diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..96e722427c2b0250783623668ef89e3d6ac7083d
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,16 @@
+# Avoid including these folders when building the components
+.git/
+.gitlab/
+.vscode/
+coverage/
+data/
+deploy/
+ecoc22/
+hackfest/
+manifests/
+nfvsdn22/
+oeccpsc22/
+ofc22/
+ofc23/
+scripts/
+tmp/
diff --git a/.gitignore b/.gitignore
index 0a116f850780386a9fe1010b22164f4c7dbf8228..a9144d6699af12319a67e8bad5cec982f3ae6a8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -168,5 +168,8 @@ delete_local_deployment.sh
 local_docker_deployment.sh
 local_k8s_deployment.sh
 
+# asdf configuration
+.tool-versions
+
 # Other logs
 **/logs/*.log.*
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6a00c6eed58ed2421c20acd90f407bd51893bd34..8fe5e6c5db2815ff2c5fcbf28b6fedeec3e060c0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -31,7 +31,7 @@ include:
   - local: '/src/dbscanserving/.gitlab-ci.yml'
   - local: '/src/opticalattackmitigator/.gitlab-ci.yml'
   - local: '/src/opticalattackdetector/.gitlab-ci.yml'
-  - local: '/src/opticalattackmanager/.gitlab-ci.yml'
+  # - local: '/src/opticalattackmanager/.gitlab-ci.yml'
   - local: '/src/automation/.gitlab-ci.yml'
   - local: '/src/policy/.gitlab-ci.yml'
   #- local: '/src/webui/.gitlab-ci.yml'
diff --git a/deploy/expose_dashboard.sh b/deploy/expose_dashboard.sh
index 60b41c7b75d4f96a22151b1d4d68ba53c75a265c..65f715cabe6d688eb01dc5ae6afe7a21261aca94 100755
--- a/deploy/expose_dashboard.sh
+++ b/deploy/expose_dashboard.sh
@@ -29,11 +29,13 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"}
 # Automated steps start here
 ########################################################################################################################
 
+MONITORING_NAMESPACE="monitoring"
+
 function expose_dashboard() {
     echo "Prometheus Port Mapping"
     echo ">>> Expose Prometheus HTTP Mgmt GUI port (9090->${PROM_EXT_PORT_HTTP})"
-    PROM_PORT_HTTP=$(kubectl --namespace monitoring get service prometheus-k8s -o 'jsonpath={.spec.ports[?(@.name=="web")].port}')
-    PATCH='{"data": {"'${PROM_EXT_PORT_HTTP}'": "monitoring/prometheus-k8s:'${PROM_PORT_HTTP}'"}}'
+    PROM_PORT_HTTP=$(kubectl --namespace ${MONITORING_NAMESPACE} get service prometheus-k8s -o 'jsonpath={.spec.ports[?(@.name=="web")].port}')
+    PATCH='{"data": {"'${PROM_EXT_PORT_HTTP}'": "'${MONITORING_NAMESPACE}'/prometheus-k8s:'${PROM_PORT_HTTP}'"}}'
     kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
 
     PORT_MAP='{"containerPort": '${PROM_EXT_PORT_HTTP}', "hostPort": '${PROM_EXT_PORT_HTTP}'}'
@@ -44,8 +46,8 @@ function expose_dashboard() {
 
     echo "Grafana Port Mapping"
     echo ">>> Expose Grafana HTTP Mgmt GUI port (3000->${GRAF_EXT_PORT_HTTP})"
-    GRAF_PORT_HTTP=$(kubectl --namespace monitoring get service grafana -o 'jsonpath={.spec.ports[?(@.name=="http")].port}')
-    PATCH='{"data": {"'${GRAF_EXT_PORT_HTTP}'": "monitoring/grafana:'${GRAF_PORT_HTTP}'"}}'
+    GRAF_PORT_HTTP=$(kubectl --namespace ${MONITORING_NAMESPACE} get service grafana -o 'jsonpath={.spec.ports[?(@.name=="http")].port}')
+    PATCH='{"data": {"'${GRAF_EXT_PORT_HTTP}'": "'${MONITORING_NAMESPACE}'/grafana:'${GRAF_PORT_HTTP}'"}}'
     kubectl patch configmap nginx-ingress-tcp-microk8s-conf --namespace ingress --patch "${PATCH}"
 
     PORT_MAP='{"containerPort": '${GRAF_EXT_PORT_HTTP}', "hostPort": '${GRAF_EXT_PORT_HTTP}'}'
@@ -55,4 +57,9 @@ function expose_dashboard() {
     echo
 }
 
-expose_dashboard
+if kubectl get namespace ${MONITORING_NAMESPACE} &> /dev/null; then
+    echo ">>> Namespace ${MONITORING_NAMESPACE} is present, exposing dashboard..."
+    expose_dashboard
+else
+    echo ">>> Namespace ${MONITORING_NAMESPACE} is NOT present, skipping expose dashboard..."
+fi
diff --git a/deploy/mock_blockchain.sh b/deploy/mock_blockchain.sh
index ef7811c87eabdcb7cf95db2e4cf1a6eee52ef6ca..74d62cd526a38298c8f197fedf0c0169dbb8efca 100755
--- a/deploy/mock_blockchain.sh
+++ b/deploy/mock_blockchain.sh
@@ -38,20 +38,21 @@ GITLAB_REPO_URL="labs.etsi.org:5050/tfs/controller"
 TMP_FOLDER="./tmp"
 
 # Create a tmp folder for files modified during the deployment
-TMP_MANIFESTS_FOLDER="$TMP_FOLDER/manifests"
+TMP_MANIFESTS_FOLDER="${TMP_FOLDER}/${K8S_NAMESPACE}/manifests"
 mkdir -p $TMP_MANIFESTS_FOLDER
-TMP_LOGS_FOLDER="$TMP_FOLDER/logs"
+TMP_LOGS_FOLDER="${TMP_FOLDER}/${K8S_NAMESPACE}/logs"
 mkdir -p $TMP_LOGS_FOLDER
 
 echo "Deleting and Creating a new namespace..."
-kubectl delete namespace $K8S_NAMESPACE
+kubectl delete namespace $K8S_NAMESPACE --ignore-not-found
 kubectl create namespace $K8S_NAMESPACE
 printf "\n"
 
 echo "Deploying components and collecting environment variables..."
 ENV_VARS_SCRIPT=tfs_bchain_runtime_env_vars.sh
-echo "# Environment variables for TeraFlow Mock-Blockchain deployment" > $ENV_VARS_SCRIPT
+echo "# Environment variables for TeraFlowSDN Mock-Blockchain deployment" > $ENV_VARS_SCRIPT
 PYTHONPATH=$(pwd)/src
+echo "export PYTHONPATH=${PYTHONPATH}" >> $ENV_VARS_SCRIPT
 
 echo "Processing '$COMPONENT' component..."
 IMAGE_NAME="$COMPONENT:$IMAGE_TAG"
@@ -77,12 +78,12 @@ cp ./manifests/"${COMPONENT}".yaml "$MANIFEST"
 
 if [ -n "$REGISTRY_IMAGE" ]; then
     # Registry is set
-    VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}:" "$MANIFEST" | cut -d ":" -f3)
+    VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}:" "$MANIFEST" | cut -d ":" -f4)
     sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT:${VERSION}#image: $IMAGE_URL#g" "$MANIFEST"
     sed -E -i "s#imagePullPolicy: .*#imagePullPolicy: Always#g" "$MANIFEST"
 else
     # Registry is not set
-    VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}:" "$MANIFEST" | cut -d ":" -f3)
+    VERSION=$(grep -i "${GITLAB_REPO_URL}/${COMPONENT}:" "$MANIFEST" | cut -d ":" -f4)
     sed -E -i "s#image: $GITLAB_REPO_URL/$COMPONENT:${VERSION}#image: $IMAGE_NAME#g" "$MANIFEST"
     sed -E -i "s#imagePullPolicy: .*#imagePullPolicy: Never#g" "$MANIFEST"
 fi
@@ -91,8 +92,8 @@ echo "  Deploying '$COMPONENT' component to Kubernetes..."
 DEPLOY_LOG="$TMP_LOGS_FOLDER/deploy_${COMPONENT}.log"
 kubectl --namespace $K8S_NAMESPACE apply -f "$MANIFEST" > "$DEPLOY_LOG"
 COMPONENT_OBJNAME=$(echo "${COMPONENT}" | sed "s/\_/-/")
-kubectl --namespace $K8S_NAMESPACE scale deployment --replicas=0 ${COMPONENT_OBJNAME} >> "$DEPLOY_LOG"
-kubectl --namespace $K8S_NAMESPACE scale deployment --replicas=1 ${COMPONENT_OBJNAME} >> "$DEPLOY_LOG"
+#kubectl --namespace $K8S_NAMESPACE scale deployment --replicas=0 ${COMPONENT_OBJNAME} >> "$DEPLOY_LOG"
+#kubectl --namespace $K8S_NAMESPACE scale deployment --replicas=1 ${COMPONENT_OBJNAME} >> "$DEPLOY_LOG"
 
 echo "  Collecting env-vars for '$COMPONENT' component..."
 SERVICE_DATA=$(kubectl get service ${COMPONENT_OBJNAME} --namespace $K8S_NAMESPACE -o json)
diff --git a/deploy/tfs.sh b/deploy/tfs.sh
index e6a0c0c1053b69462a0e60c6b6cebe28a7dc59af..95d882c8ba06d53c724559800440a788b7496555 100755
--- a/deploy/tfs.sh
+++ b/deploy/tfs.sh
@@ -327,7 +327,12 @@ echo "Deploying extra manifests..."
 for EXTRA_MANIFEST in $TFS_EXTRA_MANIFESTS; do
     echo "Processing manifest '$EXTRA_MANIFEST'..."
     if [[ "$EXTRA_MANIFEST" == *"servicemonitor"* ]]; then
-        kubectl apply -f $EXTRA_MANIFEST
+        if kubectl get namespace monitoring &> /dev/null; then
+            echo ">>> Namespace monitoring is present, applying service monitors..."
+            kubectl apply -f $EXTRA_MANIFEST
+        else
+            echo ">>> Namespace monitoring is NOT present, skipping service monitors..."
+        fi
     else
         kubectl --namespace $TFS_K8S_NAMESPACE apply -f $EXTRA_MANIFEST
     fi
@@ -343,7 +348,7 @@ for COMPONENT in $TFS_COMPONENTS; do
     printf "\n"
 done
 
-if [[ "$TFS_COMPONENTS" == *"webui"* ]]; then
+if [[ "$TFS_COMPONENTS" == *"monitoring"* ]] && [[ "$TFS_COMPONENTS" == *"webui"* ]]; then
     echo "Configuring WebUI DataStores and Dashboards..."
     sleep 5
 
diff --git a/hackfest/commands.txt b/hackfest/commands.txt
index 1b5d03dd4f8b64521401f1ab81bc5c2066eb68c4..840b83a245f6adf823b8ec097b16437c7d052826 100644
--- a/hackfest/commands.txt
+++ b/hackfest/commands.txt
@@ -337,8 +337,8 @@ $ python3 connectionServiceWithNotif_client.py
 $ sudo bash -c "$(curl -sL https://get.containerlab.dev)"
 
 ## Deploy proposed two SR node scenario
-$ cd tfs-ctrl/hackfest/gnmi
-$ sudo containerlab deploy -t srlinux.clab.yml
+$ cd ~/tfs-ctrl/hackfest/gnmi
+$ sudo containerlab deploy --topo srlinux.clab.yml
 
 ## Access SR Bash
 $ docker exec -it clab-srlinux-srl1 bash
diff --git a/hackfest/containerlab/.gitignore b/hackfest/containerlab/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..48cbf38799194b5fb3896f3a27f16bff11369fb2
--- /dev/null
+++ b/hackfest/containerlab/.gitignore
@@ -0,0 +1,2 @@
+clab-tfs-scenario
+.tfs-scenario.clab.yml.bak
diff --git a/hackfest/containerlab/commands.txt b/hackfest/containerlab/commands.txt
new file mode 100644
index 0000000000000000000000000000000000000000..18c629c0af2fe176a34f9b08a16405731c185243
--- /dev/null
+++ b/hackfest/containerlab/commands.txt
@@ -0,0 +1,99 @@
+############
+# ContainerLab
+############
+
+Refs:
+https://documentation.nokia.com/srlinux/22-6/SR_Linux_Book_Files/SysMgmt_Guide/data-models.html#openconfig-ov
+https://documentation.nokia.com/srlinux/SR_Linux_HTML_R21-11/SysMgmt_Guide/gnmi-interface.html#ai9ersv4qe
+https://github.com/openconfig/kne/blob/v0.1.9/examples/nokia/srlinux-services/srl-openconfig.cfg.json
+https://containerlab.dev/manual/kinds/srl/#default-node-configuration
+https://learn.srlinux.dev/tutorials/infrastructure/kne/srl-with-oc-services/
+https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md
+https://gnmic.kmrd.dev/cmd/get/
+
+
+IMPORTANT: for Nokia SR Linux, use kind "srl" and type "ixr6"
+
+## Download and install the latest release
+$ sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.42.0
+
+## Deploy proposed two SR node scenario
+$ cd ~/tfs-ctrl/hackfest/containerlab
+$ sudo containerlab deploy --topo tfs-scenario.clab.yml
+
+## Access SR Bash
+$ docker exec -it clab-tfs-scenario-srl1 bash
+
+## Access SR CLI
+$ docker exec -it clab-tfs-scenario-srl1 sr_cli
+
+## Destroy scenario
+$ sudo containerlab destroy --topo tfs-scenario.clab.yml
+
+
+## Enable OpenConfig data models and set as default:
+$ docker exec -it clab-tfs-scenario-srl1 sr_cli
+# enter candidate
+# system management openconfig admin-state enable
+# system gnmi-server network-instance mgmt yang-models openconfig
+# commit stay
+# quit
+
+
+# Configure containerlab clients
+docker exec -it clab-tfs-scenario-client1 bash
+    ip address add 172.16.1.10/24 dev eth1
+    ip route add 172.16.2.0/24 via 172.16.1.1
+
+    ping 172.16.2.1 or 172.16.2.10
+
+docker exec -it clab-tfs-scenario-client2 bash
+    ip address add 172.16.2.10/24 dev eth1
+    ip route add 172.16.1.0/24 via 172.16.2.1
+
+    ping 172.16.1.1 or 172.16.1.10
+
+
+
+
+## Install gNMIc
+$ sudo bash -c "$(curl -sL https://get-gnmic.kmrd.dev)"
+
+## gNMI Capabilities request
+$ gnmic -a clab-srlinux-srl1 -u admin -p NokiaSrl1! --skip-verify capabilities
+
+## gNMI Get request
+$ gnmic -a clab-srlinux-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path /system/name/host-name
+$ gnmic -a clab-srlinux-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path /interface[name=mgmt0]
+
+## gNMI Set request
+$ gnmic -a clab-srlinux-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --update-path /system/name/host-name --update-value slr11
+
+(we check the changed value) 
+$ gnmic -a clab-srlinux-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path /system/name/host-name 
+
+## Subscribe request
+$ gnmic -a clab-srlinux-srl1 -u admin -p NokiaSrl1! --skip-verify -e json_ietf subscribe --path /interface[name=mgmt0]/statistics
+(In another terminal, you can generate traffic) 
+$ssh admin@clab-srlinux-srl1
+
+
+
+
+# Check configurations done:
+gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl1-nis.json
+gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl1-ifs.json
+gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/network-instances' > srl2-nis.json
+gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf get --path '/interfaces' > srl2-ifs.json
+
+
+# Delete elements:
+gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]'
+gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]'
+gnmic -a 172.100.100.101 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]'
+gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/network-instances/network-instance[name=b19229e8]'
+gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]'
+gnmic -a 172.100.100.102 -u admin -p NokiaSrl1! --skip-verify -e json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]'
+
+# Run gNMI Driver in standalone mode (advanced)
+PYTHONPATH=./src python -m src.device.tests.test_gnmi
diff --git a/hackfest/containerlab/tfs-descriptors/.gitkeep b/hackfest/containerlab/tfs-descriptors/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/hackfest/containerlab/tfs-descriptors/dc-2-dc-l3-service.json b/hackfest/containerlab/tfs-descriptors/dc-2-dc-l3-service.json
new file mode 100644
index 0000000000000000000000000000000000000000..cb9ef972e4c314694a1a8a78bb5e30509a2de61f
--- /dev/null
+++ b/hackfest/containerlab/tfs-descriptors/dc-2-dc-l3-service.json
@@ -0,0 +1,37 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "dc-2-dc-l3-svc"}
+            },
+            "service_type": 1,
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id":{"device_uuid":{"uuid":"DC1"}},"endpoint_uuid":{"uuid":"int"}},
+                {"device_id":{"device_uuid":{"uuid":"DC2"}},"endpoint_uuid":{"uuid":"int"}}
+            ],
+            "service_constraints": [],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/device[SRL1]/settings", "resource_value": {
+                    "static_routes": [{"prefix": "172.16.2.0/24", "next_hop": "172.0.0.2"}]
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[SRL1]/endpoint[ethernet-1/1]/settings", "resource_value": {
+                    "ipv4_address": "172.0.0.1", "ipv4_prefix": 30, "sub_interface_index": 0
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[SRL1]/endpoint[ethernet-1/2]/settings", "resource_value": {
+                    "ipv4_address": "172.16.1.1", "ipv4_prefix": 24, "sub_interface_index": 0
+                }}},
+
+                {"action": 1, "custom": {"resource_key": "/device[SRL2]/settings", "resource_value": {
+                    "static_routes": [{"prefix": "172.16.1.0/24", "next_hop": "172.0.0.1"}]
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[SRL2]/endpoint[ethernet-1/1]/settings", "resource_value": {
+                    "ipv4_address": "172.0.0.2", "ipv4_prefix": 30, "sub_interface_index": 0
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[SRL2]/endpoint[ethernet-1/2]/settings", "resource_value": {
+                    "ipv4_address": "172.16.2.1", "ipv4_prefix": 24, "sub_interface_index": 0
+                }}}
+            ]}
+        }
+    ]
+}
diff --git a/hackfest/containerlab/tfs-descriptors/topology.json b/hackfest/containerlab/tfs-descriptors/topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..e4a49981f99339d77538af814365703e463d3db5
--- /dev/null
+++ b/hackfest/containerlab/tfs-descriptors/topology.json
@@ -0,0 +1,96 @@
+{
+    "contexts": [
+        {"context_id": {"context_uuid": {"uuid": "admin"}}}
+    ],
+    "topologies": [
+        {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}}
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "DC1"}}, "device_type": "emu-datacenter", "device_drivers": [0],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "eth1", "type": "copper"}, {"uuid": "eth2", "type": "copper"}, {"uuid": "int", "type": "copper"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "DC2"}}, "device_type": "emu-datacenter", "device_drivers": [0],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "eth1", "type": "copper"}, {"uuid": "eth2", "type": "copper"}, {"uuid": "int", "type": "copper"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "SRL1"}}, "device_type": "packet-router", "device_drivers": [8],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.101"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
+                    "username": "admin", "password": "NokiaSrl1!", "use_tls": true
+                }}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "SRL2"}}, "device_type": "packet-router", "device_drivers": [8],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "172.100.100.102"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "57400"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
+                    "username": "admin", "password": "NokiaSrl1!", "use_tls": true
+                }}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "DC1/eth1==SRL1/ethernet-1/2"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "eth1"}},
+                {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "SRL1/ethernet-1/2==DC1/eth1"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}},
+                {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "eth1"}}
+            ]
+        },
+
+        {
+            "link_id": {"link_uuid": {"uuid": "SRL1/ethernet-1/1==SRL2/ethernet-1/1"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}},
+                {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "SRL2/ethernet-1/1==SRL1/ethernet-1/1"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}},
+                {"device_id": {"device_uuid": {"uuid": "SRL1"}}, "endpoint_uuid": {"uuid": "ethernet-1/1"}}
+            ]
+        },
+
+        {
+            "link_id": {"link_uuid": {"uuid": "DC2/eth1==SRL2/ethernet-1/2"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "eth1"}},
+                {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "SRL2/ethernet-1/2==DC2/eth1"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "SRL2"}}, "endpoint_uuid": {"uuid": "ethernet-1/2"}},
+                {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "eth1"}}
+            ]
+        }
+    ]
+}
diff --git a/hackfest/containerlab/tfs-scenario.clab.yml b/hackfest/containerlab/tfs-scenario.clab.yml
new file mode 100644
index 0000000000000000000000000000000000000000..df197ebea70906874515240f18d2f06c4c307c88
--- /dev/null
+++ b/hackfest/containerlab/tfs-scenario.clab.yml
@@ -0,0 +1,59 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#     http://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.
+
+# Example based on clos01 example (http://containerlab.dev/lab-examples/min-clos/)
+
+# TFS 2 Nokia SR Linux nodes + 2 Linux clients
+name: tfs-scenario
+
+mgmt:
+  network: mgmt-net
+  ipv4-subnet: 172.100.100.0/24
+
+topology:
+  kinds:
+    srl:
+      image: ghcr.io/nokia/srlinux:23.3.1
+    linux:
+      image: ghcr.io/hellt/network-multitool
+  nodes:
+    srl1:
+      kind: srl
+      type: ixr6
+      cpu: 0.5
+      memory: 1GB
+      mgmt-ipv4: 172.100.100.101
+      #startup-config: srl1.cli
+    srl2:
+      kind: srl
+      type: ixr6
+      cpu: 0.5
+      memory: 1GB
+      mgmt-ipv4: 172.100.100.102
+      #startup-config: srl2.cli
+    client1:
+      kind: linux
+      cpu: 0.1
+      memory: 100MB
+      mgmt-ipv4: 172.100.100.201
+    client2:
+      kind: linux
+      cpu: 0.1
+      memory: 100MB
+      mgmt-ipv4: 172.100.100.202
+
+  links:
+    - endpoints: ["srl1:e1-1", "srl2:e1-1"]
+    - endpoints: ["client1:eth1", "srl1:e1-2"]
+    - endpoints: ["client2:eth1", "srl2:e1-2"]
diff --git a/hackfest/tfs-descriptors/context-topology.json b/hackfest/tfs-descriptors/hackfest1/context-topology.json
similarity index 100%
rename from hackfest/tfs-descriptors/context-topology.json
rename to hackfest/tfs-descriptors/hackfest1/context-topology.json
diff --git a/hackfest/tfs-descriptors/device-all.json b/hackfest/tfs-descriptors/hackfest1/device-all.json
similarity index 100%
rename from hackfest/tfs-descriptors/device-all.json
rename to hackfest/tfs-descriptors/hackfest1/device-all.json
diff --git a/hackfest/tfs-descriptors/device-netconf-openconfig.json b/hackfest/tfs-descriptors/hackfest1/device-netconf-openconfig.json
similarity index 100%
rename from hackfest/tfs-descriptors/device-netconf-openconfig.json
rename to hackfest/tfs-descriptors/hackfest1/device-netconf-openconfig.json
diff --git a/hackfest/tfs-descriptors/device-tapi-ols.json b/hackfest/tfs-descriptors/hackfest1/device-tapi-ols.json
similarity index 100%
rename from hackfest/tfs-descriptors/device-tapi-ols.json
rename to hackfest/tfs-descriptors/hackfest1/device-tapi-ols.json
diff --git a/hackfest/tfs-descriptors/links.json b/hackfest/tfs-descriptors/hackfest1/links.json
similarity index 100%
rename from hackfest/tfs-descriptors/links.json
rename to hackfest/tfs-descriptors/hackfest1/links.json
diff --git a/hackfest/tfs-descriptors/service-l3vpn.json b/hackfest/tfs-descriptors/hackfest1/service-l3vpn.json
similarity index 100%
rename from hackfest/tfs-descriptors/service-l3vpn.json
rename to hackfest/tfs-descriptors/hackfest1/service-l3vpn.json
diff --git a/hackfest/tfs-descriptors/hackfest2/emulated-topology.json b/hackfest/tfs-descriptors/hackfest2/emulated-topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..6885c7d9082bfcb17447252636ea4efb0f500283
--- /dev/null
+++ b/hackfest/tfs-descriptors/hackfest2/emulated-topology.json
@@ -0,0 +1,210 @@
+{
+    "contexts": [
+        {"context_id": {"context_uuid": {"uuid": "admin"}}}
+    ],
+    "topologies": [
+        {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}}
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "R1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R3"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R4"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R5"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R6"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/6"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R7"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 1, "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "1/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/1"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/2"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/3"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/4"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/5"},
+                    {"sample_types": [101, 102, 201, 202], "type": "copper", "uuid": "2/6"}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+        {"link_id": {"link_uuid": {"uuid": "R1==R2"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/2"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R1==R6"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/2"}},
+            {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R1==R7"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/3"}},
+            {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R2==R1"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/2"}},
+            {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R2==R3"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/2"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R3==R2"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/2"}},
+            {"device_id": {"device_uuid": {"uuid": "R2"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R3==R4"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/2"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R3==R7"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/3"}},
+            {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/3"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R4==R3"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/2"}},
+            {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R4==R5"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/2"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R5==R4"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/2"}},
+            {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R5==R6"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/2"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R5==R7"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/3"}},
+            {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/5"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R6==R1"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/2"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R6==R5"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R6"}}, "endpoint_uuid": {"uuid": "2/2"}},
+            {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/1"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R7==R1"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/1"}},
+            {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "2/3"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R7==R3"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/3"}},
+            {"device_id": {"device_uuid": {"uuid": "R3"}}, "endpoint_uuid": {"uuid": "2/3"}}
+        ]},
+        {"link_id": {"link_uuid": {"uuid": "R7==R5"}}, "link_endpoint_ids": [
+            {"device_id": {"device_uuid": {"uuid": "R7"}}, "endpoint_uuid": {"uuid": "2/5"}},
+            {"device_id": {"device_uuid": {"uuid": "R5"}}, "endpoint_uuid": {"uuid": "2/3"}}
+        ]}
+    ]
+}
diff --git a/hackfest/tfs-descriptors/hackfest2/emulated-topology.png b/hackfest/tfs-descriptors/hackfest2/emulated-topology.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8684e825cd8a92d58c58c785b45203f7b0abee2
Binary files /dev/null and b/hackfest/tfs-descriptors/hackfest2/emulated-topology.png differ
diff --git a/hackfest/tfs-descriptors/hackfest2/l3-service.json b/hackfest/tfs-descriptors/hackfest2/l3-service.json
new file mode 100644
index 0000000000000000000000000000000000000000..540d3a7a6744551ba13e59cd9ec2c23258e0c762
--- /dev/null
+++ b/hackfest/tfs-descriptors/hackfest2/l3-service.json
@@ -0,0 +1,44 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}},
+                "service_uuid": {"uuid": "l3-service"}
+            },
+            "service_type": 1,
+            "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1"}}, "endpoint_uuid": {"uuid": "1/2"}},
+                {"device_id": {"device_uuid": {"uuid": "R4"}}, "endpoint_uuid": {"uuid": "1/2"}}
+            ],
+            "service_constraints": [
+                {"custom": {"constraint_type": "bandwidth[gbps]", "constraint_value": "10.0"}},
+                {"custom": {"constraint_type": "latency[ms]", "constraint_value": "15.2"}}
+            ],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {
+                    "address_families": ["IPV4"],
+                    "bgp_as": 65000,
+                    "bgp_route_target": "65000:333",
+                    "mtu": 1512
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R1]/endpoint[1/2]/settings", "resource_value": {
+                    "address_ip": "3.3.2.1",
+                    "address_prefix": 24,
+                    "route_distinguisher": "65000:123",
+                    "router_id": "10.10.10.1",
+                    "sub_interface_index": 400,
+                    "vlan_id": 400
+                }}},
+                {"action": 1, "custom": {"resource_key": "/device[R4]/endpoint[1/2]/settings", "resource_value": {
+                    "address_ip": "3.3.1.1",
+                    "address_prefix": 24,
+                    "route_distinguisher": "65000:123",
+                    "router_id": "20.20.20.1",
+                    "sub_interface_index": 400,
+                    "vlan_id": 500
+                }}}
+            ]}
+        }
+    ]
+}
diff --git a/manifests/deviceservice.yaml b/manifests/deviceservice.yaml
index 22c0f5f9d124b76d0e477dce35d14811204c1496..77e421f297fefc8979b9cd6e3415c58be611a53a 100644
--- a/manifests/deviceservice.yaml
+++ b/manifests/deviceservice.yaml
@@ -40,6 +40,11 @@ spec:
         env:
         - name: LOG_LEVEL
           value: "INFO"
+        startupProbe:
+          exec:
+            command: ["/bin/grpc_health_probe", "-addr=:2020"]
+          failureThreshold: 30
+          periodSeconds: 1
         readinessProbe:
           exec:
             command: ["/bin/grpc_health_probe", "-addr=:2020"]
diff --git a/manifests/interdomainservice.yaml b/manifests/interdomainservice.yaml
index 067f9432749f7d2c986503b034e55a13c8f2b210..a235834025724cb11e6b26364f25ae9feb28fe8c 100644
--- a/manifests/interdomainservice.yaml
+++ b/manifests/interdomainservice.yaml
@@ -36,6 +36,8 @@ spec:
         env:
         - name: LOG_LEVEL
           value: "INFO"
+        - name: TOPOLOGY_ABSTRACTOR
+          value: "DISABLE"
         readinessProbe:
           exec:
             command: ["/bin/grpc_health_probe", "-addr=:10010"]
diff --git a/manifests/l3_centralizedattackdetectorservice.yaml b/manifests/l3_centralizedattackdetectorservice.yaml
index 594e21f4dbb1b10e1d859053c33785e2e59e4b46..8a3be69b672200120afb4bca3892dd0c08ec2d65 100644
--- a/manifests/l3_centralizedattackdetectorservice.yaml
+++ b/manifests/l3_centralizedattackdetectorservice.yaml
@@ -36,6 +36,14 @@ spec:
         env:
         - name: LOG_LEVEL
           value: "DEBUG"
+        - name: BATCH_SIZE
+          value: "256"
+        - name: CAD_CLASSIFICATION_THRESHOLD
+          value: "0.5"
+        - name: MONITORED_KPIS_TIME_INTERVAL_AGG
+          value: "60"
+        - name: TEST_ML_MODEL
+          value: "0"
         readinessProbe:
           exec:
             command: ["/bin/grpc_health_probe", "-addr=:10001"]
diff --git a/manifests/monitoringservice.yaml b/manifests/monitoringservice.yaml
index 4447a1427980be6554228087924bf8e4ca775758..dbcfa68a036e3323f42e423de14002ba85576171 100644
--- a/manifests/monitoringservice.yaml
+++ b/manifests/monitoringservice.yaml
@@ -48,11 +48,11 @@ spec:
             command: ["/bin/grpc_health_probe", "-addr=:7070"]
         resources:
           requests:
-            cpu: 50m
-            memory: 64Mi
+            cpu: 250m
+            memory: 256Mi
           limits:
-            cpu: 500m
-            memory: 512Mi
+            cpu: 1000m
+            memory: 1024Mi
 ---
 apiVersion: v1
 kind: Service
diff --git a/manifests/pathcompservice.yaml b/manifests/pathcompservice.yaml
index 3ba12750b20a7093a570748e67a93922316a66f6..c85922d961ecc7b99e8fa2476b5e61db7ed52a9d 100644
--- a/manifests/pathcompservice.yaml
+++ b/manifests/pathcompservice.yaml
@@ -45,11 +45,11 @@ spec:
             command: ["/bin/grpc_health_probe", "-addr=:10020"]
         resources:
           requests:
-            cpu: 50m
-            memory: 64Mi
+            cpu: 250m
+            memory: 128Mi
           limits:
-            cpu: 500m
-            memory: 512Mi
+            cpu: 1000m
+            memory: 1024Mi
       - name: backend
         image: labs.etsi.org:5050/tfs/controller/pathcomp-backend:latest
         imagePullPolicy: Always
@@ -69,10 +69,10 @@ spec:
         #  timeoutSeconds: 5
         resources:
           requests:
-            cpu: 100m
+            cpu: 250m
             memory: 256Mi
           limits:
-            cpu: 700m
+            cpu: 1000m
             memory: 1024Mi
 ---
 apiVersion: v1
diff --git a/manifests/teservice.yaml b/manifests/teservice.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..15f1619df08069f00db883f0b918c17837c707d1
--- /dev/null
+++ b/manifests/teservice.yaml
@@ -0,0 +1,81 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: teservice
+spec:
+  selector:
+    matchLabels:
+      app: teservice
+  template:
+    metadata:
+      annotations:
+        config.linkerd.io/skip-inbound-ports: "4189"
+      labels:
+        app: teservice
+    spec:
+      terminationGracePeriodSeconds: 5
+      shareProcessNamespace: true
+      containers:
+      - name: server
+        image: labs.etsi.org:5050/tfs/controller/te:latest
+        imagePullPolicy: Always
+        ports:
+        - containerPort: 10030
+        env:
+        - name: ERLANG_LOGGER_LEVEL
+          value: "debug"
+        - name: ERLANG_COOKIE
+          value: "tfte-unsafe-cookie"
+        - name: ERLANG_NODE_NAME
+          valueFrom:
+            fieldRef:
+              fieldPath: metadata.name
+        - name: ERLANG_NODE_IP
+          valueFrom:
+            fieldRef:
+              fieldPath: status.podIP
+        readinessProbe:
+          exec:
+            command: ["/tfte/bin/tfte", "status"]
+        livenessProbe:
+          exec:
+            command: ["/tfte/bin/tfte", "status"]
+        resources:
+          requests:
+            cpu: 250m
+            memory: 512Mi
+          limits:
+            cpu: 700m
+            memory: 1024Mi
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: teservice
+spec:
+  type: ClusterIP
+  selector:
+    app: teservice
+  ports:
+  - name: grpc
+    protocol: TCP
+    port: 10030
+    targetPort: 10030
+  - name: pcep
+    protocol: TCP
+    port: 4189
+    targetPort: 4189
diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml
index b6ddfc0a91ae5316969079c517e148f63fb18b61..43caa9f04b56d6477d82c5a5bb22cb292eec8a90 100644
--- a/manifests/webuiservice.yaml
+++ b/manifests/webuiservice.yaml
@@ -57,10 +57,10 @@ spec:
         resources:
           requests:
             cpu: 50m
-            memory: 64Mi
+            memory: 128Mi
           limits:
-            cpu: 500m
-            memory: 512Mi
+            cpu: 1000m
+            memory: 1024Mi
       - name: grafana
         image: grafana/grafana:8.5.22
         imagePullPolicy: IfNotPresent
@@ -74,26 +74,27 @@ spec:
         - name: GF_SERVER_SERVE_FROM_SUB_PATH
           value: "true"
         readinessProbe:
-          failureThreshold: 3
+          failureThreshold: 60
           httpGet:
-            path: /robots.txt
+            #path: /robots.txt
+            path: /login
             port: 3000
             scheme: HTTP
-          initialDelaySeconds: 10
-          periodSeconds: 30
+          initialDelaySeconds: 1
+          periodSeconds: 1
           successThreshold: 1
           timeoutSeconds: 2
         livenessProbe:
-          failureThreshold: 3
-          initialDelaySeconds: 30
-          periodSeconds: 10
+          failureThreshold: 60
+          initialDelaySeconds: 1
+          periodSeconds: 1
           successThreshold: 1
           tcpSocket:
             port: 3000
           timeoutSeconds: 1
         resources:
           requests:
-            cpu: 150m
+            cpu: 250m
             memory: 512Mi
           limits:
             cpu: 500m
diff --git a/my_deploy.sh b/my_deploy.sh
index e3ad5e71ae58f8546ecf7f24bf2a3a4c0d03cb37..888fc98903eb665729d7e0843cf9e9fc8b60741d 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -22,18 +22,21 @@ export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
 export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
 
-# Uncoment to activate Monitoring
+# Uncomment to activate Monitoring
 #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
 
-# Uncoment to activate Automation and Policy Manager
+# Uncomment to activate Automation and Policy Manager
 #export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
 
-# Uncoment to activate Optical CyberSecurity
+# Uncomment to activate Optical CyberSecurity
 #export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
 
-# Uncoment to activate L3 CyberSecurity
+# Uncomment to activate L3 CyberSecurity
 #export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
 
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
+
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
 
@@ -41,9 +44,12 @@ export TFS_IMAGE_TAG="dev"
 export TFS_K8S_NAMESPACE="tfs"
 
 # Set additional manifest files to be applied after the deployment
-export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml manifests/servicemonitors.yaml"
+export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
+
+# Uncomment to monitor performance of components
+export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
 
-# Uncoment when deploying Optical CyberSecurity
+# Uncomment when deploying Optical CyberSecurity
 #export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
 
 # Set the new Grafana admin password
diff --git a/proto/.gitignore b/proto/.gitignore
index d1dea37b3a85abaa18b5bd65d3ec0e1d3c6fe9b6..4d6f9cbd73b283a2520ac926f56294a2aa060478 100644
--- a/proto/.gitignore
+++ b/proto/.gitignore
@@ -3,5 +3,8 @@ src/*/*
 # used to prevent breaking symbolic links from source code folders
 !src/*/.gitignore
 !src/python/__init__.py
+!src/erlang/rebar.config
+!src/erlang/rebar.lock
+!src/erlang/src/tfpb.app.src
 
 uml/generated
diff --git a/proto/context.proto b/proto/context.proto
index 3104f1b545c02bab71c8638ebba03efdcbfe71ff..55a80470d40463742cc3e034ca9e933f4ff6c3f0 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -195,6 +195,7 @@ enum DeviceDriverEnum {
   DEVICEDRIVER_ONF_TR_352 = 5;
   DEVICEDRIVER_XR = 6;
   DEVICEDRIVER_IETF_L2VPN = 7;
+  DEVICEDRIVER_GNMI_OPENCONFIG = 8;
 }
 
 enum DeviceOperationalStatusEnum {
@@ -272,6 +273,7 @@ enum ServiceTypeEnum {
   SERVICETYPE_L3NM = 1;
   SERVICETYPE_L2NM = 2;
   SERVICETYPE_TAPI_CONNECTIVITY_SERVICE = 3;
+  SERVICETYPE_TE = 4;
 }
 
 enum ServiceStatusEnum {
@@ -494,6 +496,12 @@ message ConfigRule {
 
 
 // ----- Constraint ----------------------------------------------------------------------------------------------------
+enum ConstraintActionEnum {
+  CONSTRAINTACTION_UNDEFINED = 0;
+  CONSTRAINTACTION_SET       = 1;
+  CONSTRAINTACTION_DELETE    = 2;
+}
+
 message Constraint_Custom {
   string constraint_type = 1;
   string constraint_value = 2;
@@ -564,16 +572,17 @@ message Constraint_Exclusions {
 }
 
 message Constraint {
+  ConstraintActionEnum action = 1;
   oneof constraint {
-    Constraint_Custom custom = 1;
-    Constraint_Schedule schedule = 2;
-    Constraint_EndPointLocation endpoint_location = 3;
-    Constraint_EndPointPriority endpoint_priority = 4;
-    Constraint_SLA_Capacity sla_capacity = 5;
-    Constraint_SLA_Latency sla_latency = 6;
-    Constraint_SLA_Availability sla_availability = 7;
-    Constraint_SLA_Isolation_level sla_isolation = 8;
-    Constraint_Exclusions exclusions = 9;
+    Constraint_Custom custom = 2;
+    Constraint_Schedule schedule = 3;
+    Constraint_EndPointLocation endpoint_location = 4;
+    Constraint_EndPointPriority endpoint_priority = 5;
+    Constraint_SLA_Capacity sla_capacity = 6;
+    Constraint_SLA_Latency sla_latency = 7;
+    Constraint_SLA_Availability sla_availability = 8;
+    Constraint_SLA_Isolation_level sla_isolation = 9;
+    Constraint_Exclusions exclusions = 10;
   }
 }
 
diff --git a/proto/generate_code_erlang.sh b/proto/generate_code_erlang.sh
new file mode 100755
index 0000000000000000000000000000000000000000..80fb977e44536482888d2963995fd811e95417fd
--- /dev/null
+++ b/proto/generate_code_erlang.sh
@@ -0,0 +1,74 @@
+#!/bin/bash -eu
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+set -e
+
+FORCE=0
+DEFAULT_ACTION="generate"
+
+usage() {
+    echo "Usage: $0 [-f] [clean|generate]" 1>&2
+    echo "Options:"
+    echo "  -f: Force regeneration of all protocol buffers"
+    exit 1;
+}
+
+while getopts "fc" o; do
+    case "${o}" in
+        f)
+            FORCE=1
+            ;;
+        *)
+            usage
+            ;;
+    esac
+done
+shift $((OPTIND-1))
+
+ACTION=${1:-$DEFAULT_ACTION}
+cd $(dirname $0)
+ROOT=$(pwd)
+ERLANG_PROTO_DIR="$ROOT/src/erlang"
+BUILD_CHECK="$ERLANG_PROTO_DIR/.generated"
+
+tfpb_clean() {
+    rm -f "$BUILD_CHECK"
+    rm -rf "$ERLANG_PROTO_DIR/src/"*.erl
+    rm -rf "$ERLANG_PROTO_DIR/src/erlang/_build"
+}
+
+tfpb_generate() {
+    if [[ -f "$BUILD_CHECK" && $FORCE != 1 ]]; then
+        echo "Protocol buffer code for Erlang already generated, use -f to force"
+        exit 0
+    fi
+
+    tfpb_clean
+    mkdir -p "$ERLANG_PROTO_DIR"
+    cd "$ERLANG_PROTO_DIR"
+    rebar3 compile
+    rebar3 grpc gen
+    rebar3 compile
+    touch "$BUILD_CHECK"
+
+    echo "Protocol buffer code for Erlang generated"
+}
+
+case "$ACTION" in
+    clean) tfpb_clean;;
+    generate) tfpb_generate;;
+    *) usage;;
+esac
+
diff --git a/proto/interdomain.proto b/proto/interdomain.proto
index 3e44fb4477c400e8ca278bda38a7af6d142cebe0..ca6a64b19d22c3b80f2a6e57d4aba36ae2a9b080 100644
--- a/proto/interdomain.proto
+++ b/proto/interdomain.proto
@@ -25,4 +25,5 @@ service InterdomainService {
   rpc CreateSliceAndAddToCatalog(context.Slice             ) returns (context.Slice               ) {}
   rpc OrderSliceWithSLA         (context.Slice) returns (context.SliceId) {} // If slice with SLA already exists, returns slice. If not, it creates it.
   rpc UpdateSlice               (context.Slice             ) returns (context.Slice               ) {}
+  rpc DeleteSlice               (context.SliceId           ) returns (context.Empty               ) {}
 }
diff --git a/proto/l3_attackmitigator.proto b/proto/l3_attackmitigator.proto
index 572d96f9e586dae4a124b1b9de1368b71fb9f0b7..d8ed4baf788a793b6b1451606760256db8ebe089 100644
--- a/proto/l3_attackmitigator.proto
+++ b/proto/l3_attackmitigator.proto
@@ -13,15 +13,14 @@
 // limitations under the License.
 
 syntax = "proto3";
+package l3_attackmitigator;
 
 import "context.proto";
+import "l3_centralizedattackdetector.proto";
 
 service L3Attackmitigator{
-  // Perform Mitigation
-  rpc PerformMitigation (L3AttackmitigatorOutput) returns (context.Empty) {}
-  // Get Mitigation
+  rpc PerformMitigation (L3AttackmitigatorOutput) returns (l3_centralizedattackdetector.StatusMessage) {}
   rpc GetMitigation (context.Empty) returns (context.Empty) {}
-  // Get Configured ACL Rules
   rpc GetConfiguredACLRules (context.Empty) returns (ACLRules) {}
 }
 
diff --git a/proto/l3_centralizedattackdetector.proto b/proto/l3_centralizedattackdetector.proto
index ed99435aa7db6584b381079cb1e3d589fb9998b5..de967aea0812c611d7d969b2c3b20421446e927f 100644
--- a/proto/l3_centralizedattackdetector.proto
+++ b/proto/l3_centralizedattackdetector.proto
@@ -13,18 +13,23 @@
 // limitations under the License.
 
 syntax = "proto3";
+package l3_centralizedattackdetector;
 
 import "context.proto";
 
 service L3Centralizedattackdetector {
   // Analyze single input to the ML model in the CAD component
-  rpc AnalyzeConnectionStatistics (L3CentralizedattackdetectorMetrics) returns (Empty) {}
+  rpc AnalyzeConnectionStatistics (L3CentralizedattackdetectorMetrics) returns (StatusMessage) {}
 
   // Analyze a batch of inputs to the ML model in the CAD component
-  rpc AnalyzeBatchConnectionStatistics (L3CentralizedattackdetectorBatchInput) returns (Empty) {}
+  rpc AnalyzeBatchConnectionStatistics (L3CentralizedattackdetectorBatchInput) returns (StatusMessage) {}
 
   // Get the list of features used by the ML model in the CAD component
-  rpc GetFeaturesIds (Empty) returns (AutoFeatures) {}
+  rpc GetFeaturesIds (context.Empty) returns (AutoFeatures) {}
+
+  // Sets the list of attack IPs in order to be used to compute the prediction accuracy of the
+  // ML model in the CAD component in case of testing the ML model.
+  rpc SetAttackIPs (AttackIPs) returns (context.Empty) {}
 }
 
 message Feature {
@@ -63,6 +68,10 @@ message L3CentralizedattackdetectorBatchInput {
 	repeated L3CentralizedattackdetectorMetrics metrics = 1;
 }
 
-message Empty {
+message StatusMessage {
 	string message = 1;
 }
+
+message AttackIPs {
+	repeated string attack_ips = 1;
+}
\ No newline at end of file
diff --git a/proto/src/erlang/.gitignore b/proto/src/erlang/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b583d287f2c200fe88ad47c7e8d9cfcf15b0135c
--- /dev/null
+++ b/proto/src/erlang/.gitignore
@@ -0,0 +1,5 @@
+*
+!rebar.config
+!rebar.lock
+!src/
+!src/tfpb.app.src
diff --git a/proto/src/erlang/rebar.config b/proto/src/erlang/rebar.config
new file mode 100644
index 0000000000000000000000000000000000000000..55e139eabf9bf5e0bdcb66af889d78bdc8aa9c11
--- /dev/null
+++ b/proto/src/erlang/rebar.config
@@ -0,0 +1,21 @@
+% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%
+% 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
+%
+%      http://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.
+
+{erl_opts, [debug_info]}.
+{deps, [grpcbox]}.
+
+{grpc, [{protos, "../.."},
+        {gpb_opts, [{i, "../.."}, {strbin, true}, {descriptor, true}, {module_name_suffix, "_pb"}]}]}.
+
+{plugins, [grpcbox_plugin]}.
diff --git a/proto/src/erlang/rebar.lock b/proto/src/erlang/rebar.lock
new file mode 100644
index 0000000000000000000000000000000000000000..d353eaf344ffe261be7200c1cb3a1ad76bf80703
--- /dev/null
+++ b/proto/src/erlang/rebar.lock
@@ -0,0 +1,23 @@
+{"1.2.0",
+[{<<"acceptor_pool">>,{pkg,<<"acceptor_pool">>,<<"1.0.0">>},1},
+ {<<"chatterbox">>,{pkg,<<"ts_chatterbox">>,<<"0.12.0">>},1},
+ {<<"ctx">>,{pkg,<<"ctx">>,<<"0.6.0">>},1},
+ {<<"gproc">>,{pkg,<<"gproc">>,<<"0.8.0">>},1},
+ {<<"grpcbox">>,{pkg,<<"grpcbox">>,<<"0.15.0">>},0},
+ {<<"hpack">>,{pkg,<<"hpack_erl">>,<<"0.2.3">>},2}]}.
+[
+{pkg_hash,[
+ {<<"acceptor_pool">>, <<"43C20D2ACAE35F0C2BCD64F9D2BDE267E459F0F3FD23DAB26485BF518C281B21">>},
+ {<<"chatterbox">>, <<"4E54F199E15C0320B85372A24E35554A2CCFC4342E0B7CD8DAED9A04F9B8EF4A">>},
+ {<<"ctx">>, <<"8FF88B70E6400C4DF90142E7F130625B82086077A45364A78D208ED3ED53C7FE">>},
+ {<<"gproc">>, <<"CEA02C578589C61E5341FCE149EA36CCEF236CC2ECAC8691FBA408E7EA77EC2F">>},
+ {<<"grpcbox">>, <<"97C7126296A091602D372EBF5860A04F7BC795B45B33A984CAD2B8E362774FD8">>},
+ {<<"hpack">>, <<"17670F83FF984AE6CD74B1C456EDDE906D27FF013740EE4D9EFAA4F1BF999633">>}]},
+{pkg_hash_ext,[
+ {<<"acceptor_pool">>, <<"0CBCD83FDC8B9AD2EEE2067EF8B91A14858A5883CB7CD800E6FCD5803E158788">>},
+ {<<"chatterbox">>, <<"6478C161BC60244F41CD5847CC3ACCD26D997883E9F7FACD36FF24533B2FA579">>},
+ {<<"ctx">>, <<"A14ED2D1B67723DBEBBE423B28D7615EB0BDCBA6FF28F2D1F1B0A7E1D4AA5FC2">>},
+ {<<"gproc">>, <<"580ADAFA56463B75263EF5A5DF4C86AF321F68694E7786CB057FD805D1E2A7DE">>},
+ {<<"grpcbox">>, <<"161ABE9E17E7D1982EFA6488ADEAA13C3E847A07984A6E6B224E553368918647">>},
+ {<<"hpack">>, <<"06F580167C4B8B8A6429040DF36CC93BBA6D571FAEAEC1B28816523379CBB23A">>}]}
+].
diff --git a/proto/src/erlang/src/tfpb.app.src b/proto/src/erlang/src/tfpb.app.src
new file mode 100644
index 0000000000000000000000000000000000000000..097bdc5979ece9d9d02322c16bd97816460afc00
--- /dev/null
+++ b/proto/src/erlang/src/tfpb.app.src
@@ -0,0 +1,24 @@
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+
+{application, tfpb,
+ [{description, "Teraflow Erlang Protocol Buffers"},
+  {vsn, "0.1.0"},
+  {registered, []},
+  {applications, [kernel, stdlib, grpcbox]},
+  {env, []},
+  {modules, []},
+  {licenses, ["Apache 2.0"]},
+  {links, []}
+ ]}.
diff --git a/src/tests/scenario3/l3/complete_deploy.sh b/scripts/run_tests_locally-interdomain-compute-domains.sh
similarity index 70%
rename from src/tests/scenario3/l3/complete_deploy.sh
rename to scripts/run_tests_locally-interdomain-compute-domains.sh
index 5e8a2772c61ac2e96e5cf675468d27be2b940fe6..09fa4ce7ea6a4464ed5f821502e41c13c6248564 100755
--- a/src/tests/scenario3/l3/complete_deploy.sh
+++ b/scripts/run_tests_locally-interdomain-compute-domains.sh
@@ -13,11 +13,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-./src/tests/ofc22/run_test_03_delete_service.sh
-./src/tests/ofc22/run_test_04_cleanup.sh
-source src/tests/ofc22/deploy_specs.sh
-source my_deploy.sh
-./deploy/all.sh
-source tfs_runtime_env_vars.sh
-ofc22/run_test_01_bootstrap.sh
-ofc22/run_test_02_create_service.sh
+source tfs_runtime_env_vars_dom1.sh 
+PYTHONPATH=./src pytest --log-level=INFO --verbose src/interdomain/tests/test_compute_domains.py
diff --git a/src/tests/scenario3/l3/get_ml_model_info.sh b/scripts/run_tests_locally-interdomain-topology-abstractor.sh
similarity index 69%
rename from src/tests/scenario3/l3/get_ml_model_info.sh
rename to scripts/run_tests_locally-interdomain-topology-abstractor.sh
index 19fb1177a23c13e4cdffd2e8c75df3aad3502c04..1e1dc1767e6a6efbd01eb1cd559fc75dd30c2794 100755
--- a/src/tests/scenario3/l3/get_ml_model_info.sh
+++ b/scripts/run_tests_locally-interdomain-topology-abstractor.sh
@@ -13,10 +13,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-pod=$(kubectl get pods -n "tfs" -l app=l3-centralizedattackdetectorservice | sed -n '2p' | cut -d " " -f1)
-while true; do
-    kubectl -n "tfs" cp $pod:prediction_accuracy.txt ./prediction_accuracy.txt
-    clear
-    cat prediction_accuracy.txt | tail -n 10
-    sleep 1
-done
+source tfs_runtime_env_vars_dom2.sh 
+PYTHONPATH=./src pytest --log-level=INFO --verbose src/interdomain/tests/test_topology_abstractor.py
diff --git a/src/automation/mvnw b/src/automation/mvnw
old mode 100644
new mode 100755
diff --git a/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java b/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
index 2f9054cd8296579b3e391aae84ec16ad1f460bdb..217c76671cbb8524c7f0c0218e83fedc5e52bdb0 100644
--- a/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
+++ b/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
@@ -26,7 +26,6 @@ import eu.teraflow.automation.model.DeviceState;
 import io.quarkus.grpc.GrpcService;
 import io.smallrye.mutiny.Uni;
 import javax.inject.Inject;
-
 import org.eclipse.microprofile.metrics.MetricUnits;
 import org.eclipse.microprofile.metrics.annotation.Counted;
 import org.eclipse.microprofile.metrics.annotation.Timed;
diff --git a/src/automation/src/main/java/eu/teraflow/automation/AutomationServiceImpl.java b/src/automation/src/main/java/eu/teraflow/automation/AutomationServiceImpl.java
index f25e0e2988dd2dd1e35243559821dc35d84bb1e0..017a101fb1a5b35b018a775d36f24480104f586f 100644
--- a/src/automation/src/main/java/eu/teraflow/automation/AutomationServiceImpl.java
+++ b/src/automation/src/main/java/eu/teraflow/automation/AutomationServiceImpl.java
@@ -28,7 +28,7 @@ import org.jboss.logging.Logger;
 @ApplicationScoped
 public class AutomationServiceImpl implements AutomationService {
     private static final Logger LOGGER = Logger.getLogger(AutomationServiceImpl.class);
-    //private static final String MESSAGE = "Retrieved %s";
+    // private static final String MESSAGE = "Retrieved %s";
 
     private final DeviceService deviceService;
     private final ContextService contextService;
@@ -61,7 +61,7 @@ public class AutomationServiceImpl implements AutomationService {
                                 return;
                             }
 
-                            //LOGGER.infof(MESSAGE, device);
+                            // LOGGER.infof(MESSAGE, device);
 
                             final var initialConfiguration =
                                     deviceService.getInitialConfiguration(device.getDeviceId());
@@ -114,7 +114,7 @@ public class AutomationServiceImpl implements AutomationService {
                             device.disableDevice();
                             LOGGER.infof("Disabled device [%s]", id);
 
-                            //LOGGER.infof(MESSAGE, device);
+                            // LOGGER.infof(MESSAGE, device);
 
                             final var empty = deviceService.deleteDevice(device.getDeviceId());
 
@@ -150,7 +150,7 @@ public class AutomationServiceImpl implements AutomationService {
                                 return;
                             }
 
-                            //LOGGER.infof(MESSAGE, device);
+                            // LOGGER.infof(MESSAGE, device);
                             device.setDeviceConfiguration(deviceConfig);
                             final var updatedDeviceIdUni = deviceService.configureDevice(device);
 
diff --git a/src/automation/src/test/java/eu/teraflow/automation/ContextSubscriberTest.java b/src/automation/src/test/java/eu/teraflow/automation/ContextSubscriberTest.java
index 84acd8b5d33c8e0b622a427f0952c0053aad3252..eb5f63e25d0f83417bcd461ce3aa9313a7eb417f 100644
--- a/src/automation/src/test/java/eu/teraflow/automation/ContextSubscriberTest.java
+++ b/src/automation/src/test/java/eu/teraflow/automation/ContextSubscriberTest.java
@@ -1,18 +1,18 @@
 /*
- * Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
- *
- * 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
- *
- *     http://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.
- */
+* Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+*
+* 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
+*
+*     http://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 eu.teraflow.automation;
 
diff --git a/src/automation/src/test/java/eu/teraflow/automation/MockAutomationConfiguration.java b/src/automation/src/test/java/eu/teraflow/automation/MockAutomationConfiguration.java
index b3653edc8d148fc428775be0d7743c48ec45ae33..94110ebbcd8826b6fd73f451c799f3d8d79521f7 100644
--- a/src/automation/src/test/java/eu/teraflow/automation/MockAutomationConfiguration.java
+++ b/src/automation/src/test/java/eu/teraflow/automation/MockAutomationConfiguration.java
@@ -1,18 +1,18 @@
 /*
- * Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
- *
- * 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
- *
- *     http://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.
- */
+* Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+*
+* 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
+*
+*     http://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 eu.teraflow.automation;
 
diff --git a/src/automation/src/test/java/eu/teraflow/automation/SerializerTest.java b/src/automation/src/test/java/eu/teraflow/automation/SerializerTest.java
index 0931054c682dede502fb9f22bf911439e52c2140..d2257d1b34e4753aff620e9bbc15d941f99ae3ba 100644
--- a/src/automation/src/test/java/eu/teraflow/automation/SerializerTest.java
+++ b/src/automation/src/test/java/eu/teraflow/automation/SerializerTest.java
@@ -1216,7 +1216,8 @@ class SerializerTest {
                         ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352),
                 Arguments.of(DeviceDriverEnum.XR, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_XR),
                 Arguments.of(
-                        DeviceDriverEnum.IETF_L2VPN, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN),
+                        DeviceDriverEnum.IETF_L2VPN,
+                        ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN),
                 Arguments.of(
                         DeviceDriverEnum.UNDEFINED, ContextOuterClass.DeviceDriverEnum.DEVICEDRIVER_UNDEFINED));
     }
diff --git a/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java b/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java
index b1bccdeccf564b0d8d7bd2a8606f614b00ede972..a605e30de68ae66866a78d53863412937ceea890 100644
--- a/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/automation/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -181,6 +181,10 @@ public final class ContextOuterClass {
      * <code>DEVICEDRIVER_IETF_L2VPN = 7;</code>
      */
     DEVICEDRIVER_IETF_L2VPN(7),
+    /**
+     * <code>DEVICEDRIVER_GNMI_OPENCONFIG = 8;</code>
+     */
+    DEVICEDRIVER_GNMI_OPENCONFIG(8),
     UNRECOGNIZED(-1),
     ;
 
@@ -220,6 +224,10 @@ public final class ContextOuterClass {
      * <code>DEVICEDRIVER_IETF_L2VPN = 7;</code>
      */
     public static final int DEVICEDRIVER_IETF_L2VPN_VALUE = 7;
+    /**
+     * <code>DEVICEDRIVER_GNMI_OPENCONFIG = 8;</code>
+     */
+    public static final int DEVICEDRIVER_GNMI_OPENCONFIG_VALUE = 8;
 
 
     public final int getNumber() {
@@ -254,6 +262,7 @@ public final class ContextOuterClass {
         case 5: return DEVICEDRIVER_ONF_TR_352;
         case 6: return DEVICEDRIVER_XR;
         case 7: return DEVICEDRIVER_IETF_L2VPN;
+        case 8: return DEVICEDRIVER_GNMI_OPENCONFIG;
         default: return null;
       }
     }
@@ -571,13 +580,17 @@ public final class ContextOuterClass {
      */
     SERVICESTATUS_ACTIVE(2),
     /**
-     * <code>SERVICESTATUS_PENDING_REMOVAL = 3;</code>
+     * <code>SERVICESTATUS_UPDATING = 3;</code>
+     */
+    SERVICESTATUS_UPDATING(3),
+    /**
+     * <code>SERVICESTATUS_PENDING_REMOVAL = 4;</code>
      */
-    SERVICESTATUS_PENDING_REMOVAL(3),
+    SERVICESTATUS_PENDING_REMOVAL(4),
     /**
-     * <code>SERVICESTATUS_SLA_VIOLATED = 4;</code>
+     * <code>SERVICESTATUS_SLA_VIOLATED = 5;</code>
      */
-    SERVICESTATUS_SLA_VIOLATED(4),
+    SERVICESTATUS_SLA_VIOLATED(5),
     UNRECOGNIZED(-1),
     ;
 
@@ -594,13 +607,17 @@ public final class ContextOuterClass {
      */
     public static final int SERVICESTATUS_ACTIVE_VALUE = 2;
     /**
-     * <code>SERVICESTATUS_PENDING_REMOVAL = 3;</code>
+     * <code>SERVICESTATUS_UPDATING = 3;</code>
      */
-    public static final int SERVICESTATUS_PENDING_REMOVAL_VALUE = 3;
+    public static final int SERVICESTATUS_UPDATING_VALUE = 3;
     /**
-     * <code>SERVICESTATUS_SLA_VIOLATED = 4;</code>
+     * <code>SERVICESTATUS_PENDING_REMOVAL = 4;</code>
      */
-    public static final int SERVICESTATUS_SLA_VIOLATED_VALUE = 4;
+    public static final int SERVICESTATUS_PENDING_REMOVAL_VALUE = 4;
+    /**
+     * <code>SERVICESTATUS_SLA_VIOLATED = 5;</code>
+     */
+    public static final int SERVICESTATUS_SLA_VIOLATED_VALUE = 5;
 
 
     public final int getNumber() {
@@ -630,8 +647,9 @@ public final class ContextOuterClass {
         case 0: return SERVICESTATUS_UNDEFINED;
         case 1: return SERVICESTATUS_PLANNED;
         case 2: return SERVICESTATUS_ACTIVE;
-        case 3: return SERVICESTATUS_PENDING_REMOVAL;
-        case 4: return SERVICESTATUS_SLA_VIOLATED;
+        case 3: return SERVICESTATUS_UPDATING;
+        case 4: return SERVICESTATUS_PENDING_REMOVAL;
+        case 5: return SERVICESTATUS_SLA_VIOLATED;
         default: return null;
       }
     }
@@ -953,6 +971,127 @@ public final class ContextOuterClass {
     // @@protoc_insertion_point(enum_scope:context.ConfigActionEnum)
   }
 
+  /**
+   * <pre>
+   * ----- Constraint ----------------------------------------------------------------------------------------------------
+   * </pre>
+   *
+   * Protobuf enum {@code context.ConstraintActionEnum}
+   */
+  public enum ConstraintActionEnum
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <code>CONSTRAINTACTION_UNDEFINED = 0;</code>
+     */
+    CONSTRAINTACTION_UNDEFINED(0),
+    /**
+     * <code>CONSTRAINTACTION_SET = 1;</code>
+     */
+    CONSTRAINTACTION_SET(1),
+    /**
+     * <code>CONSTRAINTACTION_DELETE = 2;</code>
+     */
+    CONSTRAINTACTION_DELETE(2),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <code>CONSTRAINTACTION_UNDEFINED = 0;</code>
+     */
+    public static final int CONSTRAINTACTION_UNDEFINED_VALUE = 0;
+    /**
+     * <code>CONSTRAINTACTION_SET = 1;</code>
+     */
+    public static final int CONSTRAINTACTION_SET_VALUE = 1;
+    /**
+     * <code>CONSTRAINTACTION_DELETE = 2;</code>
+     */
+    public static final int CONSTRAINTACTION_DELETE_VALUE = 2;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static ConstraintActionEnum valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static ConstraintActionEnum forNumber(int value) {
+      switch (value) {
+        case 0: return CONSTRAINTACTION_UNDEFINED;
+        case 1: return CONSTRAINTACTION_SET;
+        case 2: return CONSTRAINTACTION_DELETE;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<ConstraintActionEnum>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        ConstraintActionEnum> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<ConstraintActionEnum>() {
+            public ConstraintActionEnum findValueByNumber(int number) {
+              return ConstraintActionEnum.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return context.ContextOuterClass.getDescriptor().getEnumTypes().get(7);
+    }
+
+    private static final ConstraintActionEnum[] VALUES = values();
+
+    public static ConstraintActionEnum valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private ConstraintActionEnum(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:context.ConstraintActionEnum)
+  }
+
   /**
    * Protobuf enum {@code context.IsolationLevelEnum}
    */
@@ -1098,7 +1237,7 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptor() {
-      return context.ContextOuterClass.getDescriptor().getEnumTypes().get(7);
+      return context.ContextOuterClass.getDescriptor().getEnumTypes().get(8);
     }
 
     private static final IsolationLevelEnum[] VALUES = values();
@@ -15540,6 +15679,33 @@ public final class ContextOuterClass {
      */
     context.ContextOuterClass.ComponentOrBuilder getComponentOrBuilder(
         int index);
+
+    /**
+     * <pre>
+     * Identifier of node controlling the actual device
+     * </pre>
+     *
+     * <code>.context.DeviceId controller_id = 9;</code>
+     * @return Whether the controllerId field is set.
+     */
+    boolean hasControllerId();
+    /**
+     * <pre>
+     * Identifier of node controlling the actual device
+     * </pre>
+     *
+     * <code>.context.DeviceId controller_id = 9;</code>
+     * @return The controllerId.
+     */
+    context.ContextOuterClass.DeviceId getControllerId();
+    /**
+     * <pre>
+     * Identifier of node controlling the actual device
+     * </pre>
+     *
+     * <code>.context.DeviceId controller_id = 9;</code>
+     */
+    context.ContextOuterClass.DeviceIdOrBuilder getControllerIdOrBuilder();
   }
   /**
    * Protobuf type {@code context.Device}
@@ -15678,6 +15844,19 @@ public final class ContextOuterClass {
                   input.readMessage(context.ContextOuterClass.Component.parser(), extensionRegistry));
               break;
             }
+            case 74: {
+              context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+              if (controllerId_ != null) {
+                subBuilder = controllerId_.toBuilder();
+              }
+              controllerId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(controllerId_);
+                controllerId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
             default: {
               if (!parseUnknownField(
                   input, unknownFields, extensionRegistry, tag)) {
@@ -16024,6 +16203,44 @@ public final class ContextOuterClass {
       return component_.get(index);
     }
 
+    public static final int CONTROLLER_ID_FIELD_NUMBER = 9;
+    private context.ContextOuterClass.DeviceId controllerId_;
+    /**
+     * <pre>
+     * Identifier of node controlling the actual device
+     * </pre>
+     *
+     * <code>.context.DeviceId controller_id = 9;</code>
+     * @return Whether the controllerId field is set.
+     */
+    @java.lang.Override
+    public boolean hasControllerId() {
+      return controllerId_ != null;
+    }
+    /**
+     * <pre>
+     * Identifier of node controlling the actual device
+     * </pre>
+     *
+     * <code>.context.DeviceId controller_id = 9;</code>
+     * @return The controllerId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceId getControllerId() {
+      return controllerId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : controllerId_;
+    }
+    /**
+     * <pre>
+     * Identifier of node controlling the actual device
+     * </pre>
+     *
+     * <code>.context.DeviceId controller_id = 9;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceIdOrBuilder getControllerIdOrBuilder() {
+      return getControllerId();
+    }
+
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -16067,6 +16284,9 @@ public final class ContextOuterClass {
       for (int i = 0; i < component_.size(); i++) {
         output.writeMessage(8, component_.get(i));
       }
+      if (controllerId_ != null) {
+        output.writeMessage(9, getControllerId());
+      }
       unknownFields.writeTo(output);
     }
 
@@ -16114,6 +16334,10 @@ public final class ContextOuterClass {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(8, component_.get(i));
       }
+      if (controllerId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(9, getControllerId());
+      }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
       return size;
@@ -16149,6 +16373,11 @@ public final class ContextOuterClass {
           .equals(other.getDeviceEndpointsList())) return false;
       if (!getComponentList()
           .equals(other.getComponentList())) return false;
+      if (hasControllerId() != other.hasControllerId()) return false;
+      if (hasControllerId()) {
+        if (!getControllerId()
+            .equals(other.getControllerId())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -16186,6 +16415,10 @@ public final class ContextOuterClass {
         hash = (37 * hash) + COMPONENT_FIELD_NUMBER;
         hash = (53 * hash) + getComponentList().hashCode();
       }
+      if (hasControllerId()) {
+        hash = (37 * hash) + CONTROLLER_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getControllerId().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
@@ -16353,6 +16586,12 @@ public final class ContextOuterClass {
         } else {
           componentBuilder_.clear();
         }
+        if (controllerIdBuilder_ == null) {
+          controllerId_ = null;
+        } else {
+          controllerId_ = null;
+          controllerIdBuilder_ = null;
+        }
         return this;
       }
 
@@ -16416,6 +16655,11 @@ public final class ContextOuterClass {
         } else {
           result.component_ = componentBuilder_.build();
         }
+        if (controllerIdBuilder_ == null) {
+          result.controllerId_ = controllerId_;
+        } else {
+          result.controllerId_ = controllerIdBuilder_.build();
+        }
         onBuilt();
         return result;
       }
@@ -16543,6 +16787,9 @@ public final class ContextOuterClass {
             }
           }
         }
+        if (other.hasControllerId()) {
+          mergeControllerId(other.getControllerId());
+        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -17708,6 +17955,161 @@ public final class ContextOuterClass {
         }
         return componentBuilder_;
       }
+
+      private context.ContextOuterClass.DeviceId controllerId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> controllerIdBuilder_;
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       * @return Whether the controllerId field is set.
+       */
+      public boolean hasControllerId() {
+        return controllerIdBuilder_ != null || controllerId_ != null;
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       * @return The controllerId.
+       */
+      public context.ContextOuterClass.DeviceId getControllerId() {
+        if (controllerIdBuilder_ == null) {
+          return controllerId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : controllerId_;
+        } else {
+          return controllerIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      public Builder setControllerId(context.ContextOuterClass.DeviceId value) {
+        if (controllerIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          controllerId_ = value;
+          onChanged();
+        } else {
+          controllerIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      public Builder setControllerId(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (controllerIdBuilder_ == null) {
+          controllerId_ = builderForValue.build();
+          onChanged();
+        } else {
+          controllerIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      public Builder mergeControllerId(context.ContextOuterClass.DeviceId value) {
+        if (controllerIdBuilder_ == null) {
+          if (controllerId_ != null) {
+            controllerId_ =
+              context.ContextOuterClass.DeviceId.newBuilder(controllerId_).mergeFrom(value).buildPartial();
+          } else {
+            controllerId_ = value;
+          }
+          onChanged();
+        } else {
+          controllerIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      public Builder clearControllerId() {
+        if (controllerIdBuilder_ == null) {
+          controllerId_ = null;
+          onChanged();
+        } else {
+          controllerId_ = null;
+          controllerIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder getControllerIdBuilder() {
+        
+        onChanged();
+        return getControllerIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      public context.ContextOuterClass.DeviceIdOrBuilder getControllerIdOrBuilder() {
+        if (controllerIdBuilder_ != null) {
+          return controllerIdBuilder_.getMessageOrBuilder();
+        } else {
+          return controllerId_ == null ?
+              context.ContextOuterClass.DeviceId.getDefaultInstance() : controllerId_;
+        }
+      }
+      /**
+       * <pre>
+       * Identifier of node controlling the actual device
+       * </pre>
+       *
+       * <code>.context.DeviceId controller_id = 9;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getControllerIdFieldBuilder() {
+        if (controllerIdBuilder_ == null) {
+          controllerIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  getControllerId(),
+                  getParentForChildren(),
+                  isClean());
+          controllerId_ = null;
+        }
+        return controllerIdBuilder_;
+      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -20778,75 +21180,63 @@ public final class ContextOuterClass {
 
   }
 
-  public interface DeviceEventOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
+  public interface DeviceFilterOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.DeviceFilter)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
+     * <code>.context.DeviceIdList device_ids = 1;</code>
+     * @return Whether the deviceIds field is set.
      */
-    boolean hasEvent();
+    boolean hasDeviceIds();
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>.context.DeviceIdList device_ids = 1;</code>
+     * @return The deviceIds.
      */
-    context.ContextOuterClass.Event getEvent();
+    context.ContextOuterClass.DeviceIdList getDeviceIds();
     /**
-     * <code>.context.Event event = 1;</code>
+     * <code>.context.DeviceIdList device_ids = 1;</code>
      */
-    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
+    context.ContextOuterClass.DeviceIdListOrBuilder getDeviceIdsOrBuilder();
 
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return Whether the deviceId field is set.
+     * <code>bool include_endpoints = 2;</code>
+     * @return The includeEndpoints.
      */
-    boolean hasDeviceId();
-    /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return The deviceId.
-     */
-    context.ContextOuterClass.DeviceId getDeviceId();
-    /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     */
-    context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder();
+    boolean getIncludeEndpoints();
 
     /**
-     * <code>.context.DeviceConfig device_config = 3;</code>
-     * @return Whether the deviceConfig field is set.
-     */
-    boolean hasDeviceConfig();
-    /**
-     * <code>.context.DeviceConfig device_config = 3;</code>
-     * @return The deviceConfig.
+     * <code>bool include_config_rules = 3;</code>
+     * @return The includeConfigRules.
      */
-    context.ContextOuterClass.DeviceConfig getDeviceConfig();
+    boolean getIncludeConfigRules();
+
     /**
-     * <code>.context.DeviceConfig device_config = 3;</code>
+     * <code>bool include_components = 4;</code>
+     * @return The includeComponents.
      */
-    context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder();
+    boolean getIncludeComponents();
   }
   /**
-   * Protobuf type {@code context.DeviceEvent}
+   * Protobuf type {@code context.DeviceFilter}
    */
-  public static final class DeviceEvent extends
+  public static final class DeviceFilter extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.DeviceEvent)
-      DeviceEventOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.DeviceFilter)
+      DeviceFilterOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use DeviceEvent.newBuilder() to construct.
-    private DeviceEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use DeviceFilter.newBuilder() to construct.
+    private DeviceFilter(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private DeviceEvent() {
+    private DeviceFilter() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new DeviceEvent();
+      return new DeviceFilter();
     }
 
     @java.lang.Override
@@ -20854,7 +21244,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private DeviceEvent(
+    private DeviceFilter(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -20873,42 +21263,31 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Event.Builder subBuilder = null;
-              if (event_ != null) {
-                subBuilder = event_.toBuilder();
+              context.ContextOuterClass.DeviceIdList.Builder subBuilder = null;
+              if (deviceIds_ != null) {
+                subBuilder = deviceIds_.toBuilder();
               }
-              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+              deviceIds_ = input.readMessage(context.ContextOuterClass.DeviceIdList.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(event_);
-                event_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(deviceIds_);
+                deviceIds_ = subBuilder.buildPartial();
               }
 
               break;
             }
-            case 18: {
-              context.ContextOuterClass.DeviceId.Builder subBuilder = null;
-              if (deviceId_ != null) {
-                subBuilder = deviceId_.toBuilder();
-              }
-              deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(deviceId_);
-                deviceId_ = subBuilder.buildPartial();
-              }
+            case 16: {
 
+              includeEndpoints_ = input.readBool();
               break;
             }
-            case 26: {
-              context.ContextOuterClass.DeviceConfig.Builder subBuilder = null;
-              if (deviceConfig_ != null) {
-                subBuilder = deviceConfig_.toBuilder();
-              }
-              deviceConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(deviceConfig_);
-                deviceConfig_ = subBuilder.buildPartial();
-              }
+            case 24: {
+
+              includeConfigRules_ = input.readBool();
+              break;
+            }
+            case 32: {
 
+              includeComponents_ = input.readBool();
               break;
             }
             default: {
@@ -20932,93 +21311,74 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
+      return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_DeviceEvent_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_DeviceFilter_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.DeviceEvent.class, context.ContextOuterClass.DeviceEvent.Builder.class);
+              context.ContextOuterClass.DeviceFilter.class, context.ContextOuterClass.DeviceFilter.Builder.class);
     }
 
-    public static final int EVENT_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Event event_;
+    public static final int DEVICE_IDS_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.DeviceIdList deviceIds_;
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
+     * <code>.context.DeviceIdList device_ids = 1;</code>
+     * @return Whether the deviceIds field is set.
      */
     @java.lang.Override
-    public boolean hasEvent() {
-      return event_ != null;
+    public boolean hasDeviceIds() {
+      return deviceIds_ != null;
     }
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>.context.DeviceIdList device_ids = 1;</code>
+     * @return The deviceIds.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Event getEvent() {
-      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+    public context.ContextOuterClass.DeviceIdList getDeviceIds() {
+      return deviceIds_ == null ? context.ContextOuterClass.DeviceIdList.getDefaultInstance() : deviceIds_;
     }
     /**
-     * <code>.context.Event event = 1;</code>
+     * <code>.context.DeviceIdList device_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-      return getEvent();
+    public context.ContextOuterClass.DeviceIdListOrBuilder getDeviceIdsOrBuilder() {
+      return getDeviceIds();
     }
 
-    public static final int DEVICE_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.DeviceId deviceId_;
-    /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return Whether the deviceId field is set.
-     */
-    @java.lang.Override
-    public boolean hasDeviceId() {
-      return deviceId_ != null;
-    }
-    /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return The deviceId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.DeviceId getDeviceId() {
-      return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
-    }
+    public static final int INCLUDE_ENDPOINTS_FIELD_NUMBER = 2;
+    private boolean includeEndpoints_;
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
+     * <code>bool include_endpoints = 2;</code>
+     * @return The includeEndpoints.
      */
     @java.lang.Override
-    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-      return getDeviceId();
+    public boolean getIncludeEndpoints() {
+      return includeEndpoints_;
     }
 
-    public static final int DEVICE_CONFIG_FIELD_NUMBER = 3;
-    private context.ContextOuterClass.DeviceConfig deviceConfig_;
-    /**
-     * <code>.context.DeviceConfig device_config = 3;</code>
-     * @return Whether the deviceConfig field is set.
-     */
-    @java.lang.Override
-    public boolean hasDeviceConfig() {
-      return deviceConfig_ != null;
-    }
+    public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 3;
+    private boolean includeConfigRules_;
     /**
-     * <code>.context.DeviceConfig device_config = 3;</code>
-     * @return The deviceConfig.
+     * <code>bool include_config_rules = 3;</code>
+     * @return The includeConfigRules.
      */
     @java.lang.Override
-    public context.ContextOuterClass.DeviceConfig getDeviceConfig() {
-      return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+    public boolean getIncludeConfigRules() {
+      return includeConfigRules_;
     }
+
+    public static final int INCLUDE_COMPONENTS_FIELD_NUMBER = 4;
+    private boolean includeComponents_;
     /**
-     * <code>.context.DeviceConfig device_config = 3;</code>
+     * <code>bool include_components = 4;</code>
+     * @return The includeComponents.
      */
     @java.lang.Override
-    public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
-      return getDeviceConfig();
+    public boolean getIncludeComponents() {
+      return includeComponents_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -21035,14 +21395,17 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (event_ != null) {
-        output.writeMessage(1, getEvent());
+      if (deviceIds_ != null) {
+        output.writeMessage(1, getDeviceIds());
       }
-      if (deviceId_ != null) {
-        output.writeMessage(2, getDeviceId());
+      if (includeEndpoints_ != false) {
+        output.writeBool(2, includeEndpoints_);
       }
-      if (deviceConfig_ != null) {
-        output.writeMessage(3, getDeviceConfig());
+      if (includeConfigRules_ != false) {
+        output.writeBool(3, includeConfigRules_);
+      }
+      if (includeComponents_ != false) {
+        output.writeBool(4, includeComponents_);
       }
       unknownFields.writeTo(output);
     }
@@ -21053,17 +21416,21 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (event_ != null) {
+      if (deviceIds_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEvent());
+          .computeMessageSize(1, getDeviceIds());
       }
-      if (deviceId_ != null) {
+      if (includeEndpoints_ != false) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getDeviceId());
+          .computeBoolSize(2, includeEndpoints_);
       }
-      if (deviceConfig_ != null) {
+      if (includeConfigRules_ != false) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, getDeviceConfig());
+          .computeBoolSize(3, includeConfigRules_);
+      }
+      if (includeComponents_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(4, includeComponents_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -21075,26 +21442,22 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.DeviceEvent)) {
+      if (!(obj instanceof context.ContextOuterClass.DeviceFilter)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.DeviceEvent other = (context.ContextOuterClass.DeviceEvent) obj;
+      context.ContextOuterClass.DeviceFilter other = (context.ContextOuterClass.DeviceFilter) obj;
 
-      if (hasEvent() != other.hasEvent()) return false;
-      if (hasEvent()) {
-        if (!getEvent()
-            .equals(other.getEvent())) return false;
-      }
-      if (hasDeviceId() != other.hasDeviceId()) return false;
-      if (hasDeviceId()) {
-        if (!getDeviceId()
-            .equals(other.getDeviceId())) return false;
-      }
-      if (hasDeviceConfig() != other.hasDeviceConfig()) return false;
-      if (hasDeviceConfig()) {
-        if (!getDeviceConfig()
-            .equals(other.getDeviceConfig())) return false;
+      if (hasDeviceIds() != other.hasDeviceIds()) return false;
+      if (hasDeviceIds()) {
+        if (!getDeviceIds()
+            .equals(other.getDeviceIds())) return false;
       }
+      if (getIncludeEndpoints()
+          != other.getIncludeEndpoints()) return false;
+      if (getIncludeConfigRules()
+          != other.getIncludeConfigRules()) return false;
+      if (getIncludeComponents()
+          != other.getIncludeComponents()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -21106,86 +21469,87 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEvent()) {
-        hash = (37 * hash) + EVENT_FIELD_NUMBER;
-        hash = (53 * hash) + getEvent().hashCode();
-      }
-      if (hasDeviceId()) {
-        hash = (37 * hash) + DEVICE_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getDeviceId().hashCode();
-      }
-      if (hasDeviceConfig()) {
-        hash = (37 * hash) + DEVICE_CONFIG_FIELD_NUMBER;
-        hash = (53 * hash) + getDeviceConfig().hashCode();
+      if (hasDeviceIds()) {
+        hash = (37 * hash) + DEVICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceIds().hashCode();
       }
+      hash = (37 * hash) + INCLUDE_ENDPOINTS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeEndpoints());
+      hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeConfigRules());
+      hash = (37 * hash) + INCLUDE_COMPONENTS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeComponents());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(byte[] data)
+    public static context.ContextOuterClass.DeviceFilter parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.DeviceFilter parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.DeviceEvent parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.DeviceFilter parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.DeviceEvent parseDelimitedFrom(
+    public static context.ContextOuterClass.DeviceFilter parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.DeviceEvent parseFrom(
+    public static context.ContextOuterClass.DeviceFilter parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -21198,7 +21562,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.DeviceEvent prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.DeviceFilter prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -21214,26 +21578,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.DeviceEvent}
+     * Protobuf type {@code context.DeviceFilter}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
-        context.ContextOuterClass.DeviceEventOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.DeviceFilter)
+        context.ContextOuterClass.DeviceFilterOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_DeviceEvent_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_DeviceFilter_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.DeviceEvent.class, context.ContextOuterClass.DeviceEvent.Builder.class);
+                context.ContextOuterClass.DeviceFilter.class, context.ContextOuterClass.DeviceFilter.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.DeviceEvent.newBuilder()
+      // Construct using context.ContextOuterClass.DeviceFilter.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -21251,41 +21615,35 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (eventBuilder_ == null) {
-          event_ = null;
-        } else {
-          event_ = null;
-          eventBuilder_ = null;
-        }
-        if (deviceIdBuilder_ == null) {
-          deviceId_ = null;
-        } else {
-          deviceId_ = null;
-          deviceIdBuilder_ = null;
-        }
-        if (deviceConfigBuilder_ == null) {
-          deviceConfig_ = null;
+        if (deviceIdsBuilder_ == null) {
+          deviceIds_ = null;
         } else {
-          deviceConfig_ = null;
-          deviceConfigBuilder_ = null;
+          deviceIds_ = null;
+          deviceIdsBuilder_ = null;
         }
+        includeEndpoints_ = false;
+
+        includeConfigRules_ = false;
+
+        includeComponents_ = false;
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_DeviceFilter_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.DeviceEvent getDefaultInstanceForType() {
-        return context.ContextOuterClass.DeviceEvent.getDefaultInstance();
+      public context.ContextOuterClass.DeviceFilter getDefaultInstanceForType() {
+        return context.ContextOuterClass.DeviceFilter.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.DeviceEvent build() {
-        context.ContextOuterClass.DeviceEvent result = buildPartial();
+      public context.ContextOuterClass.DeviceFilter build() {
+        context.ContextOuterClass.DeviceFilter result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -21293,23 +21651,16 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.DeviceEvent buildPartial() {
-        context.ContextOuterClass.DeviceEvent result = new context.ContextOuterClass.DeviceEvent(this);
-        if (eventBuilder_ == null) {
-          result.event_ = event_;
-        } else {
-          result.event_ = eventBuilder_.build();
-        }
-        if (deviceIdBuilder_ == null) {
-          result.deviceId_ = deviceId_;
-        } else {
-          result.deviceId_ = deviceIdBuilder_.build();
-        }
-        if (deviceConfigBuilder_ == null) {
-          result.deviceConfig_ = deviceConfig_;
+      public context.ContextOuterClass.DeviceFilter buildPartial() {
+        context.ContextOuterClass.DeviceFilter result = new context.ContextOuterClass.DeviceFilter(this);
+        if (deviceIdsBuilder_ == null) {
+          result.deviceIds_ = deviceIds_;
         } else {
-          result.deviceConfig_ = deviceConfigBuilder_.build();
+          result.deviceIds_ = deviceIdsBuilder_.build();
         }
+        result.includeEndpoints_ = includeEndpoints_;
+        result.includeConfigRules_ = includeConfigRules_;
+        result.includeComponents_ = includeComponents_;
         onBuilt();
         return result;
       }
@@ -21348,24 +21699,27 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.DeviceEvent) {
-          return mergeFrom((context.ContextOuterClass.DeviceEvent)other);
+        if (other instanceof context.ContextOuterClass.DeviceFilter) {
+          return mergeFrom((context.ContextOuterClass.DeviceFilter)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.DeviceEvent other) {
-        if (other == context.ContextOuterClass.DeviceEvent.getDefaultInstance()) return this;
-        if (other.hasEvent()) {
-          mergeEvent(other.getEvent());
+      public Builder mergeFrom(context.ContextOuterClass.DeviceFilter other) {
+        if (other == context.ContextOuterClass.DeviceFilter.getDefaultInstance()) return this;
+        if (other.hasDeviceIds()) {
+          mergeDeviceIds(other.getDeviceIds());
         }
-        if (other.hasDeviceId()) {
-          mergeDeviceId(other.getDeviceId());
+        if (other.getIncludeEndpoints() != false) {
+          setIncludeEndpoints(other.getIncludeEndpoints());
         }
-        if (other.hasDeviceConfig()) {
-          mergeDeviceConfig(other.getDeviceConfig());
+        if (other.getIncludeConfigRules() != false) {
+          setIncludeConfigRules(other.getIncludeConfigRules());
+        }
+        if (other.getIncludeComponents() != false) {
+          setIncludeComponents(other.getIncludeComponents());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -21382,11 +21736,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.DeviceEvent parsedMessage = null;
+        context.ContextOuterClass.DeviceFilter parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.DeviceEvent) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.DeviceFilter) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -21396,361 +21750,216 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.Event event_;
+      private context.ContextOuterClass.DeviceIdList deviceIds_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
+          context.ContextOuterClass.DeviceIdList, context.ContextOuterClass.DeviceIdList.Builder, context.ContextOuterClass.DeviceIdListOrBuilder> deviceIdsBuilder_;
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return Whether the event field is set.
+       * <code>.context.DeviceIdList device_ids = 1;</code>
+       * @return Whether the deviceIds field is set.
        */
-      public boolean hasEvent() {
-        return eventBuilder_ != null || event_ != null;
+      public boolean hasDeviceIds() {
+        return deviceIdsBuilder_ != null || deviceIds_ != null;
       }
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return The event.
+       * <code>.context.DeviceIdList device_ids = 1;</code>
+       * @return The deviceIds.
        */
-      public context.ContextOuterClass.Event getEvent() {
-        if (eventBuilder_ == null) {
-          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+      public context.ContextOuterClass.DeviceIdList getDeviceIds() {
+        if (deviceIdsBuilder_ == null) {
+          return deviceIds_ == null ? context.ContextOuterClass.DeviceIdList.getDefaultInstance() : deviceIds_;
         } else {
-          return eventBuilder_.getMessage();
+          return deviceIdsBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
-      public Builder setEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
+      public Builder setDeviceIds(context.ContextOuterClass.DeviceIdList value) {
+        if (deviceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          event_ = value;
+          deviceIds_ = value;
           onChanged();
         } else {
-          eventBuilder_.setMessage(value);
+          deviceIdsBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
-      public Builder setEvent(
-          context.ContextOuterClass.Event.Builder builderForValue) {
-        if (eventBuilder_ == null) {
-          event_ = builderForValue.build();
+      public Builder setDeviceIds(
+          context.ContextOuterClass.DeviceIdList.Builder builderForValue) {
+        if (deviceIdsBuilder_ == null) {
+          deviceIds_ = builderForValue.build();
           onChanged();
         } else {
-          eventBuilder_.setMessage(builderForValue.build());
+          deviceIdsBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
-      public Builder mergeEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
-          if (event_ != null) {
-            event_ =
-              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
+      public Builder mergeDeviceIds(context.ContextOuterClass.DeviceIdList value) {
+        if (deviceIdsBuilder_ == null) {
+          if (deviceIds_ != null) {
+            deviceIds_ =
+              context.ContextOuterClass.DeviceIdList.newBuilder(deviceIds_).mergeFrom(value).buildPartial();
           } else {
-            event_ = value;
+            deviceIds_ = value;
           }
           onChanged();
         } else {
-          eventBuilder_.mergeFrom(value);
+          deviceIdsBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
-      public Builder clearEvent() {
-        if (eventBuilder_ == null) {
-          event_ = null;
+      public Builder clearDeviceIds() {
+        if (deviceIdsBuilder_ == null) {
+          deviceIds_ = null;
           onChanged();
         } else {
-          event_ = null;
-          eventBuilder_ = null;
+          deviceIds_ = null;
+          deviceIdsBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
-      public context.ContextOuterClass.Event.Builder getEventBuilder() {
+      public context.ContextOuterClass.DeviceIdList.Builder getDeviceIdsBuilder() {
         
         onChanged();
-        return getEventFieldBuilder().getBuilder();
+        return getDeviceIdsFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
-      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-        if (eventBuilder_ != null) {
-          return eventBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.DeviceIdListOrBuilder getDeviceIdsOrBuilder() {
+        if (deviceIdsBuilder_ != null) {
+          return deviceIdsBuilder_.getMessageOrBuilder();
         } else {
-          return event_ == null ?
-              context.ContextOuterClass.Event.getDefaultInstance() : event_;
+          return deviceIds_ == null ?
+              context.ContextOuterClass.DeviceIdList.getDefaultInstance() : deviceIds_;
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.DeviceIdList device_ids = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
-          getEventFieldBuilder() {
-        if (eventBuilder_ == null) {
-          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
-                  getEvent(),
+          context.ContextOuterClass.DeviceIdList, context.ContextOuterClass.DeviceIdList.Builder, context.ContextOuterClass.DeviceIdListOrBuilder> 
+          getDeviceIdsFieldBuilder() {
+        if (deviceIdsBuilder_ == null) {
+          deviceIdsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.DeviceIdList, context.ContextOuterClass.DeviceIdList.Builder, context.ContextOuterClass.DeviceIdListOrBuilder>(
+                  getDeviceIds(),
                   getParentForChildren(),
                   isClean());
-          event_ = null;
+          deviceIds_ = null;
         }
-        return eventBuilder_;
+        return deviceIdsBuilder_;
       }
 
-      private context.ContextOuterClass.DeviceId deviceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceIdBuilder_;
-      /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       * @return Whether the deviceId field is set.
-       */
-      public boolean hasDeviceId() {
-        return deviceIdBuilder_ != null || deviceId_ != null;
-      }
+      private boolean includeEndpoints_ ;
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       * @return The deviceId.
+       * <code>bool include_endpoints = 2;</code>
+       * @return The includeEndpoints.
        */
-      public context.ContextOuterClass.DeviceId getDeviceId() {
-        if (deviceIdBuilder_ == null) {
-          return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
-        } else {
-          return deviceIdBuilder_.getMessage();
-        }
+      @java.lang.Override
+      public boolean getIncludeEndpoints() {
+        return includeEndpoints_;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>bool include_endpoints = 2;</code>
+       * @param value The includeEndpoints to set.
+       * @return This builder for chaining.
        */
-      public Builder setDeviceId(context.ContextOuterClass.DeviceId value) {
-        if (deviceIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          deviceId_ = value;
-          onChanged();
-        } else {
-          deviceIdBuilder_.setMessage(value);
-        }
-
+      public Builder setIncludeEndpoints(boolean value) {
+        
+        includeEndpoints_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>bool include_endpoints = 2;</code>
+       * @return This builder for chaining.
        */
-      public Builder setDeviceId(
-          context.ContextOuterClass.DeviceId.Builder builderForValue) {
-        if (deviceIdBuilder_ == null) {
-          deviceId_ = builderForValue.build();
-          onChanged();
-        } else {
-          deviceIdBuilder_.setMessage(builderForValue.build());
-        }
-
+      public Builder clearIncludeEndpoints() {
+        
+        includeEndpoints_ = false;
+        onChanged();
         return this;
       }
-      /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       */
-      public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
-        if (deviceIdBuilder_ == null) {
-          if (deviceId_ != null) {
-            deviceId_ =
-              context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
-          } else {
-            deviceId_ = value;
-          }
-          onChanged();
-        } else {
-          deviceIdBuilder_.mergeFrom(value);
-        }
 
-        return this;
-      }
+      private boolean includeConfigRules_ ;
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>bool include_config_rules = 3;</code>
+       * @return The includeConfigRules.
        */
-      public Builder clearDeviceId() {
-        if (deviceIdBuilder_ == null) {
-          deviceId_ = null;
-          onChanged();
-        } else {
-          deviceId_ = null;
-          deviceIdBuilder_ = null;
-        }
-
-        return this;
+      @java.lang.Override
+      public boolean getIncludeConfigRules() {
+        return includeConfigRules_;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>bool include_config_rules = 3;</code>
+       * @param value The includeConfigRules to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
+      public Builder setIncludeConfigRules(boolean value) {
         
+        includeConfigRules_ = value;
         onChanged();
-        return getDeviceIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       */
-      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-        if (deviceIdBuilder_ != null) {
-          return deviceIdBuilder_.getMessageOrBuilder();
-        } else {
-          return deviceId_ == null ?
-              context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
-        }
-      }
-      /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
-          getDeviceIdFieldBuilder() {
-        if (deviceIdBuilder_ == null) {
-          deviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
-                  getDeviceId(),
-                  getParentForChildren(),
-                  isClean());
-          deviceId_ = null;
-        }
-        return deviceIdBuilder_;
-      }
-
-      private context.ContextOuterClass.DeviceConfig deviceConfig_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.DeviceConfig, context.ContextOuterClass.DeviceConfig.Builder, context.ContextOuterClass.DeviceConfigOrBuilder> deviceConfigBuilder_;
-      /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
-       * @return Whether the deviceConfig field is set.
-       */
-      public boolean hasDeviceConfig() {
-        return deviceConfigBuilder_ != null || deviceConfig_ != null;
-      }
-      /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
-       * @return The deviceConfig.
-       */
-      public context.ContextOuterClass.DeviceConfig getDeviceConfig() {
-        if (deviceConfigBuilder_ == null) {
-          return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
-        } else {
-          return deviceConfigBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
-       */
-      public Builder setDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
-        if (deviceConfigBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          deviceConfig_ = value;
-          onChanged();
-        } else {
-          deviceConfigBuilder_.setMessage(value);
-        }
-
         return this;
       }
       /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
+       * <code>bool include_config_rules = 3;</code>
+       * @return This builder for chaining.
        */
-      public Builder setDeviceConfig(
-          context.ContextOuterClass.DeviceConfig.Builder builderForValue) {
-        if (deviceConfigBuilder_ == null) {
-          deviceConfig_ = builderForValue.build();
-          onChanged();
-        } else {
-          deviceConfigBuilder_.setMessage(builderForValue.build());
-        }
-
+      public Builder clearIncludeConfigRules() {
+        
+        includeConfigRules_ = false;
+        onChanged();
         return this;
       }
-      /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
-       */
-      public Builder mergeDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
-        if (deviceConfigBuilder_ == null) {
-          if (deviceConfig_ != null) {
-            deviceConfig_ =
-              context.ContextOuterClass.DeviceConfig.newBuilder(deviceConfig_).mergeFrom(value).buildPartial();
-          } else {
-            deviceConfig_ = value;
-          }
-          onChanged();
-        } else {
-          deviceConfigBuilder_.mergeFrom(value);
-        }
 
-        return this;
-      }
+      private boolean includeComponents_ ;
       /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
+       * <code>bool include_components = 4;</code>
+       * @return The includeComponents.
        */
-      public Builder clearDeviceConfig() {
-        if (deviceConfigBuilder_ == null) {
-          deviceConfig_ = null;
-          onChanged();
-        } else {
-          deviceConfig_ = null;
-          deviceConfigBuilder_ = null;
-        }
-
-        return this;
+      @java.lang.Override
+      public boolean getIncludeComponents() {
+        return includeComponents_;
       }
       /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
+       * <code>bool include_components = 4;</code>
+       * @param value The includeComponents to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.DeviceConfig.Builder getDeviceConfigBuilder() {
+      public Builder setIncludeComponents(boolean value) {
         
+        includeComponents_ = value;
         onChanged();
-        return getDeviceConfigFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
-       */
-      public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
-        if (deviceConfigBuilder_ != null) {
-          return deviceConfigBuilder_.getMessageOrBuilder();
-        } else {
-          return deviceConfig_ == null ?
-              context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
-        }
+        return this;
       }
       /**
-       * <code>.context.DeviceConfig device_config = 3;</code>
+       * <code>bool include_components = 4;</code>
+       * @return This builder for chaining.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.DeviceConfig, context.ContextOuterClass.DeviceConfig.Builder, context.ContextOuterClass.DeviceConfigOrBuilder> 
-          getDeviceConfigFieldBuilder() {
-        if (deviceConfigBuilder_ == null) {
-          deviceConfigBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.DeviceConfig, context.ContextOuterClass.DeviceConfig.Builder, context.ContextOuterClass.DeviceConfigOrBuilder>(
-                  getDeviceConfig(),
-                  getParentForChildren(),
-                  isClean());
-          deviceConfig_ = null;
-        }
-        return deviceConfigBuilder_;
+      public Builder clearIncludeComponents() {
+        
+        includeComponents_ = false;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -21765,89 +21974,115 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.DeviceEvent)
+      // @@protoc_insertion_point(builder_scope:context.DeviceFilter)
     }
 
-    // @@protoc_insertion_point(class_scope:context.DeviceEvent)
-    private static final context.ContextOuterClass.DeviceEvent DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.DeviceFilter)
+    private static final context.ContextOuterClass.DeviceFilter DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.DeviceEvent();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.DeviceFilter();
     }
 
-    public static context.ContextOuterClass.DeviceEvent getDefaultInstance() {
+    public static context.ContextOuterClass.DeviceFilter getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<DeviceEvent>
-        PARSER = new com.google.protobuf.AbstractParser<DeviceEvent>() {
+    private static final com.google.protobuf.Parser<DeviceFilter>
+        PARSER = new com.google.protobuf.AbstractParser<DeviceFilter>() {
       @java.lang.Override
-      public DeviceEvent parsePartialFrom(
+      public DeviceFilter parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new DeviceEvent(input, extensionRegistry);
+        return new DeviceFilter(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<DeviceEvent> parser() {
+    public static com.google.protobuf.Parser<DeviceFilter> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<DeviceEvent> getParserForType() {
+    public com.google.protobuf.Parser<DeviceFilter> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.DeviceEvent getDefaultInstanceForType() {
+    public context.ContextOuterClass.DeviceFilter getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface LinkIdOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.LinkId)
+  public interface DeviceEventOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.DeviceEvent)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Uuid link_uuid = 1;</code>
-     * @return Whether the linkUuid field is set.
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
-    boolean hasLinkUuid();
+    boolean hasEvent();
     /**
-     * <code>.context.Uuid link_uuid = 1;</code>
-     * @return The linkUuid.
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
-    context.ContextOuterClass.Uuid getLinkUuid();
+    context.ContextOuterClass.Event getEvent();
     /**
-     * <code>.context.Uuid link_uuid = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
-    context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder();
-  }
-  /**
-   * <pre>
-   * ----- Link ----------------------------------------------------------------------------------------------------------
-   * </pre>
-   *
-   * Protobuf type {@code context.LinkId}
-   */
-  public static final class LinkId extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.LinkId)
-      LinkIdOrBuilder {
-  private static final long serialVersionUID = 0L;
-    // Use LinkId.newBuilder() to construct.
-    private LinkId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
+
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return Whether the deviceId field is set.
+     */
+    boolean hasDeviceId();
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return The deviceId.
+     */
+    context.ContextOuterClass.DeviceId getDeviceId();
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     */
+    context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder();
+
+    /**
+     * <code>.context.DeviceConfig device_config = 3;</code>
+     * @return Whether the deviceConfig field is set.
+     */
+    boolean hasDeviceConfig();
+    /**
+     * <code>.context.DeviceConfig device_config = 3;</code>
+     * @return The deviceConfig.
+     */
+    context.ContextOuterClass.DeviceConfig getDeviceConfig();
+    /**
+     * <code>.context.DeviceConfig device_config = 3;</code>
+     */
+    context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder();
+  }
+  /**
+   * Protobuf type {@code context.DeviceEvent}
+   */
+  public static final class DeviceEvent extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.DeviceEvent)
+      DeviceEventOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use DeviceEvent.newBuilder() to construct.
+    private DeviceEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private LinkId() {
+    private DeviceEvent() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new LinkId();
+      return new DeviceEvent();
     }
 
     @java.lang.Override
@@ -21855,7 +22090,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private LinkId(
+    private DeviceEvent(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -21874,14 +22109,40 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Uuid.Builder subBuilder = null;
-              if (linkUuid_ != null) {
-                subBuilder = linkUuid_.toBuilder();
+              context.ContextOuterClass.Event.Builder subBuilder = null;
+              if (event_ != null) {
+                subBuilder = event_.toBuilder();
               }
-              linkUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(linkUuid_);
-                linkUuid_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(event_);
+                event_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+              if (deviceId_ != null) {
+                subBuilder = deviceId_.toBuilder();
+              }
+              deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(deviceId_);
+                deviceId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 26: {
+              context.ContextOuterClass.DeviceConfig.Builder subBuilder = null;
+              if (deviceConfig_ != null) {
+                subBuilder = deviceConfig_.toBuilder();
+              }
+              deviceConfig_ = input.readMessage(context.ContextOuterClass.DeviceConfig.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(deviceConfig_);
+                deviceConfig_ = subBuilder.buildPartial();
               }
 
               break;
@@ -21907,41 +22168,93 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
+      return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_LinkId_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_DeviceEvent_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.LinkId.class, context.ContextOuterClass.LinkId.Builder.class);
+              context.ContextOuterClass.DeviceEvent.class, context.ContextOuterClass.DeviceEvent.Builder.class);
     }
 
-    public static final int LINK_UUID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Uuid linkUuid_;
+    public static final int EVENT_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Event event_;
     /**
-     * <code>.context.Uuid link_uuid = 1;</code>
-     * @return Whether the linkUuid field is set.
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
     @java.lang.Override
-    public boolean hasLinkUuid() {
-      return linkUuid_ != null;
+    public boolean hasEvent() {
+      return event_ != null;
     }
     /**
-     * <code>.context.Uuid link_uuid = 1;</code>
-     * @return The linkUuid.
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Uuid getLinkUuid() {
-      return linkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
+    public context.ContextOuterClass.Event getEvent() {
+      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
     }
     /**
-     * <code>.context.Uuid link_uuid = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder() {
-      return getLinkUuid();
+    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+      return getEvent();
+    }
+
+    public static final int DEVICE_ID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.DeviceId deviceId_;
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return Whether the deviceId field is set.
+     */
+    @java.lang.Override
+    public boolean hasDeviceId() {
+      return deviceId_ != null;
+    }
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return The deviceId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceId getDeviceId() {
+      return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+    }
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
+      return getDeviceId();
+    }
+
+    public static final int DEVICE_CONFIG_FIELD_NUMBER = 3;
+    private context.ContextOuterClass.DeviceConfig deviceConfig_;
+    /**
+     * <code>.context.DeviceConfig device_config = 3;</code>
+     * @return Whether the deviceConfig field is set.
+     */
+    @java.lang.Override
+    public boolean hasDeviceConfig() {
+      return deviceConfig_ != null;
+    }
+    /**
+     * <code>.context.DeviceConfig device_config = 3;</code>
+     * @return The deviceConfig.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceConfig getDeviceConfig() {
+      return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+    }
+    /**
+     * <code>.context.DeviceConfig device_config = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
+      return getDeviceConfig();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -21958,8 +22271,14 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (linkUuid_ != null) {
-        output.writeMessage(1, getLinkUuid());
+      if (event_ != null) {
+        output.writeMessage(1, getEvent());
+      }
+      if (deviceId_ != null) {
+        output.writeMessage(2, getDeviceId());
+      }
+      if (deviceConfig_ != null) {
+        output.writeMessage(3, getDeviceConfig());
       }
       unknownFields.writeTo(output);
     }
@@ -21970,9 +22289,17 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (linkUuid_ != null) {
+      if (event_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getLinkUuid());
+          .computeMessageSize(1, getEvent());
+      }
+      if (deviceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getDeviceId());
+      }
+      if (deviceConfig_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getDeviceConfig());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -21984,15 +22311,25 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.LinkId)) {
+      if (!(obj instanceof context.ContextOuterClass.DeviceEvent)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.LinkId other = (context.ContextOuterClass.LinkId) obj;
+      context.ContextOuterClass.DeviceEvent other = (context.ContextOuterClass.DeviceEvent) obj;
 
-      if (hasLinkUuid() != other.hasLinkUuid()) return false;
-      if (hasLinkUuid()) {
-        if (!getLinkUuid()
-            .equals(other.getLinkUuid())) return false;
+      if (hasEvent() != other.hasEvent()) return false;
+      if (hasEvent()) {
+        if (!getEvent()
+            .equals(other.getEvent())) return false;
+      }
+      if (hasDeviceId() != other.hasDeviceId()) return false;
+      if (hasDeviceId()) {
+        if (!getDeviceId()
+            .equals(other.getDeviceId())) return false;
+      }
+      if (hasDeviceConfig() != other.hasDeviceConfig()) return false;
+      if (hasDeviceConfig()) {
+        if (!getDeviceConfig()
+            .equals(other.getDeviceConfig())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -22005,78 +22342,86 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasLinkUuid()) {
-        hash = (37 * hash) + LINK_UUID_FIELD_NUMBER;
-        hash = (53 * hash) + getLinkUuid().hashCode();
+      if (hasEvent()) {
+        hash = (37 * hash) + EVENT_FIELD_NUMBER;
+        hash = (53 * hash) + getEvent().hashCode();
+      }
+      if (hasDeviceId()) {
+        hash = (37 * hash) + DEVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceId().hashCode();
+      }
+      if (hasDeviceConfig()) {
+        hash = (37 * hash) + DEVICE_CONFIG_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceConfig().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(byte[] data)
+    public static context.ContextOuterClass.DeviceEvent parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.DeviceEvent parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkId parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.DeviceEvent parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkId parseDelimitedFrom(
+    public static context.ContextOuterClass.DeviceEvent parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkId parseFrom(
+    public static context.ContextOuterClass.DeviceEvent parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -22089,7 +22434,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.LinkId prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.DeviceEvent prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -22105,30 +22450,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * <pre>
-     * ----- Link ----------------------------------------------------------------------------------------------------------
-     * </pre>
-     *
-     * Protobuf type {@code context.LinkId}
+     * Protobuf type {@code context.DeviceEvent}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.LinkId)
-        context.ContextOuterClass.LinkIdOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.DeviceEvent)
+        context.ContextOuterClass.DeviceEventOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
+        return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_LinkId_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_DeviceEvent_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.LinkId.class, context.ContextOuterClass.LinkId.Builder.class);
+                context.ContextOuterClass.DeviceEvent.class, context.ContextOuterClass.DeviceEvent.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.LinkId.newBuilder()
+      // Construct using context.ContextOuterClass.DeviceEvent.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -22146,11 +22487,23 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (linkUuidBuilder_ == null) {
-          linkUuid_ = null;
+        if (eventBuilder_ == null) {
+          event_ = null;
         } else {
-          linkUuid_ = null;
-          linkUuidBuilder_ = null;
+          event_ = null;
+          eventBuilder_ = null;
+        }
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = null;
+        } else {
+          deviceId_ = null;
+          deviceIdBuilder_ = null;
+        }
+        if (deviceConfigBuilder_ == null) {
+          deviceConfig_ = null;
+        } else {
+          deviceConfig_ = null;
+          deviceConfigBuilder_ = null;
         }
         return this;
       }
@@ -22158,17 +22511,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
+        return context.ContextOuterClass.internal_static_context_DeviceEvent_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkId getDefaultInstanceForType() {
-        return context.ContextOuterClass.LinkId.getDefaultInstance();
+      public context.ContextOuterClass.DeviceEvent getDefaultInstanceForType() {
+        return context.ContextOuterClass.DeviceEvent.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkId build() {
-        context.ContextOuterClass.LinkId result = buildPartial();
+      public context.ContextOuterClass.DeviceEvent build() {
+        context.ContextOuterClass.DeviceEvent result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -22176,12 +22529,22 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkId buildPartial() {
-        context.ContextOuterClass.LinkId result = new context.ContextOuterClass.LinkId(this);
-        if (linkUuidBuilder_ == null) {
-          result.linkUuid_ = linkUuid_;
+      public context.ContextOuterClass.DeviceEvent buildPartial() {
+        context.ContextOuterClass.DeviceEvent result = new context.ContextOuterClass.DeviceEvent(this);
+        if (eventBuilder_ == null) {
+          result.event_ = event_;
         } else {
-          result.linkUuid_ = linkUuidBuilder_.build();
+          result.event_ = eventBuilder_.build();
+        }
+        if (deviceIdBuilder_ == null) {
+          result.deviceId_ = deviceId_;
+        } else {
+          result.deviceId_ = deviceIdBuilder_.build();
+        }
+        if (deviceConfigBuilder_ == null) {
+          result.deviceConfig_ = deviceConfig_;
+        } else {
+          result.deviceConfig_ = deviceConfigBuilder_.build();
         }
         onBuilt();
         return result;
@@ -22221,18 +22584,24 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.LinkId) {
-          return mergeFrom((context.ContextOuterClass.LinkId)other);
+        if (other instanceof context.ContextOuterClass.DeviceEvent) {
+          return mergeFrom((context.ContextOuterClass.DeviceEvent)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.LinkId other) {
-        if (other == context.ContextOuterClass.LinkId.getDefaultInstance()) return this;
-        if (other.hasLinkUuid()) {
-          mergeLinkUuid(other.getLinkUuid());
+      public Builder mergeFrom(context.ContextOuterClass.DeviceEvent other) {
+        if (other == context.ContextOuterClass.DeviceEvent.getDefaultInstance()) return this;
+        if (other.hasEvent()) {
+          mergeEvent(other.getEvent());
+        }
+        if (other.hasDeviceId()) {
+          mergeDeviceId(other.getDeviceId());
+        }
+        if (other.hasDeviceConfig()) {
+          mergeDeviceConfig(other.getDeviceConfig());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -22249,11 +22618,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.LinkId parsedMessage = null;
+        context.ContextOuterClass.DeviceEvent parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.LinkId) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.DeviceEvent) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -22263,254 +22632,458 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.Uuid linkUuid_;
+      private context.ContextOuterClass.Event event_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> linkUuidBuilder_;
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
-       * @return Whether the linkUuid field is set.
+       * <code>.context.Event event = 1;</code>
+       * @return Whether the event field is set.
        */
-      public boolean hasLinkUuid() {
-        return linkUuidBuilder_ != null || linkUuid_ != null;
+      public boolean hasEvent() {
+        return eventBuilder_ != null || event_ != null;
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
-       * @return The linkUuid.
+       * <code>.context.Event event = 1;</code>
+       * @return The event.
        */
-      public context.ContextOuterClass.Uuid getLinkUuid() {
-        if (linkUuidBuilder_ == null) {
-          return linkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
+      public context.ContextOuterClass.Event getEvent() {
+        if (eventBuilder_ == null) {
+          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
         } else {
-          return linkUuidBuilder_.getMessage();
+          return eventBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setLinkUuid(context.ContextOuterClass.Uuid value) {
-        if (linkUuidBuilder_ == null) {
+      public Builder setEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          linkUuid_ = value;
+          event_ = value;
           onChanged();
         } else {
-          linkUuidBuilder_.setMessage(value);
+          eventBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setLinkUuid(
-          context.ContextOuterClass.Uuid.Builder builderForValue) {
-        if (linkUuidBuilder_ == null) {
-          linkUuid_ = builderForValue.build();
+      public Builder setEvent(
+          context.ContextOuterClass.Event.Builder builderForValue) {
+        if (eventBuilder_ == null) {
+          event_ = builderForValue.build();
           onChanged();
         } else {
-          linkUuidBuilder_.setMessage(builderForValue.build());
+          eventBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder mergeLinkUuid(context.ContextOuterClass.Uuid value) {
-        if (linkUuidBuilder_ == null) {
-          if (linkUuid_ != null) {
-            linkUuid_ =
-              context.ContextOuterClass.Uuid.newBuilder(linkUuid_).mergeFrom(value).buildPartial();
+      public Builder mergeEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
+          if (event_ != null) {
+            event_ =
+              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
           } else {
-            linkUuid_ = value;
+            event_ = value;
           }
           onChanged();
         } else {
-          linkUuidBuilder_.mergeFrom(value);
+          eventBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder clearLinkUuid() {
-        if (linkUuidBuilder_ == null) {
-          linkUuid_ = null;
+      public Builder clearEvent() {
+        if (eventBuilder_ == null) {
+          event_ = null;
           onChanged();
         } else {
-          linkUuid_ = null;
-          linkUuidBuilder_ = null;
+          event_ = null;
+          eventBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public context.ContextOuterClass.Uuid.Builder getLinkUuidBuilder() {
+      public context.ContextOuterClass.Event.Builder getEventBuilder() {
         
         onChanged();
-        return getLinkUuidFieldBuilder().getBuilder();
+        return getEventFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder() {
-        if (linkUuidBuilder_ != null) {
-          return linkUuidBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+        if (eventBuilder_ != null) {
+          return eventBuilder_.getMessageOrBuilder();
         } else {
-          return linkUuid_ == null ?
-              context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
+          return event_ == null ?
+              context.ContextOuterClass.Event.getDefaultInstance() : event_;
         }
       }
       /**
-       * <code>.context.Uuid link_uuid = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
-          getLinkUuidFieldBuilder() {
-        if (linkUuidBuilder_ == null) {
-          linkUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
-                  getLinkUuid(),
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
+          getEventFieldBuilder() {
+        if (eventBuilder_ == null) {
+          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
+                  getEvent(),
                   getParentForChildren(),
                   isClean());
-          linkUuid_ = null;
+          event_ = null;
         }
-        return linkUuidBuilder_;
-      }
-      @java.lang.Override
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
+        return eventBuilder_;
       }
 
-      @java.lang.Override
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
+      private context.ContextOuterClass.DeviceId deviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceIdBuilder_;
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       * @return Whether the deviceId field is set.
+       */
+      public boolean hasDeviceId() {
+        return deviceIdBuilder_ != null || deviceId_ != null;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       * @return The deviceId.
+       */
+      public context.ContextOuterClass.DeviceId getDeviceId() {
+        if (deviceIdBuilder_ == null) {
+          return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+        } else {
+          return deviceIdBuilder_.getMessage();
+        }
       }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public Builder setDeviceId(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          deviceId_ = value;
+          onChanged();
+        } else {
+          deviceIdBuilder_.setMessage(value);
+        }
 
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public Builder setDeviceId(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          deviceIdBuilder_.setMessage(builderForValue.build());
+        }
 
-      // @@protoc_insertion_point(builder_scope:context.LinkId)
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdBuilder_ == null) {
+          if (deviceId_ != null) {
+            deviceId_ =
+              context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
+          } else {
+            deviceId_ = value;
+          }
+          onChanged();
+        } else {
+          deviceIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public Builder clearDeviceId() {
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = null;
+          onChanged();
+        } else {
+          deviceId_ = null;
+          deviceIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
+        
+        onChanged();
+        return getDeviceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
+        if (deviceIdBuilder_ != null) {
+          return deviceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return deviceId_ == null ?
+              context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+        }
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getDeviceIdFieldBuilder() {
+        if (deviceIdBuilder_ == null) {
+          deviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  getDeviceId(),
+                  getParentForChildren(),
+                  isClean());
+          deviceId_ = null;
+        }
+        return deviceIdBuilder_;
+      }
+
+      private context.ContextOuterClass.DeviceConfig deviceConfig_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceConfig, context.ContextOuterClass.DeviceConfig.Builder, context.ContextOuterClass.DeviceConfigOrBuilder> deviceConfigBuilder_;
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       * @return Whether the deviceConfig field is set.
+       */
+      public boolean hasDeviceConfig() {
+        return deviceConfigBuilder_ != null || deviceConfig_ != null;
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       * @return The deviceConfig.
+       */
+      public context.ContextOuterClass.DeviceConfig getDeviceConfig() {
+        if (deviceConfigBuilder_ == null) {
+          return deviceConfig_ == null ? context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+        } else {
+          return deviceConfigBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      public Builder setDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
+        if (deviceConfigBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          deviceConfig_ = value;
+          onChanged();
+        } else {
+          deviceConfigBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      public Builder setDeviceConfig(
+          context.ContextOuterClass.DeviceConfig.Builder builderForValue) {
+        if (deviceConfigBuilder_ == null) {
+          deviceConfig_ = builderForValue.build();
+          onChanged();
+        } else {
+          deviceConfigBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      public Builder mergeDeviceConfig(context.ContextOuterClass.DeviceConfig value) {
+        if (deviceConfigBuilder_ == null) {
+          if (deviceConfig_ != null) {
+            deviceConfig_ =
+              context.ContextOuterClass.DeviceConfig.newBuilder(deviceConfig_).mergeFrom(value).buildPartial();
+          } else {
+            deviceConfig_ = value;
+          }
+          onChanged();
+        } else {
+          deviceConfigBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      public Builder clearDeviceConfig() {
+        if (deviceConfigBuilder_ == null) {
+          deviceConfig_ = null;
+          onChanged();
+        } else {
+          deviceConfig_ = null;
+          deviceConfigBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceConfig.Builder getDeviceConfigBuilder() {
+        
+        onChanged();
+        return getDeviceConfigFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      public context.ContextOuterClass.DeviceConfigOrBuilder getDeviceConfigOrBuilder() {
+        if (deviceConfigBuilder_ != null) {
+          return deviceConfigBuilder_.getMessageOrBuilder();
+        } else {
+          return deviceConfig_ == null ?
+              context.ContextOuterClass.DeviceConfig.getDefaultInstance() : deviceConfig_;
+        }
+      }
+      /**
+       * <code>.context.DeviceConfig device_config = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceConfig, context.ContextOuterClass.DeviceConfig.Builder, context.ContextOuterClass.DeviceConfigOrBuilder> 
+          getDeviceConfigFieldBuilder() {
+        if (deviceConfigBuilder_ == null) {
+          deviceConfigBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.DeviceConfig, context.ContextOuterClass.DeviceConfig.Builder, context.ContextOuterClass.DeviceConfigOrBuilder>(
+                  getDeviceConfig(),
+                  getParentForChildren(),
+                  isClean());
+          deviceConfig_ = null;
+        }
+        return deviceConfigBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:context.DeviceEvent)
     }
 
-    // @@protoc_insertion_point(class_scope:context.LinkId)
-    private static final context.ContextOuterClass.LinkId DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.DeviceEvent)
+    private static final context.ContextOuterClass.DeviceEvent DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkId();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.DeviceEvent();
     }
 
-    public static context.ContextOuterClass.LinkId getDefaultInstance() {
+    public static context.ContextOuterClass.DeviceEvent getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<LinkId>
-        PARSER = new com.google.protobuf.AbstractParser<LinkId>() {
+    private static final com.google.protobuf.Parser<DeviceEvent>
+        PARSER = new com.google.protobuf.AbstractParser<DeviceEvent>() {
       @java.lang.Override
-      public LinkId parsePartialFrom(
+      public DeviceEvent parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new LinkId(input, extensionRegistry);
+        return new DeviceEvent(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<LinkId> parser() {
+    public static com.google.protobuf.Parser<DeviceEvent> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<LinkId> getParserForType() {
+    public com.google.protobuf.Parser<DeviceEvent> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.LinkId getDefaultInstanceForType() {
+    public context.ContextOuterClass.DeviceEvent getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface LinkOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Link)
+  public interface LinkIdOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.LinkId)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.LinkId link_id = 1;</code>
-     * @return Whether the linkId field is set.
-     */
-    boolean hasLinkId();
-    /**
-     * <code>.context.LinkId link_id = 1;</code>
-     * @return The linkId.
-     */
-    context.ContextOuterClass.LinkId getLinkId();
-    /**
-     * <code>.context.LinkId link_id = 1;</code>
-     */
-    context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder();
-
-    /**
-     * <code>string name = 2;</code>
-     * @return The name.
-     */
-    java.lang.String getName();
-    /**
-     * <code>string name = 2;</code>
-     * @return The bytes for name.
-     */
-    com.google.protobuf.ByteString
-        getNameBytes();
-
-    /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-     */
-    java.util.List<context.ContextOuterClass.EndPointId> 
-        getLinkEndpointIdsList();
-    /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-     */
-    context.ContextOuterClass.EndPointId getLinkEndpointIds(int index);
-    /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     * <code>.context.Uuid link_uuid = 1;</code>
+     * @return Whether the linkUuid field is set.
      */
-    int getLinkEndpointIdsCount();
+    boolean hasLinkUuid();
     /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     * <code>.context.Uuid link_uuid = 1;</code>
+     * @return The linkUuid.
      */
-    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getLinkEndpointIdsOrBuilderList();
+    context.ContextOuterClass.Uuid getLinkUuid();
     /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     * <code>.context.Uuid link_uuid = 1;</code>
      */
-    context.ContextOuterClass.EndPointIdOrBuilder getLinkEndpointIdsOrBuilder(
-        int index);
+    context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder();
   }
   /**
-   * Protobuf type {@code context.Link}
+   * <pre>
+   * ----- Link ----------------------------------------------------------------------------------------------------------
+   * </pre>
+   *
+   * Protobuf type {@code context.LinkId}
    */
-  public static final class Link extends
+  public static final class LinkId extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Link)
-      LinkOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.LinkId)
+      LinkIdOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Link.newBuilder() to construct.
-    private Link(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use LinkId.newBuilder() to construct.
+    private LinkId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Link() {
-      name_ = "";
-      linkEndpointIds_ = java.util.Collections.emptyList();
+    private LinkId() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Link();
+      return new LinkId();
     }
 
     @java.lang.Override
@@ -22518,7 +23091,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Link(
+    private LinkId(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -22526,7 +23099,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -22538,33 +23110,18 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.LinkId.Builder subBuilder = null;
-              if (linkId_ != null) {
-                subBuilder = linkId_.toBuilder();
+              context.ContextOuterClass.Uuid.Builder subBuilder = null;
+              if (linkUuid_ != null) {
+                subBuilder = linkUuid_.toBuilder();
               }
-              linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
+              linkUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(linkId_);
-                linkId_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(linkUuid_);
+                linkUuid_ = subBuilder.buildPartial();
               }
 
               break;
             }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              name_ = s;
-              break;
-            }
-            case 26: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                linkEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              linkEndpointIds_.add(
-                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
-              break;
-            }
             default: {
               if (!parseUnknownField(
                   input, unknownFields, extensionRegistry, tag)) {
@@ -22580,128 +23137,47 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Link_descriptor;
+      return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Link_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_LinkId_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Link.class, context.ContextOuterClass.Link.Builder.class);
-    }
-
-    public static final int LINK_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.LinkId linkId_;
-    /**
-     * <code>.context.LinkId link_id = 1;</code>
-     * @return Whether the linkId field is set.
-     */
-    @java.lang.Override
-    public boolean hasLinkId() {
-      return linkId_ != null;
-    }
-    /**
-     * <code>.context.LinkId link_id = 1;</code>
-     * @return The linkId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.LinkId getLinkId() {
-      return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
-    }
-    /**
-     * <code>.context.LinkId link_id = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-      return getLinkId();
-    }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object name_;
-    /**
-     * <code>string name = 2;</code>
-     * @return The name.
-     */
-    @java.lang.Override
-    public java.lang.String getName() {
-      java.lang.Object ref = name_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        name_ = s;
-        return s;
-      }
-    }
-    /**
-     * <code>string name = 2;</code>
-     * @return The bytes for name.
-     */
-    @java.lang.Override
-    public com.google.protobuf.ByteString
-        getNameBytes() {
-      java.lang.Object ref = name_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        name_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+              context.ContextOuterClass.LinkId.class, context.ContextOuterClass.LinkId.Builder.class);
     }
 
-    public static final int LINK_ENDPOINT_IDS_FIELD_NUMBER = 3;
-    private java.util.List<context.ContextOuterClass.EndPointId> linkEndpointIds_;
-    /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public java.util.List<context.ContextOuterClass.EndPointId> getLinkEndpointIdsList() {
-      return linkEndpointIds_;
-    }
-    /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getLinkEndpointIdsOrBuilderList() {
-      return linkEndpointIds_;
-    }
+    public static final int LINK_UUID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Uuid linkUuid_;
     /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     * <code>.context.Uuid link_uuid = 1;</code>
+     * @return Whether the linkUuid field is set.
      */
     @java.lang.Override
-    public int getLinkEndpointIdsCount() {
-      return linkEndpointIds_.size();
+    public boolean hasLinkUuid() {
+      return linkUuid_ != null;
     }
     /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     * <code>.context.Uuid link_uuid = 1;</code>
+     * @return The linkUuid.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointId getLinkEndpointIds(int index) {
-      return linkEndpointIds_.get(index);
+    public context.ContextOuterClass.Uuid getLinkUuid() {
+      return linkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
     }
     /**
-     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     * <code>.context.Uuid link_uuid = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getLinkEndpointIdsOrBuilder(
-        int index) {
-      return linkEndpointIds_.get(index);
+    public context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder() {
+      return getLinkUuid();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -22718,14 +23194,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (linkId_ != null) {
-        output.writeMessage(1, getLinkId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
-      }
-      for (int i = 0; i < linkEndpointIds_.size(); i++) {
-        output.writeMessage(3, linkEndpointIds_.get(i));
+      if (linkUuid_ != null) {
+        output.writeMessage(1, getLinkUuid());
       }
       unknownFields.writeTo(output);
     }
@@ -22736,16 +23206,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (linkId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getLinkId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
-      }
-      for (int i = 0; i < linkEndpointIds_.size(); i++) {
+      if (linkUuid_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, linkEndpointIds_.get(i));
+          .computeMessageSize(1, getLinkUuid());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -22757,20 +23220,16 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Link)) {
+      if (!(obj instanceof context.ContextOuterClass.LinkId)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Link other = (context.ContextOuterClass.Link) obj;
+      context.ContextOuterClass.LinkId other = (context.ContextOuterClass.LinkId) obj;
 
-      if (hasLinkId() != other.hasLinkId()) return false;
-      if (hasLinkId()) {
-        if (!getLinkId()
-            .equals(other.getLinkId())) return false;
+      if (hasLinkUuid() != other.hasLinkUuid()) return false;
+      if (hasLinkUuid()) {
+        if (!getLinkUuid()
+            .equals(other.getLinkUuid())) return false;
       }
-      if (!getName()
-          .equals(other.getName())) return false;
-      if (!getLinkEndpointIdsList()
-          .equals(other.getLinkEndpointIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -22782,84 +23241,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasLinkId()) {
-        hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getLinkId().hashCode();
-      }
-      hash = (37 * hash) + NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getName().hashCode();
-      if (getLinkEndpointIdsCount() > 0) {
-        hash = (37 * hash) + LINK_ENDPOINT_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getLinkEndpointIdsList().hashCode();
+      if (hasLinkUuid()) {
+        hash = (37 * hash) + LINK_UUID_FIELD_NUMBER;
+        hash = (53 * hash) + getLinkUuid().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Link parseFrom(byte[] data)
+    public static context.ContextOuterClass.LinkId parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Link parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkId parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Link parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkId parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Link parseDelimitedFrom(
+    public static context.ContextOuterClass.LinkId parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Link parseFrom(
+    public static context.ContextOuterClass.LinkId parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -22872,7 +23325,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Link prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.LinkId prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -22888,26 +23341,30 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Link}
+     * <pre>
+     * ----- Link ----------------------------------------------------------------------------------------------------------
+     * </pre>
+     *
+     * Protobuf type {@code context.LinkId}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Link)
-        context.ContextOuterClass.LinkOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.LinkId)
+        context.ContextOuterClass.LinkIdOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Link_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Link_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_LinkId_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Link.class, context.ContextOuterClass.Link.Builder.class);
+                context.ContextOuterClass.LinkId.class, context.ContextOuterClass.LinkId.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Link.newBuilder()
+      // Construct using context.ContextOuterClass.LinkId.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -22920,25 +23377,16 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getLinkEndpointIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (linkIdBuilder_ == null) {
-          linkId_ = null;
-        } else {
-          linkId_ = null;
-          linkIdBuilder_ = null;
-        }
-        name_ = "";
-
-        if (linkEndpointIdsBuilder_ == null) {
-          linkEndpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+        if (linkUuidBuilder_ == null) {
+          linkUuid_ = null;
         } else {
-          linkEndpointIdsBuilder_.clear();
+          linkUuid_ = null;
+          linkUuidBuilder_ = null;
         }
         return this;
       }
@@ -22946,17 +23394,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Link_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkId_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Link getDefaultInstanceForType() {
-        return context.ContextOuterClass.Link.getDefaultInstance();
+      public context.ContextOuterClass.LinkId getDefaultInstanceForType() {
+        return context.ContextOuterClass.LinkId.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Link build() {
-        context.ContextOuterClass.Link result = buildPartial();
+      public context.ContextOuterClass.LinkId build() {
+        context.ContextOuterClass.LinkId result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -22964,23 +23412,12 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Link buildPartial() {
-        context.ContextOuterClass.Link result = new context.ContextOuterClass.Link(this);
-        int from_bitField0_ = bitField0_;
-        if (linkIdBuilder_ == null) {
-          result.linkId_ = linkId_;
-        } else {
-          result.linkId_ = linkIdBuilder_.build();
-        }
-        result.name_ = name_;
-        if (linkEndpointIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.linkEndpointIds_ = linkEndpointIds_;
+      public context.ContextOuterClass.LinkId buildPartial() {
+        context.ContextOuterClass.LinkId result = new context.ContextOuterClass.LinkId(this);
+        if (linkUuidBuilder_ == null) {
+          result.linkUuid_ = linkUuid_;
         } else {
-          result.linkEndpointIds_ = linkEndpointIdsBuilder_.build();
+          result.linkUuid_ = linkUuidBuilder_.build();
         }
         onBuilt();
         return result;
@@ -23020,48 +23457,18 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Link) {
-          return mergeFrom((context.ContextOuterClass.Link)other);
+        if (other instanceof context.ContextOuterClass.LinkId) {
+          return mergeFrom((context.ContextOuterClass.LinkId)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Link other) {
-        if (other == context.ContextOuterClass.Link.getDefaultInstance()) return this;
-        if (other.hasLinkId()) {
-          mergeLinkId(other.getLinkId());
-        }
-        if (!other.getName().isEmpty()) {
-          name_ = other.name_;
-          onChanged();
-        }
-        if (linkEndpointIdsBuilder_ == null) {
-          if (!other.linkEndpointIds_.isEmpty()) {
-            if (linkEndpointIds_.isEmpty()) {
-              linkEndpointIds_ = other.linkEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureLinkEndpointIdsIsMutable();
-              linkEndpointIds_.addAll(other.linkEndpointIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.linkEndpointIds_.isEmpty()) {
-            if (linkEndpointIdsBuilder_.isEmpty()) {
-              linkEndpointIdsBuilder_.dispose();
-              linkEndpointIdsBuilder_ = null;
-              linkEndpointIds_ = other.linkEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              linkEndpointIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getLinkEndpointIdsFieldBuilder() : null;
-            } else {
-              linkEndpointIdsBuilder_.addAllMessages(other.linkEndpointIds_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.LinkId other) {
+        if (other == context.ContextOuterClass.LinkId.getDefaultInstance()) return this;
+        if (other.hasLinkUuid()) {
+          mergeLinkUuid(other.getLinkUuid());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -23078,11 +23485,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Link parsedMessage = null;
+        context.ContextOuterClass.LinkId parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Link) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.LinkId) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -23091,652 +23498,446 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
 
-      private context.ContextOuterClass.LinkId linkId_;
+      private context.ContextOuterClass.Uuid linkUuid_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdBuilder_;
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> linkUuidBuilder_;
       /**
-       * <code>.context.LinkId link_id = 1;</code>
-       * @return Whether the linkId field is set.
+       * <code>.context.Uuid link_uuid = 1;</code>
+       * @return Whether the linkUuid field is set.
        */
-      public boolean hasLinkId() {
-        return linkIdBuilder_ != null || linkId_ != null;
+      public boolean hasLinkUuid() {
+        return linkUuidBuilder_ != null || linkUuid_ != null;
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
-       * @return The linkId.
+       * <code>.context.Uuid link_uuid = 1;</code>
+       * @return The linkUuid.
        */
-      public context.ContextOuterClass.LinkId getLinkId() {
-        if (linkIdBuilder_ == null) {
-          return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+      public context.ContextOuterClass.Uuid getLinkUuid() {
+        if (linkUuidBuilder_ == null) {
+          return linkUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
         } else {
-          return linkIdBuilder_.getMessage();
+          return linkUuidBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
-      public Builder setLinkId(context.ContextOuterClass.LinkId value) {
-        if (linkIdBuilder_ == null) {
+      public Builder setLinkUuid(context.ContextOuterClass.Uuid value) {
+        if (linkUuidBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          linkId_ = value;
+          linkUuid_ = value;
           onChanged();
         } else {
-          linkIdBuilder_.setMessage(value);
+          linkUuidBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
-      public Builder setLinkId(
-          context.ContextOuterClass.LinkId.Builder builderForValue) {
-        if (linkIdBuilder_ == null) {
-          linkId_ = builderForValue.build();
+      public Builder setLinkUuid(
+          context.ContextOuterClass.Uuid.Builder builderForValue) {
+        if (linkUuidBuilder_ == null) {
+          linkUuid_ = builderForValue.build();
           onChanged();
         } else {
-          linkIdBuilder_.setMessage(builderForValue.build());
+          linkUuidBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
-      public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
-        if (linkIdBuilder_ == null) {
-          if (linkId_ != null) {
-            linkId_ =
-              context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
+      public Builder mergeLinkUuid(context.ContextOuterClass.Uuid value) {
+        if (linkUuidBuilder_ == null) {
+          if (linkUuid_ != null) {
+            linkUuid_ =
+              context.ContextOuterClass.Uuid.newBuilder(linkUuid_).mergeFrom(value).buildPartial();
           } else {
-            linkId_ = value;
+            linkUuid_ = value;
           }
           onChanged();
         } else {
-          linkIdBuilder_.mergeFrom(value);
+          linkUuidBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
-      public Builder clearLinkId() {
-        if (linkIdBuilder_ == null) {
-          linkId_ = null;
+      public Builder clearLinkUuid() {
+        if (linkUuidBuilder_ == null) {
+          linkUuid_ = null;
           onChanged();
         } else {
-          linkId_ = null;
-          linkIdBuilder_ = null;
+          linkUuid_ = null;
+          linkUuidBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
-      public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
+      public context.ContextOuterClass.Uuid.Builder getLinkUuidBuilder() {
         
         onChanged();
-        return getLinkIdFieldBuilder().getBuilder();
+        return getLinkUuidFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
-      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-        if (linkIdBuilder_ != null) {
-          return linkIdBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.UuidOrBuilder getLinkUuidOrBuilder() {
+        if (linkUuidBuilder_ != null) {
+          return linkUuidBuilder_.getMessageOrBuilder();
         } else {
-          return linkId_ == null ?
-              context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+          return linkUuid_ == null ?
+              context.ContextOuterClass.Uuid.getDefaultInstance() : linkUuid_;
         }
       }
       /**
-       * <code>.context.LinkId link_id = 1;</code>
+       * <code>.context.Uuid link_uuid = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
-          getLinkIdFieldBuilder() {
-        if (linkIdBuilder_ == null) {
-          linkIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
-                  getLinkId(),
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
+          getLinkUuidFieldBuilder() {
+        if (linkUuidBuilder_ == null) {
+          linkUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
+                  getLinkUuid(),
                   getParentForChildren(),
                   isClean());
-          linkId_ = null;
+          linkUuid_ = null;
         }
-        return linkIdBuilder_;
+        return linkUuidBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
       }
 
-      private java.lang.Object name_ = "";
-      /**
-       * <code>string name = 2;</code>
-       * @return The name.
-       */
-      public java.lang.String getName() {
-        java.lang.Object ref = name_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          name_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
       }
-      /**
-       * <code>string name = 2;</code>
-       * @return The bytes for name.
-       */
-      public com.google.protobuf.ByteString
-          getNameBytes() {
-        java.lang.Object ref = name_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          name_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
+
+
+      // @@protoc_insertion_point(builder_scope:context.LinkId)
+    }
+
+    // @@protoc_insertion_point(class_scope:context.LinkId)
+    private static final context.ContextOuterClass.LinkId DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkId();
+    }
+
+    public static context.ContextOuterClass.LinkId getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<LinkId>
+        PARSER = new com.google.protobuf.AbstractParser<LinkId>() {
+      @java.lang.Override
+      public LinkId parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new LinkId(input, extensionRegistry);
       }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
+    };
+
+    public static com.google.protobuf.Parser<LinkId> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<LinkId> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public context.ContextOuterClass.LinkId getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
   }
-  
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearName() {
-        
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The bytes for name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
+
+  public interface LinkOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Link)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.LinkId link_id = 1;</code>
+     * @return Whether the linkId field is set.
+     */
+    boolean hasLinkId();
+    /**
+     * <code>.context.LinkId link_id = 1;</code>
+     * @return The linkId.
+     */
+    context.ContextOuterClass.LinkId getLinkId();
+    /**
+     * <code>.context.LinkId link_id = 1;</code>
+     */
+    context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder();
+
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     */
+    java.util.List<context.ContextOuterClass.EndPointId> 
+        getLinkEndpointIdsList();
+    /**
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     */
+    context.ContextOuterClass.EndPointId getLinkEndpointIds(int index);
+    /**
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     */
+    int getLinkEndpointIdsCount();
+    /**
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getLinkEndpointIdsOrBuilderList();
+    /**
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
+     */
+    context.ContextOuterClass.EndPointIdOrBuilder getLinkEndpointIdsOrBuilder(
+        int index);
   }
-  checkByteStringIsUtf8(value);
-        
-        name_ = value;
-        onChanged();
-        return this;
-      }
+  /**
+   * Protobuf type {@code context.Link}
+   */
+  public static final class Link extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.Link)
+      LinkOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Link.newBuilder() to construct.
+    private Link(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Link() {
+      name_ = "";
+      linkEndpointIds_ = java.util.Collections.emptyList();
+    }
 
-      private java.util.List<context.ContextOuterClass.EndPointId> linkEndpointIds_ =
-        java.util.Collections.emptyList();
-      private void ensureLinkEndpointIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          linkEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(linkEndpointIds_);
-          bitField0_ |= 0x00000001;
-         }
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Link();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Link(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              context.ContextOuterClass.LinkId.Builder subBuilder = null;
+              if (linkId_ != null) {
+                subBuilder = linkId_.toBuilder();
+              }
+              linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(linkId_);
+                linkId_ = subBuilder.buildPartial();
+              }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> linkEndpointIdsBuilder_;
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
 
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointId> getLinkEndpointIdsList() {
-        if (linkEndpointIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(linkEndpointIds_);
-        } else {
-          return linkEndpointIdsBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public int getLinkEndpointIdsCount() {
-        if (linkEndpointIdsBuilder_ == null) {
-          return linkEndpointIds_.size();
-        } else {
-          return linkEndpointIdsBuilder_.getCount();
+              name_ = s;
+              break;
+            }
+            case 26: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                linkEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              linkEndpointIds_.add(
+                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
         }
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId getLinkEndpointIds(int index) {
-        if (linkEndpointIdsBuilder_ == null) {
-          return linkEndpointIds_.get(index);
-        } else {
-          return linkEndpointIdsBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder setLinkEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (linkEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.set(index, value);
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder setLinkEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (linkEndpointIdsBuilder_ == null) {
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder addLinkEndpointIds(context.ContextOuterClass.EndPointId value) {
-        if (linkEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.add(value);
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder addLinkEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (linkEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.add(index, value);
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder addLinkEndpointIds(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (linkEndpointIdsBuilder_ == null) {
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.add(builderForValue.build());
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder addLinkEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (linkEndpointIdsBuilder_ == null) {
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder addAllLinkEndpointIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
-        if (linkEndpointIdsBuilder_ == null) {
-          ensureLinkEndpointIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, linkEndpointIds_);
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.addAllMessages(values);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder clearLinkEndpointIds() {
-        if (linkEndpointIdsBuilder_ == null) {
-          linkEndpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public Builder removeLinkEndpointIds(int index) {
-        if (linkEndpointIdsBuilder_ == null) {
-          ensureLinkEndpointIdsIsMutable();
-          linkEndpointIds_.remove(index);
-          onChanged();
-        } else {
-          linkEndpointIdsBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getLinkEndpointIdsBuilder(
-          int index) {
-        return getLinkEndpointIdsFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getLinkEndpointIdsOrBuilder(
-          int index) {
-        if (linkEndpointIdsBuilder_ == null) {
-          return linkEndpointIds_.get(index);  } else {
-          return linkEndpointIdsBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-           getLinkEndpointIdsOrBuilderList() {
-        if (linkEndpointIdsBuilder_ != null) {
-          return linkEndpointIdsBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(linkEndpointIds_);
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder addLinkEndpointIdsBuilder() {
-        return getLinkEndpointIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.EndPointId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder addLinkEndpointIdsBuilder(
-          int index) {
-        return getLinkEndpointIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
-           getLinkEndpointIdsBuilderList() {
-        return getLinkEndpointIdsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getLinkEndpointIdsFieldBuilder() {
-        if (linkEndpointIdsBuilder_ == null) {
-          linkEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  linkEndpointIds_,
-                  ((bitField0_ & 0x00000001) != 0),
-                  getParentForChildren(),
-                  isClean());
-          linkEndpointIds_ = null;
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
         }
-        return linkEndpointIdsBuilder_;
-      }
-      @java.lang.Override
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
-      }
-
-      @java.lang.Override
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
-      }
-
-
-      // @@protoc_insertion_point(builder_scope:context.Link)
-    }
-
-    // @@protoc_insertion_point(class_scope:context.Link)
-    private static final context.ContextOuterClass.Link DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Link();
-    }
-
-    public static context.ContextOuterClass.Link getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    private static final com.google.protobuf.Parser<Link>
-        PARSER = new com.google.protobuf.AbstractParser<Link>() {
-      @java.lang.Override
-      public Link parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Link(input, extensionRegistry);
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
       }
-    };
-
-    public static com.google.protobuf.Parser<Link> parser() {
-      return PARSER;
     }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<Link> getParserForType() {
-      return PARSER;
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return context.ContextOuterClass.internal_static_context_Link_descriptor;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Link getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return context.ContextOuterClass.internal_static_context_Link_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              context.ContextOuterClass.Link.class, context.ContextOuterClass.Link.Builder.class);
     }
 
-  }
-
-  public interface LinkIdListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.LinkIdList)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
-     */
-    java.util.List<context.ContextOuterClass.LinkId> 
-        getLinkIdsList();
-    /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
-     */
-    context.ContextOuterClass.LinkId getLinkIds(int index);
+    public static final int LINK_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.LinkId linkId_;
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>.context.LinkId link_id = 1;</code>
+     * @return Whether the linkId field is set.
      */
-    int getLinkIdsCount();
+    @java.lang.Override
+    public boolean hasLinkId() {
+      return linkId_ != null;
+    }
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>.context.LinkId link_id = 1;</code>
+     * @return The linkId.
      */
-    java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
-        getLinkIdsOrBuilderList();
+    @java.lang.Override
+    public context.ContextOuterClass.LinkId getLinkId() {
+      return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+    }
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>.context.LinkId link_id = 1;</code>
      */
-    context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
-        int index);
-  }
-  /**
-   * Protobuf type {@code context.LinkIdList}
-   */
-  public static final class LinkIdList extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.LinkIdList)
-      LinkIdListOrBuilder {
-  private static final long serialVersionUID = 0L;
-    // Use LinkIdList.newBuilder() to construct.
-    private LinkIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private LinkIdList() {
-      linkIds_ = java.util.Collections.emptyList();
-    }
-
     @java.lang.Override
-    @SuppressWarnings({"unused"})
-    protected java.lang.Object newInstance(
-        UnusedPrivateParameter unused) {
-      return new LinkIdList();
+    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
+      return getLinkId();
     }
 
+    public static final int NAME_FIELD_NUMBER = 2;
+    private volatile java.lang.Object name_;
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
     @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private LinkIdList(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      if (extensionRegistry == null) {
-        throw new java.lang.NullPointerException();
-      }
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              linkIds_.add(
-                  input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
-              break;
-            }
-            default: {
-              if (!parseUnknownField(
-                  input, unknownFields, extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-          }
-        }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
-        }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
       }
     }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
-    }
-
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
     @java.lang.Override
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_LinkIdList_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.LinkIdList.class, context.ContextOuterClass.LinkIdList.Builder.class);
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
-    public static final int LINK_IDS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.LinkId> linkIds_;
+    public static final int LINK_ENDPOINT_IDS_FIELD_NUMBER = 3;
+    private java.util.List<context.ContextOuterClass.EndPointId> linkEndpointIds_;
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
-      return linkIds_;
+    public java.util.List<context.ContextOuterClass.EndPointId> getLinkEndpointIdsList() {
+      return linkEndpointIds_;
     }
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
-        getLinkIdsOrBuilderList() {
-      return linkIds_;
+    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getLinkEndpointIdsOrBuilderList() {
+      return linkEndpointIds_;
     }
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public int getLinkIdsCount() {
-      return linkIds_.size();
+    public int getLinkEndpointIdsCount() {
+      return linkEndpointIds_.size();
     }
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.LinkId getLinkIds(int index) {
-      return linkIds_.get(index);
+    public context.ContextOuterClass.EndPointId getLinkEndpointIds(int index) {
+      return linkEndpointIds_.get(index);
     }
     /**
-     * <code>repeated .context.LinkId link_ids = 1;</code>
+     * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
+    public context.ContextOuterClass.EndPointIdOrBuilder getLinkEndpointIdsOrBuilder(
         int index) {
-      return linkIds_.get(index);
+      return linkEndpointIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -23753,8 +23954,14 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < linkIds_.size(); i++) {
-        output.writeMessage(1, linkIds_.get(i));
+      if (linkId_ != null) {
+        output.writeMessage(1, getLinkId());
+      }
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+      }
+      for (int i = 0; i < linkEndpointIds_.size(); i++) {
+        output.writeMessage(3, linkEndpointIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -23765,9 +23972,16 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < linkIds_.size(); i++) {
+      if (linkId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, linkIds_.get(i));
+          .computeMessageSize(1, getLinkId());
+      }
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+      }
+      for (int i = 0; i < linkEndpointIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, linkEndpointIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -23779,13 +23993,20 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.LinkIdList)) {
+      if (!(obj instanceof context.ContextOuterClass.Link)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.LinkIdList other = (context.ContextOuterClass.LinkIdList) obj;
+      context.ContextOuterClass.Link other = (context.ContextOuterClass.Link) obj;
 
-      if (!getLinkIdsList()
-          .equals(other.getLinkIdsList())) return false;
+      if (hasLinkId() != other.hasLinkId()) return false;
+      if (hasLinkId()) {
+        if (!getLinkId()
+            .equals(other.getLinkId())) return false;
+      }
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (!getLinkEndpointIdsList()
+          .equals(other.getLinkEndpointIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -23797,78 +24018,84 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getLinkIdsCount() > 0) {
-        hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getLinkIdsList().hashCode();
+      if (hasLinkId()) {
+        hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getLinkId().hashCode();
+      }
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      if (getLinkEndpointIdsCount() > 0) {
+        hash = (37 * hash) + LINK_ENDPOINT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getLinkEndpointIdsList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(byte[] data)
+    public static context.ContextOuterClass.Link parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Link parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkIdList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Link parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkIdList parseDelimitedFrom(
+    public static context.ContextOuterClass.Link parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkIdList parseFrom(
+    public static context.ContextOuterClass.Link parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -23881,7 +24108,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.LinkIdList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Link prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -23897,26 +24124,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.LinkIdList}
+     * Protobuf type {@code context.Link}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.LinkIdList)
-        context.ContextOuterClass.LinkIdListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Link)
+        context.ContextOuterClass.LinkOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_Link_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_LinkIdList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Link_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.LinkIdList.class, context.ContextOuterClass.LinkIdList.Builder.class);
+                context.ContextOuterClass.Link.class, context.ContextOuterClass.Link.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.LinkIdList.newBuilder()
+      // Construct using context.ContextOuterClass.Link.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -23929,17 +24156,25 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getLinkIdsFieldBuilder();
+          getLinkEndpointIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (linkIdsBuilder_ == null) {
-          linkIds_ = java.util.Collections.emptyList();
+        if (linkIdBuilder_ == null) {
+          linkId_ = null;
+        } else {
+          linkId_ = null;
+          linkIdBuilder_ = null;
+        }
+        name_ = "";
+
+        if (linkEndpointIdsBuilder_ == null) {
+          linkEndpointIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          linkIdsBuilder_.clear();
+          linkEndpointIdsBuilder_.clear();
         }
         return this;
       }
@@ -23947,17 +24182,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_Link_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkIdList getDefaultInstanceForType() {
-        return context.ContextOuterClass.LinkIdList.getDefaultInstance();
+      public context.ContextOuterClass.Link getDefaultInstanceForType() {
+        return context.ContextOuterClass.Link.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkIdList build() {
-        context.ContextOuterClass.LinkIdList result = buildPartial();
+      public context.ContextOuterClass.Link build() {
+        context.ContextOuterClass.Link result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -23965,17 +24200,23 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkIdList buildPartial() {
-        context.ContextOuterClass.LinkIdList result = new context.ContextOuterClass.LinkIdList(this);
+      public context.ContextOuterClass.Link buildPartial() {
+        context.ContextOuterClass.Link result = new context.ContextOuterClass.Link(this);
         int from_bitField0_ = bitField0_;
-        if (linkIdsBuilder_ == null) {
+        if (linkIdBuilder_ == null) {
+          result.linkId_ = linkId_;
+        } else {
+          result.linkId_ = linkIdBuilder_.build();
+        }
+        result.name_ = name_;
+        if (linkEndpointIdsBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+            linkEndpointIds_ = java.util.Collections.unmodifiableList(linkEndpointIds_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.linkIds_ = linkIds_;
+          result.linkEndpointIds_ = linkEndpointIds_;
         } else {
-          result.linkIds_ = linkIdsBuilder_.build();
+          result.linkEndpointIds_ = linkEndpointIdsBuilder_.build();
         }
         onBuilt();
         return result;
@@ -24015,39 +24256,46 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.LinkIdList) {
-          return mergeFrom((context.ContextOuterClass.LinkIdList)other);
+        if (other instanceof context.ContextOuterClass.Link) {
+          return mergeFrom((context.ContextOuterClass.Link)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.LinkIdList other) {
-        if (other == context.ContextOuterClass.LinkIdList.getDefaultInstance()) return this;
-        if (linkIdsBuilder_ == null) {
-          if (!other.linkIds_.isEmpty()) {
-            if (linkIds_.isEmpty()) {
-              linkIds_ = other.linkIds_;
+      public Builder mergeFrom(context.ContextOuterClass.Link other) {
+        if (other == context.ContextOuterClass.Link.getDefaultInstance()) return this;
+        if (other.hasLinkId()) {
+          mergeLinkId(other.getLinkId());
+        }
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (linkEndpointIdsBuilder_ == null) {
+          if (!other.linkEndpointIds_.isEmpty()) {
+            if (linkEndpointIds_.isEmpty()) {
+              linkEndpointIds_ = other.linkEndpointIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureLinkIdsIsMutable();
-              linkIds_.addAll(other.linkIds_);
+              ensureLinkEndpointIdsIsMutable();
+              linkEndpointIds_.addAll(other.linkEndpointIds_);
             }
             onChanged();
           }
         } else {
-          if (!other.linkIds_.isEmpty()) {
-            if (linkIdsBuilder_.isEmpty()) {
-              linkIdsBuilder_.dispose();
-              linkIdsBuilder_ = null;
-              linkIds_ = other.linkIds_;
+          if (!other.linkEndpointIds_.isEmpty()) {
+            if (linkEndpointIdsBuilder_.isEmpty()) {
+              linkEndpointIdsBuilder_.dispose();
+              linkEndpointIdsBuilder_ = null;
+              linkEndpointIds_ = other.linkEndpointIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              linkIdsBuilder_ = 
+              linkEndpointIdsBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getLinkIdsFieldBuilder() : null;
+                   getLinkEndpointIdsFieldBuilder() : null;
             } else {
-              linkIdsBuilder_.addAllMessages(other.linkIds_);
+              linkEndpointIdsBuilder_.addAllMessages(other.linkEndpointIds_);
             }
           }
         }
@@ -24066,11 +24314,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.LinkIdList parsedMessage = null;
+        context.ContextOuterClass.Link parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.LinkIdList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Link) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -24081,244 +24329,439 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.LinkId> linkIds_ =
+      private context.ContextOuterClass.LinkId linkId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdBuilder_;
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       * @return Whether the linkId field is set.
+       */
+      public boolean hasLinkId() {
+        return linkIdBuilder_ != null || linkId_ != null;
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       * @return The linkId.
+       */
+      public context.ContextOuterClass.LinkId getLinkId() {
+        if (linkIdBuilder_ == null) {
+          return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+        } else {
+          return linkIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      public Builder setLinkId(context.ContextOuterClass.LinkId value) {
+        if (linkIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          linkId_ = value;
+          onChanged();
+        } else {
+          linkIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      public Builder setLinkId(
+          context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdBuilder_ == null) {
+          linkId_ = builderForValue.build();
+          onChanged();
+        } else {
+          linkIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
+        if (linkIdBuilder_ == null) {
+          if (linkId_ != null) {
+            linkId_ =
+              context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
+          } else {
+            linkId_ = value;
+          }
+          onChanged();
+        } else {
+          linkIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      public Builder clearLinkId() {
+        if (linkIdBuilder_ == null) {
+          linkId_ = null;
+          onChanged();
+        } else {
+          linkId_ = null;
+          linkIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
+        
+        onChanged();
+        return getLinkIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
+        if (linkIdBuilder_ != null) {
+          return linkIdBuilder_.getMessageOrBuilder();
+        } else {
+          return linkId_ == null ?
+              context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+        }
+      }
+      /**
+       * <code>.context.LinkId link_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
+          getLinkIdFieldBuilder() {
+        if (linkIdBuilder_ == null) {
+          linkIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
+                  getLinkId(),
+                  getParentForChildren(),
+                  isClean());
+          linkId_ = null;
+        }
+        return linkIdBuilder_;
+      }
+
+      private java.lang.Object name_ = "";
+      /**
+       * <code>string name = 2;</code>
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<context.ContextOuterClass.EndPointId> linkEndpointIds_ =
         java.util.Collections.emptyList();
-      private void ensureLinkIdsIsMutable() {
+      private void ensureLinkEndpointIdsIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>(linkIds_);
+          linkEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(linkEndpointIds_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdsBuilder_;
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> linkEndpointIdsBuilder_;
 
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
-        if (linkIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(linkIds_);
+      public java.util.List<context.ContextOuterClass.EndPointId> getLinkEndpointIdsList() {
+        if (linkEndpointIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(linkEndpointIds_);
         } else {
-          return linkIdsBuilder_.getMessageList();
+          return linkEndpointIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public int getLinkIdsCount() {
-        if (linkIdsBuilder_ == null) {
-          return linkIds_.size();
+      public int getLinkEndpointIdsCount() {
+        if (linkEndpointIdsBuilder_ == null) {
+          return linkEndpointIds_.size();
         } else {
-          return linkIdsBuilder_.getCount();
+          return linkEndpointIdsBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public context.ContextOuterClass.LinkId getLinkIds(int index) {
-        if (linkIdsBuilder_ == null) {
-          return linkIds_.get(index);
+      public context.ContextOuterClass.EndPointId getLinkEndpointIds(int index) {
+        if (linkEndpointIdsBuilder_ == null) {
+          return linkEndpointIds_.get(index);
         } else {
-          return linkIdsBuilder_.getMessage(index);
+          return linkEndpointIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder setLinkIds(
-          int index, context.ContextOuterClass.LinkId value) {
-        if (linkIdsBuilder_ == null) {
+      public Builder setLinkEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (linkEndpointIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureLinkIdsIsMutable();
-          linkIds_.set(index, value);
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.set(index, value);
           onChanged();
         } else {
-          linkIdsBuilder_.setMessage(index, value);
+          linkEndpointIdsBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder setLinkIds(
-          int index, context.ContextOuterClass.LinkId.Builder builderForValue) {
-        if (linkIdsBuilder_ == null) {
-          ensureLinkIdsIsMutable();
-          linkIds_.set(index, builderForValue.build());
+      public Builder setLinkEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (linkEndpointIdsBuilder_ == null) {
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          linkIdsBuilder_.setMessage(index, builderForValue.build());
+          linkEndpointIdsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder addLinkIds(context.ContextOuterClass.LinkId value) {
-        if (linkIdsBuilder_ == null) {
+      public Builder addLinkEndpointIds(context.ContextOuterClass.EndPointId value) {
+        if (linkEndpointIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureLinkIdsIsMutable();
-          linkIds_.add(value);
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.add(value);
           onChanged();
         } else {
-          linkIdsBuilder_.addMessage(value);
+          linkEndpointIdsBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder addLinkIds(
-          int index, context.ContextOuterClass.LinkId value) {
-        if (linkIdsBuilder_ == null) {
+      public Builder addLinkEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (linkEndpointIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureLinkIdsIsMutable();
-          linkIds_.add(index, value);
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.add(index, value);
           onChanged();
         } else {
-          linkIdsBuilder_.addMessage(index, value);
+          linkEndpointIdsBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder addLinkIds(
-          context.ContextOuterClass.LinkId.Builder builderForValue) {
-        if (linkIdsBuilder_ == null) {
-          ensureLinkIdsIsMutable();
-          linkIds_.add(builderForValue.build());
+      public Builder addLinkEndpointIds(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (linkEndpointIdsBuilder_ == null) {
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.add(builderForValue.build());
           onChanged();
         } else {
-          linkIdsBuilder_.addMessage(builderForValue.build());
+          linkEndpointIdsBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder addLinkIds(
-          int index, context.ContextOuterClass.LinkId.Builder builderForValue) {
-        if (linkIdsBuilder_ == null) {
-          ensureLinkIdsIsMutable();
-          linkIds_.add(index, builderForValue.build());
+      public Builder addLinkEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (linkEndpointIdsBuilder_ == null) {
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.add(index, builderForValue.build());
           onChanged();
         } else {
-          linkIdsBuilder_.addMessage(index, builderForValue.build());
+          linkEndpointIdsBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder addAllLinkIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.LinkId> values) {
-        if (linkIdsBuilder_ == null) {
-          ensureLinkIdsIsMutable();
+      public Builder addAllLinkEndpointIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
+        if (linkEndpointIdsBuilder_ == null) {
+          ensureLinkEndpointIdsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, linkIds_);
+              values, linkEndpointIds_);
           onChanged();
         } else {
-          linkIdsBuilder_.addAllMessages(values);
+          linkEndpointIdsBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder clearLinkIds() {
-        if (linkIdsBuilder_ == null) {
-          linkIds_ = java.util.Collections.emptyList();
+      public Builder clearLinkEndpointIds() {
+        if (linkEndpointIdsBuilder_ == null) {
+          linkEndpointIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          linkIdsBuilder_.clear();
+          linkEndpointIdsBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public Builder removeLinkIds(int index) {
-        if (linkIdsBuilder_ == null) {
-          ensureLinkIdsIsMutable();
-          linkIds_.remove(index);
+      public Builder removeLinkEndpointIds(int index) {
+        if (linkEndpointIdsBuilder_ == null) {
+          ensureLinkEndpointIdsIsMutable();
+          linkEndpointIds_.remove(index);
           onChanged();
         } else {
-          linkIdsBuilder_.remove(index);
+          linkEndpointIdsBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public context.ContextOuterClass.LinkId.Builder getLinkIdsBuilder(
+      public context.ContextOuterClass.EndPointId.Builder getLinkEndpointIdsBuilder(
           int index) {
-        return getLinkIdsFieldBuilder().getBuilder(index);
+        return getLinkEndpointIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
+      public context.ContextOuterClass.EndPointIdOrBuilder getLinkEndpointIdsOrBuilder(
           int index) {
-        if (linkIdsBuilder_ == null) {
-          return linkIds_.get(index);  } else {
-          return linkIdsBuilder_.getMessageOrBuilder(index);
+        if (linkEndpointIdsBuilder_ == null) {
+          return linkEndpointIds_.get(index);  } else {
+          return linkEndpointIdsBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
-           getLinkIdsOrBuilderList() {
-        if (linkIdsBuilder_ != null) {
-          return linkIdsBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+           getLinkEndpointIdsOrBuilderList() {
+        if (linkEndpointIdsBuilder_ != null) {
+          return linkEndpointIdsBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(linkIds_);
+          return java.util.Collections.unmodifiableList(linkEndpointIds_);
         }
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public context.ContextOuterClass.LinkId.Builder addLinkIdsBuilder() {
-        return getLinkIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.LinkId.getDefaultInstance());
-      }
+      public context.ContextOuterClass.EndPointId.Builder addLinkEndpointIdsBuilder() {
+        return getLinkEndpointIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public context.ContextOuterClass.LinkId.Builder addLinkIdsBuilder(
+      public context.ContextOuterClass.EndPointId.Builder addLinkEndpointIdsBuilder(
           int index) {
-        return getLinkIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.LinkId.getDefaultInstance());
+        return getLinkEndpointIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>repeated .context.EndPointId link_endpoint_ids = 3;</code>
        */
-      public java.util.List<context.ContextOuterClass.LinkId.Builder> 
-           getLinkIdsBuilderList() {
-        return getLinkIdsFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
+           getLinkEndpointIdsBuilderList() {
+        return getLinkEndpointIdsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
-          getLinkIdsFieldBuilder() {
-        if (linkIdsBuilder_ == null) {
-          linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
-                  linkIds_,
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getLinkEndpointIdsFieldBuilder() {
+        if (linkEndpointIdsBuilder_ == null) {
+          linkEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  linkEndpointIds_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          linkIds_ = null;
+          linkEndpointIds_ = null;
         }
-        return linkIdsBuilder_;
+        return linkEndpointIdsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -24333,95 +24776,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.LinkIdList)
+      // @@protoc_insertion_point(builder_scope:context.Link)
     }
 
-    // @@protoc_insertion_point(class_scope:context.LinkIdList)
-    private static final context.ContextOuterClass.LinkIdList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Link)
+    private static final context.ContextOuterClass.Link DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkIdList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Link();
     }
 
-    public static context.ContextOuterClass.LinkIdList getDefaultInstance() {
+    public static context.ContextOuterClass.Link getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<LinkIdList>
-        PARSER = new com.google.protobuf.AbstractParser<LinkIdList>() {
+    private static final com.google.protobuf.Parser<Link>
+        PARSER = new com.google.protobuf.AbstractParser<Link>() {
       @java.lang.Override
-      public LinkIdList parsePartialFrom(
+      public Link parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new LinkIdList(input, extensionRegistry);
+        return new Link(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<LinkIdList> parser() {
+    public static com.google.protobuf.Parser<Link> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<LinkIdList> getParserForType() {
+    public com.google.protobuf.Parser<Link> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.LinkIdList getDefaultInstanceForType() {
+    public context.ContextOuterClass.Link getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface LinkListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.LinkList)
+  public interface LinkIdListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.LinkIdList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
-    java.util.List<context.ContextOuterClass.Link> 
-        getLinksList();
+    java.util.List<context.ContextOuterClass.LinkId> 
+        getLinkIdsList();
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
-    context.ContextOuterClass.Link getLinks(int index);
+    context.ContextOuterClass.LinkId getLinkIds(int index);
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
-    int getLinksCount();
+    int getLinkIdsCount();
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
-    java.util.List<? extends context.ContextOuterClass.LinkOrBuilder> 
-        getLinksOrBuilderList();
+    java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
+        getLinkIdsOrBuilderList();
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
-    context.ContextOuterClass.LinkOrBuilder getLinksOrBuilder(
+    context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
         int index);
   }
   /**
-   * Protobuf type {@code context.LinkList}
+   * Protobuf type {@code context.LinkIdList}
    */
-  public static final class LinkList extends
+  public static final class LinkIdList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.LinkList)
-      LinkListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.LinkIdList)
+      LinkIdListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use LinkList.newBuilder() to construct.
-    private LinkList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use LinkIdList.newBuilder() to construct.
+    private LinkIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private LinkList() {
-      links_ = java.util.Collections.emptyList();
+    private LinkIdList() {
+      linkIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new LinkList();
+      return new LinkIdList();
     }
 
     @java.lang.Override
@@ -24429,7 +24872,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private LinkList(
+    private LinkIdList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -24450,11 +24893,11 @@ public final class ContextOuterClass {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                links_ = new java.util.ArrayList<context.ContextOuterClass.Link>();
+                linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              links_.add(
-                  input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry));
+              linkIds_.add(
+                  input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -24473,7 +24916,7 @@ public final class ContextOuterClass {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          links_ = java.util.Collections.unmodifiableList(links_);
+          linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -24481,55 +24924,55 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
+      return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_LinkList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_LinkIdList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.LinkList.class, context.ContextOuterClass.LinkList.Builder.class);
+              context.ContextOuterClass.LinkIdList.class, context.ContextOuterClass.LinkIdList.Builder.class);
     }
 
-    public static final int LINKS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.Link> links_;
+    public static final int LINK_IDS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.LinkId> linkIds_;
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.Link> getLinksList() {
-      return links_;
+    public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
+      return linkIds_;
     }
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.LinkOrBuilder> 
-        getLinksOrBuilderList() {
-      return links_;
+    public java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
+        getLinkIdsOrBuilderList() {
+      return linkIds_;
     }
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
     @java.lang.Override
-    public int getLinksCount() {
-      return links_.size();
+    public int getLinkIdsCount() {
+      return linkIds_.size();
     }
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.Link getLinks(int index) {
-      return links_.get(index);
+    public context.ContextOuterClass.LinkId getLinkIds(int index) {
+      return linkIds_.get(index);
     }
     /**
-     * <code>repeated .context.Link links = 1;</code>
+     * <code>repeated .context.LinkId link_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.LinkOrBuilder getLinksOrBuilder(
+    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
         int index) {
-      return links_.get(index);
+      return linkIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -24546,8 +24989,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < links_.size(); i++) {
-        output.writeMessage(1, links_.get(i));
+      for (int i = 0; i < linkIds_.size(); i++) {
+        output.writeMessage(1, linkIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -24558,9 +25001,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < links_.size(); i++) {
+      for (int i = 0; i < linkIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, links_.get(i));
+          .computeMessageSize(1, linkIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -24572,13 +25015,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.LinkList)) {
+      if (!(obj instanceof context.ContextOuterClass.LinkIdList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.LinkList other = (context.ContextOuterClass.LinkList) obj;
+      context.ContextOuterClass.LinkIdList other = (context.ContextOuterClass.LinkIdList) obj;
 
-      if (!getLinksList()
-          .equals(other.getLinksList())) return false;
+      if (!getLinkIdsList()
+          .equals(other.getLinkIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -24590,78 +25033,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getLinksCount() > 0) {
-        hash = (37 * hash) + LINKS_FIELD_NUMBER;
-        hash = (53 * hash) + getLinksList().hashCode();
+      if (getLinkIdsCount() > 0) {
+        hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getLinkIdsList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(byte[] data)
+    public static context.ContextOuterClass.LinkIdList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkIdList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkIdList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkList parseDelimitedFrom(
+    public static context.ContextOuterClass.LinkIdList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkList parseFrom(
+    public static context.ContextOuterClass.LinkIdList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -24674,7 +25117,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.LinkList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.LinkIdList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -24690,26 +25133,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.LinkList}
+     * Protobuf type {@code context.LinkIdList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.LinkList)
-        context.ContextOuterClass.LinkListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.LinkIdList)
+        context.ContextOuterClass.LinkIdListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_LinkList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_LinkIdList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.LinkList.class, context.ContextOuterClass.LinkList.Builder.class);
+                context.ContextOuterClass.LinkIdList.class, context.ContextOuterClass.LinkIdList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.LinkList.newBuilder()
+      // Construct using context.ContextOuterClass.LinkIdList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -24722,17 +25165,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getLinksFieldBuilder();
+          getLinkIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (linksBuilder_ == null) {
-          links_ = java.util.Collections.emptyList();
+        if (linkIdsBuilder_ == null) {
+          linkIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          linksBuilder_.clear();
+          linkIdsBuilder_.clear();
         }
         return this;
       }
@@ -24740,17 +25183,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkList getDefaultInstanceForType() {
-        return context.ContextOuterClass.LinkList.getDefaultInstance();
+      public context.ContextOuterClass.LinkIdList getDefaultInstanceForType() {
+        return context.ContextOuterClass.LinkIdList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkList build() {
-        context.ContextOuterClass.LinkList result = buildPartial();
+      public context.ContextOuterClass.LinkIdList build() {
+        context.ContextOuterClass.LinkIdList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -24758,17 +25201,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkList buildPartial() {
-        context.ContextOuterClass.LinkList result = new context.ContextOuterClass.LinkList(this);
+      public context.ContextOuterClass.LinkIdList buildPartial() {
+        context.ContextOuterClass.LinkIdList result = new context.ContextOuterClass.LinkIdList(this);
         int from_bitField0_ = bitField0_;
-        if (linksBuilder_ == null) {
+        if (linkIdsBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            links_ = java.util.Collections.unmodifiableList(links_);
+            linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.links_ = links_;
+          result.linkIds_ = linkIds_;
         } else {
-          result.links_ = linksBuilder_.build();
+          result.linkIds_ = linkIdsBuilder_.build();
         }
         onBuilt();
         return result;
@@ -24808,39 +25251,39 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.LinkList) {
-          return mergeFrom((context.ContextOuterClass.LinkList)other);
+        if (other instanceof context.ContextOuterClass.LinkIdList) {
+          return mergeFrom((context.ContextOuterClass.LinkIdList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.LinkList other) {
-        if (other == context.ContextOuterClass.LinkList.getDefaultInstance()) return this;
-        if (linksBuilder_ == null) {
-          if (!other.links_.isEmpty()) {
-            if (links_.isEmpty()) {
-              links_ = other.links_;
+      public Builder mergeFrom(context.ContextOuterClass.LinkIdList other) {
+        if (other == context.ContextOuterClass.LinkIdList.getDefaultInstance()) return this;
+        if (linkIdsBuilder_ == null) {
+          if (!other.linkIds_.isEmpty()) {
+            if (linkIds_.isEmpty()) {
+              linkIds_ = other.linkIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureLinksIsMutable();
-              links_.addAll(other.links_);
+              ensureLinkIdsIsMutable();
+              linkIds_.addAll(other.linkIds_);
             }
             onChanged();
           }
         } else {
-          if (!other.links_.isEmpty()) {
-            if (linksBuilder_.isEmpty()) {
-              linksBuilder_.dispose();
-              linksBuilder_ = null;
-              links_ = other.links_;
+          if (!other.linkIds_.isEmpty()) {
+            if (linkIdsBuilder_.isEmpty()) {
+              linkIdsBuilder_.dispose();
+              linkIdsBuilder_ = null;
+              linkIds_ = other.linkIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              linksBuilder_ = 
+              linkIdsBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getLinksFieldBuilder() : null;
+                   getLinkIdsFieldBuilder() : null;
             } else {
-              linksBuilder_.addAllMessages(other.links_);
+              linkIdsBuilder_.addAllMessages(other.linkIds_);
             }
           }
         }
@@ -24859,11 +25302,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.LinkList parsedMessage = null;
+        context.ContextOuterClass.LinkIdList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.LinkList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.LinkIdList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -24874,244 +25317,244 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.Link> links_ =
+      private java.util.List<context.ContextOuterClass.LinkId> linkIds_ =
         java.util.Collections.emptyList();
-      private void ensureLinksIsMutable() {
+      private void ensureLinkIdsIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          links_ = new java.util.ArrayList<context.ContextOuterClass.Link>(links_);
+          linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>(linkIds_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Link, context.ContextOuterClass.Link.Builder, context.ContextOuterClass.LinkOrBuilder> linksBuilder_;
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdsBuilder_;
 
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.Link> getLinksList() {
-        if (linksBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(links_);
+      public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
+        if (linkIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(linkIds_);
         } else {
-          return linksBuilder_.getMessageList();
+          return linkIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public int getLinksCount() {
-        if (linksBuilder_ == null) {
-          return links_.size();
+      public int getLinkIdsCount() {
+        if (linkIdsBuilder_ == null) {
+          return linkIds_.size();
         } else {
-          return linksBuilder_.getCount();
+          return linkIdsBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public context.ContextOuterClass.Link getLinks(int index) {
-        if (linksBuilder_ == null) {
-          return links_.get(index);
+      public context.ContextOuterClass.LinkId getLinkIds(int index) {
+        if (linkIdsBuilder_ == null) {
+          return linkIds_.get(index);
         } else {
-          return linksBuilder_.getMessage(index);
+          return linkIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder setLinks(
-          int index, context.ContextOuterClass.Link value) {
-        if (linksBuilder_ == null) {
+      public Builder setLinkIds(
+          int index, context.ContextOuterClass.LinkId value) {
+        if (linkIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureLinksIsMutable();
-          links_.set(index, value);
+          ensureLinkIdsIsMutable();
+          linkIds_.set(index, value);
           onChanged();
         } else {
-          linksBuilder_.setMessage(index, value);
+          linkIdsBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder setLinks(
-          int index, context.ContextOuterClass.Link.Builder builderForValue) {
-        if (linksBuilder_ == null) {
-          ensureLinksIsMutable();
-          links_.set(index, builderForValue.build());
+      public Builder setLinkIds(
+          int index, context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          linksBuilder_.setMessage(index, builderForValue.build());
+          linkIdsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder addLinks(context.ContextOuterClass.Link value) {
-        if (linksBuilder_ == null) {
+      public Builder addLinkIds(context.ContextOuterClass.LinkId value) {
+        if (linkIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureLinksIsMutable();
-          links_.add(value);
+          ensureLinkIdsIsMutable();
+          linkIds_.add(value);
           onChanged();
         } else {
-          linksBuilder_.addMessage(value);
+          linkIdsBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder addLinks(
-          int index, context.ContextOuterClass.Link value) {
-        if (linksBuilder_ == null) {
+      public Builder addLinkIds(
+          int index, context.ContextOuterClass.LinkId value) {
+        if (linkIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureLinksIsMutable();
-          links_.add(index, value);
+          ensureLinkIdsIsMutable();
+          linkIds_.add(index, value);
           onChanged();
         } else {
-          linksBuilder_.addMessage(index, value);
+          linkIdsBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder addLinks(
-          context.ContextOuterClass.Link.Builder builderForValue) {
-        if (linksBuilder_ == null) {
-          ensureLinksIsMutable();
-          links_.add(builderForValue.build());
+      public Builder addLinkIds(
+          context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.add(builderForValue.build());
           onChanged();
         } else {
-          linksBuilder_.addMessage(builderForValue.build());
+          linkIdsBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder addLinks(
-          int index, context.ContextOuterClass.Link.Builder builderForValue) {
-        if (linksBuilder_ == null) {
-          ensureLinksIsMutable();
-          links_.add(index, builderForValue.build());
+      public Builder addLinkIds(
+          int index, context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.add(index, builderForValue.build());
           onChanged();
         } else {
-          linksBuilder_.addMessage(index, builderForValue.build());
+          linkIdsBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder addAllLinks(
-          java.lang.Iterable<? extends context.ContextOuterClass.Link> values) {
-        if (linksBuilder_ == null) {
-          ensureLinksIsMutable();
+      public Builder addAllLinkIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.LinkId> values) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, links_);
+              values, linkIds_);
           onChanged();
         } else {
-          linksBuilder_.addAllMessages(values);
+          linkIdsBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder clearLinks() {
-        if (linksBuilder_ == null) {
-          links_ = java.util.Collections.emptyList();
+      public Builder clearLinkIds() {
+        if (linkIdsBuilder_ == null) {
+          linkIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          linksBuilder_.clear();
+          linkIdsBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public Builder removeLinks(int index) {
-        if (linksBuilder_ == null) {
-          ensureLinksIsMutable();
-          links_.remove(index);
+      public Builder removeLinkIds(int index) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.remove(index);
           onChanged();
         } else {
-          linksBuilder_.remove(index);
+          linkIdsBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public context.ContextOuterClass.Link.Builder getLinksBuilder(
+      public context.ContextOuterClass.LinkId.Builder getLinkIdsBuilder(
           int index) {
-        return getLinksFieldBuilder().getBuilder(index);
+        return getLinkIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public context.ContextOuterClass.LinkOrBuilder getLinksOrBuilder(
+      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
           int index) {
-        if (linksBuilder_ == null) {
-          return links_.get(index);  } else {
-          return linksBuilder_.getMessageOrBuilder(index);
+        if (linkIdsBuilder_ == null) {
+          return linkIds_.get(index);  } else {
+          return linkIdsBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.LinkOrBuilder> 
-           getLinksOrBuilderList() {
-        if (linksBuilder_ != null) {
-          return linksBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
+           getLinkIdsOrBuilderList() {
+        if (linkIdsBuilder_ != null) {
+          return linkIdsBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(links_);
+          return java.util.Collections.unmodifiableList(linkIds_);
         }
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public context.ContextOuterClass.Link.Builder addLinksBuilder() {
-        return getLinksFieldBuilder().addBuilder(
-            context.ContextOuterClass.Link.getDefaultInstance());
+      public context.ContextOuterClass.LinkId.Builder addLinkIdsBuilder() {
+        return getLinkIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.LinkId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public context.ContextOuterClass.Link.Builder addLinksBuilder(
+      public context.ContextOuterClass.LinkId.Builder addLinkIdsBuilder(
           int index) {
-        return getLinksFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.Link.getDefaultInstance());
+        return getLinkIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.LinkId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.Link links = 1;</code>
+       * <code>repeated .context.LinkId link_ids = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.Link.Builder> 
-           getLinksBuilderList() {
-        return getLinksFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.LinkId.Builder> 
+           getLinkIdsBuilderList() {
+        return getLinkIdsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Link, context.ContextOuterClass.Link.Builder, context.ContextOuterClass.LinkOrBuilder> 
-          getLinksFieldBuilder() {
-        if (linksBuilder_ == null) {
-          linksBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.Link, context.ContextOuterClass.Link.Builder, context.ContextOuterClass.LinkOrBuilder>(
-                  links_,
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
+          getLinkIdsFieldBuilder() {
+        if (linkIdsBuilder_ == null) {
+          linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
+                  linkIds_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          links_ = null;
+          linkIds_ = null;
         }
-        return linksBuilder_;
+        return linkIdsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -25126,100 +25569,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.LinkList)
+      // @@protoc_insertion_point(builder_scope:context.LinkIdList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.LinkList)
-    private static final context.ContextOuterClass.LinkList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.LinkIdList)
+    private static final context.ContextOuterClass.LinkIdList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkIdList();
     }
 
-    public static context.ContextOuterClass.LinkList getDefaultInstance() {
+    public static context.ContextOuterClass.LinkIdList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<LinkList>
-        PARSER = new com.google.protobuf.AbstractParser<LinkList>() {
+    private static final com.google.protobuf.Parser<LinkIdList>
+        PARSER = new com.google.protobuf.AbstractParser<LinkIdList>() {
       @java.lang.Override
-      public LinkList parsePartialFrom(
+      public LinkIdList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new LinkList(input, extensionRegistry);
+        return new LinkIdList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<LinkList> parser() {
+    public static com.google.protobuf.Parser<LinkIdList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<LinkList> getParserForType() {
+    public com.google.protobuf.Parser<LinkIdList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.LinkList getDefaultInstanceForType() {
+    public context.ContextOuterClass.LinkIdList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface LinkEventOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.LinkEvent)
+  public interface LinkListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.LinkList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
-     */
-    boolean hasEvent();
-    /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>repeated .context.Link links = 1;</code>
      */
-    context.ContextOuterClass.Event getEvent();
+    java.util.List<context.ContextOuterClass.Link> 
+        getLinksList();
     /**
-     * <code>.context.Event event = 1;</code>
+     * <code>repeated .context.Link links = 1;</code>
      */
-    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
-
+    context.ContextOuterClass.Link getLinks(int index);
     /**
-     * <code>.context.LinkId link_id = 2;</code>
-     * @return Whether the linkId field is set.
+     * <code>repeated .context.Link links = 1;</code>
      */
-    boolean hasLinkId();
+    int getLinksCount();
     /**
-     * <code>.context.LinkId link_id = 2;</code>
-     * @return The linkId.
+     * <code>repeated .context.Link links = 1;</code>
      */
-    context.ContextOuterClass.LinkId getLinkId();
+    java.util.List<? extends context.ContextOuterClass.LinkOrBuilder> 
+        getLinksOrBuilderList();
     /**
-     * <code>.context.LinkId link_id = 2;</code>
+     * <code>repeated .context.Link links = 1;</code>
      */
-    context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder();
+    context.ContextOuterClass.LinkOrBuilder getLinksOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.LinkEvent}
+   * Protobuf type {@code context.LinkList}
    */
-  public static final class LinkEvent extends
+  public static final class LinkList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.LinkEvent)
-      LinkEventOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.LinkList)
+      LinkListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use LinkEvent.newBuilder() to construct.
-    private LinkEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use LinkList.newBuilder() to construct.
+    private LinkList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private LinkEvent() {
+    private LinkList() {
+      links_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new LinkEvent();
+      return new LinkList();
     }
 
     @java.lang.Override
@@ -25227,7 +25665,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private LinkEvent(
+    private LinkList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -25235,6 +25673,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -25246,29 +25685,12 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Event.Builder subBuilder = null;
-              if (event_ != null) {
-                subBuilder = event_.toBuilder();
-              }
-              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(event_);
-                event_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 18: {
-              context.ContextOuterClass.LinkId.Builder subBuilder = null;
-              if (linkId_ != null) {
-                subBuilder = linkId_.toBuilder();
-              }
-              linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(linkId_);
-                linkId_ = subBuilder.buildPartial();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                links_ = new java.util.ArrayList<context.ContextOuterClass.Link>();
+                mutable_bitField0_ |= 0x00000001;
               }
-
+              links_.add(
+                  input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -25286,73 +25708,64 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          links_ = java.util.Collections.unmodifiableList(links_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
+      return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_LinkEvent_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_LinkList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.LinkEvent.class, context.ContextOuterClass.LinkEvent.Builder.class);
+              context.ContextOuterClass.LinkList.class, context.ContextOuterClass.LinkList.Builder.class);
     }
 
-    public static final int EVENT_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Event event_;
-    /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
-     */
-    @java.lang.Override
-    public boolean hasEvent() {
-      return event_ != null;
-    }
+    public static final int LINKS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.Link> links_;
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>repeated .context.Link links = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.Event getEvent() {
-      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+    public java.util.List<context.ContextOuterClass.Link> getLinksList() {
+      return links_;
     }
     /**
-     * <code>.context.Event event = 1;</code>
+     * <code>repeated .context.Link links = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-      return getEvent();
+    public java.util.List<? extends context.ContextOuterClass.LinkOrBuilder> 
+        getLinksOrBuilderList() {
+      return links_;
     }
-
-    public static final int LINK_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.LinkId linkId_;
     /**
-     * <code>.context.LinkId link_id = 2;</code>
-     * @return Whether the linkId field is set.
+     * <code>repeated .context.Link links = 1;</code>
      */
     @java.lang.Override
-    public boolean hasLinkId() {
-      return linkId_ != null;
+    public int getLinksCount() {
+      return links_.size();
     }
     /**
-     * <code>.context.LinkId link_id = 2;</code>
-     * @return The linkId.
+     * <code>repeated .context.Link links = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.LinkId getLinkId() {
-      return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+    public context.ContextOuterClass.Link getLinks(int index) {
+      return links_.get(index);
     }
     /**
-     * <code>.context.LinkId link_id = 2;</code>
+     * <code>repeated .context.Link links = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-      return getLinkId();
+    public context.ContextOuterClass.LinkOrBuilder getLinksOrBuilder(
+        int index) {
+      return links_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -25369,11 +25782,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (event_ != null) {
-        output.writeMessage(1, getEvent());
-      }
-      if (linkId_ != null) {
-        output.writeMessage(2, getLinkId());
+      for (int i = 0; i < links_.size(); i++) {
+        output.writeMessage(1, links_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -25384,13 +25794,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (event_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEvent());
-      }
-      if (linkId_ != null) {
+      for (int i = 0; i < links_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getLinkId());
+          .computeMessageSize(1, links_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -25402,21 +25808,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.LinkEvent)) {
+      if (!(obj instanceof context.ContextOuterClass.LinkList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.LinkEvent other = (context.ContextOuterClass.LinkEvent) obj;
+      context.ContextOuterClass.LinkList other = (context.ContextOuterClass.LinkList) obj;
 
-      if (hasEvent() != other.hasEvent()) return false;
-      if (hasEvent()) {
-        if (!getEvent()
-            .equals(other.getEvent())) return false;
-      }
-      if (hasLinkId() != other.hasLinkId()) return false;
-      if (hasLinkId()) {
-        if (!getLinkId()
-            .equals(other.getLinkId())) return false;
-      }
+      if (!getLinksList()
+          .equals(other.getLinksList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -25428,82 +25826,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEvent()) {
-        hash = (37 * hash) + EVENT_FIELD_NUMBER;
-        hash = (53 * hash) + getEvent().hashCode();
-      }
-      if (hasLinkId()) {
-        hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getLinkId().hashCode();
+      if (getLinksCount() > 0) {
+        hash = (37 * hash) + LINKS_FIELD_NUMBER;
+        hash = (53 * hash) + getLinksList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(byte[] data)
+    public static context.ContextOuterClass.LinkList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkEvent parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkEvent parseDelimitedFrom(
+    public static context.ContextOuterClass.LinkList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.LinkEvent parseFrom(
+    public static context.ContextOuterClass.LinkList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -25516,7 +25910,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.LinkEvent prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.LinkList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -25532,26 +25926,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.LinkEvent}
+     * Protobuf type {@code context.LinkList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.LinkEvent)
-        context.ContextOuterClass.LinkEventOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.LinkList)
+        context.ContextOuterClass.LinkListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_LinkEvent_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_LinkList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.LinkEvent.class, context.ContextOuterClass.LinkEvent.Builder.class);
+                context.ContextOuterClass.LinkList.class, context.ContextOuterClass.LinkList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.LinkEvent.newBuilder()
+      // Construct using context.ContextOuterClass.LinkList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -25564,22 +25958,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getLinksFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (eventBuilder_ == null) {
-          event_ = null;
-        } else {
-          event_ = null;
-          eventBuilder_ = null;
-        }
-        if (linkIdBuilder_ == null) {
-          linkId_ = null;
+        if (linksBuilder_ == null) {
+          links_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          linkId_ = null;
-          linkIdBuilder_ = null;
+          linksBuilder_.clear();
         }
         return this;
       }
@@ -25587,17 +25976,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkEvent getDefaultInstanceForType() {
-        return context.ContextOuterClass.LinkEvent.getDefaultInstance();
+      public context.ContextOuterClass.LinkList getDefaultInstanceForType() {
+        return context.ContextOuterClass.LinkList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkEvent build() {
-        context.ContextOuterClass.LinkEvent result = buildPartial();
+      public context.ContextOuterClass.LinkList build() {
+        context.ContextOuterClass.LinkList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -25605,17 +25994,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.LinkEvent buildPartial() {
-        context.ContextOuterClass.LinkEvent result = new context.ContextOuterClass.LinkEvent(this);
-        if (eventBuilder_ == null) {
-          result.event_ = event_;
-        } else {
-          result.event_ = eventBuilder_.build();
-        }
-        if (linkIdBuilder_ == null) {
-          result.linkId_ = linkId_;
+      public context.ContextOuterClass.LinkList buildPartial() {
+        context.ContextOuterClass.LinkList result = new context.ContextOuterClass.LinkList(this);
+        int from_bitField0_ = bitField0_;
+        if (linksBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            links_ = java.util.Collections.unmodifiableList(links_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.links_ = links_;
         } else {
-          result.linkId_ = linkIdBuilder_.build();
+          result.links_ = linksBuilder_.build();
         }
         onBuilt();
         return result;
@@ -25655,21 +26044,41 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.LinkEvent) {
-          return mergeFrom((context.ContextOuterClass.LinkEvent)other);
+        if (other instanceof context.ContextOuterClass.LinkList) {
+          return mergeFrom((context.ContextOuterClass.LinkList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.LinkEvent other) {
-        if (other == context.ContextOuterClass.LinkEvent.getDefaultInstance()) return this;
-        if (other.hasEvent()) {
-          mergeEvent(other.getEvent());
-        }
-        if (other.hasLinkId()) {
-          mergeLinkId(other.getLinkId());
+      public Builder mergeFrom(context.ContextOuterClass.LinkList other) {
+        if (other == context.ContextOuterClass.LinkList.getDefaultInstance()) return this;
+        if (linksBuilder_ == null) {
+          if (!other.links_.isEmpty()) {
+            if (links_.isEmpty()) {
+              links_ = other.links_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureLinksIsMutable();
+              links_.addAll(other.links_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.links_.isEmpty()) {
+            if (linksBuilder_.isEmpty()) {
+              linksBuilder_.dispose();
+              linksBuilder_ = null;
+              links_ = other.links_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              linksBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getLinksFieldBuilder() : null;
+            } else {
+              linksBuilder_.addAllMessages(other.links_);
+            }
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -25686,11 +26095,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.LinkEvent parsedMessage = null;
+        context.ContextOuterClass.LinkList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.LinkEvent) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.LinkList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -25699,243 +26108,246 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
+
+      private java.util.List<context.ContextOuterClass.Link> links_ =
+        java.util.Collections.emptyList();
+      private void ensureLinksIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          links_ = new java.util.ArrayList<context.ContextOuterClass.Link>(links_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.Link, context.ContextOuterClass.Link.Builder, context.ContextOuterClass.LinkOrBuilder> linksBuilder_;
 
-      private context.ContextOuterClass.Event event_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return Whether the event field is set.
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public boolean hasEvent() {
-        return eventBuilder_ != null || event_ != null;
+      public java.util.List<context.ContextOuterClass.Link> getLinksList() {
+        if (linksBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(links_);
+        } else {
+          return linksBuilder_.getMessageList();
+        }
       }
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return The event.
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public context.ContextOuterClass.Event getEvent() {
-        if (eventBuilder_ == null) {
-          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+      public int getLinksCount() {
+        if (linksBuilder_ == null) {
+          return links_.size();
         } else {
-          return eventBuilder_.getMessage();
+          return linksBuilder_.getCount();
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder setEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
+      public context.ContextOuterClass.Link getLinks(int index) {
+        if (linksBuilder_ == null) {
+          return links_.get(index);
+        } else {
+          return linksBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.Link links = 1;</code>
+       */
+      public Builder setLinks(
+          int index, context.ContextOuterClass.Link value) {
+        if (linksBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          event_ = value;
+          ensureLinksIsMutable();
+          links_.set(index, value);
           onChanged();
         } else {
-          eventBuilder_.setMessage(value);
+          linksBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder setEvent(
-          context.ContextOuterClass.Event.Builder builderForValue) {
-        if (eventBuilder_ == null) {
-          event_ = builderForValue.build();
+      public Builder setLinks(
+          int index, context.ContextOuterClass.Link.Builder builderForValue) {
+        if (linksBuilder_ == null) {
+          ensureLinksIsMutable();
+          links_.set(index, builderForValue.build());
           onChanged();
         } else {
-          eventBuilder_.setMessage(builderForValue.build());
+          linksBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder mergeEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
-          if (event_ != null) {
-            event_ =
-              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
-          } else {
-            event_ = value;
+      public Builder addLinks(context.ContextOuterClass.Link value) {
+        if (linksBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureLinksIsMutable();
+          links_.add(value);
           onChanged();
         } else {
-          eventBuilder_.mergeFrom(value);
+          linksBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder clearEvent() {
-        if (eventBuilder_ == null) {
-          event_ = null;
+      public Builder addLinks(
+          int index, context.ContextOuterClass.Link value) {
+        if (linksBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureLinksIsMutable();
+          links_.add(index, value);
           onChanged();
         } else {
-          event_ = null;
-          eventBuilder_ = null;
+          linksBuilder_.addMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public context.ContextOuterClass.Event.Builder getEventBuilder() {
-        
-        onChanged();
-        return getEventFieldBuilder().getBuilder();
+      public Builder addLinks(
+          context.ContextOuterClass.Link.Builder builderForValue) {
+        if (linksBuilder_ == null) {
+          ensureLinksIsMutable();
+          links_.add(builderForValue.build());
+          onChanged();
+        } else {
+          linksBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-        if (eventBuilder_ != null) {
-          return eventBuilder_.getMessageOrBuilder();
+      public Builder addLinks(
+          int index, context.ContextOuterClass.Link.Builder builderForValue) {
+        if (linksBuilder_ == null) {
+          ensureLinksIsMutable();
+          links_.add(index, builderForValue.build());
+          onChanged();
         } else {
-          return event_ == null ?
-              context.ContextOuterClass.Event.getDefaultInstance() : event_;
+          linksBuilder_.addMessage(index, builderForValue.build());
         }
+        return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
-          getEventFieldBuilder() {
-        if (eventBuilder_ == null) {
-          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
-                  getEvent(),
-                  getParentForChildren(),
-                  isClean());
-          event_ = null;
+      public Builder addAllLinks(
+          java.lang.Iterable<? extends context.ContextOuterClass.Link> values) {
+        if (linksBuilder_ == null) {
+          ensureLinksIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, links_);
+          onChanged();
+        } else {
+          linksBuilder_.addAllMessages(values);
         }
-        return eventBuilder_;
+        return this;
       }
-
-      private context.ContextOuterClass.LinkId linkId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdBuilder_;
       /**
-       * <code>.context.LinkId link_id = 2;</code>
-       * @return Whether the linkId field is set.
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public boolean hasLinkId() {
-        return linkIdBuilder_ != null || linkId_ != null;
-      }
-      /**
-       * <code>.context.LinkId link_id = 2;</code>
-       * @return The linkId.
-       */
-      public context.ContextOuterClass.LinkId getLinkId() {
-        if (linkIdBuilder_ == null) {
-          return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
+      public Builder clearLinks() {
+        if (linksBuilder_ == null) {
+          links_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
         } else {
-          return linkIdBuilder_.getMessage();
+          linksBuilder_.clear();
         }
+        return this;
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder setLinkId(context.ContextOuterClass.LinkId value) {
-        if (linkIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          linkId_ = value;
+      public Builder removeLinks(int index) {
+        if (linksBuilder_ == null) {
+          ensureLinksIsMutable();
+          links_.remove(index);
           onChanged();
         } else {
-          linkIdBuilder_.setMessage(value);
+          linksBuilder_.remove(index);
         }
-
         return this;
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder setLinkId(
-          context.ContextOuterClass.LinkId.Builder builderForValue) {
-        if (linkIdBuilder_ == null) {
-          linkId_ = builderForValue.build();
-          onChanged();
-        } else {
-          linkIdBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
+      public context.ContextOuterClass.Link.Builder getLinksBuilder(
+          int index) {
+        return getLinksFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
-        if (linkIdBuilder_ == null) {
-          if (linkId_ != null) {
-            linkId_ =
-              context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
-          } else {
-            linkId_ = value;
-          }
-          onChanged();
-        } else {
-          linkIdBuilder_.mergeFrom(value);
+      public context.ContextOuterClass.LinkOrBuilder getLinksOrBuilder(
+          int index) {
+        if (linksBuilder_ == null) {
+          return links_.get(index);  } else {
+          return linksBuilder_.getMessageOrBuilder(index);
         }
-
-        return this;
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public Builder clearLinkId() {
-        if (linkIdBuilder_ == null) {
-          linkId_ = null;
-          onChanged();
+      public java.util.List<? extends context.ContextOuterClass.LinkOrBuilder> 
+           getLinksOrBuilderList() {
+        if (linksBuilder_ != null) {
+          return linksBuilder_.getMessageOrBuilderList();
         } else {
-          linkId_ = null;
-          linkIdBuilder_ = null;
+          return java.util.Collections.unmodifiableList(links_);
         }
-
-        return this;
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
-        
-        onChanged();
-        return getLinkIdFieldBuilder().getBuilder();
+      public context.ContextOuterClass.Link.Builder addLinksBuilder() {
+        return getLinksFieldBuilder().addBuilder(
+            context.ContextOuterClass.Link.getDefaultInstance());
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
-        if (linkIdBuilder_ != null) {
-          return linkIdBuilder_.getMessageOrBuilder();
-        } else {
-          return linkId_ == null ?
-              context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
-        }
+      public context.ContextOuterClass.Link.Builder addLinksBuilder(
+          int index) {
+        return getLinksFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.Link.getDefaultInstance());
       }
       /**
-       * <code>.context.LinkId link_id = 2;</code>
+       * <code>repeated .context.Link links = 1;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
-          getLinkIdFieldBuilder() {
-        if (linkIdBuilder_ == null) {
-          linkIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
-                  getLinkId(),
+      public java.util.List<context.ContextOuterClass.Link.Builder> 
+           getLinksBuilderList() {
+        return getLinksFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.Link, context.ContextOuterClass.Link.Builder, context.ContextOuterClass.LinkOrBuilder> 
+          getLinksFieldBuilder() {
+        if (linksBuilder_ == null) {
+          linksBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.Link, context.ContextOuterClass.Link.Builder, context.ContextOuterClass.LinkOrBuilder>(
+                  links_,
+                  ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          linkId_ = null;
+          links_ = null;
         }
-        return linkIdBuilder_;
+        return linksBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -25950,104 +26362,100 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.LinkEvent)
+      // @@protoc_insertion_point(builder_scope:context.LinkList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.LinkEvent)
-    private static final context.ContextOuterClass.LinkEvent DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.LinkList)
+    private static final context.ContextOuterClass.LinkList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkEvent();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkList();
     }
 
-    public static context.ContextOuterClass.LinkEvent getDefaultInstance() {
+    public static context.ContextOuterClass.LinkList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<LinkEvent>
-        PARSER = new com.google.protobuf.AbstractParser<LinkEvent>() {
+    private static final com.google.protobuf.Parser<LinkList>
+        PARSER = new com.google.protobuf.AbstractParser<LinkList>() {
       @java.lang.Override
-      public LinkEvent parsePartialFrom(
+      public LinkList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new LinkEvent(input, extensionRegistry);
+        return new LinkList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<LinkEvent> parser() {
+    public static com.google.protobuf.Parser<LinkList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<LinkEvent> getParserForType() {
+    public com.google.protobuf.Parser<LinkList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.LinkEvent getDefaultInstanceForType() {
+    public context.ContextOuterClass.LinkList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ServiceIdOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ServiceId)
+  public interface LinkEventOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.LinkEvent)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.ContextId context_id = 1;</code>
-     * @return Whether the contextId field is set.
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
-    boolean hasContextId();
+    boolean hasEvent();
     /**
-     * <code>.context.ContextId context_id = 1;</code>
-     * @return The contextId.
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
-    context.ContextOuterClass.ContextId getContextId();
+    context.ContextOuterClass.Event getEvent();
     /**
-     * <code>.context.ContextId context_id = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
-    context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder();
+    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
 
     /**
-     * <code>.context.Uuid service_uuid = 2;</code>
-     * @return Whether the serviceUuid field is set.
+     * <code>.context.LinkId link_id = 2;</code>
+     * @return Whether the linkId field is set.
      */
-    boolean hasServiceUuid();
+    boolean hasLinkId();
     /**
-     * <code>.context.Uuid service_uuid = 2;</code>
-     * @return The serviceUuid.
+     * <code>.context.LinkId link_id = 2;</code>
+     * @return The linkId.
      */
-    context.ContextOuterClass.Uuid getServiceUuid();
+    context.ContextOuterClass.LinkId getLinkId();
     /**
-     * <code>.context.Uuid service_uuid = 2;</code>
+     * <code>.context.LinkId link_id = 2;</code>
      */
-    context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder();
+    context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder();
   }
   /**
-   * <pre>
-   * ----- Service -------------------------------------------------------------------------------------------------------
-   * </pre>
-   *
-   * Protobuf type {@code context.ServiceId}
+   * Protobuf type {@code context.LinkEvent}
    */
-  public static final class ServiceId extends
+  public static final class LinkEvent extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ServiceId)
-      ServiceIdOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.LinkEvent)
+      LinkEventOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ServiceId.newBuilder() to construct.
-    private ServiceId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use LinkEvent.newBuilder() to construct.
+    private LinkEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ServiceId() {
+    private LinkEvent() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ServiceId();
+      return new LinkEvent();
     }
 
     @java.lang.Override
@@ -26055,7 +26463,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ServiceId(
+    private LinkEvent(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -26074,27 +26482,27 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.ContextId.Builder subBuilder = null;
-              if (contextId_ != null) {
-                subBuilder = contextId_.toBuilder();
+              context.ContextOuterClass.Event.Builder subBuilder = null;
+              if (event_ != null) {
+                subBuilder = event_.toBuilder();
               }
-              contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
+              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(contextId_);
-                contextId_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(event_);
+                event_ = subBuilder.buildPartial();
               }
 
               break;
             }
             case 18: {
-              context.ContextOuterClass.Uuid.Builder subBuilder = null;
-              if (serviceUuid_ != null) {
-                subBuilder = serviceUuid_.toBuilder();
+              context.ContextOuterClass.LinkId.Builder subBuilder = null;
+              if (linkId_ != null) {
+                subBuilder = linkId_.toBuilder();
               }
-              serviceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+              linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(serviceUuid_);
-                serviceUuid_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(linkId_);
+                linkId_ = subBuilder.buildPartial();
               }
 
               break;
@@ -26120,67 +26528,67 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
+      return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ServiceId_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_LinkEvent_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ServiceId.class, context.ContextOuterClass.ServiceId.Builder.class);
+              context.ContextOuterClass.LinkEvent.class, context.ContextOuterClass.LinkEvent.Builder.class);
     }
 
-    public static final int CONTEXT_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.ContextId contextId_;
+    public static final int EVENT_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Event event_;
     /**
-     * <code>.context.ContextId context_id = 1;</code>
-     * @return Whether the contextId field is set.
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
     @java.lang.Override
-    public boolean hasContextId() {
-      return contextId_ != null;
+    public boolean hasEvent() {
+      return event_ != null;
     }
     /**
-     * <code>.context.ContextId context_id = 1;</code>
-     * @return The contextId.
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ContextId getContextId() {
-      return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+    public context.ContextOuterClass.Event getEvent() {
+      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
     }
     /**
-     * <code>.context.ContextId context_id = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-      return getContextId();
+    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+      return getEvent();
     }
 
-    public static final int SERVICE_UUID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.Uuid serviceUuid_;
+    public static final int LINK_ID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.LinkId linkId_;
     /**
-     * <code>.context.Uuid service_uuid = 2;</code>
-     * @return Whether the serviceUuid field is set.
+     * <code>.context.LinkId link_id = 2;</code>
+     * @return Whether the linkId field is set.
      */
     @java.lang.Override
-    public boolean hasServiceUuid() {
-      return serviceUuid_ != null;
+    public boolean hasLinkId() {
+      return linkId_ != null;
     }
     /**
-     * <code>.context.Uuid service_uuid = 2;</code>
-     * @return The serviceUuid.
+     * <code>.context.LinkId link_id = 2;</code>
+     * @return The linkId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Uuid getServiceUuid() {
-      return serviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
+    public context.ContextOuterClass.LinkId getLinkId() {
+      return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
     }
     /**
-     * <code>.context.Uuid service_uuid = 2;</code>
+     * <code>.context.LinkId link_id = 2;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder() {
-      return getServiceUuid();
+    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
+      return getLinkId();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -26197,11 +26605,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (contextId_ != null) {
-        output.writeMessage(1, getContextId());
+      if (event_ != null) {
+        output.writeMessage(1, getEvent());
       }
-      if (serviceUuid_ != null) {
-        output.writeMessage(2, getServiceUuid());
+      if (linkId_ != null) {
+        output.writeMessage(2, getLinkId());
       }
       unknownFields.writeTo(output);
     }
@@ -26212,13 +26620,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (contextId_ != null) {
+      if (event_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getContextId());
+          .computeMessageSize(1, getEvent());
       }
-      if (serviceUuid_ != null) {
+      if (linkId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getServiceUuid());
+          .computeMessageSize(2, getLinkId());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -26230,20 +26638,20 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ServiceId)) {
+      if (!(obj instanceof context.ContextOuterClass.LinkEvent)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ServiceId other = (context.ContextOuterClass.ServiceId) obj;
+      context.ContextOuterClass.LinkEvent other = (context.ContextOuterClass.LinkEvent) obj;
 
-      if (hasContextId() != other.hasContextId()) return false;
-      if (hasContextId()) {
-        if (!getContextId()
-            .equals(other.getContextId())) return false;
+      if (hasEvent() != other.hasEvent()) return false;
+      if (hasEvent()) {
+        if (!getEvent()
+            .equals(other.getEvent())) return false;
       }
-      if (hasServiceUuid() != other.hasServiceUuid()) return false;
-      if (hasServiceUuid()) {
-        if (!getServiceUuid()
-            .equals(other.getServiceUuid())) return false;
+      if (hasLinkId() != other.hasLinkId()) return false;
+      if (hasLinkId()) {
+        if (!getLinkId()
+            .equals(other.getLinkId())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -26256,82 +26664,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasContextId()) {
-        hash = (37 * hash) + CONTEXT_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getContextId().hashCode();
+      if (hasEvent()) {
+        hash = (37 * hash) + EVENT_FIELD_NUMBER;
+        hash = (53 * hash) + getEvent().hashCode();
       }
-      if (hasServiceUuid()) {
-        hash = (37 * hash) + SERVICE_UUID_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceUuid().hashCode();
+      if (hasLinkId()) {
+        hash = (37 * hash) + LINK_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getLinkId().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(byte[] data)
+    public static context.ContextOuterClass.LinkEvent parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkEvent parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceId parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.LinkEvent parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceId parseDelimitedFrom(
+    public static context.ContextOuterClass.LinkEvent parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceId parseFrom(
+    public static context.ContextOuterClass.LinkEvent parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -26344,7 +26752,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ServiceId prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.LinkEvent prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -26360,30 +26768,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * <pre>
-     * ----- Service -------------------------------------------------------------------------------------------------------
-     * </pre>
-     *
-     * Protobuf type {@code context.ServiceId}
+     * Protobuf type {@code context.LinkEvent}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ServiceId)
-        context.ContextOuterClass.ServiceIdOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.LinkEvent)
+        context.ContextOuterClass.LinkEventOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ServiceId_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_LinkEvent_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ServiceId.class, context.ContextOuterClass.ServiceId.Builder.class);
+                context.ContextOuterClass.LinkEvent.class, context.ContextOuterClass.LinkEvent.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ServiceId.newBuilder()
+      // Construct using context.ContextOuterClass.LinkEvent.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -26401,17 +26805,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (contextIdBuilder_ == null) {
-          contextId_ = null;
+        if (eventBuilder_ == null) {
+          event_ = null;
         } else {
-          contextId_ = null;
-          contextIdBuilder_ = null;
+          event_ = null;
+          eventBuilder_ = null;
         }
-        if (serviceUuidBuilder_ == null) {
-          serviceUuid_ = null;
+        if (linkIdBuilder_ == null) {
+          linkId_ = null;
         } else {
-          serviceUuid_ = null;
-          serviceUuidBuilder_ = null;
+          linkId_ = null;
+          linkIdBuilder_ = null;
         }
         return this;
       }
@@ -26419,17 +26823,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
+        return context.ContextOuterClass.internal_static_context_LinkEvent_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceId getDefaultInstanceForType() {
-        return context.ContextOuterClass.ServiceId.getDefaultInstance();
+      public context.ContextOuterClass.LinkEvent getDefaultInstanceForType() {
+        return context.ContextOuterClass.LinkEvent.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceId build() {
-        context.ContextOuterClass.ServiceId result = buildPartial();
+      public context.ContextOuterClass.LinkEvent build() {
+        context.ContextOuterClass.LinkEvent result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -26437,17 +26841,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceId buildPartial() {
-        context.ContextOuterClass.ServiceId result = new context.ContextOuterClass.ServiceId(this);
-        if (contextIdBuilder_ == null) {
-          result.contextId_ = contextId_;
+      public context.ContextOuterClass.LinkEvent buildPartial() {
+        context.ContextOuterClass.LinkEvent result = new context.ContextOuterClass.LinkEvent(this);
+        if (eventBuilder_ == null) {
+          result.event_ = event_;
         } else {
-          result.contextId_ = contextIdBuilder_.build();
+          result.event_ = eventBuilder_.build();
         }
-        if (serviceUuidBuilder_ == null) {
-          result.serviceUuid_ = serviceUuid_;
+        if (linkIdBuilder_ == null) {
+          result.linkId_ = linkId_;
         } else {
-          result.serviceUuid_ = serviceUuidBuilder_.build();
+          result.linkId_ = linkIdBuilder_.build();
         }
         onBuilt();
         return result;
@@ -26487,21 +26891,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ServiceId) {
-          return mergeFrom((context.ContextOuterClass.ServiceId)other);
+        if (other instanceof context.ContextOuterClass.LinkEvent) {
+          return mergeFrom((context.ContextOuterClass.LinkEvent)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ServiceId other) {
-        if (other == context.ContextOuterClass.ServiceId.getDefaultInstance()) return this;
-        if (other.hasContextId()) {
-          mergeContextId(other.getContextId());
+      public Builder mergeFrom(context.ContextOuterClass.LinkEvent other) {
+        if (other == context.ContextOuterClass.LinkEvent.getDefaultInstance()) return this;
+        if (other.hasEvent()) {
+          mergeEvent(other.getEvent());
         }
-        if (other.hasServiceUuid()) {
-          mergeServiceUuid(other.getServiceUuid());
+        if (other.hasLinkId()) {
+          mergeLinkId(other.getLinkId());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -26518,11 +26922,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ServiceId parsedMessage = null;
+        context.ContextOuterClass.LinkEvent parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ServiceId) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.LinkEvent) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -26532,242 +26936,242 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.ContextId contextId_;
+      private context.ContextOuterClass.Event event_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ContextId, context.ContextOuterClass.ContextId.Builder, context.ContextOuterClass.ContextIdOrBuilder> contextIdBuilder_;
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
       /**
-       * <code>.context.ContextId context_id = 1;</code>
-       * @return Whether the contextId field is set.
+       * <code>.context.Event event = 1;</code>
+       * @return Whether the event field is set.
        */
-      public boolean hasContextId() {
-        return contextIdBuilder_ != null || contextId_ != null;
+      public boolean hasEvent() {
+        return eventBuilder_ != null || event_ != null;
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
-       * @return The contextId.
+       * <code>.context.Event event = 1;</code>
+       * @return The event.
        */
-      public context.ContextOuterClass.ContextId getContextId() {
-        if (contextIdBuilder_ == null) {
-          return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+      public context.ContextOuterClass.Event getEvent() {
+        if (eventBuilder_ == null) {
+          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
         } else {
-          return contextIdBuilder_.getMessage();
+          return eventBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setContextId(context.ContextOuterClass.ContextId value) {
-        if (contextIdBuilder_ == null) {
+      public Builder setEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          contextId_ = value;
+          event_ = value;
           onChanged();
         } else {
-          contextIdBuilder_.setMessage(value);
+          eventBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setContextId(
-          context.ContextOuterClass.ContextId.Builder builderForValue) {
-        if (contextIdBuilder_ == null) {
-          contextId_ = builderForValue.build();
+      public Builder setEvent(
+          context.ContextOuterClass.Event.Builder builderForValue) {
+        if (eventBuilder_ == null) {
+          event_ = builderForValue.build();
           onChanged();
         } else {
-          contextIdBuilder_.setMessage(builderForValue.build());
+          eventBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
-        if (contextIdBuilder_ == null) {
-          if (contextId_ != null) {
-            contextId_ =
-              context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
+      public Builder mergeEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
+          if (event_ != null) {
+            event_ =
+              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
           } else {
-            contextId_ = value;
+            event_ = value;
           }
           onChanged();
         } else {
-          contextIdBuilder_.mergeFrom(value);
+          eventBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder clearContextId() {
-        if (contextIdBuilder_ == null) {
-          contextId_ = null;
-          onChanged();
-        } else {
-          contextId_ = null;
-          contextIdBuilder_ = null;
+      public Builder clearEvent() {
+        if (eventBuilder_ == null) {
+          event_ = null;
+          onChanged();
+        } else {
+          event_ = null;
+          eventBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
+      public context.ContextOuterClass.Event.Builder getEventBuilder() {
         
         onChanged();
-        return getContextIdFieldBuilder().getBuilder();
+        return getEventFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
-        if (contextIdBuilder_ != null) {
-          return contextIdBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+        if (eventBuilder_ != null) {
+          return eventBuilder_.getMessageOrBuilder();
         } else {
-          return contextId_ == null ?
-              context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
+          return event_ == null ?
+              context.ContextOuterClass.Event.getDefaultInstance() : event_;
         }
       }
       /**
-       * <code>.context.ContextId context_id = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ContextId, context.ContextOuterClass.ContextId.Builder, context.ContextOuterClass.ContextIdOrBuilder> 
-          getContextIdFieldBuilder() {
-        if (contextIdBuilder_ == null) {
-          contextIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ContextId, context.ContextOuterClass.ContextId.Builder, context.ContextOuterClass.ContextIdOrBuilder>(
-                  getContextId(),
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
+          getEventFieldBuilder() {
+        if (eventBuilder_ == null) {
+          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
+                  getEvent(),
                   getParentForChildren(),
                   isClean());
-          contextId_ = null;
+          event_ = null;
         }
-        return contextIdBuilder_;
+        return eventBuilder_;
       }
 
-      private context.ContextOuterClass.Uuid serviceUuid_;
+      private context.ContextOuterClass.LinkId linkId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> serviceUuidBuilder_;
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdBuilder_;
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
-       * @return Whether the serviceUuid field is set.
+       * <code>.context.LinkId link_id = 2;</code>
+       * @return Whether the linkId field is set.
        */
-      public boolean hasServiceUuid() {
-        return serviceUuidBuilder_ != null || serviceUuid_ != null;
+      public boolean hasLinkId() {
+        return linkIdBuilder_ != null || linkId_ != null;
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
-       * @return The serviceUuid.
+       * <code>.context.LinkId link_id = 2;</code>
+       * @return The linkId.
        */
-      public context.ContextOuterClass.Uuid getServiceUuid() {
-        if (serviceUuidBuilder_ == null) {
-          return serviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
+      public context.ContextOuterClass.LinkId getLinkId() {
+        if (linkIdBuilder_ == null) {
+          return linkId_ == null ? context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
         } else {
-          return serviceUuidBuilder_.getMessage();
+          return linkIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
-      public Builder setServiceUuid(context.ContextOuterClass.Uuid value) {
-        if (serviceUuidBuilder_ == null) {
+      public Builder setLinkId(context.ContextOuterClass.LinkId value) {
+        if (linkIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          serviceUuid_ = value;
+          linkId_ = value;
           onChanged();
         } else {
-          serviceUuidBuilder_.setMessage(value);
+          linkIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
-      public Builder setServiceUuid(
-          context.ContextOuterClass.Uuid.Builder builderForValue) {
-        if (serviceUuidBuilder_ == null) {
-          serviceUuid_ = builderForValue.build();
+      public Builder setLinkId(
+          context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdBuilder_ == null) {
+          linkId_ = builderForValue.build();
           onChanged();
         } else {
-          serviceUuidBuilder_.setMessage(builderForValue.build());
+          linkIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
-      public Builder mergeServiceUuid(context.ContextOuterClass.Uuid value) {
-        if (serviceUuidBuilder_ == null) {
-          if (serviceUuid_ != null) {
-            serviceUuid_ =
-              context.ContextOuterClass.Uuid.newBuilder(serviceUuid_).mergeFrom(value).buildPartial();
+      public Builder mergeLinkId(context.ContextOuterClass.LinkId value) {
+        if (linkIdBuilder_ == null) {
+          if (linkId_ != null) {
+            linkId_ =
+              context.ContextOuterClass.LinkId.newBuilder(linkId_).mergeFrom(value).buildPartial();
           } else {
-            serviceUuid_ = value;
+            linkId_ = value;
           }
           onChanged();
         } else {
-          serviceUuidBuilder_.mergeFrom(value);
+          linkIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
-      public Builder clearServiceUuid() {
-        if (serviceUuidBuilder_ == null) {
-          serviceUuid_ = null;
+      public Builder clearLinkId() {
+        if (linkIdBuilder_ == null) {
+          linkId_ = null;
           onChanged();
         } else {
-          serviceUuid_ = null;
-          serviceUuidBuilder_ = null;
+          linkId_ = null;
+          linkIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
-      public context.ContextOuterClass.Uuid.Builder getServiceUuidBuilder() {
+      public context.ContextOuterClass.LinkId.Builder getLinkIdBuilder() {
         
         onChanged();
-        return getServiceUuidFieldBuilder().getBuilder();
+        return getLinkIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
-      public context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder() {
-        if (serviceUuidBuilder_ != null) {
-          return serviceUuidBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdOrBuilder() {
+        if (linkIdBuilder_ != null) {
+          return linkIdBuilder_.getMessageOrBuilder();
         } else {
-          return serviceUuid_ == null ?
-              context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
+          return linkId_ == null ?
+              context.ContextOuterClass.LinkId.getDefaultInstance() : linkId_;
         }
       }
       /**
-       * <code>.context.Uuid service_uuid = 2;</code>
+       * <code>.context.LinkId link_id = 2;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
-          getServiceUuidFieldBuilder() {
-        if (serviceUuidBuilder_ == null) {
-          serviceUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
-                  getServiceUuid(),
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
+          getLinkIdFieldBuilder() {
+        if (linkIdBuilder_ == null) {
+          linkIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
+                  getLinkId(),
                   getParentForChildren(),
                   isClean());
-          serviceUuid_ = null;
+          linkId_ = null;
         }
-        return serviceUuidBuilder_;
+        return linkIdBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -26782,205 +27186,104 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ServiceId)
+      // @@protoc_insertion_point(builder_scope:context.LinkEvent)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ServiceId)
-    private static final context.ContextOuterClass.ServiceId DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.LinkEvent)
+    private static final context.ContextOuterClass.LinkEvent DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceId();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.LinkEvent();
     }
 
-    public static context.ContextOuterClass.ServiceId getDefaultInstance() {
+    public static context.ContextOuterClass.LinkEvent getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ServiceId>
-        PARSER = new com.google.protobuf.AbstractParser<ServiceId>() {
+    private static final com.google.protobuf.Parser<LinkEvent>
+        PARSER = new com.google.protobuf.AbstractParser<LinkEvent>() {
       @java.lang.Override
-      public ServiceId parsePartialFrom(
+      public LinkEvent parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ServiceId(input, extensionRegistry);
+        return new LinkEvent(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ServiceId> parser() {
+    public static com.google.protobuf.Parser<LinkEvent> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ServiceId> getParserForType() {
+    public com.google.protobuf.Parser<LinkEvent> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ServiceId getDefaultInstanceForType() {
+    public context.ContextOuterClass.LinkEvent getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ServiceOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Service)
+  public interface ServiceIdOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ServiceId)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.ServiceId service_id = 1;</code>
-     * @return Whether the serviceId field is set.
-     */
-    boolean hasServiceId();
-    /**
-     * <code>.context.ServiceId service_id = 1;</code>
-     * @return The serviceId.
-     */
-    context.ContextOuterClass.ServiceId getServiceId();
-    /**
-     * <code>.context.ServiceId service_id = 1;</code>
-     */
-    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
-
-    /**
-     * <code>string name = 2;</code>
-     * @return The name.
-     */
-    java.lang.String getName();
-    /**
-     * <code>string name = 2;</code>
-     * @return The bytes for name.
-     */
-    com.google.protobuf.ByteString
-        getNameBytes();
-
-    /**
-     * <code>.context.ServiceTypeEnum service_type = 3;</code>
-     * @return The enum numeric value on the wire for serviceType.
-     */
-    int getServiceTypeValue();
-    /**
-     * <code>.context.ServiceTypeEnum service_type = 3;</code>
-     * @return The serviceType.
-     */
-    context.ContextOuterClass.ServiceTypeEnum getServiceType();
-
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    java.util.List<context.ContextOuterClass.EndPointId> 
-        getServiceEndpointIdsList();
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    context.ContextOuterClass.EndPointId getServiceEndpointIds(int index);
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    int getServiceEndpointIdsCount();
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getServiceEndpointIdsOrBuilderList();
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    context.ContextOuterClass.EndPointIdOrBuilder getServiceEndpointIdsOrBuilder(
-        int index);
-
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    java.util.List<context.ContextOuterClass.Constraint> 
-        getServiceConstraintsList();
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    context.ContextOuterClass.Constraint getServiceConstraints(int index);
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    int getServiceConstraintsCount();
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
-        getServiceConstraintsOrBuilderList();
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    context.ContextOuterClass.ConstraintOrBuilder getServiceConstraintsOrBuilder(
-        int index);
-
-    /**
-     * <code>.context.ServiceStatus service_status = 6;</code>
-     * @return Whether the serviceStatus field is set.
-     */
-    boolean hasServiceStatus();
-    /**
-     * <code>.context.ServiceStatus service_status = 6;</code>
-     * @return The serviceStatus.
-     */
-    context.ContextOuterClass.ServiceStatus getServiceStatus();
-    /**
-     * <code>.context.ServiceStatus service_status = 6;</code>
-     */
-    context.ContextOuterClass.ServiceStatusOrBuilder getServiceStatusOrBuilder();
-
-    /**
-     * <code>.context.ServiceConfig service_config = 7;</code>
-     * @return Whether the serviceConfig field is set.
+     * <code>.context.ContextId context_id = 1;</code>
+     * @return Whether the contextId field is set.
      */
-    boolean hasServiceConfig();
+    boolean hasContextId();
     /**
-     * <code>.context.ServiceConfig service_config = 7;</code>
-     * @return The serviceConfig.
+     * <code>.context.ContextId context_id = 1;</code>
+     * @return The contextId.
      */
-    context.ContextOuterClass.ServiceConfig getServiceConfig();
+    context.ContextOuterClass.ContextId getContextId();
     /**
-     * <code>.context.ServiceConfig service_config = 7;</code>
+     * <code>.context.ContextId context_id = 1;</code>
      */
-    context.ContextOuterClass.ServiceConfigOrBuilder getServiceConfigOrBuilder();
+    context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder();
 
     /**
-     * <code>.context.Timestamp timestamp = 8;</code>
-     * @return Whether the timestamp field is set.
+     * <code>.context.Uuid service_uuid = 2;</code>
+     * @return Whether the serviceUuid field is set.
      */
-    boolean hasTimestamp();
+    boolean hasServiceUuid();
     /**
-     * <code>.context.Timestamp timestamp = 8;</code>
-     * @return The timestamp.
+     * <code>.context.Uuid service_uuid = 2;</code>
+     * @return The serviceUuid.
      */
-    context.ContextOuterClass.Timestamp getTimestamp();
+    context.ContextOuterClass.Uuid getServiceUuid();
     /**
-     * <code>.context.Timestamp timestamp = 8;</code>
+     * <code>.context.Uuid service_uuid = 2;</code>
      */
-    context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder();
+    context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder();
   }
   /**
-   * Protobuf type {@code context.Service}
+   * <pre>
+   * ----- Service -------------------------------------------------------------------------------------------------------
+   * </pre>
+   *
+   * Protobuf type {@code context.ServiceId}
    */
-  public static final class Service extends
+  public static final class ServiceId extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Service)
-      ServiceOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ServiceId)
+      ServiceIdOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Service.newBuilder() to construct.
-    private Service(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ServiceId.newBuilder() to construct.
+    private ServiceId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Service() {
-      name_ = "";
-      serviceType_ = 0;
-      serviceEndpointIds_ = java.util.Collections.emptyList();
-      serviceConstraints_ = java.util.Collections.emptyList();
+    private ServiceId() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Service();
+      return new ServiceId();
     }
 
     @java.lang.Override
@@ -26988,7 +27291,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Service(
+    private ServiceId(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -26996,7 +27299,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -27008,83 +27310,27 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
-              if (serviceId_ != null) {
-                subBuilder = serviceId_.toBuilder();
+              context.ContextOuterClass.ContextId.Builder subBuilder = null;
+              if (contextId_ != null) {
+                subBuilder = contextId_.toBuilder();
               }
-              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+              contextId_ = input.readMessage(context.ContextOuterClass.ContextId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(serviceId_);
-                serviceId_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(contextId_);
+                contextId_ = subBuilder.buildPartial();
               }
 
               break;
             }
             case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              name_ = s;
-              break;
-            }
-            case 24: {
-              int rawValue = input.readEnum();
-
-              serviceType_ = rawValue;
-              break;
-            }
-            case 34: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                serviceEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              serviceEndpointIds_.add(
-                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
-              break;
-            }
-            case 42: {
-              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-                serviceConstraints_ = new java.util.ArrayList<context.ContextOuterClass.Constraint>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              serviceConstraints_.add(
-                  input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry));
-              break;
-            }
-            case 50: {
-              context.ContextOuterClass.ServiceStatus.Builder subBuilder = null;
-              if (serviceStatus_ != null) {
-                subBuilder = serviceStatus_.toBuilder();
-              }
-              serviceStatus_ = input.readMessage(context.ContextOuterClass.ServiceStatus.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(serviceStatus_);
-                serviceStatus_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 58: {
-              context.ContextOuterClass.ServiceConfig.Builder subBuilder = null;
-              if (serviceConfig_ != null) {
-                subBuilder = serviceConfig_.toBuilder();
-              }
-              serviceConfig_ = input.readMessage(context.ContextOuterClass.ServiceConfig.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(serviceConfig_);
-                serviceConfig_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 66: {
-              context.ContextOuterClass.Timestamp.Builder subBuilder = null;
-              if (timestamp_ != null) {
-                subBuilder = timestamp_.toBuilder();
+              context.ContextOuterClass.Uuid.Builder subBuilder = null;
+              if (serviceUuid_ != null) {
+                subBuilder = serviceUuid_.toBuilder();
               }
-              timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+              serviceUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(timestamp_);
-                timestamp_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(serviceUuid_);
+                serviceUuid_ = subBuilder.buildPartial();
               }
 
               break;
@@ -27104,268 +27350,73 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
-        }
-        if (((mutable_bitField0_ & 0x00000002) != 0)) {
-          serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Service_descriptor;
+      return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Service_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ServiceId_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Service.class, context.ContextOuterClass.Service.Builder.class);
+              context.ContextOuterClass.ServiceId.class, context.ContextOuterClass.ServiceId.Builder.class);
     }
 
-    public static final int SERVICE_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.ServiceId serviceId_;
+    public static final int CONTEXT_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.ContextId contextId_;
     /**
-     * <code>.context.ServiceId service_id = 1;</code>
-     * @return Whether the serviceId field is set.
+     * <code>.context.ContextId context_id = 1;</code>
+     * @return Whether the contextId field is set.
      */
     @java.lang.Override
-    public boolean hasServiceId() {
-      return serviceId_ != null;
+    public boolean hasContextId() {
+      return contextId_ != null;
     }
     /**
-     * <code>.context.ServiceId service_id = 1;</code>
-     * @return The serviceId.
+     * <code>.context.ContextId context_id = 1;</code>
+     * @return The contextId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceId getServiceId() {
-      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+    public context.ContextOuterClass.ContextId getContextId() {
+      return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
     }
     /**
-     * <code>.context.ServiceId service_id = 1;</code>
+     * <code>.context.ContextId context_id = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-      return getServiceId();
+    public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
+      return getContextId();
     }
 
-    public static final int NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object name_;
+    public static final int SERVICE_UUID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.Uuid serviceUuid_;
     /**
-     * <code>string name = 2;</code>
-     * @return The name.
+     * <code>.context.Uuid service_uuid = 2;</code>
+     * @return Whether the serviceUuid field is set.
      */
     @java.lang.Override
-    public java.lang.String getName() {
-      java.lang.Object ref = name_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        name_ = s;
-        return s;
-      }
+    public boolean hasServiceUuid() {
+      return serviceUuid_ != null;
     }
     /**
-     * <code>string name = 2;</code>
-     * @return The bytes for name.
+     * <code>.context.Uuid service_uuid = 2;</code>
+     * @return The serviceUuid.
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getNameBytes() {
-      java.lang.Object ref = name_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        name_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public context.ContextOuterClass.Uuid getServiceUuid() {
+      return serviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
     }
-
-    public static final int SERVICE_TYPE_FIELD_NUMBER = 3;
-    private int serviceType_;
     /**
-     * <code>.context.ServiceTypeEnum service_type = 3;</code>
-     * @return The enum numeric value on the wire for serviceType.
+     * <code>.context.Uuid service_uuid = 2;</code>
      */
-    @java.lang.Override public int getServiceTypeValue() {
-      return serviceType_;
-    }
-    /**
-     * <code>.context.ServiceTypeEnum service_type = 3;</code>
-     * @return The serviceType.
-     */
-    @java.lang.Override public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-      @SuppressWarnings("deprecation")
-      context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
-      return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
-    }
-
-    public static final int SERVICE_ENDPOINT_IDS_FIELD_NUMBER = 4;
-    private java.util.List<context.ContextOuterClass.EndPointId> serviceEndpointIds_;
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    @java.lang.Override
-    public java.util.List<context.ContextOuterClass.EndPointId> getServiceEndpointIdsList() {
-      return serviceEndpointIds_;
-    }
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getServiceEndpointIdsOrBuilderList() {
-      return serviceEndpointIds_;
-    }
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    @java.lang.Override
-    public int getServiceEndpointIdsCount() {
-      return serviceEndpointIds_.size();
-    }
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointId getServiceEndpointIds(int index) {
-      return serviceEndpointIds_.get(index);
-    }
-    /**
-     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getServiceEndpointIdsOrBuilder(
-        int index) {
-      return serviceEndpointIds_.get(index);
-    }
-
-    public static final int SERVICE_CONSTRAINTS_FIELD_NUMBER = 5;
-    private java.util.List<context.ContextOuterClass.Constraint> serviceConstraints_;
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    @java.lang.Override
-    public java.util.List<context.ContextOuterClass.Constraint> getServiceConstraintsList() {
-      return serviceConstraints_;
-    }
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
-        getServiceConstraintsOrBuilderList() {
-      return serviceConstraints_;
-    }
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    @java.lang.Override
-    public int getServiceConstraintsCount() {
-      return serviceConstraints_.size();
-    }
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.Constraint getServiceConstraints(int index) {
-      return serviceConstraints_.get(index);
-    }
-    /**
-     * <code>repeated .context.Constraint service_constraints = 5;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConstraintOrBuilder getServiceConstraintsOrBuilder(
-        int index) {
-      return serviceConstraints_.get(index);
-    }
-
-    public static final int SERVICE_STATUS_FIELD_NUMBER = 6;
-    private context.ContextOuterClass.ServiceStatus serviceStatus_;
-    /**
-     * <code>.context.ServiceStatus service_status = 6;</code>
-     * @return Whether the serviceStatus field is set.
-     */
-    @java.lang.Override
-    public boolean hasServiceStatus() {
-      return serviceStatus_ != null;
-    }
-    /**
-     * <code>.context.ServiceStatus service_status = 6;</code>
-     * @return The serviceStatus.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ServiceStatus getServiceStatus() {
-      return serviceStatus_ == null ? context.ContextOuterClass.ServiceStatus.getDefaultInstance() : serviceStatus_;
-    }
-    /**
-     * <code>.context.ServiceStatus service_status = 6;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ServiceStatusOrBuilder getServiceStatusOrBuilder() {
-      return getServiceStatus();
-    }
-
-    public static final int SERVICE_CONFIG_FIELD_NUMBER = 7;
-    private context.ContextOuterClass.ServiceConfig serviceConfig_;
-    /**
-     * <code>.context.ServiceConfig service_config = 7;</code>
-     * @return Whether the serviceConfig field is set.
-     */
-    @java.lang.Override
-    public boolean hasServiceConfig() {
-      return serviceConfig_ != null;
-    }
-    /**
-     * <code>.context.ServiceConfig service_config = 7;</code>
-     * @return The serviceConfig.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ServiceConfig getServiceConfig() {
-      return serviceConfig_ == null ? context.ContextOuterClass.ServiceConfig.getDefaultInstance() : serviceConfig_;
-    }
-    /**
-     * <code>.context.ServiceConfig service_config = 7;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ServiceConfigOrBuilder getServiceConfigOrBuilder() {
-      return getServiceConfig();
-    }
-
-    public static final int TIMESTAMP_FIELD_NUMBER = 8;
-    private context.ContextOuterClass.Timestamp timestamp_;
-    /**
-     * <code>.context.Timestamp timestamp = 8;</code>
-     * @return Whether the timestamp field is set.
-     */
-    @java.lang.Override
-    public boolean hasTimestamp() {
-      return timestamp_ != null;
-    }
-    /**
-     * <code>.context.Timestamp timestamp = 8;</code>
-     * @return The timestamp.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.Timestamp getTimestamp() {
-      return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
-    }
-    /**
-     * <code>.context.Timestamp timestamp = 8;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-      return getTimestamp();
+    @java.lang.Override
+    public context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder() {
+      return getServiceUuid();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -27382,29 +27433,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (serviceId_ != null) {
-        output.writeMessage(1, getServiceId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
-      }
-      if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
-        output.writeEnum(3, serviceType_);
-      }
-      for (int i = 0; i < serviceEndpointIds_.size(); i++) {
-        output.writeMessage(4, serviceEndpointIds_.get(i));
-      }
-      for (int i = 0; i < serviceConstraints_.size(); i++) {
-        output.writeMessage(5, serviceConstraints_.get(i));
-      }
-      if (serviceStatus_ != null) {
-        output.writeMessage(6, getServiceStatus());
-      }
-      if (serviceConfig_ != null) {
-        output.writeMessage(7, getServiceConfig());
+      if (contextId_ != null) {
+        output.writeMessage(1, getContextId());
       }
-      if (timestamp_ != null) {
-        output.writeMessage(8, getTimestamp());
+      if (serviceUuid_ != null) {
+        output.writeMessage(2, getServiceUuid());
       }
       unknownFields.writeTo(output);
     }
@@ -27415,36 +27448,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (serviceId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getServiceId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
-      }
-      if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(3, serviceType_);
-      }
-      for (int i = 0; i < serviceEndpointIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, serviceEndpointIds_.get(i));
-      }
-      for (int i = 0; i < serviceConstraints_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, serviceConstraints_.get(i));
-      }
-      if (serviceStatus_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(6, getServiceStatus());
-      }
-      if (serviceConfig_ != null) {
+      if (contextId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, getServiceConfig());
+          .computeMessageSize(1, getContextId());
       }
-      if (timestamp_ != null) {
+      if (serviceUuid_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(8, getTimestamp());
+          .computeMessageSize(2, getServiceUuid());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -27456,37 +27466,20 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Service)) {
+      if (!(obj instanceof context.ContextOuterClass.ServiceId)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Service other = (context.ContextOuterClass.Service) obj;
+      context.ContextOuterClass.ServiceId other = (context.ContextOuterClass.ServiceId) obj;
 
-      if (hasServiceId() != other.hasServiceId()) return false;
-      if (hasServiceId()) {
-        if (!getServiceId()
-            .equals(other.getServiceId())) return false;
-      }
-      if (!getName()
-          .equals(other.getName())) return false;
-      if (serviceType_ != other.serviceType_) return false;
-      if (!getServiceEndpointIdsList()
-          .equals(other.getServiceEndpointIdsList())) return false;
-      if (!getServiceConstraintsList()
-          .equals(other.getServiceConstraintsList())) return false;
-      if (hasServiceStatus() != other.hasServiceStatus()) return false;
-      if (hasServiceStatus()) {
-        if (!getServiceStatus()
-            .equals(other.getServiceStatus())) return false;
-      }
-      if (hasServiceConfig() != other.hasServiceConfig()) return false;
-      if (hasServiceConfig()) {
-        if (!getServiceConfig()
-            .equals(other.getServiceConfig())) return false;
+      if (hasContextId() != other.hasContextId()) return false;
+      if (hasContextId()) {
+        if (!getContextId()
+            .equals(other.getContextId())) return false;
       }
-      if (hasTimestamp() != other.hasTimestamp()) return false;
-      if (hasTimestamp()) {
-        if (!getTimestamp()
-            .equals(other.getTimestamp())) return false;
+      if (hasServiceUuid() != other.hasServiceUuid()) return false;
+      if (hasServiceUuid()) {
+        if (!getServiceUuid()
+            .equals(other.getServiceUuid())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -27499,102 +27492,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasServiceId()) {
-        hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceId().hashCode();
-      }
-      hash = (37 * hash) + NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getName().hashCode();
-      hash = (37 * hash) + SERVICE_TYPE_FIELD_NUMBER;
-      hash = (53 * hash) + serviceType_;
-      if (getServiceEndpointIdsCount() > 0) {
-        hash = (37 * hash) + SERVICE_ENDPOINT_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceEndpointIdsList().hashCode();
-      }
-      if (getServiceConstraintsCount() > 0) {
-        hash = (37 * hash) + SERVICE_CONSTRAINTS_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceConstraintsList().hashCode();
-      }
-      if (hasServiceStatus()) {
-        hash = (37 * hash) + SERVICE_STATUS_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceStatus().hashCode();
-      }
-      if (hasServiceConfig()) {
-        hash = (37 * hash) + SERVICE_CONFIG_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceConfig().hashCode();
+      if (hasContextId()) {
+        hash = (37 * hash) + CONTEXT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getContextId().hashCode();
       }
-      if (hasTimestamp()) {
-        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + getTimestamp().hashCode();
+      if (hasServiceUuid()) {
+        hash = (37 * hash) + SERVICE_UUID_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceUuid().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Service parseFrom(byte[] data)
+    public static context.ContextOuterClass.ServiceId parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Service parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceId parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Service parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceId parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Service parseDelimitedFrom(
+    public static context.ContextOuterClass.ServiceId parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Service parseFrom(
+    public static context.ContextOuterClass.ServiceId parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -27607,7 +27580,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Service prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ServiceId prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -27623,26 +27596,30 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Service}
+     * <pre>
+     * ----- Service -------------------------------------------------------------------------------------------------------
+     * </pre>
+     *
+     * Protobuf type {@code context.ServiceId}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Service)
-        context.ContextOuterClass.ServiceOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ServiceId)
+        context.ContextOuterClass.ServiceIdOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Service_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Service_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ServiceId_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Service.class, context.ContextOuterClass.Service.Builder.class);
+                context.ContextOuterClass.ServiceId.class, context.ContextOuterClass.ServiceId.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Service.newBuilder()
+      // Construct using context.ContextOuterClass.ServiceId.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -27655,52 +27632,22 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getServiceEndpointIdsFieldBuilder();
-          getServiceConstraintsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
-        } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
-        }
-        name_ = "";
-
-        serviceType_ = 0;
-
-        if (serviceEndpointIdsBuilder_ == null) {
-          serviceEndpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-        } else {
-          serviceEndpointIdsBuilder_.clear();
-        }
-        if (serviceConstraintsBuilder_ == null) {
-          serviceConstraints_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-        } else {
-          serviceConstraintsBuilder_.clear();
-        }
-        if (serviceStatusBuilder_ == null) {
-          serviceStatus_ = null;
-        } else {
-          serviceStatus_ = null;
-          serviceStatusBuilder_ = null;
-        }
-        if (serviceConfigBuilder_ == null) {
-          serviceConfig_ = null;
+        if (contextIdBuilder_ == null) {
+          contextId_ = null;
         } else {
-          serviceConfig_ = null;
-          serviceConfigBuilder_ = null;
+          contextId_ = null;
+          contextIdBuilder_ = null;
         }
-        if (timestampBuilder_ == null) {
-          timestamp_ = null;
+        if (serviceUuidBuilder_ == null) {
+          serviceUuid_ = null;
         } else {
-          timestamp_ = null;
-          timestampBuilder_ = null;
+          serviceUuid_ = null;
+          serviceUuidBuilder_ = null;
         }
         return this;
       }
@@ -27708,17 +27655,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Service_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceId_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Service getDefaultInstanceForType() {
-        return context.ContextOuterClass.Service.getDefaultInstance();
+      public context.ContextOuterClass.ServiceId getDefaultInstanceForType() {
+        return context.ContextOuterClass.ServiceId.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Service build() {
-        context.ContextOuterClass.Service result = buildPartial();
+      public context.ContextOuterClass.ServiceId build() {
+        context.ContextOuterClass.ServiceId result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -27726,48 +27673,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Service buildPartial() {
-        context.ContextOuterClass.Service result = new context.ContextOuterClass.Service(this);
-        int from_bitField0_ = bitField0_;
-        if (serviceIdBuilder_ == null) {
-          result.serviceId_ = serviceId_;
-        } else {
-          result.serviceId_ = serviceIdBuilder_.build();
-        }
-        result.name_ = name_;
-        result.serviceType_ = serviceType_;
-        if (serviceEndpointIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.serviceEndpointIds_ = serviceEndpointIds_;
-        } else {
-          result.serviceEndpointIds_ = serviceEndpointIdsBuilder_.build();
-        }
-        if (serviceConstraintsBuilder_ == null) {
-          if (((bitField0_ & 0x00000002) != 0)) {
-            serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
-            bitField0_ = (bitField0_ & ~0x00000002);
-          }
-          result.serviceConstraints_ = serviceConstraints_;
-        } else {
-          result.serviceConstraints_ = serviceConstraintsBuilder_.build();
-        }
-        if (serviceStatusBuilder_ == null) {
-          result.serviceStatus_ = serviceStatus_;
-        } else {
-          result.serviceStatus_ = serviceStatusBuilder_.build();
-        }
-        if (serviceConfigBuilder_ == null) {
-          result.serviceConfig_ = serviceConfig_;
+      public context.ContextOuterClass.ServiceId buildPartial() {
+        context.ContextOuterClass.ServiceId result = new context.ContextOuterClass.ServiceId(this);
+        if (contextIdBuilder_ == null) {
+          result.contextId_ = contextId_;
         } else {
-          result.serviceConfig_ = serviceConfigBuilder_.build();
+          result.contextId_ = contextIdBuilder_.build();
         }
-        if (timestampBuilder_ == null) {
-          result.timestamp_ = timestamp_;
+        if (serviceUuidBuilder_ == null) {
+          result.serviceUuid_ = serviceUuid_;
         } else {
-          result.timestamp_ = timestampBuilder_.build();
+          result.serviceUuid_ = serviceUuidBuilder_.build();
         }
         onBuilt();
         return result;
@@ -27807,560 +27723,1880 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Service) {
-          return mergeFrom((context.ContextOuterClass.Service)other);
+        if (other instanceof context.ContextOuterClass.ServiceId) {
+          return mergeFrom((context.ContextOuterClass.ServiceId)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Service other) {
-        if (other == context.ContextOuterClass.Service.getDefaultInstance()) return this;
-        if (other.hasServiceId()) {
-          mergeServiceId(other.getServiceId());
-        }
-        if (!other.getName().isEmpty()) {
-          name_ = other.name_;
-          onChanged();
+      public Builder mergeFrom(context.ContextOuterClass.ServiceId other) {
+        if (other == context.ContextOuterClass.ServiceId.getDefaultInstance()) return this;
+        if (other.hasContextId()) {
+          mergeContextId(other.getContextId());
         }
-        if (other.serviceType_ != 0) {
-          setServiceTypeValue(other.getServiceTypeValue());
+        if (other.hasServiceUuid()) {
+          mergeServiceUuid(other.getServiceUuid());
         }
-        if (serviceEndpointIdsBuilder_ == null) {
-          if (!other.serviceEndpointIds_.isEmpty()) {
-            if (serviceEndpointIds_.isEmpty()) {
-              serviceEndpointIds_ = other.serviceEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureServiceEndpointIdsIsMutable();
-              serviceEndpointIds_.addAll(other.serviceEndpointIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.serviceEndpointIds_.isEmpty()) {
-            if (serviceEndpointIdsBuilder_.isEmpty()) {
-              serviceEndpointIdsBuilder_.dispose();
-              serviceEndpointIdsBuilder_ = null;
-              serviceEndpointIds_ = other.serviceEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              serviceEndpointIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getServiceEndpointIdsFieldBuilder() : null;
-            } else {
-              serviceEndpointIdsBuilder_.addAllMessages(other.serviceEndpointIds_);
-            }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.ServiceId parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.ServiceId) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
           }
         }
-        if (serviceConstraintsBuilder_ == null) {
-          if (!other.serviceConstraints_.isEmpty()) {
-            if (serviceConstraints_.isEmpty()) {
-              serviceConstraints_ = other.serviceConstraints_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-            } else {
-              ensureServiceConstraintsIsMutable();
-              serviceConstraints_.addAll(other.serviceConstraints_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.serviceConstraints_.isEmpty()) {
-            if (serviceConstraintsBuilder_.isEmpty()) {
-              serviceConstraintsBuilder_.dispose();
-              serviceConstraintsBuilder_ = null;
-              serviceConstraints_ = other.serviceConstraints_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              serviceConstraintsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getServiceConstraintsFieldBuilder() : null;
-            } else {
-              serviceConstraintsBuilder_.addAllMessages(other.serviceConstraints_);
-            }
-          }
-        }
-        if (other.hasServiceStatus()) {
-          mergeServiceStatus(other.getServiceStatus());
-        }
-        if (other.hasServiceConfig()) {
-          mergeServiceConfig(other.getServiceConfig());
-        }
-        if (other.hasTimestamp()) {
-          mergeTimestamp(other.getTimestamp());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
         return this;
       }
 
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.Service parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Service) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private context.ContextOuterClass.ServiceId serviceId_;
+      private context.ContextOuterClass.ContextId contextId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
+          context.ContextOuterClass.ContextId, context.ContextOuterClass.ContextId.Builder, context.ContextOuterClass.ContextIdOrBuilder> contextIdBuilder_;
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       * @return Whether the serviceId field is set.
+       * <code>.context.ContextId context_id = 1;</code>
+       * @return Whether the contextId field is set.
        */
-      public boolean hasServiceId() {
-        return serviceIdBuilder_ != null || serviceId_ != null;
+      public boolean hasContextId() {
+        return contextIdBuilder_ != null || contextId_ != null;
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       * @return The serviceId.
+       * <code>.context.ContextId context_id = 1;</code>
+       * @return The contextId.
        */
-      public context.ContextOuterClass.ServiceId getServiceId() {
-        if (serviceIdBuilder_ == null) {
-          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+      public context.ContextOuterClass.ContextId getContextId() {
+        if (contextIdBuilder_ == null) {
+          return contextId_ == null ? context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
         } else {
-          return serviceIdBuilder_.getMessage();
+          return contextIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
-      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
+      public Builder setContextId(context.ContextOuterClass.ContextId value) {
+        if (contextIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          serviceId_ = value;
+          contextId_ = value;
           onChanged();
         } else {
-          serviceIdBuilder_.setMessage(value);
+          contextIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
-      public Builder setServiceId(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = builderForValue.build();
+      public Builder setContextId(
+          context.ContextOuterClass.ContextId.Builder builderForValue) {
+        if (contextIdBuilder_ == null) {
+          contextId_ = builderForValue.build();
           onChanged();
         } else {
-          serviceIdBuilder_.setMessage(builderForValue.build());
+          contextIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
-      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (serviceId_ != null) {
-            serviceId_ =
-              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
+      public Builder mergeContextId(context.ContextOuterClass.ContextId value) {
+        if (contextIdBuilder_ == null) {
+          if (contextId_ != null) {
+            contextId_ =
+              context.ContextOuterClass.ContextId.newBuilder(contextId_).mergeFrom(value).buildPartial();
           } else {
-            serviceId_ = value;
+            contextId_ = value;
           }
           onChanged();
         } else {
-          serviceIdBuilder_.mergeFrom(value);
+          contextIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
-      public Builder clearServiceId() {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
+      public Builder clearContextId() {
+        if (contextIdBuilder_ == null) {
+          contextId_ = null;
           onChanged();
         } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
+          contextId_ = null;
+          contextIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
+      public context.ContextOuterClass.ContextId.Builder getContextIdBuilder() {
         
         onChanged();
-        return getServiceIdFieldBuilder().getBuilder();
+        return getContextIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
-      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-        if (serviceIdBuilder_ != null) {
-          return serviceIdBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.ContextIdOrBuilder getContextIdOrBuilder() {
+        if (contextIdBuilder_ != null) {
+          return contextIdBuilder_.getMessageOrBuilder();
         } else {
-          return serviceId_ == null ?
-              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+          return contextId_ == null ?
+              context.ContextOuterClass.ContextId.getDefaultInstance() : contextId_;
         }
       }
       /**
-       * <code>.context.ServiceId service_id = 1;</code>
+       * <code>.context.ContextId context_id = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getServiceIdFieldBuilder() {
-        if (serviceIdBuilder_ == null) {
-          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  getServiceId(),
+          context.ContextOuterClass.ContextId, context.ContextOuterClass.ContextId.Builder, context.ContextOuterClass.ContextIdOrBuilder> 
+          getContextIdFieldBuilder() {
+        if (contextIdBuilder_ == null) {
+          contextIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ContextId, context.ContextOuterClass.ContextId.Builder, context.ContextOuterClass.ContextIdOrBuilder>(
+                  getContextId(),
                   getParentForChildren(),
                   isClean());
-          serviceId_ = null;
-        }
-        return serviceIdBuilder_;
-      }
-
-      private java.lang.Object name_ = "";
-      /**
-       * <code>string name = 2;</code>
-       * @return The name.
-       */
-      public java.lang.String getName() {
-        java.lang.Object ref = name_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          name_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return The bytes for name.
-       */
-      public com.google.protobuf.ByteString
-          getNameBytes() {
-        java.lang.Object ref = name_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          name_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearName() {
-        
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The bytes for name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        name_ = value;
-        onChanged();
-        return this;
-      }
-
-      private int serviceType_ = 0;
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @return The enum numeric value on the wire for serviceType.
-       */
-      @java.lang.Override public int getServiceTypeValue() {
-        return serviceType_;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @param value The enum numeric value on the wire for serviceType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setServiceTypeValue(int value) {
-        
-        serviceType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @return The serviceType.
-       */
-      @java.lang.Override
-      public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-        @SuppressWarnings("deprecation")
-        context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
-        return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @param value The serviceType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setServiceType(context.ContextOuterClass.ServiceTypeEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
+          contextId_ = null;
         }
-        
-        serviceType_ = value.getNumber();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearServiceType() {
-        
-        serviceType_ = 0;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<context.ContextOuterClass.EndPointId> serviceEndpointIds_ =
-        java.util.Collections.emptyList();
-      private void ensureServiceEndpointIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          serviceEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(serviceEndpointIds_);
-          bitField0_ |= 0x00000001;
-         }
+        return contextIdBuilder_;
       }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> serviceEndpointIdsBuilder_;
-
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointId> getServiceEndpointIdsList() {
-        if (serviceEndpointIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(serviceEndpointIds_);
-        } else {
-          return serviceEndpointIdsBuilder_.getMessageList();
-        }
-      }
+      private context.ContextOuterClass.Uuid serviceUuid_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> serviceUuidBuilder_;
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
+       * @return Whether the serviceUuid field is set.
        */
-      public int getServiceEndpointIdsCount() {
-        if (serviceEndpointIdsBuilder_ == null) {
-          return serviceEndpointIds_.size();
-        } else {
-          return serviceEndpointIdsBuilder_.getCount();
-        }
+      public boolean hasServiceUuid() {
+        return serviceUuidBuilder_ != null || serviceUuid_ != null;
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
+       * @return The serviceUuid.
        */
-      public context.ContextOuterClass.EndPointId getServiceEndpointIds(int index) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          return serviceEndpointIds_.get(index);
+      public context.ContextOuterClass.Uuid getServiceUuid() {
+        if (serviceUuidBuilder_ == null) {
+          return serviceUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
         } else {
-          return serviceEndpointIdsBuilder_.getMessage(index);
+          return serviceUuidBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder setServiceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (serviceEndpointIdsBuilder_ == null) {
+      public Builder setServiceUuid(context.ContextOuterClass.Uuid value) {
+        if (serviceUuidBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.set(index, value);
-          onChanged();
-        } else {
-          serviceEndpointIdsBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-       */
-      public Builder setServiceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.set(index, builderForValue.build());
+          serviceUuid_ = value;
           onChanged();
         } else {
-          serviceEndpointIdsBuilder_.setMessage(index, builderForValue.build());
+          serviceUuidBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder addServiceEndpointIds(context.ContextOuterClass.EndPointId value) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.add(value);
+      public Builder setServiceUuid(
+          context.ContextOuterClass.Uuid.Builder builderForValue) {
+        if (serviceUuidBuilder_ == null) {
+          serviceUuid_ = builderForValue.build();
           onChanged();
         } else {
-          serviceEndpointIdsBuilder_.addMessage(value);
+          serviceUuidBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder addServiceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeServiceUuid(context.ContextOuterClass.Uuid value) {
+        if (serviceUuidBuilder_ == null) {
+          if (serviceUuid_ != null) {
+            serviceUuid_ =
+              context.ContextOuterClass.Uuid.newBuilder(serviceUuid_).mergeFrom(value).buildPartial();
+          } else {
+            serviceUuid_ = value;
           }
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.add(index, value);
-          onChanged();
-        } else {
-          serviceEndpointIdsBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-       */
-      public Builder addServiceEndpointIds(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.add(builderForValue.build());
           onChanged();
         } else {
-          serviceEndpointIdsBuilder_.addMessage(builderForValue.build());
+          serviceUuidBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder addServiceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.add(index, builderForValue.build());
+      public Builder clearServiceUuid() {
+        if (serviceUuidBuilder_ == null) {
+          serviceUuid_ = null;
           onChanged();
         } else {
-          serviceEndpointIdsBuilder_.addMessage(index, builderForValue.build());
+          serviceUuid_ = null;
+          serviceUuidBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder addAllServiceEndpointIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          ensureServiceEndpointIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, serviceEndpointIds_);
-          onChanged();
-        } else {
-          serviceEndpointIdsBuilder_.addAllMessages(values);
-        }
-        return this;
+      public context.ContextOuterClass.Uuid.Builder getServiceUuidBuilder() {
+        
+        onChanged();
+        return getServiceUuidFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder clearServiceEndpointIds() {
-        if (serviceEndpointIdsBuilder_ == null) {
-          serviceEndpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
+      public context.ContextOuterClass.UuidOrBuilder getServiceUuidOrBuilder() {
+        if (serviceUuidBuilder_ != null) {
+          return serviceUuidBuilder_.getMessageOrBuilder();
         } else {
-          serviceEndpointIdsBuilder_.clear();
+          return serviceUuid_ == null ?
+              context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       * <code>.context.Uuid service_uuid = 2;</code>
        */
-      public Builder removeServiceEndpointIds(int index) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          ensureServiceEndpointIdsIsMutable();
-          serviceEndpointIds_.remove(index);
-          onChanged();
-        } else {
-          serviceEndpointIdsBuilder_.remove(index);
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
+          getServiceUuidFieldBuilder() {
+        if (serviceUuidBuilder_ == null) {
+          serviceUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
+                  getServiceUuid(),
+                  getParentForChildren(),
+                  isClean());
+          serviceUuid_ = null;
         }
-        return this;
+        return serviceUuidBuilder_;
       }
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getServiceEndpointIdsBuilder(
-          int index) {
-        return getServiceEndpointIdsFieldBuilder().getBuilder(index);
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
       }
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getServiceEndpointIdsOrBuilder(
-          int index) {
-        if (serviceEndpointIdsBuilder_ == null) {
-          return serviceEndpointIds_.get(index);  } else {
-          return serviceEndpointIdsBuilder_.getMessageOrBuilder(index);
-        }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
       }
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+
+
+      // @@protoc_insertion_point(builder_scope:context.ServiceId)
+    }
+
+    // @@protoc_insertion_point(class_scope:context.ServiceId)
+    private static final context.ContextOuterClass.ServiceId DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceId();
+    }
+
+    public static context.ContextOuterClass.ServiceId getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ServiceId>
+        PARSER = new com.google.protobuf.AbstractParser<ServiceId>() {
+      @java.lang.Override
+      public ServiceId parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ServiceId(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ServiceId> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ServiceId> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceId getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ServiceOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Service)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.ServiceId service_id = 1;</code>
+     * @return Whether the serviceId field is set.
+     */
+    boolean hasServiceId();
+    /**
+     * <code>.context.ServiceId service_id = 1;</code>
+     * @return The serviceId.
+     */
+    context.ContextOuterClass.ServiceId getServiceId();
+    /**
+     * <code>.context.ServiceId service_id = 1;</code>
+     */
+    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
+
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <code>.context.ServiceTypeEnum service_type = 3;</code>
+     * @return The enum numeric value on the wire for serviceType.
+     */
+    int getServiceTypeValue();
+    /**
+     * <code>.context.ServiceTypeEnum service_type = 3;</code>
+     * @return The serviceType.
+     */
+    context.ContextOuterClass.ServiceTypeEnum getServiceType();
+
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    java.util.List<context.ContextOuterClass.EndPointId> 
+        getServiceEndpointIdsList();
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    context.ContextOuterClass.EndPointId getServiceEndpointIds(int index);
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    int getServiceEndpointIdsCount();
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getServiceEndpointIdsOrBuilderList();
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    context.ContextOuterClass.EndPointIdOrBuilder getServiceEndpointIdsOrBuilder(
+        int index);
+
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    java.util.List<context.ContextOuterClass.Constraint> 
+        getServiceConstraintsList();
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    context.ContextOuterClass.Constraint getServiceConstraints(int index);
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    int getServiceConstraintsCount();
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
+        getServiceConstraintsOrBuilderList();
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    context.ContextOuterClass.ConstraintOrBuilder getServiceConstraintsOrBuilder(
+        int index);
+
+    /**
+     * <code>.context.ServiceStatus service_status = 6;</code>
+     * @return Whether the serviceStatus field is set.
+     */
+    boolean hasServiceStatus();
+    /**
+     * <code>.context.ServiceStatus service_status = 6;</code>
+     * @return The serviceStatus.
+     */
+    context.ContextOuterClass.ServiceStatus getServiceStatus();
+    /**
+     * <code>.context.ServiceStatus service_status = 6;</code>
+     */
+    context.ContextOuterClass.ServiceStatusOrBuilder getServiceStatusOrBuilder();
+
+    /**
+     * <code>.context.ServiceConfig service_config = 7;</code>
+     * @return Whether the serviceConfig field is set.
+     */
+    boolean hasServiceConfig();
+    /**
+     * <code>.context.ServiceConfig service_config = 7;</code>
+     * @return The serviceConfig.
+     */
+    context.ContextOuterClass.ServiceConfig getServiceConfig();
+    /**
+     * <code>.context.ServiceConfig service_config = 7;</code>
+     */
+    context.ContextOuterClass.ServiceConfigOrBuilder getServiceConfigOrBuilder();
+
+    /**
+     * <code>.context.Timestamp timestamp = 8;</code>
+     * @return Whether the timestamp field is set.
+     */
+    boolean hasTimestamp();
+    /**
+     * <code>.context.Timestamp timestamp = 8;</code>
+     * @return The timestamp.
+     */
+    context.ContextOuterClass.Timestamp getTimestamp();
+    /**
+     * <code>.context.Timestamp timestamp = 8;</code>
+     */
+    context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder();
+  }
+  /**
+   * Protobuf type {@code context.Service}
+   */
+  public static final class Service extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.Service)
+      ServiceOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Service.newBuilder() to construct.
+    private Service(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Service() {
+      name_ = "";
+      serviceType_ = 0;
+      serviceEndpointIds_ = java.util.Collections.emptyList();
+      serviceConstraints_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new Service();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Service(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+              if (serviceId_ != null) {
+                subBuilder = serviceId_.toBuilder();
+              }
+              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(serviceId_);
+                serviceId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 24: {
+              int rawValue = input.readEnum();
+
+              serviceType_ = rawValue;
+              break;
+            }
+            case 34: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                serviceEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              serviceEndpointIds_.add(
+                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+              break;
+            }
+            case 42: {
+              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                serviceConstraints_ = new java.util.ArrayList<context.ContextOuterClass.Constraint>();
+                mutable_bitField0_ |= 0x00000002;
+              }
+              serviceConstraints_.add(
+                  input.readMessage(context.ContextOuterClass.Constraint.parser(), extensionRegistry));
+              break;
+            }
+            case 50: {
+              context.ContextOuterClass.ServiceStatus.Builder subBuilder = null;
+              if (serviceStatus_ != null) {
+                subBuilder = serviceStatus_.toBuilder();
+              }
+              serviceStatus_ = input.readMessage(context.ContextOuterClass.ServiceStatus.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(serviceStatus_);
+                serviceStatus_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 58: {
+              context.ContextOuterClass.ServiceConfig.Builder subBuilder = null;
+              if (serviceConfig_ != null) {
+                subBuilder = serviceConfig_.toBuilder();
+              }
+              serviceConfig_ = input.readMessage(context.ContextOuterClass.ServiceConfig.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(serviceConfig_);
+                serviceConfig_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 66: {
+              context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+              if (timestamp_ != null) {
+                subBuilder = timestamp_.toBuilder();
+              }
+              timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(timestamp_);
+                timestamp_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
+        }
+        if (((mutable_bitField0_ & 0x00000002) != 0)) {
+          serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return context.ContextOuterClass.internal_static_context_Service_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return context.ContextOuterClass.internal_static_context_Service_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              context.ContextOuterClass.Service.class, context.ContextOuterClass.Service.Builder.class);
+    }
+
+    public static final int SERVICE_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.ServiceId serviceId_;
+    /**
+     * <code>.context.ServiceId service_id = 1;</code>
+     * @return Whether the serviceId field is set.
+     */
+    @java.lang.Override
+    public boolean hasServiceId() {
+      return serviceId_ != null;
+    }
+    /**
+     * <code>.context.ServiceId service_id = 1;</code>
+     * @return The serviceId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceId getServiceId() {
+      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+    }
+    /**
+     * <code>.context.ServiceId service_id = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+      return getServiceId();
+    }
+
+    public static final int NAME_FIELD_NUMBER = 2;
+    private volatile java.lang.Object name_;
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    @java.lang.Override
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int SERVICE_TYPE_FIELD_NUMBER = 3;
+    private int serviceType_;
+    /**
+     * <code>.context.ServiceTypeEnum service_type = 3;</code>
+     * @return The enum numeric value on the wire for serviceType.
+     */
+    @java.lang.Override public int getServiceTypeValue() {
+      return serviceType_;
+    }
+    /**
+     * <code>.context.ServiceTypeEnum service_type = 3;</code>
+     * @return The serviceType.
+     */
+    @java.lang.Override public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
+      @SuppressWarnings("deprecation")
+      context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
+      return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
+    }
+
+    public static final int SERVICE_ENDPOINT_IDS_FIELD_NUMBER = 4;
+    private java.util.List<context.ContextOuterClass.EndPointId> serviceEndpointIds_;
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.EndPointId> getServiceEndpointIdsList() {
+      return serviceEndpointIds_;
+    }
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getServiceEndpointIdsOrBuilderList() {
+      return serviceEndpointIds_;
+    }
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    @java.lang.Override
+    public int getServiceEndpointIdsCount() {
+      return serviceEndpointIds_.size();
+    }
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointId getServiceEndpointIds(int index) {
+      return serviceEndpointIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointIdOrBuilder getServiceEndpointIdsOrBuilder(
+        int index) {
+      return serviceEndpointIds_.get(index);
+    }
+
+    public static final int SERVICE_CONSTRAINTS_FIELD_NUMBER = 5;
+    private java.util.List<context.ContextOuterClass.Constraint> serviceConstraints_;
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.Constraint> getServiceConstraintsList() {
+      return serviceConstraints_;
+    }
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
+        getServiceConstraintsOrBuilderList() {
+      return serviceConstraints_;
+    }
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    @java.lang.Override
+    public int getServiceConstraintsCount() {
+      return serviceConstraints_.size();
+    }
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Constraint getServiceConstraints(int index) {
+      return serviceConstraints_.get(index);
+    }
+    /**
+     * <code>repeated .context.Constraint service_constraints = 5;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConstraintOrBuilder getServiceConstraintsOrBuilder(
+        int index) {
+      return serviceConstraints_.get(index);
+    }
+
+    public static final int SERVICE_STATUS_FIELD_NUMBER = 6;
+    private context.ContextOuterClass.ServiceStatus serviceStatus_;
+    /**
+     * <code>.context.ServiceStatus service_status = 6;</code>
+     * @return Whether the serviceStatus field is set.
+     */
+    @java.lang.Override
+    public boolean hasServiceStatus() {
+      return serviceStatus_ != null;
+    }
+    /**
+     * <code>.context.ServiceStatus service_status = 6;</code>
+     * @return The serviceStatus.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceStatus getServiceStatus() {
+      return serviceStatus_ == null ? context.ContextOuterClass.ServiceStatus.getDefaultInstance() : serviceStatus_;
+    }
+    /**
+     * <code>.context.ServiceStatus service_status = 6;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceStatusOrBuilder getServiceStatusOrBuilder() {
+      return getServiceStatus();
+    }
+
+    public static final int SERVICE_CONFIG_FIELD_NUMBER = 7;
+    private context.ContextOuterClass.ServiceConfig serviceConfig_;
+    /**
+     * <code>.context.ServiceConfig service_config = 7;</code>
+     * @return Whether the serviceConfig field is set.
+     */
+    @java.lang.Override
+    public boolean hasServiceConfig() {
+      return serviceConfig_ != null;
+    }
+    /**
+     * <code>.context.ServiceConfig service_config = 7;</code>
+     * @return The serviceConfig.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceConfig getServiceConfig() {
+      return serviceConfig_ == null ? context.ContextOuterClass.ServiceConfig.getDefaultInstance() : serviceConfig_;
+    }
+    /**
+     * <code>.context.ServiceConfig service_config = 7;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceConfigOrBuilder getServiceConfigOrBuilder() {
+      return getServiceConfig();
+    }
+
+    public static final int TIMESTAMP_FIELD_NUMBER = 8;
+    private context.ContextOuterClass.Timestamp timestamp_;
+    /**
+     * <code>.context.Timestamp timestamp = 8;</code>
+     * @return Whether the timestamp field is set.
+     */
+    @java.lang.Override
+    public boolean hasTimestamp() {
+      return timestamp_ != null;
+    }
+    /**
+     * <code>.context.Timestamp timestamp = 8;</code>
+     * @return The timestamp.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Timestamp getTimestamp() {
+      return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+    }
+    /**
+     * <code>.context.Timestamp timestamp = 8;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
+      return getTimestamp();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (serviceId_ != null) {
+        output.writeMessage(1, getServiceId());
+      }
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+      }
+      if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
+        output.writeEnum(3, serviceType_);
+      }
+      for (int i = 0; i < serviceEndpointIds_.size(); i++) {
+        output.writeMessage(4, serviceEndpointIds_.get(i));
+      }
+      for (int i = 0; i < serviceConstraints_.size(); i++) {
+        output.writeMessage(5, serviceConstraints_.get(i));
+      }
+      if (serviceStatus_ != null) {
+        output.writeMessage(6, getServiceStatus());
+      }
+      if (serviceConfig_ != null) {
+        output.writeMessage(7, getServiceConfig());
+      }
+      if (timestamp_ != null) {
+        output.writeMessage(8, getTimestamp());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (serviceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getServiceId());
+      }
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+      }
+      if (serviceType_ != context.ContextOuterClass.ServiceTypeEnum.SERVICETYPE_UNKNOWN.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(3, serviceType_);
+      }
+      for (int i = 0; i < serviceEndpointIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, serviceEndpointIds_.get(i));
+      }
+      for (int i = 0; i < serviceConstraints_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, serviceConstraints_.get(i));
+      }
+      if (serviceStatus_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, getServiceStatus());
+      }
+      if (serviceConfig_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(7, getServiceConfig());
+      }
+      if (timestamp_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, getTimestamp());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof context.ContextOuterClass.Service)) {
+        return super.equals(obj);
+      }
+      context.ContextOuterClass.Service other = (context.ContextOuterClass.Service) obj;
+
+      if (hasServiceId() != other.hasServiceId()) return false;
+      if (hasServiceId()) {
+        if (!getServiceId()
+            .equals(other.getServiceId())) return false;
+      }
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (serviceType_ != other.serviceType_) return false;
+      if (!getServiceEndpointIdsList()
+          .equals(other.getServiceEndpointIdsList())) return false;
+      if (!getServiceConstraintsList()
+          .equals(other.getServiceConstraintsList())) return false;
+      if (hasServiceStatus() != other.hasServiceStatus()) return false;
+      if (hasServiceStatus()) {
+        if (!getServiceStatus()
+            .equals(other.getServiceStatus())) return false;
+      }
+      if (hasServiceConfig() != other.hasServiceConfig()) return false;
+      if (hasServiceConfig()) {
+        if (!getServiceConfig()
+            .equals(other.getServiceConfig())) return false;
+      }
+      if (hasTimestamp() != other.hasTimestamp()) return false;
+      if (hasTimestamp()) {
+        if (!getTimestamp()
+            .equals(other.getTimestamp())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasServiceId()) {
+        hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceId().hashCode();
+      }
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + SERVICE_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + serviceType_;
+      if (getServiceEndpointIdsCount() > 0) {
+        hash = (37 * hash) + SERVICE_ENDPOINT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceEndpointIdsList().hashCode();
+      }
+      if (getServiceConstraintsCount() > 0) {
+        hash = (37 * hash) + SERVICE_CONSTRAINTS_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceConstraintsList().hashCode();
+      }
+      if (hasServiceStatus()) {
+        hash = (37 * hash) + SERVICE_STATUS_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceStatus().hashCode();
+      }
+      if (hasServiceConfig()) {
+        hash = (37 * hash) + SERVICE_CONFIG_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceConfig().hashCode();
+      }
+      if (hasTimestamp()) {
+        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
+        hash = (53 * hash) + getTimestamp().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static context.ContextOuterClass.Service parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Service parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Service parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Service parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.Service parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.Service parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(context.ContextOuterClass.Service prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code context.Service}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.Service)
+        context.ContextOuterClass.ServiceOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return context.ContextOuterClass.internal_static_context_Service_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return context.ContextOuterClass.internal_static_context_Service_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                context.ContextOuterClass.Service.class, context.ContextOuterClass.Service.Builder.class);
+      }
+
+      // Construct using context.ContextOuterClass.Service.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getServiceEndpointIdsFieldBuilder();
+          getServiceConstraintsFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
+        name_ = "";
+
+        serviceType_ = 0;
+
+        if (serviceEndpointIdsBuilder_ == null) {
+          serviceEndpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          serviceEndpointIdsBuilder_.clear();
+        }
+        if (serviceConstraintsBuilder_ == null) {
+          serviceConstraints_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          serviceConstraintsBuilder_.clear();
+        }
+        if (serviceStatusBuilder_ == null) {
+          serviceStatus_ = null;
+        } else {
+          serviceStatus_ = null;
+          serviceStatusBuilder_ = null;
+        }
+        if (serviceConfigBuilder_ == null) {
+          serviceConfig_ = null;
+        } else {
+          serviceConfig_ = null;
+          serviceConfigBuilder_ = null;
+        }
+        if (timestampBuilder_ == null) {
+          timestamp_ = null;
+        } else {
+          timestamp_ = null;
+          timestampBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return context.ContextOuterClass.internal_static_context_Service_descriptor;
+      }
+
+      @java.lang.Override
+      public context.ContextOuterClass.Service getDefaultInstanceForType() {
+        return context.ContextOuterClass.Service.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public context.ContextOuterClass.Service build() {
+        context.ContextOuterClass.Service result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public context.ContextOuterClass.Service buildPartial() {
+        context.ContextOuterClass.Service result = new context.ContextOuterClass.Service(this);
+        int from_bitField0_ = bitField0_;
+        if (serviceIdBuilder_ == null) {
+          result.serviceId_ = serviceId_;
+        } else {
+          result.serviceId_ = serviceIdBuilder_.build();
+        }
+        result.name_ = name_;
+        result.serviceType_ = serviceType_;
+        if (serviceEndpointIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            serviceEndpointIds_ = java.util.Collections.unmodifiableList(serviceEndpointIds_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.serviceEndpointIds_ = serviceEndpointIds_;
+        } else {
+          result.serviceEndpointIds_ = serviceEndpointIdsBuilder_.build();
+        }
+        if (serviceConstraintsBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0)) {
+            serviceConstraints_ = java.util.Collections.unmodifiableList(serviceConstraints_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.serviceConstraints_ = serviceConstraints_;
+        } else {
+          result.serviceConstraints_ = serviceConstraintsBuilder_.build();
+        }
+        if (serviceStatusBuilder_ == null) {
+          result.serviceStatus_ = serviceStatus_;
+        } else {
+          result.serviceStatus_ = serviceStatusBuilder_.build();
+        }
+        if (serviceConfigBuilder_ == null) {
+          result.serviceConfig_ = serviceConfig_;
+        } else {
+          result.serviceConfig_ = serviceConfigBuilder_.build();
+        }
+        if (timestampBuilder_ == null) {
+          result.timestamp_ = timestamp_;
+        } else {
+          result.timestamp_ = timestampBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.Service) {
+          return mergeFrom((context.ContextOuterClass.Service)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.Service other) {
+        if (other == context.ContextOuterClass.Service.getDefaultInstance()) return this;
+        if (other.hasServiceId()) {
+          mergeServiceId(other.getServiceId());
+        }
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.serviceType_ != 0) {
+          setServiceTypeValue(other.getServiceTypeValue());
+        }
+        if (serviceEndpointIdsBuilder_ == null) {
+          if (!other.serviceEndpointIds_.isEmpty()) {
+            if (serviceEndpointIds_.isEmpty()) {
+              serviceEndpointIds_ = other.serviceEndpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureServiceEndpointIdsIsMutable();
+              serviceEndpointIds_.addAll(other.serviceEndpointIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.serviceEndpointIds_.isEmpty()) {
+            if (serviceEndpointIdsBuilder_.isEmpty()) {
+              serviceEndpointIdsBuilder_.dispose();
+              serviceEndpointIdsBuilder_ = null;
+              serviceEndpointIds_ = other.serviceEndpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              serviceEndpointIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getServiceEndpointIdsFieldBuilder() : null;
+            } else {
+              serviceEndpointIdsBuilder_.addAllMessages(other.serviceEndpointIds_);
+            }
+          }
+        }
+        if (serviceConstraintsBuilder_ == null) {
+          if (!other.serviceConstraints_.isEmpty()) {
+            if (serviceConstraints_.isEmpty()) {
+              serviceConstraints_ = other.serviceConstraints_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureServiceConstraintsIsMutable();
+              serviceConstraints_.addAll(other.serviceConstraints_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.serviceConstraints_.isEmpty()) {
+            if (serviceConstraintsBuilder_.isEmpty()) {
+              serviceConstraintsBuilder_.dispose();
+              serviceConstraintsBuilder_ = null;
+              serviceConstraints_ = other.serviceConstraints_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              serviceConstraintsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getServiceConstraintsFieldBuilder() : null;
+            } else {
+              serviceConstraintsBuilder_.addAllMessages(other.serviceConstraints_);
+            }
+          }
+        }
+        if (other.hasServiceStatus()) {
+          mergeServiceStatus(other.getServiceStatus());
+        }
+        if (other.hasServiceConfig()) {
+          mergeServiceConfig(other.getServiceConfig());
+        }
+        if (other.hasTimestamp()) {
+          mergeTimestamp(other.getTimestamp());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.Service parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.Service) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private context.ContextOuterClass.ServiceId serviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       * @return Whether the serviceId field is set.
+       */
+      public boolean hasServiceId() {
+        return serviceIdBuilder_ != null || serviceId_ != null;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       * @return The serviceId.
+       */
+      public context.ContextOuterClass.ServiceId getServiceId() {
+        if (serviceIdBuilder_ == null) {
+          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        } else {
+          return serviceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          serviceId_ = value;
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      public Builder setServiceId(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (serviceId_ != null) {
+            serviceId_ =
+              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
+          } else {
+            serviceId_ = value;
+          }
+          onChanged();
+        } else {
+          serviceIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      public Builder clearServiceId() {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+          onChanged();
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
+        
+        onChanged();
+        return getServiceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+        if (serviceIdBuilder_ != null) {
+          return serviceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return serviceId_ == null ?
+              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        }
+      }
+      /**
+       * <code>.context.ServiceId service_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getServiceIdFieldBuilder() {
+        if (serviceIdBuilder_ == null) {
+          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  getServiceId(),
+                  getParentForChildren(),
+                  isClean());
+          serviceId_ = null;
+        }
+        return serviceIdBuilder_;
+      }
+
+      private java.lang.Object name_ = "";
+      /**
+       * <code>string name = 2;</code>
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int serviceType_ = 0;
+      /**
+       * <code>.context.ServiceTypeEnum service_type = 3;</code>
+       * @return The enum numeric value on the wire for serviceType.
+       */
+      @java.lang.Override public int getServiceTypeValue() {
+        return serviceType_;
+      }
+      /**
+       * <code>.context.ServiceTypeEnum service_type = 3;</code>
+       * @param value The enum numeric value on the wire for serviceType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setServiceTypeValue(int value) {
+        
+        serviceType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ServiceTypeEnum service_type = 3;</code>
+       * @return The serviceType.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
+        @SuppressWarnings("deprecation")
+        context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
+        return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
+      }
+      /**
+       * <code>.context.ServiceTypeEnum service_type = 3;</code>
+       * @param value The serviceType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setServiceType(context.ContextOuterClass.ServiceTypeEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        serviceType_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ServiceTypeEnum service_type = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearServiceType() {
+        
+        serviceType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<context.ContextOuterClass.EndPointId> serviceEndpointIds_ =
+        java.util.Collections.emptyList();
+      private void ensureServiceEndpointIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          serviceEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(serviceEndpointIds_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> serviceEndpointIdsBuilder_;
+
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId> getServiceEndpointIdsList() {
+        if (serviceEndpointIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(serviceEndpointIds_);
+        } else {
+          return serviceEndpointIdsBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public int getServiceEndpointIdsCount() {
+        if (serviceEndpointIdsBuilder_ == null) {
+          return serviceEndpointIds_.size();
+        } else {
+          return serviceEndpointIdsBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public context.ContextOuterClass.EndPointId getServiceEndpointIds(int index) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          return serviceEndpointIds_.get(index);
+        } else {
+          return serviceEndpointIdsBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder setServiceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.set(index, value);
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder setServiceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder addServiceEndpointIds(context.ContextOuterClass.EndPointId value) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.add(value);
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder addServiceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.add(index, value);
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder addServiceEndpointIds(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder addServiceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder addAllServiceEndpointIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          ensureServiceEndpointIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, serviceEndpointIds_);
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder clearServiceEndpointIds() {
+        if (serviceEndpointIdsBuilder_ == null) {
+          serviceEndpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public Builder removeServiceEndpointIds(int index) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          ensureServiceEndpointIdsIsMutable();
+          serviceEndpointIds_.remove(index);
+          onChanged();
+        } else {
+          serviceEndpointIdsBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder getServiceEndpointIdsBuilder(
+          int index) {
+        return getServiceEndpointIdsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
+       */
+      public context.ContextOuterClass.EndPointIdOrBuilder getServiceEndpointIdsOrBuilder(
+          int index) {
+        if (serviceEndpointIdsBuilder_ == null) {
+          return serviceEndpointIds_.get(index);  } else {
+          return serviceEndpointIdsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
        */
       public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
            getServiceEndpointIdsOrBuilderList() {
@@ -28965,43 +30201,568 @@ public final class ContextOuterClass {
           timestamp_ = null;
           timestampBuilder_ = null;
         }
-
+
+        return this;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 8;</code>
+       */
+      public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
+        
+        onChanged();
+        return getTimestampFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 8;</code>
+       */
+      public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
+        if (timestampBuilder_ != null) {
+          return timestampBuilder_.getMessageOrBuilder();
+        } else {
+          return timestamp_ == null ?
+              context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+        }
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 8;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
+          getTimestampFieldBuilder() {
+        if (timestampBuilder_ == null) {
+          timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder>(
+                  getTimestamp(),
+                  getParentForChildren(),
+                  isClean());
+          timestamp_ = null;
+        }
+        return timestampBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:context.Service)
+    }
+
+    // @@protoc_insertion_point(class_scope:context.Service)
+    private static final context.ContextOuterClass.Service DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Service();
+    }
+
+    public static context.ContextOuterClass.Service getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Service>
+        PARSER = new com.google.protobuf.AbstractParser<Service>() {
+      @java.lang.Override
+      public Service parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Service(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<Service> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Service> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public context.ContextOuterClass.Service getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ServiceStatusOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.ServiceStatusEnum service_status = 1;</code>
+     * @return The enum numeric value on the wire for serviceStatus.
+     */
+    int getServiceStatusValue();
+    /**
+     * <code>.context.ServiceStatusEnum service_status = 1;</code>
+     * @return The serviceStatus.
+     */
+    context.ContextOuterClass.ServiceStatusEnum getServiceStatus();
+  }
+  /**
+   * Protobuf type {@code context.ServiceStatus}
+   */
+  public static final class ServiceStatus extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.ServiceStatus)
+      ServiceStatusOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ServiceStatus.newBuilder() to construct.
+    private ServiceStatus(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ServiceStatus() {
+      serviceStatus_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ServiceStatus();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ServiceStatus(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+              int rawValue = input.readEnum();
+
+              serviceStatus_ = rawValue;
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return context.ContextOuterClass.internal_static_context_ServiceStatus_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              context.ContextOuterClass.ServiceStatus.class, context.ContextOuterClass.ServiceStatus.Builder.class);
+    }
+
+    public static final int SERVICE_STATUS_FIELD_NUMBER = 1;
+    private int serviceStatus_;
+    /**
+     * <code>.context.ServiceStatusEnum service_status = 1;</code>
+     * @return The enum numeric value on the wire for serviceStatus.
+     */
+    @java.lang.Override public int getServiceStatusValue() {
+      return serviceStatus_;
+    }
+    /**
+     * <code>.context.ServiceStatusEnum service_status = 1;</code>
+     * @return The serviceStatus.
+     */
+    @java.lang.Override public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
+      @SuppressWarnings("deprecation")
+      context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
+      return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
+        output.writeEnum(1, serviceStatus_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, serviceStatus_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof context.ContextOuterClass.ServiceStatus)) {
+        return super.equals(obj);
+      }
+      context.ContextOuterClass.ServiceStatus other = (context.ContextOuterClass.ServiceStatus) obj;
+
+      if (serviceStatus_ != other.serviceStatus_) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + SERVICE_STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + serviceStatus_;
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.ServiceStatus parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(context.ContextOuterClass.ServiceStatus prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code context.ServiceStatus}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
+        context.ContextOuterClass.ServiceStatusOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return context.ContextOuterClass.internal_static_context_ServiceStatus_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                context.ContextOuterClass.ServiceStatus.class, context.ContextOuterClass.ServiceStatus.Builder.class);
+      }
+
+      // Construct using context.ContextOuterClass.ServiceStatus.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        serviceStatus_ = 0;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
+      }
+
+      @java.lang.Override
+      public context.ContextOuterClass.ServiceStatus getDefaultInstanceForType() {
+        return context.ContextOuterClass.ServiceStatus.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public context.ContextOuterClass.ServiceStatus build() {
+        context.ContextOuterClass.ServiceStatus result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public context.ContextOuterClass.ServiceStatus buildPartial() {
+        context.ContextOuterClass.ServiceStatus result = new context.ContextOuterClass.ServiceStatus(this);
+        result.serviceStatus_ = serviceStatus_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.ServiceStatus) {
+          return mergeFrom((context.ContextOuterClass.ServiceStatus)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.ServiceStatus other) {
+        if (other == context.ContextOuterClass.ServiceStatus.getDefaultInstance()) return this;
+        if (other.serviceStatus_ != 0) {
+          setServiceStatusValue(other.getServiceStatusValue());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.ServiceStatus parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.ServiceStatus) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
         return this;
       }
+
+      private int serviceStatus_ = 0;
       /**
-       * <code>.context.Timestamp timestamp = 8;</code>
+       * <code>.context.ServiceStatusEnum service_status = 1;</code>
+       * @return The enum numeric value on the wire for serviceStatus.
        */
-      public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
+      @java.lang.Override public int getServiceStatusValue() {
+        return serviceStatus_;
+      }
+      /**
+       * <code>.context.ServiceStatusEnum service_status = 1;</code>
+       * @param value The enum numeric value on the wire for serviceStatus to set.
+       * @return This builder for chaining.
+       */
+      public Builder setServiceStatusValue(int value) {
         
+        serviceStatus_ = value;
         onChanged();
-        return getTimestampFieldBuilder().getBuilder();
+        return this;
       }
       /**
-       * <code>.context.Timestamp timestamp = 8;</code>
+       * <code>.context.ServiceStatusEnum service_status = 1;</code>
+       * @return The serviceStatus.
        */
-      public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-        if (timestampBuilder_ != null) {
-          return timestampBuilder_.getMessageOrBuilder();
-        } else {
-          return timestamp_ == null ?
-              context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
-        }
+      @java.lang.Override
+      public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
+        @SuppressWarnings("deprecation")
+        context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
+        return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
       }
       /**
-       * <code>.context.Timestamp timestamp = 8;</code>
+       * <code>.context.ServiceStatusEnum service_status = 1;</code>
+       * @param value The serviceStatus to set.
+       * @return This builder for chaining.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
-          getTimestampFieldBuilder() {
-        if (timestampBuilder_ == null) {
-          timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder>(
-                  getTimestamp(),
-                  getParentForChildren(),
-                  isClean());
-          timestamp_ = null;
+      public Builder setServiceStatus(context.ContextOuterClass.ServiceStatusEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
         }
-        return timestampBuilder_;
+        
+        serviceStatus_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ServiceStatusEnum service_status = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearServiceStatus() {
+        
+        serviceStatus_ = 0;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -29016,82 +30777,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Service)
+      // @@protoc_insertion_point(builder_scope:context.ServiceStatus)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Service)
-    private static final context.ContextOuterClass.Service DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ServiceStatus)
+    private static final context.ContextOuterClass.ServiceStatus DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Service();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceStatus();
     }
 
-    public static context.ContextOuterClass.Service getDefaultInstance() {
+    public static context.ContextOuterClass.ServiceStatus getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Service>
-        PARSER = new com.google.protobuf.AbstractParser<Service>() {
+    private static final com.google.protobuf.Parser<ServiceStatus>
+        PARSER = new com.google.protobuf.AbstractParser<ServiceStatus>() {
       @java.lang.Override
-      public Service parsePartialFrom(
+      public ServiceStatus parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Service(input, extensionRegistry);
+        return new ServiceStatus(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Service> parser() {
+    public static com.google.protobuf.Parser<ServiceStatus> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Service> getParserForType() {
+    public com.google.protobuf.Parser<ServiceStatus> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Service getDefaultInstanceForType() {
+    public context.ContextOuterClass.ServiceStatus getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ServiceStatusOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ServiceStatus)
+  public interface ServiceConfigOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.ServiceStatusEnum service_status = 1;</code>
-     * @return The enum numeric value on the wire for serviceStatus.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    int getServiceStatusValue();
+    java.util.List<context.ContextOuterClass.ConfigRule> 
+        getConfigRulesList();
     /**
-     * <code>.context.ServiceStatusEnum service_status = 1;</code>
-     * @return The serviceStatus.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    context.ContextOuterClass.ServiceStatusEnum getServiceStatus();
+    context.ContextOuterClass.ConfigRule getConfigRules(int index);
+    /**
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     */
+    int getConfigRulesCount();
+    /**
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
+        getConfigRulesOrBuilderList();
+    /**
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     */
+    context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.ServiceStatus}
+   * Protobuf type {@code context.ServiceConfig}
    */
-  public static final class ServiceStatus extends
+  public static final class ServiceConfig extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ServiceStatus)
-      ServiceStatusOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ServiceConfig)
+      ServiceConfigOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ServiceStatus.newBuilder() to construct.
-    private ServiceStatus(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ServiceConfig.newBuilder() to construct.
+    private ServiceConfig(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ServiceStatus() {
-      serviceStatus_ = 0;
+    private ServiceConfig() {
+      configRules_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ServiceStatus();
+      return new ServiceConfig();
     }
 
     @java.lang.Override
@@ -29099,7 +30873,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ServiceStatus(
+    private ServiceConfig(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -29107,6 +30881,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -29117,10 +30892,13 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 8: {
-              int rawValue = input.readEnum();
-
-              serviceStatus_ = rawValue;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              configRules_.add(
+                  input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -29138,40 +30916,64 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          configRules_ = java.util.Collections.unmodifiableList(configRules_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
+      return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ServiceStatus_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ServiceConfig_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ServiceStatus.class, context.ContextOuterClass.ServiceStatus.Builder.class);
+              context.ContextOuterClass.ServiceConfig.class, context.ContextOuterClass.ServiceConfig.Builder.class);
     }
 
-    public static final int SERVICE_STATUS_FIELD_NUMBER = 1;
-    private int serviceStatus_;
+    public static final int CONFIG_RULES_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.ConfigRule> configRules_;
     /**
-     * <code>.context.ServiceStatusEnum service_status = 1;</code>
-     * @return The enum numeric value on the wire for serviceStatus.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    @java.lang.Override public int getServiceStatusValue() {
-      return serviceStatus_;
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
+      return configRules_;
     }
     /**
-     * <code>.context.ServiceStatusEnum service_status = 1;</code>
-     * @return The serviceStatus.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    @java.lang.Override public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
-      @SuppressWarnings("deprecation")
-      context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
-      return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
+        getConfigRulesOrBuilderList() {
+      return configRules_;
+    }
+    /**
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     */
+    @java.lang.Override
+    public int getConfigRulesCount() {
+      return configRules_.size();
+    }
+    /**
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
+      return configRules_.get(index);
+    }
+    /**
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+        int index) {
+      return configRules_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -29188,8 +30990,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
-        output.writeEnum(1, serviceStatus_);
+      for (int i = 0; i < configRules_.size(); i++) {
+        output.writeMessage(1, configRules_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -29200,9 +31002,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (serviceStatus_ != context.ContextOuterClass.ServiceStatusEnum.SERVICESTATUS_UNDEFINED.getNumber()) {
+      for (int i = 0; i < configRules_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(1, serviceStatus_);
+          .computeMessageSize(1, configRules_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -29214,12 +31016,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ServiceStatus)) {
+      if (!(obj instanceof context.ContextOuterClass.ServiceConfig)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ServiceStatus other = (context.ContextOuterClass.ServiceStatus) obj;
+      context.ContextOuterClass.ServiceConfig other = (context.ContextOuterClass.ServiceConfig) obj;
 
-      if (serviceStatus_ != other.serviceStatus_) return false;
+      if (!getConfigRulesList()
+          .equals(other.getConfigRulesList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -29231,76 +31034,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + SERVICE_STATUS_FIELD_NUMBER;
-      hash = (53 * hash) + serviceStatus_;
+      if (getConfigRulesCount() > 0) {
+        hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
+        hash = (53 * hash) + getConfigRulesList().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(byte[] data)
+    public static context.ContextOuterClass.ServiceConfig parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceConfig parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceStatus parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceConfig parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceStatus parseDelimitedFrom(
+    public static context.ContextOuterClass.ServiceConfig parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceStatus parseFrom(
+    public static context.ContextOuterClass.ServiceConfig parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -29313,7 +31118,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ServiceStatus prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ServiceConfig prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -29329,26 +31134,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ServiceStatus}
+     * Protobuf type {@code context.ServiceConfig}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ServiceStatus)
-        context.ContextOuterClass.ServiceStatusOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
+        context.ContextOuterClass.ServiceConfigOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ServiceStatus_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ServiceConfig_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ServiceStatus.class, context.ContextOuterClass.ServiceStatus.Builder.class);
+                context.ContextOuterClass.ServiceConfig.class, context.ContextOuterClass.ServiceConfig.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ServiceStatus.newBuilder()
+      // Construct using context.ContextOuterClass.ServiceConfig.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -29361,30 +31166,35 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getConfigRulesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        serviceStatus_ = 0;
-
+        if (configRulesBuilder_ == null) {
+          configRules_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          configRulesBuilder_.clear();
+        }
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ServiceStatus_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceStatus getDefaultInstanceForType() {
-        return context.ContextOuterClass.ServiceStatus.getDefaultInstance();
+      public context.ContextOuterClass.ServiceConfig getDefaultInstanceForType() {
+        return context.ContextOuterClass.ServiceConfig.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceStatus build() {
-        context.ContextOuterClass.ServiceStatus result = buildPartial();
+      public context.ContextOuterClass.ServiceConfig build() {
+        context.ContextOuterClass.ServiceConfig result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -29392,9 +31202,18 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceStatus buildPartial() {
-        context.ContextOuterClass.ServiceStatus result = new context.ContextOuterClass.ServiceStatus(this);
-        result.serviceStatus_ = serviceStatus_;
+      public context.ContextOuterClass.ServiceConfig buildPartial() {
+        context.ContextOuterClass.ServiceConfig result = new context.ContextOuterClass.ServiceConfig(this);
+        int from_bitField0_ = bitField0_;
+        if (configRulesBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            configRules_ = java.util.Collections.unmodifiableList(configRules_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.configRules_ = configRules_;
+        } else {
+          result.configRules_ = configRulesBuilder_.build();
+        }
         onBuilt();
         return result;
       }
@@ -29433,100 +31252,310 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ServiceStatus) {
-          return mergeFrom((context.ContextOuterClass.ServiceStatus)other);
+        if (other instanceof context.ContextOuterClass.ServiceConfig) {
+          return mergeFrom((context.ContextOuterClass.ServiceConfig)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ServiceStatus other) {
-        if (other == context.ContextOuterClass.ServiceStatus.getDefaultInstance()) return this;
-        if (other.serviceStatus_ != 0) {
-          setServiceStatusValue(other.getServiceStatusValue());
+      public Builder mergeFrom(context.ContextOuterClass.ServiceConfig other) {
+        if (other == context.ContextOuterClass.ServiceConfig.getDefaultInstance()) return this;
+        if (configRulesBuilder_ == null) {
+          if (!other.configRules_.isEmpty()) {
+            if (configRules_.isEmpty()) {
+              configRules_ = other.configRules_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureConfigRulesIsMutable();
+              configRules_.addAll(other.configRules_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.configRules_.isEmpty()) {
+            if (configRulesBuilder_.isEmpty()) {
+              configRulesBuilder_.dispose();
+              configRulesBuilder_ = null;
+              configRules_ = other.configRules_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              configRulesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getConfigRulesFieldBuilder() : null;
+            } else {
+              configRulesBuilder_.addAllMessages(other.configRules_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.ServiceConfig parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.ServiceConfig) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<context.ContextOuterClass.ConfigRule> configRules_ =
+        java.util.Collections.emptyList();
+      private void ensureConfigRulesIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>(configRules_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> configRulesBuilder_;
+
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
+        if (configRulesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(configRules_);
+        } else {
+          return configRulesBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public int getConfigRulesCount() {
+        if (configRulesBuilder_ == null) {
+          return configRules_.size();
+        } else {
+          return configRulesBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
+        if (configRulesBuilder_ == null) {
+          return configRules_.get(index);
+        } else {
+          return configRulesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder setConfigRules(
+          int index, context.ContextOuterClass.ConfigRule value) {
+        if (configRulesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConfigRulesIsMutable();
+          configRules_.set(index, value);
+          onChanged();
+        } else {
+          configRulesBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder setConfigRules(
+          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          configRulesBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder addConfigRules(context.ContextOuterClass.ConfigRule value) {
+        if (configRulesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConfigRulesIsMutable();
+          configRules_.add(value);
+          onChanged();
+        } else {
+          configRulesBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder addConfigRules(
+          int index, context.ContextOuterClass.ConfigRule value) {
+        if (configRulesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConfigRulesIsMutable();
+          configRules_.add(index, value);
+          onChanged();
+        } else {
+          configRulesBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder addConfigRules(
+          context.ContextOuterClass.ConfigRule.Builder builderForValue) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.add(builderForValue.build());
+          onChanged();
+        } else {
+          configRulesBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder addConfigRules(
+          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          configRulesBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder addAllConfigRules(
+          java.lang.Iterable<? extends context.ContextOuterClass.ConfigRule> values) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, configRules_);
+          onChanged();
+        } else {
+          configRulesBuilder_.addAllMessages(values);
         }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
         return this;
       }
-
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.ServiceStatus parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ServiceStatus) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder clearConfigRules() {
+        if (configRulesBuilder_ == null) {
+          configRules_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          configRulesBuilder_.clear();
         }
         return this;
       }
-
-      private int serviceStatus_ = 0;
       /**
-       * <code>.context.ServiceStatusEnum service_status = 1;</code>
-       * @return The enum numeric value on the wire for serviceStatus.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      @java.lang.Override public int getServiceStatusValue() {
-        return serviceStatus_;
+      public Builder removeConfigRules(int index) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.remove(index);
+          onChanged();
+        } else {
+          configRulesBuilder_.remove(index);
+        }
+        return this;
       }
       /**
-       * <code>.context.ServiceStatusEnum service_status = 1;</code>
-       * @param value The enum numeric value on the wire for serviceStatus to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder setServiceStatusValue(int value) {
-        
-        serviceStatus_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConfigRule.Builder getConfigRulesBuilder(
+          int index) {
+        return getConfigRulesFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>.context.ServiceStatusEnum service_status = 1;</code>
-       * @return The serviceStatus.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      @java.lang.Override
-      public context.ContextOuterClass.ServiceStatusEnum getServiceStatus() {
-        @SuppressWarnings("deprecation")
-        context.ContextOuterClass.ServiceStatusEnum result = context.ContextOuterClass.ServiceStatusEnum.valueOf(serviceStatus_);
-        return result == null ? context.ContextOuterClass.ServiceStatusEnum.UNRECOGNIZED : result;
+      public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+          int index) {
+        if (configRulesBuilder_ == null) {
+          return configRules_.get(index);  } else {
+          return configRulesBuilder_.getMessageOrBuilder(index);
+        }
       }
       /**
-       * <code>.context.ServiceStatusEnum service_status = 1;</code>
-       * @param value The serviceStatus to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder setServiceStatus(context.ContextOuterClass.ServiceStatusEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
+      public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
+           getConfigRulesOrBuilderList() {
+        if (configRulesBuilder_ != null) {
+          return configRulesBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(configRules_);
         }
-        
-        serviceStatus_ = value.getNumber();
-        onChanged();
-        return this;
       }
       /**
-       * <code>.context.ServiceStatusEnum service_status = 1;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder clearServiceStatus() {
-        
-        serviceStatus_ = 0;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder() {
+        return getConfigRulesFieldBuilder().addBuilder(
+            context.ContextOuterClass.ConfigRule.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder(
+          int index) {
+        return getConfigRulesFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.ConfigRule.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public java.util.List<context.ContextOuterClass.ConfigRule.Builder> 
+           getConfigRulesBuilderList() {
+        return getConfigRulesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> 
+          getConfigRulesFieldBuilder() {
+        if (configRulesBuilder_ == null) {
+          configRulesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder>(
+                  configRules_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          configRules_ = null;
+        }
+        return configRulesBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -29541,95 +31570,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ServiceStatus)
+      // @@protoc_insertion_point(builder_scope:context.ServiceConfig)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ServiceStatus)
-    private static final context.ContextOuterClass.ServiceStatus DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ServiceConfig)
+    private static final context.ContextOuterClass.ServiceConfig DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceStatus();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceConfig();
     }
 
-    public static context.ContextOuterClass.ServiceStatus getDefaultInstance() {
+    public static context.ContextOuterClass.ServiceConfig getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ServiceStatus>
-        PARSER = new com.google.protobuf.AbstractParser<ServiceStatus>() {
+    private static final com.google.protobuf.Parser<ServiceConfig>
+        PARSER = new com.google.protobuf.AbstractParser<ServiceConfig>() {
       @java.lang.Override
-      public ServiceStatus parsePartialFrom(
+      public ServiceConfig parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ServiceStatus(input, extensionRegistry);
+        return new ServiceConfig(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ServiceStatus> parser() {
+    public static com.google.protobuf.Parser<ServiceConfig> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ServiceStatus> getParserForType() {
+    public com.google.protobuf.Parser<ServiceConfig> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ServiceStatus getDefaultInstanceForType() {
+    public context.ContextOuterClass.ServiceConfig getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ServiceConfigOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ServiceConfig)
+  public interface ServiceIdListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
-    java.util.List<context.ContextOuterClass.ConfigRule> 
-        getConfigRulesList();
+    java.util.List<context.ContextOuterClass.ServiceId> 
+        getServiceIdsList();
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
-    context.ContextOuterClass.ConfigRule getConfigRules(int index);
+    context.ContextOuterClass.ServiceId getServiceIds(int index);
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
-    int getConfigRulesCount();
+    int getServiceIdsCount();
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
-    java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
-        getConfigRulesOrBuilderList();
+    java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+        getServiceIdsOrBuilderList();
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
-    context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdsOrBuilder(
         int index);
   }
   /**
-   * Protobuf type {@code context.ServiceConfig}
+   * Protobuf type {@code context.ServiceIdList}
    */
-  public static final class ServiceConfig extends
+  public static final class ServiceIdList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ServiceConfig)
-      ServiceConfigOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ServiceIdList)
+      ServiceIdListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ServiceConfig.newBuilder() to construct.
-    private ServiceConfig(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ServiceIdList.newBuilder() to construct.
+    private ServiceIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ServiceConfig() {
-      configRules_ = java.util.Collections.emptyList();
+    private ServiceIdList() {
+      serviceIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ServiceConfig();
+      return new ServiceIdList();
     }
 
     @java.lang.Override
@@ -29637,7 +31666,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ServiceConfig(
+    private ServiceIdList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -29658,11 +31687,11 @@ public final class ContextOuterClass {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>();
+                serviceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              configRules_.add(
-                  input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+              serviceIds_.add(
+                  input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -29681,7 +31710,7 @@ public final class ContextOuterClass {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          configRules_ = java.util.Collections.unmodifiableList(configRules_);
+          serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -29689,55 +31718,55 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
+      return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ServiceConfig_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ServiceIdList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ServiceConfig.class, context.ContextOuterClass.ServiceConfig.Builder.class);
+              context.ContextOuterClass.ServiceIdList.class, context.ContextOuterClass.ServiceIdList.Builder.class);
     }
 
-    public static final int CONFIG_RULES_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.ConfigRule> configRules_;
+    public static final int SERVICE_IDS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.ServiceId> serviceIds_;
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
-      return configRules_;
+    public java.util.List<context.ContextOuterClass.ServiceId> getServiceIdsList() {
+      return serviceIds_;
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
-        getConfigRulesOrBuilderList() {
-      return configRules_;
+    public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+        getServiceIdsOrBuilderList() {
+      return serviceIds_;
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
     @java.lang.Override
-    public int getConfigRulesCount() {
-      return configRules_.size();
+    public int getServiceIdsCount() {
+      return serviceIds_.size();
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
-      return configRules_.get(index);
+    public context.ContextOuterClass.ServiceId getServiceIds(int index) {
+      return serviceIds_.get(index);
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.ServiceId service_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdsOrBuilder(
         int index) {
-      return configRules_.get(index);
+      return serviceIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -29754,8 +31783,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < configRules_.size(); i++) {
-        output.writeMessage(1, configRules_.get(i));
+      for (int i = 0; i < serviceIds_.size(); i++) {
+        output.writeMessage(1, serviceIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -29766,9 +31795,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < configRules_.size(); i++) {
+      for (int i = 0; i < serviceIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, configRules_.get(i));
+          .computeMessageSize(1, serviceIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -29780,13 +31809,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ServiceConfig)) {
+      if (!(obj instanceof context.ContextOuterClass.ServiceIdList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ServiceConfig other = (context.ContextOuterClass.ServiceConfig) obj;
+      context.ContextOuterClass.ServiceIdList other = (context.ContextOuterClass.ServiceIdList) obj;
 
-      if (!getConfigRulesList()
-          .equals(other.getConfigRulesList())) return false;
+      if (!getServiceIdsList()
+          .equals(other.getServiceIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -29798,78 +31827,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getConfigRulesCount() > 0) {
-        hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
-        hash = (53 * hash) + getConfigRulesList().hashCode();
+      if (getServiceIdsCount() > 0) {
+        hash = (37 * hash) + SERVICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceIdsList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(byte[] data)
+    public static context.ContextOuterClass.ServiceIdList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceIdList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceConfig parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceIdList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceConfig parseDelimitedFrom(
+    public static context.ContextOuterClass.ServiceIdList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceConfig parseFrom(
+    public static context.ContextOuterClass.ServiceIdList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -29882,7 +31911,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ServiceConfig prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ServiceIdList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -29898,26 +31927,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ServiceConfig}
+     * Protobuf type {@code context.ServiceIdList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ServiceConfig)
-        context.ContextOuterClass.ServiceConfigOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
+        context.ContextOuterClass.ServiceIdListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ServiceConfig_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ServiceIdList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ServiceConfig.class, context.ContextOuterClass.ServiceConfig.Builder.class);
+                context.ContextOuterClass.ServiceIdList.class, context.ContextOuterClass.ServiceIdList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ServiceConfig.newBuilder()
+      // Construct using context.ContextOuterClass.ServiceIdList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -29930,17 +31959,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getConfigRulesFieldBuilder();
+          getServiceIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (configRulesBuilder_ == null) {
-          configRules_ = java.util.Collections.emptyList();
+        if (serviceIdsBuilder_ == null) {
+          serviceIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          configRulesBuilder_.clear();
+          serviceIdsBuilder_.clear();
         }
         return this;
       }
@@ -29948,17 +31977,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ServiceConfig_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceConfig getDefaultInstanceForType() {
-        return context.ContextOuterClass.ServiceConfig.getDefaultInstance();
+      public context.ContextOuterClass.ServiceIdList getDefaultInstanceForType() {
+        return context.ContextOuterClass.ServiceIdList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceConfig build() {
-        context.ContextOuterClass.ServiceConfig result = buildPartial();
+      public context.ContextOuterClass.ServiceIdList build() {
+        context.ContextOuterClass.ServiceIdList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -29966,17 +31995,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceConfig buildPartial() {
-        context.ContextOuterClass.ServiceConfig result = new context.ContextOuterClass.ServiceConfig(this);
+      public context.ContextOuterClass.ServiceIdList buildPartial() {
+        context.ContextOuterClass.ServiceIdList result = new context.ContextOuterClass.ServiceIdList(this);
         int from_bitField0_ = bitField0_;
-        if (configRulesBuilder_ == null) {
+        if (serviceIdsBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            configRules_ = java.util.Collections.unmodifiableList(configRules_);
+            serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.configRules_ = configRules_;
+          result.serviceIds_ = serviceIds_;
         } else {
-          result.configRules_ = configRulesBuilder_.build();
+          result.serviceIds_ = serviceIdsBuilder_.build();
         }
         onBuilt();
         return result;
@@ -30016,39 +32045,39 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ServiceConfig) {
-          return mergeFrom((context.ContextOuterClass.ServiceConfig)other);
+        if (other instanceof context.ContextOuterClass.ServiceIdList) {
+          return mergeFrom((context.ContextOuterClass.ServiceIdList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ServiceConfig other) {
-        if (other == context.ContextOuterClass.ServiceConfig.getDefaultInstance()) return this;
-        if (configRulesBuilder_ == null) {
-          if (!other.configRules_.isEmpty()) {
-            if (configRules_.isEmpty()) {
-              configRules_ = other.configRules_;
+      public Builder mergeFrom(context.ContextOuterClass.ServiceIdList other) {
+        if (other == context.ContextOuterClass.ServiceIdList.getDefaultInstance()) return this;
+        if (serviceIdsBuilder_ == null) {
+          if (!other.serviceIds_.isEmpty()) {
+            if (serviceIds_.isEmpty()) {
+              serviceIds_ = other.serviceIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureConfigRulesIsMutable();
-              configRules_.addAll(other.configRules_);
+              ensureServiceIdsIsMutable();
+              serviceIds_.addAll(other.serviceIds_);
             }
             onChanged();
           }
         } else {
-          if (!other.configRules_.isEmpty()) {
-            if (configRulesBuilder_.isEmpty()) {
-              configRulesBuilder_.dispose();
-              configRulesBuilder_ = null;
-              configRules_ = other.configRules_;
+          if (!other.serviceIds_.isEmpty()) {
+            if (serviceIdsBuilder_.isEmpty()) {
+              serviceIdsBuilder_.dispose();
+              serviceIdsBuilder_ = null;
+              serviceIds_ = other.serviceIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              configRulesBuilder_ = 
+              serviceIdsBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getConfigRulesFieldBuilder() : null;
+                   getServiceIdsFieldBuilder() : null;
             } else {
-              configRulesBuilder_.addAllMessages(other.configRules_);
+              serviceIdsBuilder_.addAllMessages(other.serviceIds_);
             }
           }
         }
@@ -30067,11 +32096,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ServiceConfig parsedMessage = null;
+        context.ContextOuterClass.ServiceIdList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ServiceConfig) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ServiceIdList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -30082,244 +32111,244 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.ConfigRule> configRules_ =
+      private java.util.List<context.ContextOuterClass.ServiceId> serviceIds_ =
         java.util.Collections.emptyList();
-      private void ensureConfigRulesIsMutable() {
+      private void ensureServiceIdsIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>(configRules_);
+          serviceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>(serviceIds_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> configRulesBuilder_;
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdsBuilder_;
 
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
-        if (configRulesBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(configRules_);
+      public java.util.List<context.ContextOuterClass.ServiceId> getServiceIdsList() {
+        if (serviceIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(serviceIds_);
         } else {
-          return configRulesBuilder_.getMessageList();
+          return serviceIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public int getConfigRulesCount() {
-        if (configRulesBuilder_ == null) {
-          return configRules_.size();
+      public int getServiceIdsCount() {
+        if (serviceIdsBuilder_ == null) {
+          return serviceIds_.size();
         } else {
-          return configRulesBuilder_.getCount();
+          return serviceIdsBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
-        if (configRulesBuilder_ == null) {
-          return configRules_.get(index);
+      public context.ContextOuterClass.ServiceId getServiceIds(int index) {
+        if (serviceIdsBuilder_ == null) {
+          return serviceIds_.get(index);
         } else {
-          return configRulesBuilder_.getMessage(index);
+          return serviceIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder setConfigRules(
-          int index, context.ContextOuterClass.ConfigRule value) {
-        if (configRulesBuilder_ == null) {
+      public Builder setServiceIds(
+          int index, context.ContextOuterClass.ServiceId value) {
+        if (serviceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConfigRulesIsMutable();
-          configRules_.set(index, value);
+          ensureServiceIdsIsMutable();
+          serviceIds_.set(index, value);
           onChanged();
         } else {
-          configRulesBuilder_.setMessage(index, value);
+          serviceIdsBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder setConfigRules(
-          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.set(index, builderForValue.build());
+      public Builder setServiceIds(
+          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdsBuilder_ == null) {
+          ensureServiceIdsIsMutable();
+          serviceIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          configRulesBuilder_.setMessage(index, builderForValue.build());
+          serviceIdsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder addConfigRules(context.ContextOuterClass.ConfigRule value) {
-        if (configRulesBuilder_ == null) {
+      public Builder addServiceIds(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConfigRulesIsMutable();
-          configRules_.add(value);
+          ensureServiceIdsIsMutable();
+          serviceIds_.add(value);
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(value);
+          serviceIdsBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder addConfigRules(
-          int index, context.ContextOuterClass.ConfigRule value) {
-        if (configRulesBuilder_ == null) {
+      public Builder addServiceIds(
+          int index, context.ContextOuterClass.ServiceId value) {
+        if (serviceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConfigRulesIsMutable();
-          configRules_.add(index, value);
+          ensureServiceIdsIsMutable();
+          serviceIds_.add(index, value);
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(index, value);
+          serviceIdsBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder addConfigRules(
-          context.ContextOuterClass.ConfigRule.Builder builderForValue) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.add(builderForValue.build());
+      public Builder addServiceIds(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdsBuilder_ == null) {
+          ensureServiceIdsIsMutable();
+          serviceIds_.add(builderForValue.build());
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(builderForValue.build());
+          serviceIdsBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder addConfigRules(
-          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.add(index, builderForValue.build());
+      public Builder addServiceIds(
+          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdsBuilder_ == null) {
+          ensureServiceIdsIsMutable();
+          serviceIds_.add(index, builderForValue.build());
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(index, builderForValue.build());
+          serviceIdsBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
-       */
-      public Builder addAllConfigRules(
-          java.lang.Iterable<? extends context.ContextOuterClass.ConfigRule> values) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       */
+      public Builder addAllServiceIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.ServiceId> values) {
+        if (serviceIdsBuilder_ == null) {
+          ensureServiceIdsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, configRules_);
+              values, serviceIds_);
           onChanged();
         } else {
-          configRulesBuilder_.addAllMessages(values);
+          serviceIdsBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder clearConfigRules() {
-        if (configRulesBuilder_ == null) {
-          configRules_ = java.util.Collections.emptyList();
+      public Builder clearServiceIds() {
+        if (serviceIdsBuilder_ == null) {
+          serviceIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          configRulesBuilder_.clear();
+          serviceIdsBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public Builder removeConfigRules(int index) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.remove(index);
+      public Builder removeServiceIds(int index) {
+        if (serviceIdsBuilder_ == null) {
+          ensureServiceIdsIsMutable();
+          serviceIds_.remove(index);
           onChanged();
         } else {
-          configRulesBuilder_.remove(index);
+          serviceIdsBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule.Builder getConfigRulesBuilder(
+      public context.ContextOuterClass.ServiceId.Builder getServiceIdsBuilder(
           int index) {
-        return getConfigRulesFieldBuilder().getBuilder(index);
+        return getServiceIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdsOrBuilder(
           int index) {
-        if (configRulesBuilder_ == null) {
-          return configRules_.get(index);  } else {
-          return configRulesBuilder_.getMessageOrBuilder(index);
+        if (serviceIdsBuilder_ == null) {
+          return serviceIds_.get(index);  } else {
+          return serviceIdsBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
-           getConfigRulesOrBuilderList() {
-        if (configRulesBuilder_ != null) {
-          return configRulesBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+           getServiceIdsOrBuilderList() {
+        if (serviceIdsBuilder_ != null) {
+          return serviceIdsBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(configRules_);
+          return java.util.Collections.unmodifiableList(serviceIds_);
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder() {
-        return getConfigRulesFieldBuilder().addBuilder(
-            context.ContextOuterClass.ConfigRule.getDefaultInstance());
+      public context.ContextOuterClass.ServiceId.Builder addServiceIdsBuilder() {
+        return getServiceIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.ServiceId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder(
+      public context.ContextOuterClass.ServiceId.Builder addServiceIdsBuilder(
           int index) {
-        return getConfigRulesFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.ConfigRule.getDefaultInstance());
+        return getServiceIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.ServiceId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.ServiceId service_ids = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ConfigRule.Builder> 
-           getConfigRulesBuilderList() {
-        return getConfigRulesFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.ServiceId.Builder> 
+           getServiceIdsBuilderList() {
+        return getServiceIdsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> 
-          getConfigRulesFieldBuilder() {
-        if (configRulesBuilder_ == null) {
-          configRulesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder>(
-                  configRules_,
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getServiceIdsFieldBuilder() {
+        if (serviceIdsBuilder_ == null) {
+          serviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  serviceIds_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          configRules_ = null;
+          serviceIds_ = null;
         }
-        return configRulesBuilder_;
+        return serviceIdsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -30334,95 +32363,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ServiceConfig)
+      // @@protoc_insertion_point(builder_scope:context.ServiceIdList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ServiceConfig)
-    private static final context.ContextOuterClass.ServiceConfig DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ServiceIdList)
+    private static final context.ContextOuterClass.ServiceIdList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceConfig();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceIdList();
     }
 
-    public static context.ContextOuterClass.ServiceConfig getDefaultInstance() {
+    public static context.ContextOuterClass.ServiceIdList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ServiceConfig>
-        PARSER = new com.google.protobuf.AbstractParser<ServiceConfig>() {
+    private static final com.google.protobuf.Parser<ServiceIdList>
+        PARSER = new com.google.protobuf.AbstractParser<ServiceIdList>() {
       @java.lang.Override
-      public ServiceConfig parsePartialFrom(
+      public ServiceIdList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ServiceConfig(input, extensionRegistry);
+        return new ServiceIdList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ServiceConfig> parser() {
+    public static com.google.protobuf.Parser<ServiceIdList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ServiceConfig> getParserForType() {
+    public com.google.protobuf.Parser<ServiceIdList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ServiceConfig getDefaultInstanceForType() {
+    public context.ContextOuterClass.ServiceIdList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ServiceIdListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ServiceIdList)
+  public interface ServiceListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ServiceList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
-    java.util.List<context.ContextOuterClass.ServiceId> 
-        getServiceIdsList();
+    java.util.List<context.ContextOuterClass.Service> 
+        getServicesList();
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
-    context.ContextOuterClass.ServiceId getServiceIds(int index);
+    context.ContextOuterClass.Service getServices(int index);
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
-    int getServiceIdsCount();
+    int getServicesCount();
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
-    java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-        getServiceIdsOrBuilderList();
+    java.util.List<? extends context.ContextOuterClass.ServiceOrBuilder> 
+        getServicesOrBuilderList();
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
-    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdsOrBuilder(
+    context.ContextOuterClass.ServiceOrBuilder getServicesOrBuilder(
         int index);
   }
   /**
-   * Protobuf type {@code context.ServiceIdList}
+   * Protobuf type {@code context.ServiceList}
    */
-  public static final class ServiceIdList extends
+  public static final class ServiceList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ServiceIdList)
-      ServiceIdListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ServiceList)
+      ServiceListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ServiceIdList.newBuilder() to construct.
-    private ServiceIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ServiceList.newBuilder() to construct.
+    private ServiceList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ServiceIdList() {
-      serviceIds_ = java.util.Collections.emptyList();
+    private ServiceList() {
+      services_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ServiceIdList();
+      return new ServiceList();
     }
 
     @java.lang.Override
@@ -30430,7 +32459,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ServiceIdList(
+    private ServiceList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -30451,11 +32480,11 @@ public final class ContextOuterClass {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                serviceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>();
+                services_ = new java.util.ArrayList<context.ContextOuterClass.Service>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              serviceIds_.add(
-                  input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+              services_.add(
+                  input.readMessage(context.ContextOuterClass.Service.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -30474,7 +32503,7 @@ public final class ContextOuterClass {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
+          services_ = java.util.Collections.unmodifiableList(services_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -30482,55 +32511,55 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
+      return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ServiceIdList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ServiceList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ServiceIdList.class, context.ContextOuterClass.ServiceIdList.Builder.class);
+              context.ContextOuterClass.ServiceList.class, context.ContextOuterClass.ServiceList.Builder.class);
     }
 
-    public static final int SERVICE_IDS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.ServiceId> serviceIds_;
+    public static final int SERVICES_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.Service> services_;
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.ServiceId> getServiceIdsList() {
-      return serviceIds_;
+    public java.util.List<context.ContextOuterClass.Service> getServicesList() {
+      return services_;
     }
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-        getServiceIdsOrBuilderList() {
-      return serviceIds_;
+    public java.util.List<? extends context.ContextOuterClass.ServiceOrBuilder> 
+        getServicesOrBuilderList() {
+      return services_;
     }
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
     @java.lang.Override
-    public int getServiceIdsCount() {
-      return serviceIds_.size();
+    public int getServicesCount() {
+      return services_.size();
     }
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceId getServiceIds(int index) {
-      return serviceIds_.get(index);
+    public context.ContextOuterClass.Service getServices(int index) {
+      return services_.get(index);
     }
     /**
-     * <code>repeated .context.ServiceId service_ids = 1;</code>
+     * <code>repeated .context.Service services = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdsOrBuilder(
+    public context.ContextOuterClass.ServiceOrBuilder getServicesOrBuilder(
         int index) {
-      return serviceIds_.get(index);
+      return services_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -30547,8 +32576,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < serviceIds_.size(); i++) {
-        output.writeMessage(1, serviceIds_.get(i));
+      for (int i = 0; i < services_.size(); i++) {
+        output.writeMessage(1, services_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -30559,9 +32588,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < serviceIds_.size(); i++) {
+      for (int i = 0; i < services_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, serviceIds_.get(i));
+          .computeMessageSize(1, services_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -30573,13 +32602,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ServiceIdList)) {
+      if (!(obj instanceof context.ContextOuterClass.ServiceList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ServiceIdList other = (context.ContextOuterClass.ServiceIdList) obj;
+      context.ContextOuterClass.ServiceList other = (context.ContextOuterClass.ServiceList) obj;
 
-      if (!getServiceIdsList()
-          .equals(other.getServiceIdsList())) return false;
+      if (!getServicesList()
+          .equals(other.getServicesList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -30591,78 +32620,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getServiceIdsCount() > 0) {
-        hash = (37 * hash) + SERVICE_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceIdsList().hashCode();
+      if (getServicesCount() > 0) {
+        hash = (37 * hash) + SERVICES_FIELD_NUMBER;
+        hash = (53 * hash) + getServicesList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(byte[] data)
+    public static context.ContextOuterClass.ServiceList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceIdList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceIdList parseDelimitedFrom(
+    public static context.ContextOuterClass.ServiceList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceIdList parseFrom(
+    public static context.ContextOuterClass.ServiceList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -30675,7 +32704,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ServiceIdList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ServiceList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -30691,26 +32720,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ServiceIdList}
+     * Protobuf type {@code context.ServiceList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ServiceIdList)
-        context.ContextOuterClass.ServiceIdListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ServiceList)
+        context.ContextOuterClass.ServiceListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ServiceIdList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ServiceList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ServiceIdList.class, context.ContextOuterClass.ServiceIdList.Builder.class);
+                context.ContextOuterClass.ServiceList.class, context.ContextOuterClass.ServiceList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ServiceIdList.newBuilder()
+      // Construct using context.ContextOuterClass.ServiceList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -30723,17 +32752,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getServiceIdsFieldBuilder();
+          getServicesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (serviceIdsBuilder_ == null) {
-          serviceIds_ = java.util.Collections.emptyList();
+        if (servicesBuilder_ == null) {
+          services_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          serviceIdsBuilder_.clear();
+          servicesBuilder_.clear();
         }
         return this;
       }
@@ -30741,17 +32770,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ServiceIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceIdList getDefaultInstanceForType() {
-        return context.ContextOuterClass.ServiceIdList.getDefaultInstance();
+      public context.ContextOuterClass.ServiceList getDefaultInstanceForType() {
+        return context.ContextOuterClass.ServiceList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceIdList build() {
-        context.ContextOuterClass.ServiceIdList result = buildPartial();
+      public context.ContextOuterClass.ServiceList build() {
+        context.ContextOuterClass.ServiceList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -30759,17 +32788,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceIdList buildPartial() {
-        context.ContextOuterClass.ServiceIdList result = new context.ContextOuterClass.ServiceIdList(this);
+      public context.ContextOuterClass.ServiceList buildPartial() {
+        context.ContextOuterClass.ServiceList result = new context.ContextOuterClass.ServiceList(this);
         int from_bitField0_ = bitField0_;
-        if (serviceIdsBuilder_ == null) {
+        if (servicesBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            serviceIds_ = java.util.Collections.unmodifiableList(serviceIds_);
+            services_ = java.util.Collections.unmodifiableList(services_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.serviceIds_ = serviceIds_;
+          result.services_ = services_;
         } else {
-          result.serviceIds_ = serviceIdsBuilder_.build();
+          result.services_ = servicesBuilder_.build();
         }
         onBuilt();
         return result;
@@ -30809,39 +32838,39 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ServiceIdList) {
-          return mergeFrom((context.ContextOuterClass.ServiceIdList)other);
+        if (other instanceof context.ContextOuterClass.ServiceList) {
+          return mergeFrom((context.ContextOuterClass.ServiceList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ServiceIdList other) {
-        if (other == context.ContextOuterClass.ServiceIdList.getDefaultInstance()) return this;
-        if (serviceIdsBuilder_ == null) {
-          if (!other.serviceIds_.isEmpty()) {
-            if (serviceIds_.isEmpty()) {
-              serviceIds_ = other.serviceIds_;
+      public Builder mergeFrom(context.ContextOuterClass.ServiceList other) {
+        if (other == context.ContextOuterClass.ServiceList.getDefaultInstance()) return this;
+        if (servicesBuilder_ == null) {
+          if (!other.services_.isEmpty()) {
+            if (services_.isEmpty()) {
+              services_ = other.services_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureServiceIdsIsMutable();
-              serviceIds_.addAll(other.serviceIds_);
+              ensureServicesIsMutable();
+              services_.addAll(other.services_);
             }
             onChanged();
           }
         } else {
-          if (!other.serviceIds_.isEmpty()) {
-            if (serviceIdsBuilder_.isEmpty()) {
-              serviceIdsBuilder_.dispose();
-              serviceIdsBuilder_ = null;
-              serviceIds_ = other.serviceIds_;
+          if (!other.services_.isEmpty()) {
+            if (servicesBuilder_.isEmpty()) {
+              servicesBuilder_.dispose();
+              servicesBuilder_ = null;
+              services_ = other.services_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              serviceIdsBuilder_ = 
+              servicesBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getServiceIdsFieldBuilder() : null;
+                   getServicesFieldBuilder() : null;
             } else {
-              serviceIdsBuilder_.addAllMessages(other.serviceIds_);
+              servicesBuilder_.addAllMessages(other.services_);
             }
           }
         }
@@ -30860,11 +32889,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ServiceIdList parsedMessage = null;
+        context.ContextOuterClass.ServiceList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ServiceIdList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ServiceList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -30875,244 +32904,244 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.ServiceId> serviceIds_ =
+      private java.util.List<context.ContextOuterClass.Service> services_ =
         java.util.Collections.emptyList();
-      private void ensureServiceIdsIsMutable() {
+      private void ensureServicesIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          serviceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>(serviceIds_);
+          services_ = new java.util.ArrayList<context.ContextOuterClass.Service>(services_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdsBuilder_;
+          context.ContextOuterClass.Service, context.ContextOuterClass.Service.Builder, context.ContextOuterClass.ServiceOrBuilder> servicesBuilder_;
 
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ServiceId> getServiceIdsList() {
-        if (serviceIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(serviceIds_);
+      public java.util.List<context.ContextOuterClass.Service> getServicesList() {
+        if (servicesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(services_);
         } else {
-          return serviceIdsBuilder_.getMessageList();
+          return servicesBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public int getServiceIdsCount() {
-        if (serviceIdsBuilder_ == null) {
-          return serviceIds_.size();
+      public int getServicesCount() {
+        if (servicesBuilder_ == null) {
+          return services_.size();
         } else {
-          return serviceIdsBuilder_.getCount();
+          return servicesBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId getServiceIds(int index) {
-        if (serviceIdsBuilder_ == null) {
-          return serviceIds_.get(index);
+      public context.ContextOuterClass.Service getServices(int index) {
+        if (servicesBuilder_ == null) {
+          return services_.get(index);
         } else {
-          return serviceIdsBuilder_.getMessage(index);
+          return servicesBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder setServiceIds(
-          int index, context.ContextOuterClass.ServiceId value) {
-        if (serviceIdsBuilder_ == null) {
+      public Builder setServices(
+          int index, context.ContextOuterClass.Service value) {
+        if (servicesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureServiceIdsIsMutable();
-          serviceIds_.set(index, value);
+          ensureServicesIsMutable();
+          services_.set(index, value);
           onChanged();
         } else {
-          serviceIdsBuilder_.setMessage(index, value);
+          servicesBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder setServiceIds(
-          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdsBuilder_ == null) {
-          ensureServiceIdsIsMutable();
-          serviceIds_.set(index, builderForValue.build());
+      public Builder setServices(
+          int index, context.ContextOuterClass.Service.Builder builderForValue) {
+        if (servicesBuilder_ == null) {
+          ensureServicesIsMutable();
+          services_.set(index, builderForValue.build());
           onChanged();
         } else {
-          serviceIdsBuilder_.setMessage(index, builderForValue.build());
+          servicesBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder addServiceIds(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdsBuilder_ == null) {
+      public Builder addServices(context.ContextOuterClass.Service value) {
+        if (servicesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureServiceIdsIsMutable();
-          serviceIds_.add(value);
+          ensureServicesIsMutable();
+          services_.add(value);
           onChanged();
         } else {
-          serviceIdsBuilder_.addMessage(value);
+          servicesBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder addServiceIds(
-          int index, context.ContextOuterClass.ServiceId value) {
-        if (serviceIdsBuilder_ == null) {
+      public Builder addServices(
+          int index, context.ContextOuterClass.Service value) {
+        if (servicesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureServiceIdsIsMutable();
-          serviceIds_.add(index, value);
+          ensureServicesIsMutable();
+          services_.add(index, value);
           onChanged();
         } else {
-          serviceIdsBuilder_.addMessage(index, value);
+          servicesBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder addServiceIds(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdsBuilder_ == null) {
-          ensureServiceIdsIsMutable();
-          serviceIds_.add(builderForValue.build());
+      public Builder addServices(
+          context.ContextOuterClass.Service.Builder builderForValue) {
+        if (servicesBuilder_ == null) {
+          ensureServicesIsMutable();
+          services_.add(builderForValue.build());
           onChanged();
         } else {
-          serviceIdsBuilder_.addMessage(builderForValue.build());
+          servicesBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder addServiceIds(
-          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdsBuilder_ == null) {
-          ensureServiceIdsIsMutable();
-          serviceIds_.add(index, builderForValue.build());
+      public Builder addServices(
+          int index, context.ContextOuterClass.Service.Builder builderForValue) {
+        if (servicesBuilder_ == null) {
+          ensureServicesIsMutable();
+          services_.add(index, builderForValue.build());
           onChanged();
         } else {
-          serviceIdsBuilder_.addMessage(index, builderForValue.build());
+          servicesBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder addAllServiceIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.ServiceId> values) {
-        if (serviceIdsBuilder_ == null) {
-          ensureServiceIdsIsMutable();
+      public Builder addAllServices(
+          java.lang.Iterable<? extends context.ContextOuterClass.Service> values) {
+        if (servicesBuilder_ == null) {
+          ensureServicesIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, serviceIds_);
+              values, services_);
           onChanged();
         } else {
-          serviceIdsBuilder_.addAllMessages(values);
+          servicesBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder clearServiceIds() {
-        if (serviceIdsBuilder_ == null) {
-          serviceIds_ = java.util.Collections.emptyList();
+      public Builder clearServices() {
+        if (servicesBuilder_ == null) {
+          services_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          serviceIdsBuilder_.clear();
+          servicesBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public Builder removeServiceIds(int index) {
-        if (serviceIdsBuilder_ == null) {
-          ensureServiceIdsIsMutable();
-          serviceIds_.remove(index);
+      public Builder removeServices(int index) {
+        if (servicesBuilder_ == null) {
+          ensureServicesIsMutable();
+          services_.remove(index);
           onChanged();
         } else {
-          serviceIdsBuilder_.remove(index);
+          servicesBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder getServiceIdsBuilder(
+      public context.ContextOuterClass.Service.Builder getServicesBuilder(
           int index) {
-        return getServiceIdsFieldBuilder().getBuilder(index);
+        return getServicesFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdsOrBuilder(
+      public context.ContextOuterClass.ServiceOrBuilder getServicesOrBuilder(
           int index) {
-        if (serviceIdsBuilder_ == null) {
-          return serviceIds_.get(index);  } else {
-          return serviceIdsBuilder_.getMessageOrBuilder(index);
+        if (servicesBuilder_ == null) {
+          return services_.get(index);  } else {
+          return servicesBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-           getServiceIdsOrBuilderList() {
-        if (serviceIdsBuilder_ != null) {
-          return serviceIdsBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.ServiceOrBuilder> 
+           getServicesOrBuilderList() {
+        if (servicesBuilder_ != null) {
+          return servicesBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(serviceIds_);
+          return java.util.Collections.unmodifiableList(services_);
         }
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder addServiceIdsBuilder() {
-        return getServiceIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.ServiceId.getDefaultInstance());
+      public context.ContextOuterClass.Service.Builder addServicesBuilder() {
+        return getServicesFieldBuilder().addBuilder(
+            context.ContextOuterClass.Service.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder addServiceIdsBuilder(
+      public context.ContextOuterClass.Service.Builder addServicesBuilder(
           int index) {
-        return getServiceIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.ServiceId.getDefaultInstance());
+        return getServicesFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.Service.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ServiceId service_ids = 1;</code>
+       * <code>repeated .context.Service services = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ServiceId.Builder> 
-           getServiceIdsBuilderList() {
-        return getServiceIdsFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.Service.Builder> 
+           getServicesBuilderList() {
+        return getServicesFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getServiceIdsFieldBuilder() {
-        if (serviceIdsBuilder_ == null) {
-          serviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  serviceIds_,
+          context.ContextOuterClass.Service, context.ContextOuterClass.Service.Builder, context.ContextOuterClass.ServiceOrBuilder> 
+          getServicesFieldBuilder() {
+        if (servicesBuilder_ == null) {
+          servicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.Service, context.ContextOuterClass.Service.Builder, context.ContextOuterClass.ServiceOrBuilder>(
+                  services_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          serviceIds_ = null;
+          services_ = null;
         }
-        return serviceIdsBuilder_;
+        return servicesBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -31127,95 +33156,103 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ServiceIdList)
+      // @@protoc_insertion_point(builder_scope:context.ServiceList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ServiceIdList)
-    private static final context.ContextOuterClass.ServiceIdList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ServiceList)
+    private static final context.ContextOuterClass.ServiceList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceIdList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceList();
     }
 
-    public static context.ContextOuterClass.ServiceIdList getDefaultInstance() {
+    public static context.ContextOuterClass.ServiceList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ServiceIdList>
-        PARSER = new com.google.protobuf.AbstractParser<ServiceIdList>() {
+    private static final com.google.protobuf.Parser<ServiceList>
+        PARSER = new com.google.protobuf.AbstractParser<ServiceList>() {
       @java.lang.Override
-      public ServiceIdList parsePartialFrom(
+      public ServiceList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ServiceIdList(input, extensionRegistry);
+        return new ServiceList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ServiceIdList> parser() {
+    public static com.google.protobuf.Parser<ServiceList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ServiceIdList> getParserForType() {
+    public com.google.protobuf.Parser<ServiceList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ServiceIdList getDefaultInstanceForType() {
+    public context.ContextOuterClass.ServiceList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ServiceListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ServiceList)
+  public interface ServiceFilterOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ServiceFilter)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>.context.ServiceIdList service_ids = 1;</code>
+     * @return Whether the serviceIds field is set.
      */
-    java.util.List<context.ContextOuterClass.Service> 
-        getServicesList();
+    boolean hasServiceIds();
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>.context.ServiceIdList service_ids = 1;</code>
+     * @return The serviceIds.
      */
-    context.ContextOuterClass.Service getServices(int index);
+    context.ContextOuterClass.ServiceIdList getServiceIds();
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>.context.ServiceIdList service_ids = 1;</code>
      */
-    int getServicesCount();
+    context.ContextOuterClass.ServiceIdListOrBuilder getServiceIdsOrBuilder();
+
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>bool include_endpoint_ids = 2;</code>
+     * @return The includeEndpointIds.
      */
-    java.util.List<? extends context.ContextOuterClass.ServiceOrBuilder> 
-        getServicesOrBuilderList();
+    boolean getIncludeEndpointIds();
+
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>bool include_constraints = 3;</code>
+     * @return The includeConstraints.
      */
-    context.ContextOuterClass.ServiceOrBuilder getServicesOrBuilder(
-        int index);
+    boolean getIncludeConstraints();
+
+    /**
+     * <code>bool include_config_rules = 4;</code>
+     * @return The includeConfigRules.
+     */
+    boolean getIncludeConfigRules();
   }
   /**
-   * Protobuf type {@code context.ServiceList}
+   * Protobuf type {@code context.ServiceFilter}
    */
-  public static final class ServiceList extends
+  public static final class ServiceFilter extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ServiceList)
-      ServiceListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ServiceFilter)
+      ServiceFilterOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ServiceList.newBuilder() to construct.
-    private ServiceList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ServiceFilter.newBuilder() to construct.
+    private ServiceFilter(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ServiceList() {
-      services_ = java.util.Collections.emptyList();
+    private ServiceFilter() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ServiceList();
+      return new ServiceFilter();
     }
 
     @java.lang.Override
@@ -31223,7 +33260,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ServiceList(
+    private ServiceFilter(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -31231,7 +33268,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -31243,12 +33279,31 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                services_ = new java.util.ArrayList<context.ContextOuterClass.Service>();
-                mutable_bitField0_ |= 0x00000001;
+              context.ContextOuterClass.ServiceIdList.Builder subBuilder = null;
+              if (serviceIds_ != null) {
+                subBuilder = serviceIds_.toBuilder();
               }
-              services_.add(
-                  input.readMessage(context.ContextOuterClass.Service.parser(), extensionRegistry));
+              serviceIds_ = input.readMessage(context.ContextOuterClass.ServiceIdList.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(serviceIds_);
+                serviceIds_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 16: {
+
+              includeEndpointIds_ = input.readBool();
+              break;
+            }
+            case 24: {
+
+              includeConstraints_ = input.readBool();
+              break;
+            }
+            case 32: {
+
+              includeConfigRules_ = input.readBool();
               break;
             }
             default: {
@@ -31266,64 +33321,80 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          services_ = java.util.Collections.unmodifiableList(services_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
+      return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ServiceList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ServiceFilter_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ServiceList.class, context.ContextOuterClass.ServiceList.Builder.class);
+              context.ContextOuterClass.ServiceFilter.class, context.ContextOuterClass.ServiceFilter.Builder.class);
     }
 
-    public static final int SERVICES_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.Service> services_;
+    public static final int SERVICE_IDS_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.ServiceIdList serviceIds_;
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>.context.ServiceIdList service_ids = 1;</code>
+     * @return Whether the serviceIds field is set.
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.Service> getServicesList() {
-      return services_;
+    public boolean hasServiceIds() {
+      return serviceIds_ != null;
     }
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>.context.ServiceIdList service_ids = 1;</code>
+     * @return The serviceIds.
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ServiceOrBuilder> 
-        getServicesOrBuilderList() {
-      return services_;
+    public context.ContextOuterClass.ServiceIdList getServiceIds() {
+      return serviceIds_ == null ? context.ContextOuterClass.ServiceIdList.getDefaultInstance() : serviceIds_;
     }
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>.context.ServiceIdList service_ids = 1;</code>
      */
     @java.lang.Override
-    public int getServicesCount() {
-      return services_.size();
+    public context.ContextOuterClass.ServiceIdListOrBuilder getServiceIdsOrBuilder() {
+      return getServiceIds();
     }
+
+    public static final int INCLUDE_ENDPOINT_IDS_FIELD_NUMBER = 2;
+    private boolean includeEndpointIds_;
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>bool include_endpoint_ids = 2;</code>
+     * @return The includeEndpointIds.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Service getServices(int index) {
-      return services_.get(index);
+    public boolean getIncludeEndpointIds() {
+      return includeEndpointIds_;
     }
+
+    public static final int INCLUDE_CONSTRAINTS_FIELD_NUMBER = 3;
+    private boolean includeConstraints_;
     /**
-     * <code>repeated .context.Service services = 1;</code>
+     * <code>bool include_constraints = 3;</code>
+     * @return The includeConstraints.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceOrBuilder getServicesOrBuilder(
-        int index) {
-      return services_.get(index);
+    public boolean getIncludeConstraints() {
+      return includeConstraints_;
+    }
+
+    public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 4;
+    private boolean includeConfigRules_;
+    /**
+     * <code>bool include_config_rules = 4;</code>
+     * @return The includeConfigRules.
+     */
+    @java.lang.Override
+    public boolean getIncludeConfigRules() {
+      return includeConfigRules_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -31340,8 +33411,17 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < services_.size(); i++) {
-        output.writeMessage(1, services_.get(i));
+      if (serviceIds_ != null) {
+        output.writeMessage(1, getServiceIds());
+      }
+      if (includeEndpointIds_ != false) {
+        output.writeBool(2, includeEndpointIds_);
+      }
+      if (includeConstraints_ != false) {
+        output.writeBool(3, includeConstraints_);
+      }
+      if (includeConfigRules_ != false) {
+        output.writeBool(4, includeConfigRules_);
       }
       unknownFields.writeTo(output);
     }
@@ -31352,9 +33432,21 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < services_.size(); i++) {
+      if (serviceIds_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, services_.get(i));
+          .computeMessageSize(1, getServiceIds());
+      }
+      if (includeEndpointIds_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(2, includeEndpointIds_);
+      }
+      if (includeConstraints_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(3, includeConstraints_);
+      }
+      if (includeConfigRules_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(4, includeConfigRules_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -31366,13 +33458,22 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ServiceList)) {
+      if (!(obj instanceof context.ContextOuterClass.ServiceFilter)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ServiceList other = (context.ContextOuterClass.ServiceList) obj;
+      context.ContextOuterClass.ServiceFilter other = (context.ContextOuterClass.ServiceFilter) obj;
 
-      if (!getServicesList()
-          .equals(other.getServicesList())) return false;
+      if (hasServiceIds() != other.hasServiceIds()) return false;
+      if (hasServiceIds()) {
+        if (!getServiceIds()
+            .equals(other.getServiceIds())) return false;
+      }
+      if (getIncludeEndpointIds()
+          != other.getIncludeEndpointIds()) return false;
+      if (getIncludeConstraints()
+          != other.getIncludeConstraints()) return false;
+      if (getIncludeConfigRules()
+          != other.getIncludeConfigRules()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -31384,78 +33485,87 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getServicesCount() > 0) {
-        hash = (37 * hash) + SERVICES_FIELD_NUMBER;
-        hash = (53 * hash) + getServicesList().hashCode();
+      if (hasServiceIds()) {
+        hash = (37 * hash) + SERVICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceIds().hashCode();
       }
+      hash = (37 * hash) + INCLUDE_ENDPOINT_IDS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeEndpointIds());
+      hash = (37 * hash) + INCLUDE_CONSTRAINTS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeConstraints());
+      hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeConfigRules());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(byte[] data)
+    public static context.ContextOuterClass.ServiceFilter parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceFilter parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ServiceFilter parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceList parseDelimitedFrom(
+    public static context.ContextOuterClass.ServiceFilter parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ServiceList parseFrom(
+    public static context.ContextOuterClass.ServiceFilter parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -31468,7 +33578,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ServiceList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ServiceFilter prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -31484,26 +33594,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ServiceList}
+     * Protobuf type {@code context.ServiceFilter}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ServiceList)
-        context.ContextOuterClass.ServiceListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ServiceFilter)
+        context.ContextOuterClass.ServiceFilterOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ServiceList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ServiceFilter_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ServiceList.class, context.ContextOuterClass.ServiceList.Builder.class);
+                context.ContextOuterClass.ServiceFilter.class, context.ContextOuterClass.ServiceFilter.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ServiceList.newBuilder()
+      // Construct using context.ContextOuterClass.ServiceFilter.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -31516,35 +33626,40 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getServicesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (servicesBuilder_ == null) {
-          services_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+        if (serviceIdsBuilder_ == null) {
+          serviceIds_ = null;
         } else {
-          servicesBuilder_.clear();
+          serviceIds_ = null;
+          serviceIdsBuilder_ = null;
         }
+        includeEndpointIds_ = false;
+
+        includeConstraints_ = false;
+
+        includeConfigRules_ = false;
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ServiceList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ServiceFilter_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceList getDefaultInstanceForType() {
-        return context.ContextOuterClass.ServiceList.getDefaultInstance();
+      public context.ContextOuterClass.ServiceFilter getDefaultInstanceForType() {
+        return context.ContextOuterClass.ServiceFilter.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceList build() {
-        context.ContextOuterClass.ServiceList result = buildPartial();
+      public context.ContextOuterClass.ServiceFilter build() {
+        context.ContextOuterClass.ServiceFilter result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -31552,18 +33667,16 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ServiceList buildPartial() {
-        context.ContextOuterClass.ServiceList result = new context.ContextOuterClass.ServiceList(this);
-        int from_bitField0_ = bitField0_;
-        if (servicesBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            services_ = java.util.Collections.unmodifiableList(services_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.services_ = services_;
+      public context.ContextOuterClass.ServiceFilter buildPartial() {
+        context.ContextOuterClass.ServiceFilter result = new context.ContextOuterClass.ServiceFilter(this);
+        if (serviceIdsBuilder_ == null) {
+          result.serviceIds_ = serviceIds_;
         } else {
-          result.services_ = servicesBuilder_.build();
+          result.serviceIds_ = serviceIdsBuilder_.build();
         }
+        result.includeEndpointIds_ = includeEndpointIds_;
+        result.includeConstraints_ = includeConstraints_;
+        result.includeConfigRules_ = includeConfigRules_;
         onBuilt();
         return result;
       }
@@ -31602,41 +33715,27 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ServiceList) {
-          return mergeFrom((context.ContextOuterClass.ServiceList)other);
+        if (other instanceof context.ContextOuterClass.ServiceFilter) {
+          return mergeFrom((context.ContextOuterClass.ServiceFilter)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ServiceList other) {
-        if (other == context.ContextOuterClass.ServiceList.getDefaultInstance()) return this;
-        if (servicesBuilder_ == null) {
-          if (!other.services_.isEmpty()) {
-            if (services_.isEmpty()) {
-              services_ = other.services_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureServicesIsMutable();
-              services_.addAll(other.services_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.services_.isEmpty()) {
-            if (servicesBuilder_.isEmpty()) {
-              servicesBuilder_.dispose();
-              servicesBuilder_ = null;
-              services_ = other.services_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              servicesBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getServicesFieldBuilder() : null;
-            } else {
-              servicesBuilder_.addAllMessages(other.services_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.ServiceFilter other) {
+        if (other == context.ContextOuterClass.ServiceFilter.getDefaultInstance()) return this;
+        if (other.hasServiceIds()) {
+          mergeServiceIds(other.getServiceIds());
+        }
+        if (other.getIncludeEndpointIds() != false) {
+          setIncludeEndpointIds(other.getIncludeEndpointIds());
+        }
+        if (other.getIncludeConstraints() != false) {
+          setIncludeConstraints(other.getIncludeConstraints());
+        }
+        if (other.getIncludeConfigRules() != false) {
+          setIncludeConfigRules(other.getIncludeConfigRules());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -31653,11 +33752,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ServiceList parsedMessage = null;
+        context.ContextOuterClass.ServiceFilter parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ServiceList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ServiceFilter) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -31666,246 +33765,217 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<context.ContextOuterClass.Service> services_ =
-        java.util.Collections.emptyList();
-      private void ensureServicesIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          services_ = new java.util.ArrayList<context.ContextOuterClass.Service>(services_);
-          bitField0_ |= 0x00000001;
-         }
-      }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Service, context.ContextOuterClass.Service.Builder, context.ContextOuterClass.ServiceOrBuilder> servicesBuilder_;
-
-      /**
-       * <code>repeated .context.Service services = 1;</code>
-       */
-      public java.util.List<context.ContextOuterClass.Service> getServicesList() {
-        if (servicesBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(services_);
-        } else {
-          return servicesBuilder_.getMessageList();
-        }
-      }
+      private context.ContextOuterClass.ServiceIdList serviceIds_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceIdList, context.ContextOuterClass.ServiceIdList.Builder, context.ContextOuterClass.ServiceIdListOrBuilder> serviceIdsBuilder_;
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
+       * @return Whether the serviceIds field is set.
        */
-      public int getServicesCount() {
-        if (servicesBuilder_ == null) {
-          return services_.size();
-        } else {
-          return servicesBuilder_.getCount();
-        }
+      public boolean hasServiceIds() {
+        return serviceIdsBuilder_ != null || serviceIds_ != null;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
+       * @return The serviceIds.
        */
-      public context.ContextOuterClass.Service getServices(int index) {
-        if (servicesBuilder_ == null) {
-          return services_.get(index);
+      public context.ContextOuterClass.ServiceIdList getServiceIds() {
+        if (serviceIdsBuilder_ == null) {
+          return serviceIds_ == null ? context.ContextOuterClass.ServiceIdList.getDefaultInstance() : serviceIds_;
         } else {
-          return servicesBuilder_.getMessage(index);
+          return serviceIdsBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder setServices(
-          int index, context.ContextOuterClass.Service value) {
-        if (servicesBuilder_ == null) {
+      public Builder setServiceIds(context.ContextOuterClass.ServiceIdList value) {
+        if (serviceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureServicesIsMutable();
-          services_.set(index, value);
+          serviceIds_ = value;
           onChanged();
         } else {
-          servicesBuilder_.setMessage(index, value);
+          serviceIdsBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder setServices(
-          int index, context.ContextOuterClass.Service.Builder builderForValue) {
-        if (servicesBuilder_ == null) {
-          ensureServicesIsMutable();
-          services_.set(index, builderForValue.build());
+      public Builder setServiceIds(
+          context.ContextOuterClass.ServiceIdList.Builder builderForValue) {
+        if (serviceIdsBuilder_ == null) {
+          serviceIds_ = builderForValue.build();
           onChanged();
         } else {
-          servicesBuilder_.setMessage(index, builderForValue.build());
+          serviceIdsBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder addServices(context.ContextOuterClass.Service value) {
-        if (servicesBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeServiceIds(context.ContextOuterClass.ServiceIdList value) {
+        if (serviceIdsBuilder_ == null) {
+          if (serviceIds_ != null) {
+            serviceIds_ =
+              context.ContextOuterClass.ServiceIdList.newBuilder(serviceIds_).mergeFrom(value).buildPartial();
+          } else {
+            serviceIds_ = value;
           }
-          ensureServicesIsMutable();
-          services_.add(value);
           onChanged();
         } else {
-          servicesBuilder_.addMessage(value);
+          serviceIdsBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder addServices(
-          int index, context.ContextOuterClass.Service value) {
-        if (servicesBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureServicesIsMutable();
-          services_.add(index, value);
+      public Builder clearServiceIds() {
+        if (serviceIdsBuilder_ == null) {
+          serviceIds_ = null;
           onChanged();
         } else {
-          servicesBuilder_.addMessage(index, value);
+          serviceIds_ = null;
+          serviceIdsBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder addServices(
-          context.ContextOuterClass.Service.Builder builderForValue) {
-        if (servicesBuilder_ == null) {
-          ensureServicesIsMutable();
-          services_.add(builderForValue.build());
-          onChanged();
-        } else {
-          servicesBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
+      public context.ContextOuterClass.ServiceIdList.Builder getServiceIdsBuilder() {
+        
+        onChanged();
+        return getServiceIdsFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder addServices(
-          int index, context.ContextOuterClass.Service.Builder builderForValue) {
-        if (servicesBuilder_ == null) {
-          ensureServicesIsMutable();
-          services_.add(index, builderForValue.build());
-          onChanged();
+      public context.ContextOuterClass.ServiceIdListOrBuilder getServiceIdsOrBuilder() {
+        if (serviceIdsBuilder_ != null) {
+          return serviceIdsBuilder_.getMessageOrBuilder();
         } else {
-          servicesBuilder_.addMessage(index, builderForValue.build());
+          return serviceIds_ == null ?
+              context.ContextOuterClass.ServiceIdList.getDefaultInstance() : serviceIds_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>.context.ServiceIdList service_ids = 1;</code>
        */
-      public Builder addAllServices(
-          java.lang.Iterable<? extends context.ContextOuterClass.Service> values) {
-        if (servicesBuilder_ == null) {
-          ensureServicesIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, services_);
-          onChanged();
-        } else {
-          servicesBuilder_.addAllMessages(values);
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceIdList, context.ContextOuterClass.ServiceIdList.Builder, context.ContextOuterClass.ServiceIdListOrBuilder> 
+          getServiceIdsFieldBuilder() {
+        if (serviceIdsBuilder_ == null) {
+          serviceIdsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ServiceIdList, context.ContextOuterClass.ServiceIdList.Builder, context.ContextOuterClass.ServiceIdListOrBuilder>(
+                  getServiceIds(),
+                  getParentForChildren(),
+                  isClean());
+          serviceIds_ = null;
         }
-        return this;
+        return serviceIdsBuilder_;
       }
+
+      private boolean includeEndpointIds_ ;
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_endpoint_ids = 2;</code>
+       * @return The includeEndpointIds.
        */
-      public Builder clearServices() {
-        if (servicesBuilder_ == null) {
-          services_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          servicesBuilder_.clear();
-        }
-        return this;
+      @java.lang.Override
+      public boolean getIncludeEndpointIds() {
+        return includeEndpointIds_;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_endpoint_ids = 2;</code>
+       * @param value The includeEndpointIds to set.
+       * @return This builder for chaining.
        */
-      public Builder removeServices(int index) {
-        if (servicesBuilder_ == null) {
-          ensureServicesIsMutable();
-          services_.remove(index);
-          onChanged();
-        } else {
-          servicesBuilder_.remove(index);
-        }
+      public Builder setIncludeEndpointIds(boolean value) {
+        
+        includeEndpointIds_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_endpoint_ids = 2;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Service.Builder getServicesBuilder(
-          int index) {
-        return getServicesFieldBuilder().getBuilder(index);
+      public Builder clearIncludeEndpointIds() {
+        
+        includeEndpointIds_ = false;
+        onChanged();
+        return this;
       }
+
+      private boolean includeConstraints_ ;
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_constraints = 3;</code>
+       * @return The includeConstraints.
        */
-      public context.ContextOuterClass.ServiceOrBuilder getServicesOrBuilder(
-          int index) {
-        if (servicesBuilder_ == null) {
-          return services_.get(index);  } else {
-          return servicesBuilder_.getMessageOrBuilder(index);
-        }
+      @java.lang.Override
+      public boolean getIncludeConstraints() {
+        return includeConstraints_;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_constraints = 3;</code>
+       * @param value The includeConstraints to set.
+       * @return This builder for chaining.
        */
-      public java.util.List<? extends context.ContextOuterClass.ServiceOrBuilder> 
-           getServicesOrBuilderList() {
-        if (servicesBuilder_ != null) {
-          return servicesBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(services_);
-        }
+      public Builder setIncludeConstraints(boolean value) {
+        
+        includeConstraints_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_constraints = 3;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Service.Builder addServicesBuilder() {
-        return getServicesFieldBuilder().addBuilder(
-            context.ContextOuterClass.Service.getDefaultInstance());
+      public Builder clearIncludeConstraints() {
+        
+        includeConstraints_ = false;
+        onChanged();
+        return this;
       }
+
+      private boolean includeConfigRules_ ;
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_config_rules = 4;</code>
+       * @return The includeConfigRules.
        */
-      public context.ContextOuterClass.Service.Builder addServicesBuilder(
-          int index) {
-        return getServicesFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.Service.getDefaultInstance());
+      @java.lang.Override
+      public boolean getIncludeConfigRules() {
+        return includeConfigRules_;
       }
       /**
-       * <code>repeated .context.Service services = 1;</code>
+       * <code>bool include_config_rules = 4;</code>
+       * @param value The includeConfigRules to set.
+       * @return This builder for chaining.
        */
-      public java.util.List<context.ContextOuterClass.Service.Builder> 
-           getServicesBuilderList() {
-        return getServicesFieldBuilder().getBuilderList();
+      public Builder setIncludeConfigRules(boolean value) {
+        
+        includeConfigRules_ = value;
+        onChanged();
+        return this;
       }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Service, context.ContextOuterClass.Service.Builder, context.ContextOuterClass.ServiceOrBuilder> 
-          getServicesFieldBuilder() {
-        if (servicesBuilder_ == null) {
-          servicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.Service, context.ContextOuterClass.Service.Builder, context.ContextOuterClass.ServiceOrBuilder>(
-                  services_,
-                  ((bitField0_ & 0x00000001) != 0),
-                  getParentForChildren(),
-                  isClean());
-          services_ = null;
-        }
-        return servicesBuilder_;
+      /**
+       * <code>bool include_config_rules = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearIncludeConfigRules() {
+        
+        includeConfigRules_ = false;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -31920,41 +33990,41 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ServiceList)
+      // @@protoc_insertion_point(builder_scope:context.ServiceFilter)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ServiceList)
-    private static final context.ContextOuterClass.ServiceList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ServiceFilter)
+    private static final context.ContextOuterClass.ServiceFilter DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ServiceFilter();
     }
 
-    public static context.ContextOuterClass.ServiceList getDefaultInstance() {
+    public static context.ContextOuterClass.ServiceFilter getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ServiceList>
-        PARSER = new com.google.protobuf.AbstractParser<ServiceList>() {
+    private static final com.google.protobuf.Parser<ServiceFilter>
+        PARSER = new com.google.protobuf.AbstractParser<ServiceFilter>() {
       @java.lang.Override
-      public ServiceList parsePartialFrom(
+      public ServiceFilter parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ServiceList(input, extensionRegistry);
+        return new ServiceFilter(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ServiceList> parser() {
+    public static com.google.protobuf.Parser<ServiceFilter> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ServiceList> getParserForType() {
+    public com.google.protobuf.Parser<ServiceFilter> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ServiceList getDefaultInstanceForType() {
+    public context.ContextOuterClass.ServiceFilter getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -34273,2369 +36343,3665 @@ public final class ContextOuterClass {
     public context.ContextOuterClass.SliceConfig getSliceConfig() {
       return sliceConfig_ == null ? context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
     }
-    /**
-     * <code>.context.SliceConfig slice_config = 8;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.SliceConfigOrBuilder getSliceConfigOrBuilder() {
-      return getSliceConfig();
+    /**
+     * <code>.context.SliceConfig slice_config = 8;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.SliceConfigOrBuilder getSliceConfigOrBuilder() {
+      return getSliceConfig();
+    }
+
+    public static final int SLICE_OWNER_FIELD_NUMBER = 9;
+    private context.ContextOuterClass.SliceOwner sliceOwner_;
+    /**
+     * <code>.context.SliceOwner slice_owner = 9;</code>
+     * @return Whether the sliceOwner field is set.
+     */
+    @java.lang.Override
+    public boolean hasSliceOwner() {
+      return sliceOwner_ != null;
+    }
+    /**
+     * <code>.context.SliceOwner slice_owner = 9;</code>
+     * @return The sliceOwner.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.SliceOwner getSliceOwner() {
+      return sliceOwner_ == null ? context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
+    }
+    /**
+     * <code>.context.SliceOwner slice_owner = 9;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.SliceOwnerOrBuilder getSliceOwnerOrBuilder() {
+      return getSliceOwner();
+    }
+
+    public static final int TIMESTAMP_FIELD_NUMBER = 10;
+    private context.ContextOuterClass.Timestamp timestamp_;
+    /**
+     * <code>.context.Timestamp timestamp = 10;</code>
+     * @return Whether the timestamp field is set.
+     */
+    @java.lang.Override
+    public boolean hasTimestamp() {
+      return timestamp_ != null;
+    }
+    /**
+     * <code>.context.Timestamp timestamp = 10;</code>
+     * @return The timestamp.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Timestamp getTimestamp() {
+      return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+    }
+    /**
+     * <code>.context.Timestamp timestamp = 10;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
+      return getTimestamp();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (sliceId_ != null) {
+        output.writeMessage(1, getSliceId());
+      }
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+      }
+      for (int i = 0; i < sliceEndpointIds_.size(); i++) {
+        output.writeMessage(3, sliceEndpointIds_.get(i));
+      }
+      for (int i = 0; i < sliceConstraints_.size(); i++) {
+        output.writeMessage(4, sliceConstraints_.get(i));
+      }
+      for (int i = 0; i < sliceServiceIds_.size(); i++) {
+        output.writeMessage(5, sliceServiceIds_.get(i));
+      }
+      for (int i = 0; i < sliceSubsliceIds_.size(); i++) {
+        output.writeMessage(6, sliceSubsliceIds_.get(i));
+      }
+      if (sliceStatus_ != null) {
+        output.writeMessage(7, getSliceStatus());
+      }
+      if (sliceConfig_ != null) {
+        output.writeMessage(8, getSliceConfig());
+      }
+      if (sliceOwner_ != null) {
+        output.writeMessage(9, getSliceOwner());
+      }
+      if (timestamp_ != null) {
+        output.writeMessage(10, getTimestamp());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (sliceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getSliceId());
+      }
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+      }
+      for (int i = 0; i < sliceEndpointIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, sliceEndpointIds_.get(i));
+      }
+      for (int i = 0; i < sliceConstraints_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, sliceConstraints_.get(i));
+      }
+      for (int i = 0; i < sliceServiceIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, sliceServiceIds_.get(i));
+      }
+      for (int i = 0; i < sliceSubsliceIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(6, sliceSubsliceIds_.get(i));
+      }
+      if (sliceStatus_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(7, getSliceStatus());
+      }
+      if (sliceConfig_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(8, getSliceConfig());
+      }
+      if (sliceOwner_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(9, getSliceOwner());
+      }
+      if (timestamp_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(10, getTimestamp());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof context.ContextOuterClass.Slice)) {
+        return super.equals(obj);
+      }
+      context.ContextOuterClass.Slice other = (context.ContextOuterClass.Slice) obj;
+
+      if (hasSliceId() != other.hasSliceId()) return false;
+      if (hasSliceId()) {
+        if (!getSliceId()
+            .equals(other.getSliceId())) return false;
+      }
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (!getSliceEndpointIdsList()
+          .equals(other.getSliceEndpointIdsList())) return false;
+      if (!getSliceConstraintsList()
+          .equals(other.getSliceConstraintsList())) return false;
+      if (!getSliceServiceIdsList()
+          .equals(other.getSliceServiceIdsList())) return false;
+      if (!getSliceSubsliceIdsList()
+          .equals(other.getSliceSubsliceIdsList())) return false;
+      if (hasSliceStatus() != other.hasSliceStatus()) return false;
+      if (hasSliceStatus()) {
+        if (!getSliceStatus()
+            .equals(other.getSliceStatus())) return false;
+      }
+      if (hasSliceConfig() != other.hasSliceConfig()) return false;
+      if (hasSliceConfig()) {
+        if (!getSliceConfig()
+            .equals(other.getSliceConfig())) return false;
+      }
+      if (hasSliceOwner() != other.hasSliceOwner()) return false;
+      if (hasSliceOwner()) {
+        if (!getSliceOwner()
+            .equals(other.getSliceOwner())) return false;
+      }
+      if (hasTimestamp() != other.hasTimestamp()) return false;
+      if (hasTimestamp()) {
+        if (!getTimestamp()
+            .equals(other.getTimestamp())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasSliceId()) {
+        hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceId().hashCode();
+      }
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      if (getSliceEndpointIdsCount() > 0) {
+        hash = (37 * hash) + SLICE_ENDPOINT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceEndpointIdsList().hashCode();
+      }
+      if (getSliceConstraintsCount() > 0) {
+        hash = (37 * hash) + SLICE_CONSTRAINTS_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceConstraintsList().hashCode();
+      }
+      if (getSliceServiceIdsCount() > 0) {
+        hash = (37 * hash) + SLICE_SERVICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceServiceIdsList().hashCode();
+      }
+      if (getSliceSubsliceIdsCount() > 0) {
+        hash = (37 * hash) + SLICE_SUBSLICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceSubsliceIdsList().hashCode();
+      }
+      if (hasSliceStatus()) {
+        hash = (37 * hash) + SLICE_STATUS_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceStatus().hashCode();
+      }
+      if (hasSliceConfig()) {
+        hash = (37 * hash) + SLICE_CONFIG_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceConfig().hashCode();
+      }
+      if (hasSliceOwner()) {
+        hash = (37 * hash) + SLICE_OWNER_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceOwner().hashCode();
+      }
+      if (hasTimestamp()) {
+        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
+        hash = (53 * hash) + getTimestamp().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static context.ContextOuterClass.Slice parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Slice parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.Slice parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.Slice parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static final int SLICE_OWNER_FIELD_NUMBER = 9;
-    private context.ContextOuterClass.SliceOwner sliceOwner_;
-    /**
-     * <code>.context.SliceOwner slice_owner = 9;</code>
-     * @return Whether the sliceOwner field is set.
-     */
     @java.lang.Override
-    public boolean hasSliceOwner() {
-      return sliceOwner_ != null;
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
     }
-    /**
-     * <code>.context.SliceOwner slice_owner = 9;</code>
-     * @return The sliceOwner.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.SliceOwner getSliceOwner() {
-      return sliceOwner_ == null ? context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
+    public static Builder newBuilder(context.ContextOuterClass.Slice prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
-    /**
-     * <code>.context.SliceOwner slice_owner = 9;</code>
-     */
     @java.lang.Override
-    public context.ContextOuterClass.SliceOwnerOrBuilder getSliceOwnerOrBuilder() {
-      return getSliceOwner();
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
 
-    public static final int TIMESTAMP_FIELD_NUMBER = 10;
-    private context.ContextOuterClass.Timestamp timestamp_;
-    /**
-     * <code>.context.Timestamp timestamp = 10;</code>
-     * @return Whether the timestamp field is set.
-     */
-    @java.lang.Override
-    public boolean hasTimestamp() {
-      return timestamp_ != null;
-    }
-    /**
-     * <code>.context.Timestamp timestamp = 10;</code>
-     * @return The timestamp.
-     */
     @java.lang.Override
-    public context.ContextOuterClass.Timestamp getTimestamp() {
-      return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
     }
     /**
-     * <code>.context.Timestamp timestamp = 10;</code>
+     * Protobuf type {@code context.Slice}
      */
-    @java.lang.Override
-    public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-      return getTimestamp();
-    }
-
-    private byte memoizedIsInitialized = -1;
-    @java.lang.Override
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    @java.lang.Override
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (sliceId_ != null) {
-        output.writeMessage(1, getSliceId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.Slice)
+        context.ContextOuterClass.SliceOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return context.ContextOuterClass.internal_static_context_Slice_descriptor;
       }
-      for (int i = 0; i < sliceEndpointIds_.size(); i++) {
-        output.writeMessage(3, sliceEndpointIds_.get(i));
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return context.ContextOuterClass.internal_static_context_Slice_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                context.ContextOuterClass.Slice.class, context.ContextOuterClass.Slice.Builder.class);
       }
-      for (int i = 0; i < sliceConstraints_.size(); i++) {
-        output.writeMessage(4, sliceConstraints_.get(i));
+
+      // Construct using context.ContextOuterClass.Slice.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
       }
-      for (int i = 0; i < sliceServiceIds_.size(); i++) {
-        output.writeMessage(5, sliceServiceIds_.get(i));
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      for (int i = 0; i < sliceSubsliceIds_.size(); i++) {
-        output.writeMessage(6, sliceSubsliceIds_.get(i));
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getSliceEndpointIdsFieldBuilder();
+          getSliceConstraintsFieldBuilder();
+          getSliceServiceIdsFieldBuilder();
+          getSliceSubsliceIdsFieldBuilder();
+        }
       }
-      if (sliceStatus_ != null) {
-        output.writeMessage(7, getSliceStatus());
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (sliceIdBuilder_ == null) {
+          sliceId_ = null;
+        } else {
+          sliceId_ = null;
+          sliceIdBuilder_ = null;
+        }
+        name_ = "";
+
+        if (sliceEndpointIdsBuilder_ == null) {
+          sliceEndpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          sliceEndpointIdsBuilder_.clear();
+        }
+        if (sliceConstraintsBuilder_ == null) {
+          sliceConstraints_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          sliceConstraintsBuilder_.clear();
+        }
+        if (sliceServiceIdsBuilder_ == null) {
+          sliceServiceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          sliceServiceIdsBuilder_.clear();
+        }
+        if (sliceSubsliceIdsBuilder_ == null) {
+          sliceSubsliceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
+        } else {
+          sliceSubsliceIdsBuilder_.clear();
+        }
+        if (sliceStatusBuilder_ == null) {
+          sliceStatus_ = null;
+        } else {
+          sliceStatus_ = null;
+          sliceStatusBuilder_ = null;
+        }
+        if (sliceConfigBuilder_ == null) {
+          sliceConfig_ = null;
+        } else {
+          sliceConfig_ = null;
+          sliceConfigBuilder_ = null;
+        }
+        if (sliceOwnerBuilder_ == null) {
+          sliceOwner_ = null;
+        } else {
+          sliceOwner_ = null;
+          sliceOwnerBuilder_ = null;
+        }
+        if (timestampBuilder_ == null) {
+          timestamp_ = null;
+        } else {
+          timestamp_ = null;
+          timestampBuilder_ = null;
+        }
+        return this;
       }
-      if (sliceConfig_ != null) {
-        output.writeMessage(8, getSliceConfig());
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return context.ContextOuterClass.internal_static_context_Slice_descriptor;
       }
-      if (sliceOwner_ != null) {
-        output.writeMessage(9, getSliceOwner());
+
+      @java.lang.Override
+      public context.ContextOuterClass.Slice getDefaultInstanceForType() {
+        return context.ContextOuterClass.Slice.getDefaultInstance();
       }
-      if (timestamp_ != null) {
-        output.writeMessage(10, getTimestamp());
+
+      @java.lang.Override
+      public context.ContextOuterClass.Slice build() {
+        context.ContextOuterClass.Slice result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
       }
-      unknownFields.writeTo(output);
-    }
 
-    @java.lang.Override
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
+      @java.lang.Override
+      public context.ContextOuterClass.Slice buildPartial() {
+        context.ContextOuterClass.Slice result = new context.ContextOuterClass.Slice(this);
+        int from_bitField0_ = bitField0_;
+        if (sliceIdBuilder_ == null) {
+          result.sliceId_ = sliceId_;
+        } else {
+          result.sliceId_ = sliceIdBuilder_.build();
+        }
+        result.name_ = name_;
+        if (sliceEndpointIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            sliceEndpointIds_ = java.util.Collections.unmodifiableList(sliceEndpointIds_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.sliceEndpointIds_ = sliceEndpointIds_;
+        } else {
+          result.sliceEndpointIds_ = sliceEndpointIdsBuilder_.build();
+        }
+        if (sliceConstraintsBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0)) {
+            sliceConstraints_ = java.util.Collections.unmodifiableList(sliceConstraints_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.sliceConstraints_ = sliceConstraints_;
+        } else {
+          result.sliceConstraints_ = sliceConstraintsBuilder_.build();
+        }
+        if (sliceServiceIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0)) {
+            sliceServiceIds_ = java.util.Collections.unmodifiableList(sliceServiceIds_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.sliceServiceIds_ = sliceServiceIds_;
+        } else {
+          result.sliceServiceIds_ = sliceServiceIdsBuilder_.build();
+        }
+        if (sliceSubsliceIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000008) != 0)) {
+            sliceSubsliceIds_ = java.util.Collections.unmodifiableList(sliceSubsliceIds_);
+            bitField0_ = (bitField0_ & ~0x00000008);
+          }
+          result.sliceSubsliceIds_ = sliceSubsliceIds_;
+        } else {
+          result.sliceSubsliceIds_ = sliceSubsliceIdsBuilder_.build();
+        }
+        if (sliceStatusBuilder_ == null) {
+          result.sliceStatus_ = sliceStatus_;
+        } else {
+          result.sliceStatus_ = sliceStatusBuilder_.build();
+        }
+        if (sliceConfigBuilder_ == null) {
+          result.sliceConfig_ = sliceConfig_;
+        } else {
+          result.sliceConfig_ = sliceConfigBuilder_.build();
+        }
+        if (sliceOwnerBuilder_ == null) {
+          result.sliceOwner_ = sliceOwner_;
+        } else {
+          result.sliceOwner_ = sliceOwnerBuilder_.build();
+        }
+        if (timestampBuilder_ == null) {
+          result.timestamp_ = timestamp_;
+        } else {
+          result.timestamp_ = timestampBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
 
-      size = 0;
-      if (sliceId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getSliceId());
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      if (!getNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
       }
-      for (int i = 0; i < sliceEndpointIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, sliceEndpointIds_.get(i));
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
       }
-      for (int i = 0; i < sliceConstraints_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, sliceConstraints_.get(i));
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
       }
-      for (int i = 0; i < sliceServiceIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, sliceServiceIds_.get(i));
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
       }
-      for (int i = 0; i < sliceSubsliceIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(6, sliceSubsliceIds_.get(i));
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
       }
-      if (sliceStatus_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, getSliceStatus());
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.Slice) {
+          return mergeFrom((context.ContextOuterClass.Slice)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
       }
-      if (sliceConfig_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(8, getSliceConfig());
+
+      public Builder mergeFrom(context.ContextOuterClass.Slice other) {
+        if (other == context.ContextOuterClass.Slice.getDefaultInstance()) return this;
+        if (other.hasSliceId()) {
+          mergeSliceId(other.getSliceId());
+        }
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (sliceEndpointIdsBuilder_ == null) {
+          if (!other.sliceEndpointIds_.isEmpty()) {
+            if (sliceEndpointIds_.isEmpty()) {
+              sliceEndpointIds_ = other.sliceEndpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureSliceEndpointIdsIsMutable();
+              sliceEndpointIds_.addAll(other.sliceEndpointIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.sliceEndpointIds_.isEmpty()) {
+            if (sliceEndpointIdsBuilder_.isEmpty()) {
+              sliceEndpointIdsBuilder_.dispose();
+              sliceEndpointIdsBuilder_ = null;
+              sliceEndpointIds_ = other.sliceEndpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              sliceEndpointIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSliceEndpointIdsFieldBuilder() : null;
+            } else {
+              sliceEndpointIdsBuilder_.addAllMessages(other.sliceEndpointIds_);
+            }
+          }
+        }
+        if (sliceConstraintsBuilder_ == null) {
+          if (!other.sliceConstraints_.isEmpty()) {
+            if (sliceConstraints_.isEmpty()) {
+              sliceConstraints_ = other.sliceConstraints_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureSliceConstraintsIsMutable();
+              sliceConstraints_.addAll(other.sliceConstraints_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.sliceConstraints_.isEmpty()) {
+            if (sliceConstraintsBuilder_.isEmpty()) {
+              sliceConstraintsBuilder_.dispose();
+              sliceConstraintsBuilder_ = null;
+              sliceConstraints_ = other.sliceConstraints_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              sliceConstraintsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSliceConstraintsFieldBuilder() : null;
+            } else {
+              sliceConstraintsBuilder_.addAllMessages(other.sliceConstraints_);
+            }
+          }
+        }
+        if (sliceServiceIdsBuilder_ == null) {
+          if (!other.sliceServiceIds_.isEmpty()) {
+            if (sliceServiceIds_.isEmpty()) {
+              sliceServiceIds_ = other.sliceServiceIds_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureSliceServiceIdsIsMutable();
+              sliceServiceIds_.addAll(other.sliceServiceIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.sliceServiceIds_.isEmpty()) {
+            if (sliceServiceIdsBuilder_.isEmpty()) {
+              sliceServiceIdsBuilder_.dispose();
+              sliceServiceIdsBuilder_ = null;
+              sliceServiceIds_ = other.sliceServiceIds_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              sliceServiceIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSliceServiceIdsFieldBuilder() : null;
+            } else {
+              sliceServiceIdsBuilder_.addAllMessages(other.sliceServiceIds_);
+            }
+          }
+        }
+        if (sliceSubsliceIdsBuilder_ == null) {
+          if (!other.sliceSubsliceIds_.isEmpty()) {
+            if (sliceSubsliceIds_.isEmpty()) {
+              sliceSubsliceIds_ = other.sliceSubsliceIds_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+            } else {
+              ensureSliceSubsliceIdsIsMutable();
+              sliceSubsliceIds_.addAll(other.sliceSubsliceIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.sliceSubsliceIds_.isEmpty()) {
+            if (sliceSubsliceIdsBuilder_.isEmpty()) {
+              sliceSubsliceIdsBuilder_.dispose();
+              sliceSubsliceIdsBuilder_ = null;
+              sliceSubsliceIds_ = other.sliceSubsliceIds_;
+              bitField0_ = (bitField0_ & ~0x00000008);
+              sliceSubsliceIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSliceSubsliceIdsFieldBuilder() : null;
+            } else {
+              sliceSubsliceIdsBuilder_.addAllMessages(other.sliceSubsliceIds_);
+            }
+          }
+        }
+        if (other.hasSliceStatus()) {
+          mergeSliceStatus(other.getSliceStatus());
+        }
+        if (other.hasSliceConfig()) {
+          mergeSliceConfig(other.getSliceConfig());
+        }
+        if (other.hasSliceOwner()) {
+          mergeSliceOwner(other.getSliceOwner());
+        }
+        if (other.hasTimestamp()) {
+          mergeTimestamp(other.getTimestamp());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
       }
-      if (sliceOwner_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(9, getSliceOwner());
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
-      if (timestamp_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(10, getTimestamp());
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.Slice parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.Slice) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private context.ContextOuterClass.SliceId sliceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdBuilder_;
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       * @return Whether the sliceId field is set.
+       */
+      public boolean hasSliceId() {
+        return sliceIdBuilder_ != null || sliceId_ != null;
       }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       * @return The sliceId.
+       */
+      public context.ContextOuterClass.SliceId getSliceId() {
+        if (sliceIdBuilder_ == null) {
+          return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+        } else {
+          return sliceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      public Builder setSliceId(context.ContextOuterClass.SliceId value) {
+        if (sliceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          sliceId_ = value;
+          onChanged();
+        } else {
+          sliceIdBuilder_.setMessage(value);
+        }
 
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
+        return this;
       }
-      if (!(obj instanceof context.ContextOuterClass.Slice)) {
-        return super.equals(obj);
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      public Builder setSliceId(
+          context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceIdBuilder_ == null) {
+          sliceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          sliceIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
       }
-      context.ContextOuterClass.Slice other = (context.ContextOuterClass.Slice) obj;
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
+        if (sliceIdBuilder_ == null) {
+          if (sliceId_ != null) {
+            sliceId_ =
+              context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
+          } else {
+            sliceId_ = value;
+          }
+          onChanged();
+        } else {
+          sliceIdBuilder_.mergeFrom(value);
+        }
 
-      if (hasSliceId() != other.hasSliceId()) return false;
-      if (hasSliceId()) {
-        if (!getSliceId()
-            .equals(other.getSliceId())) return false;
+        return this;
       }
-      if (!getName()
-          .equals(other.getName())) return false;
-      if (!getSliceEndpointIdsList()
-          .equals(other.getSliceEndpointIdsList())) return false;
-      if (!getSliceConstraintsList()
-          .equals(other.getSliceConstraintsList())) return false;
-      if (!getSliceServiceIdsList()
-          .equals(other.getSliceServiceIdsList())) return false;
-      if (!getSliceSubsliceIdsList()
-          .equals(other.getSliceSubsliceIdsList())) return false;
-      if (hasSliceStatus() != other.hasSliceStatus()) return false;
-      if (hasSliceStatus()) {
-        if (!getSliceStatus()
-            .equals(other.getSliceStatus())) return false;
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      public Builder clearSliceId() {
+        if (sliceIdBuilder_ == null) {
+          sliceId_ = null;
+          onChanged();
+        } else {
+          sliceId_ = null;
+          sliceIdBuilder_ = null;
+        }
+
+        return this;
       }
-      if (hasSliceConfig() != other.hasSliceConfig()) return false;
-      if (hasSliceConfig()) {
-        if (!getSliceConfig()
-            .equals(other.getSliceConfig())) return false;
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
+        
+        onChanged();
+        return getSliceIdFieldBuilder().getBuilder();
       }
-      if (hasSliceOwner() != other.hasSliceOwner()) return false;
-      if (hasSliceOwner()) {
-        if (!getSliceOwner()
-            .equals(other.getSliceOwner())) return false;
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
+        if (sliceIdBuilder_ != null) {
+          return sliceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return sliceId_ == null ?
+              context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+        }
       }
-      if (hasTimestamp() != other.hasTimestamp()) return false;
-      if (hasTimestamp()) {
-        if (!getTimestamp()
-            .equals(other.getTimestamp())) return false;
+      /**
+       * <code>.context.SliceId slice_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
+          getSliceIdFieldBuilder() {
+        if (sliceIdBuilder_ == null) {
+          sliceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
+                  getSliceId(),
+                  getParentForChildren(),
+                  isClean());
+          sliceId_ = null;
+        }
+        return sliceIdBuilder_;
       }
-      if (!unknownFields.equals(other.unknownFields)) return false;
-      return true;
-    }
 
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
+      private java.lang.Object name_ = "";
+      /**
+       * <code>string name = 2;</code>
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
       }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasSliceId()) {
-        hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceId().hashCode();
+      /**
+       * <code>string name = 2;</code>
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
       }
-      hash = (37 * hash) + NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getName().hashCode();
-      if (getSliceEndpointIdsCount() > 0) {
-        hash = (37 * hash) + SLICE_ENDPOINT_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceEndpointIdsList().hashCode();
+      /**
+       * <code>string name = 2;</code>
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
       }
-      if (getSliceConstraintsCount() > 0) {
-        hash = (37 * hash) + SLICE_CONSTRAINTS_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceConstraintsList().hashCode();
+      /**
+       * <code>string name = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
       }
-      if (getSliceServiceIdsCount() > 0) {
-        hash = (37 * hash) + SLICE_SERVICE_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceServiceIdsList().hashCode();
+      /**
+       * <code>string name = 2;</code>
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
       }
-      if (getSliceSubsliceIdsCount() > 0) {
-        hash = (37 * hash) + SLICE_SUBSLICE_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceSubsliceIdsList().hashCode();
+
+      private java.util.List<context.ContextOuterClass.EndPointId> sliceEndpointIds_ =
+        java.util.Collections.emptyList();
+      private void ensureSliceEndpointIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          sliceEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(sliceEndpointIds_);
+          bitField0_ |= 0x00000001;
+         }
       }
-      if (hasSliceStatus()) {
-        hash = (37 * hash) + SLICE_STATUS_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceStatus().hashCode();
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> sliceEndpointIdsBuilder_;
+
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId> getSliceEndpointIdsList() {
+        if (sliceEndpointIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(sliceEndpointIds_);
+        } else {
+          return sliceEndpointIdsBuilder_.getMessageList();
+        }
       }
-      if (hasSliceConfig()) {
-        hash = (37 * hash) + SLICE_CONFIG_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceConfig().hashCode();
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public int getSliceEndpointIdsCount() {
+        if (sliceEndpointIdsBuilder_ == null) {
+          return sliceEndpointIds_.size();
+        } else {
+          return sliceEndpointIdsBuilder_.getCount();
+        }
       }
-      if (hasSliceOwner()) {
-        hash = (37 * hash) + SLICE_OWNER_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceOwner().hashCode();
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId getSliceEndpointIds(int index) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          return sliceEndpointIds_.get(index);
+        } else {
+          return sliceEndpointIdsBuilder_.getMessage(index);
+        }
       }
-      if (hasTimestamp()) {
-        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + getTimestamp().hashCode();
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder setSliceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.set(index, value);
+          onChanged();
+        } else {
+          sliceEndpointIdsBuilder_.setMessage(index, value);
+        }
+        return this;
       }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
-
-    public static context.ContextOuterClass.Slice parseFrom(
-        java.nio.ByteBuffer data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        java.nio.ByteBuffer data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Slice parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static context.ContextOuterClass.Slice parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static context.ContextOuterClass.Slice parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-
-    @java.lang.Override
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(context.ContextOuterClass.Slice prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    @java.lang.Override
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
-
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code context.Slice}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Slice)
-        context.ContextOuterClass.SliceOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Slice_descriptor;
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder setSliceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          sliceEndpointIdsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
       }
-
-      @java.lang.Override
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Slice_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Slice.class, context.ContextOuterClass.Slice.Builder.class);
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder addSliceEndpointIds(context.ContextOuterClass.EndPointId value) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.add(value);
+          onChanged();
+        } else {
+          sliceEndpointIdsBuilder_.addMessage(value);
+        }
+        return this;
       }
-
-      // Construct using context.ContextOuterClass.Slice.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder addSliceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.add(index, value);
+          onChanged();
+        } else {
+          sliceEndpointIdsBuilder_.addMessage(index, value);
+        }
+        return this;
       }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder addSliceEndpointIds(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          sliceEndpointIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
-          getSliceEndpointIdsFieldBuilder();
-          getSliceConstraintsFieldBuilder();
-          getSliceServiceIdsFieldBuilder();
-          getSliceSubsliceIdsFieldBuilder();
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder addSliceEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          sliceEndpointIdsBuilder_.addMessage(index, builderForValue.build());
         }
+        return this;
       }
-      @java.lang.Override
-      public Builder clear() {
-        super.clear();
-        if (sliceIdBuilder_ == null) {
-          sliceId_ = null;
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder addAllSliceEndpointIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          ensureSliceEndpointIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, sliceEndpointIds_);
+          onChanged();
         } else {
-          sliceId_ = null;
-          sliceIdBuilder_ = null;
+          sliceEndpointIdsBuilder_.addAllMessages(values);
         }
-        name_ = "";
-
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder clearSliceEndpointIds() {
         if (sliceEndpointIdsBuilder_ == null) {
           sliceEndpointIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
         } else {
           sliceEndpointIdsBuilder_.clear();
         }
-        if (sliceConstraintsBuilder_ == null) {
-          sliceConstraints_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-        } else {
-          sliceConstraintsBuilder_.clear();
-        }
-        if (sliceServiceIdsBuilder_ == null) {
-          sliceServiceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000004);
-        } else {
-          sliceServiceIdsBuilder_.clear();
-        }
-        if (sliceSubsliceIdsBuilder_ == null) {
-          sliceSubsliceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000008);
-        } else {
-          sliceSubsliceIdsBuilder_.clear();
-        }
-        if (sliceStatusBuilder_ == null) {
-          sliceStatus_ = null;
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public Builder removeSliceEndpointIds(int index) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          ensureSliceEndpointIdsIsMutable();
+          sliceEndpointIds_.remove(index);
+          onChanged();
         } else {
-          sliceStatus_ = null;
-          sliceStatusBuilder_ = null;
+          sliceEndpointIdsBuilder_.remove(index);
         }
-        if (sliceConfigBuilder_ == null) {
-          sliceConfig_ = null;
-        } else {
-          sliceConfig_ = null;
-          sliceConfigBuilder_ = null;
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder getSliceEndpointIdsBuilder(
+          int index) {
+        return getSliceEndpointIdsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointIdOrBuilder getSliceEndpointIdsOrBuilder(
+          int index) {
+        if (sliceEndpointIdsBuilder_ == null) {
+          return sliceEndpointIds_.get(index);  } else {
+          return sliceEndpointIdsBuilder_.getMessageOrBuilder(index);
         }
-        if (sliceOwnerBuilder_ == null) {
-          sliceOwner_ = null;
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+           getSliceEndpointIdsOrBuilderList() {
+        if (sliceEndpointIdsBuilder_ != null) {
+          return sliceEndpointIdsBuilder_.getMessageOrBuilderList();
         } else {
-          sliceOwner_ = null;
-          sliceOwnerBuilder_ = null;
+          return java.util.Collections.unmodifiableList(sliceEndpointIds_);
         }
-        if (timestampBuilder_ == null) {
-          timestamp_ = null;
-        } else {
-          timestamp_ = null;
-          timestampBuilder_ = null;
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addSliceEndpointIdsBuilder() {
+        return getSliceEndpointIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addSliceEndpointIdsBuilder(
+          int index) {
+        return getSliceEndpointIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
+           getSliceEndpointIdsBuilderList() {
+        return getSliceEndpointIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getSliceEndpointIdsFieldBuilder() {
+        if (sliceEndpointIdsBuilder_ == null) {
+          sliceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  sliceEndpointIds_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          sliceEndpointIds_ = null;
         }
-        return this;
+        return sliceEndpointIdsBuilder_;
       }
 
-      @java.lang.Override
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Slice_descriptor;
+      private java.util.List<context.ContextOuterClass.Constraint> sliceConstraints_ =
+        java.util.Collections.emptyList();
+      private void ensureSliceConstraintsIsMutable() {
+        if (!((bitField0_ & 0x00000002) != 0)) {
+          sliceConstraints_ = new java.util.ArrayList<context.ContextOuterClass.Constraint>(sliceConstraints_);
+          bitField0_ |= 0x00000002;
+         }
       }
 
-      @java.lang.Override
-      public context.ContextOuterClass.Slice getDefaultInstanceForType() {
-        return context.ContextOuterClass.Slice.getDefaultInstance();
-      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder> sliceConstraintsBuilder_;
 
-      @java.lang.Override
-      public context.ContextOuterClass.Slice build() {
-        context.ContextOuterClass.Slice result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public java.util.List<context.ContextOuterClass.Constraint> getSliceConstraintsList() {
+        if (sliceConstraintsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(sliceConstraints_);
+        } else {
+          return sliceConstraintsBuilder_.getMessageList();
         }
-        return result;
       }
-
-      @java.lang.Override
-      public context.ContextOuterClass.Slice buildPartial() {
-        context.ContextOuterClass.Slice result = new context.ContextOuterClass.Slice(this);
-        int from_bitField0_ = bitField0_;
-        if (sliceIdBuilder_ == null) {
-          result.sliceId_ = sliceId_;
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public int getSliceConstraintsCount() {
+        if (sliceConstraintsBuilder_ == null) {
+          return sliceConstraints_.size();
         } else {
-          result.sliceId_ = sliceIdBuilder_.build();
+          return sliceConstraintsBuilder_.getCount();
         }
-        result.name_ = name_;
-        if (sliceEndpointIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            sliceEndpointIds_ = java.util.Collections.unmodifiableList(sliceEndpointIds_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.sliceEndpointIds_ = sliceEndpointIds_;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public context.ContextOuterClass.Constraint getSliceConstraints(int index) {
+        if (sliceConstraintsBuilder_ == null) {
+          return sliceConstraints_.get(index);
         } else {
-          result.sliceEndpointIds_ = sliceEndpointIdsBuilder_.build();
+          return sliceConstraintsBuilder_.getMessage(index);
         }
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder setSliceConstraints(
+          int index, context.ContextOuterClass.Constraint value) {
         if (sliceConstraintsBuilder_ == null) {
-          if (((bitField0_ & 0x00000002) != 0)) {
-            sliceConstraints_ = java.util.Collections.unmodifiableList(sliceConstraints_);
-            bitField0_ = (bitField0_ & ~0x00000002);
+          if (value == null) {
+            throw new NullPointerException();
           }
-          result.sliceConstraints_ = sliceConstraints_;
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.set(index, value);
+          onChanged();
         } else {
-          result.sliceConstraints_ = sliceConstraintsBuilder_.build();
+          sliceConstraintsBuilder_.setMessage(index, value);
         }
-        if (sliceServiceIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000004) != 0)) {
-            sliceServiceIds_ = java.util.Collections.unmodifiableList(sliceServiceIds_);
-            bitField0_ = (bitField0_ & ~0x00000004);
-          }
-          result.sliceServiceIds_ = sliceServiceIds_;
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder setSliceConstraints(
+          int index, context.ContextOuterClass.Constraint.Builder builderForValue) {
+        if (sliceConstraintsBuilder_ == null) {
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.set(index, builderForValue.build());
+          onChanged();
         } else {
-          result.sliceServiceIds_ = sliceServiceIdsBuilder_.build();
+          sliceConstraintsBuilder_.setMessage(index, builderForValue.build());
         }
-        if (sliceSubsliceIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000008) != 0)) {
-            sliceSubsliceIds_ = java.util.Collections.unmodifiableList(sliceSubsliceIds_);
-            bitField0_ = (bitField0_ & ~0x00000008);
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder addSliceConstraints(context.ContextOuterClass.Constraint value) {
+        if (sliceConstraintsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
-          result.sliceSubsliceIds_ = sliceSubsliceIds_;
-        } else {
-          result.sliceSubsliceIds_ = sliceSubsliceIdsBuilder_.build();
-        }
-        if (sliceStatusBuilder_ == null) {
-          result.sliceStatus_ = sliceStatus_;
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.add(value);
+          onChanged();
         } else {
-          result.sliceStatus_ = sliceStatusBuilder_.build();
+          sliceConstraintsBuilder_.addMessage(value);
         }
-        if (sliceConfigBuilder_ == null) {
-          result.sliceConfig_ = sliceConfig_;
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder addSliceConstraints(
+          int index, context.ContextOuterClass.Constraint value) {
+        if (sliceConstraintsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.add(index, value);
+          onChanged();
         } else {
-          result.sliceConfig_ = sliceConfigBuilder_.build();
+          sliceConstraintsBuilder_.addMessage(index, value);
         }
-        if (sliceOwnerBuilder_ == null) {
-          result.sliceOwner_ = sliceOwner_;
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder addSliceConstraints(
+          context.ContextOuterClass.Constraint.Builder builderForValue) {
+        if (sliceConstraintsBuilder_ == null) {
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.add(builderForValue.build());
+          onChanged();
         } else {
-          result.sliceOwner_ = sliceOwnerBuilder_.build();
+          sliceConstraintsBuilder_.addMessage(builderForValue.build());
         }
-        if (timestampBuilder_ == null) {
-          result.timestamp_ = timestamp_;
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder addSliceConstraints(
+          int index, context.ContextOuterClass.Constraint.Builder builderForValue) {
+        if (sliceConstraintsBuilder_ == null) {
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.add(index, builderForValue.build());
+          onChanged();
         } else {
-          result.timestamp_ = timestampBuilder_.build();
+          sliceConstraintsBuilder_.addMessage(index, builderForValue.build());
         }
-        onBuilt();
-        return result;
-      }
-
-      @java.lang.Override
-      public Builder clone() {
-        return super.clone();
-      }
-      @java.lang.Override
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          java.lang.Object value) {
-        return super.setField(field, value);
-      }
-      @java.lang.Override
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return super.clearField(field);
-      }
-      @java.lang.Override
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return super.clearOneof(oneof);
-      }
-      @java.lang.Override
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, java.lang.Object value) {
-        return super.setRepeatedField(field, index, value);
-      }
-      @java.lang.Override
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          java.lang.Object value) {
-        return super.addRepeatedField(field, value);
+        return this;
       }
-      @java.lang.Override
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Slice) {
-          return mergeFrom((context.ContextOuterClass.Slice)other);
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder addAllSliceConstraints(
+          java.lang.Iterable<? extends context.ContextOuterClass.Constraint> values) {
+        if (sliceConstraintsBuilder_ == null) {
+          ensureSliceConstraintsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, sliceConstraints_);
+          onChanged();
         } else {
-          super.mergeFrom(other);
-          return this;
+          sliceConstraintsBuilder_.addAllMessages(values);
         }
+        return this;
       }
-
-      public Builder mergeFrom(context.ContextOuterClass.Slice other) {
-        if (other == context.ContextOuterClass.Slice.getDefaultInstance()) return this;
-        if (other.hasSliceId()) {
-          mergeSliceId(other.getSliceId());
-        }
-        if (!other.getName().isEmpty()) {
-          name_ = other.name_;
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder clearSliceConstraints() {
+        if (sliceConstraintsBuilder_ == null) {
+          sliceConstraints_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
           onChanged();
-        }
-        if (sliceEndpointIdsBuilder_ == null) {
-          if (!other.sliceEndpointIds_.isEmpty()) {
-            if (sliceEndpointIds_.isEmpty()) {
-              sliceEndpointIds_ = other.sliceEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureSliceEndpointIdsIsMutable();
-              sliceEndpointIds_.addAll(other.sliceEndpointIds_);
-            }
-            onChanged();
-          }
         } else {
-          if (!other.sliceEndpointIds_.isEmpty()) {
-            if (sliceEndpointIdsBuilder_.isEmpty()) {
-              sliceEndpointIdsBuilder_.dispose();
-              sliceEndpointIdsBuilder_ = null;
-              sliceEndpointIds_ = other.sliceEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              sliceEndpointIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSliceEndpointIdsFieldBuilder() : null;
-            } else {
-              sliceEndpointIdsBuilder_.addAllMessages(other.sliceEndpointIds_);
-            }
-          }
+          sliceConstraintsBuilder_.clear();
         }
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public Builder removeSliceConstraints(int index) {
         if (sliceConstraintsBuilder_ == null) {
-          if (!other.sliceConstraints_.isEmpty()) {
-            if (sliceConstraints_.isEmpty()) {
-              sliceConstraints_ = other.sliceConstraints_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-            } else {
-              ensureSliceConstraintsIsMutable();
-              sliceConstraints_.addAll(other.sliceConstraints_);
-            }
-            onChanged();
-          }
+          ensureSliceConstraintsIsMutable();
+          sliceConstraints_.remove(index);
+          onChanged();
         } else {
-          if (!other.sliceConstraints_.isEmpty()) {
-            if (sliceConstraintsBuilder_.isEmpty()) {
-              sliceConstraintsBuilder_.dispose();
-              sliceConstraintsBuilder_ = null;
-              sliceConstraints_ = other.sliceConstraints_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              sliceConstraintsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSliceConstraintsFieldBuilder() : null;
-            } else {
-              sliceConstraintsBuilder_.addAllMessages(other.sliceConstraints_);
-            }
-          }
+          sliceConstraintsBuilder_.remove(index);
         }
-        if (sliceServiceIdsBuilder_ == null) {
-          if (!other.sliceServiceIds_.isEmpty()) {
-            if (sliceServiceIds_.isEmpty()) {
-              sliceServiceIds_ = other.sliceServiceIds_;
-              bitField0_ = (bitField0_ & ~0x00000004);
-            } else {
-              ensureSliceServiceIdsIsMutable();
-              sliceServiceIds_.addAll(other.sliceServiceIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.sliceServiceIds_.isEmpty()) {
-            if (sliceServiceIdsBuilder_.isEmpty()) {
-              sliceServiceIdsBuilder_.dispose();
-              sliceServiceIdsBuilder_ = null;
-              sliceServiceIds_ = other.sliceServiceIds_;
-              bitField0_ = (bitField0_ & ~0x00000004);
-              sliceServiceIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSliceServiceIdsFieldBuilder() : null;
-            } else {
-              sliceServiceIdsBuilder_.addAllMessages(other.sliceServiceIds_);
-            }
-          }
+        return this;
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public context.ContextOuterClass.Constraint.Builder getSliceConstraintsBuilder(
+          int index) {
+        return getSliceConstraintsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public context.ContextOuterClass.ConstraintOrBuilder getSliceConstraintsOrBuilder(
+          int index) {
+        if (sliceConstraintsBuilder_ == null) {
+          return sliceConstraints_.get(index);  } else {
+          return sliceConstraintsBuilder_.getMessageOrBuilder(index);
         }
-        if (sliceSubsliceIdsBuilder_ == null) {
-          if (!other.sliceSubsliceIds_.isEmpty()) {
-            if (sliceSubsliceIds_.isEmpty()) {
-              sliceSubsliceIds_ = other.sliceSubsliceIds_;
-              bitField0_ = (bitField0_ & ~0x00000008);
-            } else {
-              ensureSliceSubsliceIdsIsMutable();
-              sliceSubsliceIds_.addAll(other.sliceSubsliceIds_);
-            }
-            onChanged();
-          }
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
+           getSliceConstraintsOrBuilderList() {
+        if (sliceConstraintsBuilder_ != null) {
+          return sliceConstraintsBuilder_.getMessageOrBuilderList();
         } else {
-          if (!other.sliceSubsliceIds_.isEmpty()) {
-            if (sliceSubsliceIdsBuilder_.isEmpty()) {
-              sliceSubsliceIdsBuilder_.dispose();
-              sliceSubsliceIdsBuilder_ = null;
-              sliceSubsliceIds_ = other.sliceSubsliceIds_;
-              bitField0_ = (bitField0_ & ~0x00000008);
-              sliceSubsliceIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSliceSubsliceIdsFieldBuilder() : null;
-            } else {
-              sliceSubsliceIdsBuilder_.addAllMessages(other.sliceSubsliceIds_);
-            }
-          }
-        }
-        if (other.hasSliceStatus()) {
-          mergeSliceStatus(other.getSliceStatus());
-        }
-        if (other.hasSliceConfig()) {
-          mergeSliceConfig(other.getSliceConfig());
-        }
-        if (other.hasSliceOwner()) {
-          mergeSliceOwner(other.getSliceOwner());
+          return java.util.Collections.unmodifiableList(sliceConstraints_);
         }
-        if (other.hasTimestamp()) {
-          mergeTimestamp(other.getTimestamp());
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public context.ContextOuterClass.Constraint.Builder addSliceConstraintsBuilder() {
+        return getSliceConstraintsFieldBuilder().addBuilder(
+            context.ContextOuterClass.Constraint.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public context.ContextOuterClass.Constraint.Builder addSliceConstraintsBuilder(
+          int index) {
+        return getSliceConstraintsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.Constraint.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       */
+      public java.util.List<context.ContextOuterClass.Constraint.Builder> 
+           getSliceConstraintsBuilderList() {
+        return getSliceConstraintsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder> 
+          getSliceConstraintsFieldBuilder() {
+        if (sliceConstraintsBuilder_ == null) {
+          sliceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder>(
+                  sliceConstraints_,
+                  ((bitField0_ & 0x00000002) != 0),
+                  getParentForChildren(),
+                  isClean());
+          sliceConstraints_ = null;
         }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
+        return sliceConstraintsBuilder_;
       }
 
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
+      private java.util.List<context.ContextOuterClass.ServiceId> sliceServiceIds_ =
+        java.util.Collections.emptyList();
+      private void ensureSliceServiceIdsIsMutable() {
+        if (!((bitField0_ & 0x00000004) != 0)) {
+          sliceServiceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>(sliceServiceIds_);
+          bitField0_ |= 0x00000004;
+         }
       }
 
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.Slice parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Slice) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> sliceServiceIdsBuilder_;
+
+      /**
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       */
+      public java.util.List<context.ContextOuterClass.ServiceId> getSliceServiceIdsList() {
+        if (sliceServiceIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(sliceServiceIds_);
+        } else {
+          return sliceServiceIdsBuilder_.getMessageList();
         }
-        return this;
       }
-      private int bitField0_;
-
-      private context.ContextOuterClass.SliceId sliceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdBuilder_;
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
-       * @return Whether the sliceId field is set.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public boolean hasSliceId() {
-        return sliceIdBuilder_ != null || sliceId_ != null;
+      public int getSliceServiceIdsCount() {
+        if (sliceServiceIdsBuilder_ == null) {
+          return sliceServiceIds_.size();
+        } else {
+          return sliceServiceIdsBuilder_.getCount();
+        }
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
-       * @return The sliceId.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public context.ContextOuterClass.SliceId getSliceId() {
-        if (sliceIdBuilder_ == null) {
-          return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+      public context.ContextOuterClass.ServiceId getSliceServiceIds(int index) {
+        if (sliceServiceIdsBuilder_ == null) {
+          return sliceServiceIds_.get(index);
         } else {
-          return sliceIdBuilder_.getMessage();
+          return sliceServiceIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder setSliceId(context.ContextOuterClass.SliceId value) {
-        if (sliceIdBuilder_ == null) {
+      public Builder setSliceServiceIds(
+          int index, context.ContextOuterClass.ServiceId value) {
+        if (sliceServiceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          sliceId_ = value;
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.set(index, value);
           onChanged();
         } else {
-          sliceIdBuilder_.setMessage(value);
+          sliceServiceIdsBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder setSliceId(
-          context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceIdBuilder_ == null) {
-          sliceId_ = builderForValue.build();
+      public Builder setSliceServiceIds(
+          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (sliceServiceIdsBuilder_ == null) {
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          sliceIdBuilder_.setMessage(builderForValue.build());
+          sliceServiceIdsBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
-        if (sliceIdBuilder_ == null) {
-          if (sliceId_ != null) {
-            sliceId_ =
-              context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
-          } else {
-            sliceId_ = value;
+      public Builder addSliceServiceIds(context.ContextOuterClass.ServiceId value) {
+        if (sliceServiceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.add(value);
           onChanged();
         } else {
-          sliceIdBuilder_.mergeFrom(value);
+          sliceServiceIdsBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder clearSliceId() {
-        if (sliceIdBuilder_ == null) {
-          sliceId_ = null;
+      public Builder addSliceServiceIds(
+          int index, context.ContextOuterClass.ServiceId value) {
+        if (sliceServiceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.add(index, value);
           onChanged();
         } else {
-          sliceId_ = null;
-          sliceIdBuilder_ = null;
+          sliceServiceIdsBuilder_.addMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
-        
-        onChanged();
-        return getSliceIdFieldBuilder().getBuilder();
+      public Builder addSliceServiceIds(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (sliceServiceIdsBuilder_ == null) {
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          sliceServiceIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-        if (sliceIdBuilder_ != null) {
-          return sliceIdBuilder_.getMessageOrBuilder();
+      public Builder addSliceServiceIds(
+          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (sliceServiceIdsBuilder_ == null) {
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.add(index, builderForValue.build());
+          onChanged();
         } else {
-          return sliceId_ == null ?
-              context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+          sliceServiceIdsBuilder_.addMessage(index, builderForValue.build());
         }
+        return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 1;</code>
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
-          getSliceIdFieldBuilder() {
-        if (sliceIdBuilder_ == null) {
-          sliceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
-                  getSliceId(),
-                  getParentForChildren(),
-                  isClean());
-          sliceId_ = null;
+      public Builder addAllSliceServiceIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.ServiceId> values) {
+        if (sliceServiceIdsBuilder_ == null) {
+          ensureSliceServiceIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, sliceServiceIds_);
+          onChanged();
+        } else {
+          sliceServiceIdsBuilder_.addAllMessages(values);
         }
-        return sliceIdBuilder_;
+        return this;
       }
-
-      private java.lang.Object name_ = "";
       /**
-       * <code>string name = 2;</code>
-       * @return The name.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public java.lang.String getName() {
-        java.lang.Object ref = name_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          name_ = s;
-          return s;
+      public Builder clearSliceServiceIds() {
+        if (sliceServiceIdsBuilder_ == null) {
+          sliceServiceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
         } else {
-          return (java.lang.String) ref;
+          sliceServiceIdsBuilder_.clear();
         }
+        return this;
       }
       /**
-       * <code>string name = 2;</code>
-       * @return The bytes for name.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public com.google.protobuf.ByteString
-          getNameBytes() {
-        java.lang.Object ref = name_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          name_ = b;
-          return b;
+      public Builder removeSliceServiceIds(int index) {
+        if (sliceServiceIdsBuilder_ == null) {
+          ensureSliceServiceIdsIsMutable();
+          sliceServiceIds_.remove(index);
+          onChanged();
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          sliceServiceIdsBuilder_.remove(index);
         }
+        return this;
       }
       /**
-       * <code>string name = 2;</code>
-       * @param value The name to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder setName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        name_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ServiceId.Builder getSliceServiceIdsBuilder(
+          int index) {
+        return getSliceServiceIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>string name = 2;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder clearName() {
-        
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ServiceIdOrBuilder getSliceServiceIdsOrBuilder(
+          int index) {
+        if (sliceServiceIdsBuilder_ == null) {
+          return sliceServiceIds_.get(index);  } else {
+          return sliceServiceIdsBuilder_.getMessageOrBuilder(index);
+        }
       }
       /**
-       * <code>string name = 2;</code>
-       * @param value The bytes for name to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
        */
-      public Builder setNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        name_ = value;
-        onChanged();
-        return this;
+      public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+           getSliceServiceIdsOrBuilderList() {
+        if (sliceServiceIdsBuilder_ != null) {
+          return sliceServiceIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(sliceServiceIds_);
+        }
+      }
+      /**
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       */
+      public context.ContextOuterClass.ServiceId.Builder addSliceServiceIdsBuilder() {
+        return getSliceServiceIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.ServiceId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       */
+      public context.ContextOuterClass.ServiceId.Builder addSliceServiceIdsBuilder(
+          int index) {
+        return getSliceServiceIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.ServiceId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       */
+      public java.util.List<context.ContextOuterClass.ServiceId.Builder> 
+           getSliceServiceIdsBuilderList() {
+        return getSliceServiceIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getSliceServiceIdsFieldBuilder() {
+        if (sliceServiceIdsBuilder_ == null) {
+          sliceServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  sliceServiceIds_,
+                  ((bitField0_ & 0x00000004) != 0),
+                  getParentForChildren(),
+                  isClean());
+          sliceServiceIds_ = null;
+        }
+        return sliceServiceIdsBuilder_;
       }
 
-      private java.util.List<context.ContextOuterClass.EndPointId> sliceEndpointIds_ =
+      private java.util.List<context.ContextOuterClass.SliceId> sliceSubsliceIds_ =
         java.util.Collections.emptyList();
-      private void ensureSliceEndpointIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          sliceEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(sliceEndpointIds_);
-          bitField0_ |= 0x00000001;
+      private void ensureSliceSubsliceIdsIsMutable() {
+        if (!((bitField0_ & 0x00000008) != 0)) {
+          sliceSubsliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>(sliceSubsliceIds_);
+          bitField0_ |= 0x00000008;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> sliceEndpointIdsBuilder_;
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceSubsliceIdsBuilder_;
 
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public java.util.List<context.ContextOuterClass.EndPointId> getSliceEndpointIdsList() {
-        if (sliceEndpointIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(sliceEndpointIds_);
+      public java.util.List<context.ContextOuterClass.SliceId> getSliceSubsliceIdsList() {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(sliceSubsliceIds_);
         } else {
-          return sliceEndpointIdsBuilder_.getMessageList();
+          return sliceSubsliceIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public int getSliceEndpointIdsCount() {
-        if (sliceEndpointIdsBuilder_ == null) {
-          return sliceEndpointIds_.size();
+      public int getSliceSubsliceIdsCount() {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          return sliceSubsliceIds_.size();
         } else {
-          return sliceEndpointIdsBuilder_.getCount();
+          return sliceSubsliceIdsBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public context.ContextOuterClass.EndPointId getSliceEndpointIds(int index) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          return sliceEndpointIds_.get(index);
+      public context.ContextOuterClass.SliceId getSliceSubsliceIds(int index) {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          return sliceSubsliceIds_.get(index);
         } else {
-          return sliceEndpointIdsBuilder_.getMessage(index);
+          return sliceSubsliceIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder setSliceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (sliceEndpointIdsBuilder_ == null) {
+      public Builder setSliceSubsliceIds(
+          int index, context.ContextOuterClass.SliceId value) {
+        if (sliceSubsliceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.set(index, value);
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.set(index, value);
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.setMessage(index, value);
+          sliceSubsliceIdsBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder setSliceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.set(index, builderForValue.build());
+      public Builder setSliceSubsliceIds(
+          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.setMessage(index, builderForValue.build());
+          sliceSubsliceIdsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder addSliceEndpointIds(context.ContextOuterClass.EndPointId value) {
-        if (sliceEndpointIdsBuilder_ == null) {
+      public Builder addSliceSubsliceIds(context.ContextOuterClass.SliceId value) {
+        if (sliceSubsliceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.add(value);
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.add(value);
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.addMessage(value);
+          sliceSubsliceIdsBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder addSliceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (sliceEndpointIdsBuilder_ == null) {
+      public Builder addSliceSubsliceIds(
+          int index, context.ContextOuterClass.SliceId value) {
+        if (sliceSubsliceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.add(index, value);
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.add(index, value);
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.addMessage(index, value);
+          sliceSubsliceIdsBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder addSliceEndpointIds(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.add(builderForValue.build());
+      public Builder addSliceSubsliceIds(
+          context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.add(builderForValue.build());
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.addMessage(builderForValue.build());
+          sliceSubsliceIdsBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder addSliceEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.add(index, builderForValue.build());
+      public Builder addSliceSubsliceIds(
+          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.add(index, builderForValue.build());
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.addMessage(index, builderForValue.build());
+          sliceSubsliceIdsBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder addAllSliceEndpointIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          ensureSliceEndpointIdsIsMutable();
+      public Builder addAllSliceSubsliceIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.SliceId> values) {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          ensureSliceSubsliceIdsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, sliceEndpointIds_);
+              values, sliceSubsliceIds_);
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.addAllMessages(values);
+          sliceSubsliceIdsBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder clearSliceEndpointIds() {
-        if (sliceEndpointIdsBuilder_ == null) {
-          sliceEndpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+      public Builder clearSliceSubsliceIds() {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          sliceSubsliceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000008);
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.clear();
+          sliceSubsliceIdsBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public Builder removeSliceEndpointIds(int index) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          ensureSliceEndpointIdsIsMutable();
-          sliceEndpointIds_.remove(index);
+      public Builder removeSliceSubsliceIds(int index) {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          ensureSliceSubsliceIdsIsMutable();
+          sliceSubsliceIds_.remove(index);
           onChanged();
         } else {
-          sliceEndpointIdsBuilder_.remove(index);
+          sliceSubsliceIdsBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public context.ContextOuterClass.EndPointId.Builder getSliceEndpointIdsBuilder(
+      public context.ContextOuterClass.SliceId.Builder getSliceSubsliceIdsBuilder(
           int index) {
-        return getSliceEndpointIdsFieldBuilder().getBuilder(index);
+        return getSliceSubsliceIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public context.ContextOuterClass.EndPointIdOrBuilder getSliceEndpointIdsOrBuilder(
+      public context.ContextOuterClass.SliceIdOrBuilder getSliceSubsliceIdsOrBuilder(
           int index) {
-        if (sliceEndpointIdsBuilder_ == null) {
-          return sliceEndpointIds_.get(index);  } else {
-          return sliceEndpointIdsBuilder_.getMessageOrBuilder(index);
+        if (sliceSubsliceIdsBuilder_ == null) {
+          return sliceSubsliceIds_.get(index);  } else {
+          return sliceSubsliceIdsBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-           getSliceEndpointIdsOrBuilderList() {
-        if (sliceEndpointIdsBuilder_ != null) {
-          return sliceEndpointIdsBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
+           getSliceSubsliceIdsOrBuilderList() {
+        if (sliceSubsliceIdsBuilder_ != null) {
+          return sliceSubsliceIdsBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(sliceEndpointIds_);
+          return java.util.Collections.unmodifiableList(sliceSubsliceIds_);
         }
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public context.ContextOuterClass.EndPointId.Builder addSliceEndpointIdsBuilder() {
-        return getSliceEndpointIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.EndPointId.getDefaultInstance());
+      public context.ContextOuterClass.SliceId.Builder addSliceSubsliceIdsBuilder() {
+        return getSliceSubsliceIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.SliceId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public context.ContextOuterClass.EndPointId.Builder addSliceEndpointIdsBuilder(
+      public context.ContextOuterClass.SliceId.Builder addSliceSubsliceIdsBuilder(
           int index) {
-        return getSliceEndpointIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+        return getSliceSubsliceIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.SliceId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.EndPointId slice_endpoint_ids = 3;</code>
+       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
        */
-      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
-           getSliceEndpointIdsBuilderList() {
-        return getSliceEndpointIdsFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.SliceId.Builder> 
+           getSliceSubsliceIdsBuilderList() {
+        return getSliceSubsliceIdsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getSliceEndpointIdsFieldBuilder() {
-        if (sliceEndpointIdsBuilder_ == null) {
-          sliceEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  sliceEndpointIds_,
-                  ((bitField0_ & 0x00000001) != 0),
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
+          getSliceSubsliceIdsFieldBuilder() {
+        if (sliceSubsliceIdsBuilder_ == null) {
+          sliceSubsliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
+                  sliceSubsliceIds_,
+                  ((bitField0_ & 0x00000008) != 0),
                   getParentForChildren(),
                   isClean());
-          sliceEndpointIds_ = null;
+          sliceSubsliceIds_ = null;
         }
-        return sliceEndpointIdsBuilder_;
-      }
-
-      private java.util.List<context.ContextOuterClass.Constraint> sliceConstraints_ =
-        java.util.Collections.emptyList();
-      private void ensureSliceConstraintsIsMutable() {
-        if (!((bitField0_ & 0x00000002) != 0)) {
-          sliceConstraints_ = new java.util.ArrayList<context.ContextOuterClass.Constraint>(sliceConstraints_);
-          bitField0_ |= 0x00000002;
-         }
+        return sliceSubsliceIdsBuilder_;
       }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder> sliceConstraintsBuilder_;
-
-      /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
-       */
-      public java.util.List<context.ContextOuterClass.Constraint> getSliceConstraintsList() {
-        if (sliceConstraintsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(sliceConstraints_);
-        } else {
-          return sliceConstraintsBuilder_.getMessageList();
-        }
-      }
+      private context.ContextOuterClass.SliceStatus sliceStatus_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceStatus, context.ContextOuterClass.SliceStatus.Builder, context.ContextOuterClass.SliceStatusOrBuilder> sliceStatusBuilder_;
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
+       * @return Whether the sliceStatus field is set.
        */
-      public int getSliceConstraintsCount() {
-        if (sliceConstraintsBuilder_ == null) {
-          return sliceConstraints_.size();
-        } else {
-          return sliceConstraintsBuilder_.getCount();
-        }
+      public boolean hasSliceStatus() {
+        return sliceStatusBuilder_ != null || sliceStatus_ != null;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
+       * @return The sliceStatus.
        */
-      public context.ContextOuterClass.Constraint getSliceConstraints(int index) {
-        if (sliceConstraintsBuilder_ == null) {
-          return sliceConstraints_.get(index);
+      public context.ContextOuterClass.SliceStatus getSliceStatus() {
+        if (sliceStatusBuilder_ == null) {
+          return sliceStatus_ == null ? context.ContextOuterClass.SliceStatus.getDefaultInstance() : sliceStatus_;
         } else {
-          return sliceConstraintsBuilder_.getMessage(index);
+          return sliceStatusBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
        */
-      public Builder setSliceConstraints(
-          int index, context.ContextOuterClass.Constraint value) {
-        if (sliceConstraintsBuilder_ == null) {
+      public Builder setSliceStatus(context.ContextOuterClass.SliceStatus value) {
+        if (sliceStatusBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.set(index, value);
+          sliceStatus_ = value;
           onChanged();
         } else {
-          sliceConstraintsBuilder_.setMessage(index, value);
+          sliceStatusBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
        */
-      public Builder setSliceConstraints(
-          int index, context.ContextOuterClass.Constraint.Builder builderForValue) {
-        if (sliceConstraintsBuilder_ == null) {
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.set(index, builderForValue.build());
+      public Builder setSliceStatus(
+          context.ContextOuterClass.SliceStatus.Builder builderForValue) {
+        if (sliceStatusBuilder_ == null) {
+          sliceStatus_ = builderForValue.build();
           onChanged();
         } else {
-          sliceConstraintsBuilder_.setMessage(index, builderForValue.build());
+          sliceStatusBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
        */
-      public Builder addSliceConstraints(context.ContextOuterClass.Constraint value) {
-        if (sliceConstraintsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeSliceStatus(context.ContextOuterClass.SliceStatus value) {
+        if (sliceStatusBuilder_ == null) {
+          if (sliceStatus_ != null) {
+            sliceStatus_ =
+              context.ContextOuterClass.SliceStatus.newBuilder(sliceStatus_).mergeFrom(value).buildPartial();
+          } else {
+            sliceStatus_ = value;
           }
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.add(value);
           onChanged();
         } else {
-          sliceConstraintsBuilder_.addMessage(value);
+          sliceStatusBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
        */
-      public Builder addSliceConstraints(
-          int index, context.ContextOuterClass.Constraint value) {
-        if (sliceConstraintsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.add(index, value);
+      public Builder clearSliceStatus() {
+        if (sliceStatusBuilder_ == null) {
+          sliceStatus_ = null;
           onChanged();
         } else {
-          sliceConstraintsBuilder_.addMessage(index, value);
+          sliceStatus_ = null;
+          sliceStatusBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
        */
-      public Builder addSliceConstraints(
-          context.ContextOuterClass.Constraint.Builder builderForValue) {
-        if (sliceConstraintsBuilder_ == null) {
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.add(builderForValue.build());
-          onChanged();
+      public context.ContextOuterClass.SliceStatus.Builder getSliceStatusBuilder() {
+        
+        onChanged();
+        return getSliceStatusFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.SliceStatus slice_status = 7;</code>
+       */
+      public context.ContextOuterClass.SliceStatusOrBuilder getSliceStatusOrBuilder() {
+        if (sliceStatusBuilder_ != null) {
+          return sliceStatusBuilder_.getMessageOrBuilder();
         } else {
-          sliceConstraintsBuilder_.addMessage(builderForValue.build());
+          return sliceStatus_ == null ?
+              context.ContextOuterClass.SliceStatus.getDefaultInstance() : sliceStatus_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceStatus slice_status = 7;</code>
        */
-      public Builder addSliceConstraints(
-          int index, context.ContextOuterClass.Constraint.Builder builderForValue) {
-        if (sliceConstraintsBuilder_ == null) {
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          sliceConstraintsBuilder_.addMessage(index, builderForValue.build());
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceStatus, context.ContextOuterClass.SliceStatus.Builder, context.ContextOuterClass.SliceStatusOrBuilder> 
+          getSliceStatusFieldBuilder() {
+        if (sliceStatusBuilder_ == null) {
+          sliceStatusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.SliceStatus, context.ContextOuterClass.SliceStatus.Builder, context.ContextOuterClass.SliceStatusOrBuilder>(
+                  getSliceStatus(),
+                  getParentForChildren(),
+                  isClean());
+          sliceStatus_ = null;
         }
-        return this;
+        return sliceStatusBuilder_;
       }
+
+      private context.ContextOuterClass.SliceConfig sliceConfig_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder> sliceConfigBuilder_;
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
+       * @return Whether the sliceConfig field is set.
        */
-      public Builder addAllSliceConstraints(
-          java.lang.Iterable<? extends context.ContextOuterClass.Constraint> values) {
-        if (sliceConstraintsBuilder_ == null) {
-          ensureSliceConstraintsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, sliceConstraints_);
-          onChanged();
+      public boolean hasSliceConfig() {
+        return sliceConfigBuilder_ != null || sliceConfig_ != null;
+      }
+      /**
+       * <code>.context.SliceConfig slice_config = 8;</code>
+       * @return The sliceConfig.
+       */
+      public context.ContextOuterClass.SliceConfig getSliceConfig() {
+        if (sliceConfigBuilder_ == null) {
+          return sliceConfig_ == null ? context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
         } else {
-          sliceConstraintsBuilder_.addAllMessages(values);
+          return sliceConfigBuilder_.getMessage();
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public Builder clearSliceConstraints() {
-        if (sliceConstraintsBuilder_ == null) {
-          sliceConstraints_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
+      public Builder setSliceConfig(context.ContextOuterClass.SliceConfig value) {
+        if (sliceConfigBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          sliceConfig_ = value;
           onChanged();
         } else {
-          sliceConstraintsBuilder_.clear();
+          sliceConfigBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public Builder removeSliceConstraints(int index) {
-        if (sliceConstraintsBuilder_ == null) {
-          ensureSliceConstraintsIsMutable();
-          sliceConstraints_.remove(index);
+      public Builder setSliceConfig(
+          context.ContextOuterClass.SliceConfig.Builder builderForValue) {
+        if (sliceConfigBuilder_ == null) {
+          sliceConfig_ = builderForValue.build();
           onChanged();
         } else {
-          sliceConstraintsBuilder_.remove(index);
+          sliceConfigBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
-       */
-      public context.ContextOuterClass.Constraint.Builder getSliceConstraintsBuilder(
-          int index) {
-        return getSliceConstraintsFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public context.ContextOuterClass.ConstraintOrBuilder getSliceConstraintsOrBuilder(
-          int index) {
-        if (sliceConstraintsBuilder_ == null) {
-          return sliceConstraints_.get(index);  } else {
-          return sliceConstraintsBuilder_.getMessageOrBuilder(index);
+      public Builder mergeSliceConfig(context.ContextOuterClass.SliceConfig value) {
+        if (sliceConfigBuilder_ == null) {
+          if (sliceConfig_ != null) {
+            sliceConfig_ =
+              context.ContextOuterClass.SliceConfig.newBuilder(sliceConfig_).mergeFrom(value).buildPartial();
+          } else {
+            sliceConfig_ = value;
+          }
+          onChanged();
+        } else {
+          sliceConfigBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
-           getSliceConstraintsOrBuilderList() {
-        if (sliceConstraintsBuilder_ != null) {
-          return sliceConstraintsBuilder_.getMessageOrBuilderList();
+      public Builder clearSliceConfig() {
+        if (sliceConfigBuilder_ == null) {
+          sliceConfig_ = null;
+          onChanged();
         } else {
-          return java.util.Collections.unmodifiableList(sliceConstraints_);
+          sliceConfig_ = null;
+          sliceConfigBuilder_ = null;
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public context.ContextOuterClass.Constraint.Builder addSliceConstraintsBuilder() {
-        return getSliceConstraintsFieldBuilder().addBuilder(
-            context.ContextOuterClass.Constraint.getDefaultInstance());
+      public context.ContextOuterClass.SliceConfig.Builder getSliceConfigBuilder() {
+        
+        onChanged();
+        return getSliceConfigFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public context.ContextOuterClass.Constraint.Builder addSliceConstraintsBuilder(
-          int index) {
-        return getSliceConstraintsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.Constraint.getDefaultInstance());
+      public context.ContextOuterClass.SliceConfigOrBuilder getSliceConfigOrBuilder() {
+        if (sliceConfigBuilder_ != null) {
+          return sliceConfigBuilder_.getMessageOrBuilder();
+        } else {
+          return sliceConfig_ == null ?
+              context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
+        }
       }
       /**
-       * <code>repeated .context.Constraint slice_constraints = 4;</code>
+       * <code>.context.SliceConfig slice_config = 8;</code>
        */
-      public java.util.List<context.ContextOuterClass.Constraint.Builder> 
-           getSliceConstraintsBuilderList() {
-        return getSliceConstraintsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder> 
-          getSliceConstraintsFieldBuilder() {
-        if (sliceConstraintsBuilder_ == null) {
-          sliceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder>(
-                  sliceConstraints_,
-                  ((bitField0_ & 0x00000002) != 0),
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder> 
+          getSliceConfigFieldBuilder() {
+        if (sliceConfigBuilder_ == null) {
+          sliceConfigBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder>(
+                  getSliceConfig(),
                   getParentForChildren(),
                   isClean());
-          sliceConstraints_ = null;
+          sliceConfig_ = null;
         }
-        return sliceConstraintsBuilder_;
+        return sliceConfigBuilder_;
       }
 
-      private java.util.List<context.ContextOuterClass.ServiceId> sliceServiceIds_ =
-        java.util.Collections.emptyList();
-      private void ensureSliceServiceIdsIsMutable() {
-        if (!((bitField0_ & 0x00000004) != 0)) {
-          sliceServiceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>(sliceServiceIds_);
-          bitField0_ |= 0x00000004;
-         }
+      private context.ContextOuterClass.SliceOwner sliceOwner_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceOwner, context.ContextOuterClass.SliceOwner.Builder, context.ContextOuterClass.SliceOwnerOrBuilder> sliceOwnerBuilder_;
+      /**
+       * <code>.context.SliceOwner slice_owner = 9;</code>
+       * @return Whether the sliceOwner field is set.
+       */
+      public boolean hasSliceOwner() {
+        return sliceOwnerBuilder_ != null || sliceOwner_ != null;
       }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> sliceServiceIdsBuilder_;
-
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.SliceOwner slice_owner = 9;</code>
+       * @return The sliceOwner.
        */
-      public java.util.List<context.ContextOuterClass.ServiceId> getSliceServiceIdsList() {
-        if (sliceServiceIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(sliceServiceIds_);
+      public context.ContextOuterClass.SliceOwner getSliceOwner() {
+        if (sliceOwnerBuilder_ == null) {
+          return sliceOwner_ == null ? context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
         } else {
-          return sliceServiceIdsBuilder_.getMessageList();
+          return sliceOwnerBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.SliceOwner slice_owner = 9;</code>
        */
-      public int getSliceServiceIdsCount() {
-        if (sliceServiceIdsBuilder_ == null) {
-          return sliceServiceIds_.size();
+      public Builder setSliceOwner(context.ContextOuterClass.SliceOwner value) {
+        if (sliceOwnerBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          sliceOwner_ = value;
+          onChanged();
         } else {
-          return sliceServiceIdsBuilder_.getCount();
+          sliceOwnerBuilder_.setMessage(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.SliceOwner slice_owner = 9;</code>
        */
-      public context.ContextOuterClass.ServiceId getSliceServiceIds(int index) {
-        if (sliceServiceIdsBuilder_ == null) {
-          return sliceServiceIds_.get(index);
+      public Builder setSliceOwner(
+          context.ContextOuterClass.SliceOwner.Builder builderForValue) {
+        if (sliceOwnerBuilder_ == null) {
+          sliceOwner_ = builderForValue.build();
+          onChanged();
         } else {
-          return sliceServiceIdsBuilder_.getMessage(index);
+          sliceOwnerBuilder_.setMessage(builderForValue.build());
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.SliceOwner slice_owner = 9;</code>
        */
-      public Builder setSliceServiceIds(
-          int index, context.ContextOuterClass.ServiceId value) {
-        if (sliceServiceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeSliceOwner(context.ContextOuterClass.SliceOwner value) {
+        if (sliceOwnerBuilder_ == null) {
+          if (sliceOwner_ != null) {
+            sliceOwner_ =
+              context.ContextOuterClass.SliceOwner.newBuilder(sliceOwner_).mergeFrom(value).buildPartial();
+          } else {
+            sliceOwner_ = value;
           }
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.set(index, value);
           onChanged();
         } else {
-          sliceServiceIdsBuilder_.setMessage(index, value);
+          sliceOwnerBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.SliceOwner slice_owner = 9;</code>
        */
-      public Builder setSliceServiceIds(
-          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (sliceServiceIdsBuilder_ == null) {
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.set(index, builderForValue.build());
+      public Builder clearSliceOwner() {
+        if (sliceOwnerBuilder_ == null) {
+          sliceOwner_ = null;
           onChanged();
         } else {
-          sliceServiceIdsBuilder_.setMessage(index, builderForValue.build());
+          sliceOwner_ = null;
+          sliceOwnerBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.SliceOwner slice_owner = 9;</code>
        */
-      public Builder addSliceServiceIds(context.ContextOuterClass.ServiceId value) {
-        if (sliceServiceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.add(value);
-          onChanged();
+      public context.ContextOuterClass.SliceOwner.Builder getSliceOwnerBuilder() {
+        
+        onChanged();
+        return getSliceOwnerFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.SliceOwner slice_owner = 9;</code>
+       */
+      public context.ContextOuterClass.SliceOwnerOrBuilder getSliceOwnerOrBuilder() {
+        if (sliceOwnerBuilder_ != null) {
+          return sliceOwnerBuilder_.getMessageOrBuilder();
+        } else {
+          return sliceOwner_ == null ?
+              context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
+        }
+      }
+      /**
+       * <code>.context.SliceOwner slice_owner = 9;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceOwner, context.ContextOuterClass.SliceOwner.Builder, context.ContextOuterClass.SliceOwnerOrBuilder> 
+          getSliceOwnerFieldBuilder() {
+        if (sliceOwnerBuilder_ == null) {
+          sliceOwnerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.SliceOwner, context.ContextOuterClass.SliceOwner.Builder, context.ContextOuterClass.SliceOwnerOrBuilder>(
+                  getSliceOwner(),
+                  getParentForChildren(),
+                  isClean());
+          sliceOwner_ = null;
+        }
+        return sliceOwnerBuilder_;
+      }
+
+      private context.ContextOuterClass.Timestamp timestamp_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> timestampBuilder_;
+      /**
+       * <code>.context.Timestamp timestamp = 10;</code>
+       * @return Whether the timestamp field is set.
+       */
+      public boolean hasTimestamp() {
+        return timestampBuilder_ != null || timestamp_ != null;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 10;</code>
+       * @return The timestamp.
+       */
+      public context.ContextOuterClass.Timestamp getTimestamp() {
+        if (timestampBuilder_ == null) {
+          return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
         } else {
-          sliceServiceIdsBuilder_.addMessage(value);
+          return timestampBuilder_.getMessage();
         }
-        return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public Builder addSliceServiceIds(
-          int index, context.ContextOuterClass.ServiceId value) {
-        if (sliceServiceIdsBuilder_ == null) {
+      public Builder setTimestamp(context.ContextOuterClass.Timestamp value) {
+        if (timestampBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.add(index, value);
+          timestamp_ = value;
           onChanged();
         } else {
-          sliceServiceIdsBuilder_.addMessage(index, value);
+          timestampBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public Builder addSliceServiceIds(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (sliceServiceIdsBuilder_ == null) {
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.add(builderForValue.build());
+      public Builder setTimestamp(
+          context.ContextOuterClass.Timestamp.Builder builderForValue) {
+        if (timestampBuilder_ == null) {
+          timestamp_ = builderForValue.build();
           onChanged();
         } else {
-          sliceServiceIdsBuilder_.addMessage(builderForValue.build());
+          timestampBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public Builder addSliceServiceIds(
-          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (sliceServiceIdsBuilder_ == null) {
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.add(index, builderForValue.build());
+      public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
+        if (timestampBuilder_ == null) {
+          if (timestamp_ != null) {
+            timestamp_ =
+              context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
+          } else {
+            timestamp_ = value;
+          }
           onChanged();
         } else {
-          sliceServiceIdsBuilder_.addMessage(index, builderForValue.build());
+          timestampBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public Builder addAllSliceServiceIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.ServiceId> values) {
-        if (sliceServiceIdsBuilder_ == null) {
-          ensureSliceServiceIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, sliceServiceIds_);
+      public Builder clearTimestamp() {
+        if (timestampBuilder_ == null) {
+          timestamp_ = null;
           onChanged();
         } else {
-          sliceServiceIdsBuilder_.addAllMessages(values);
+          timestamp_ = null;
+          timestampBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public Builder clearSliceServiceIds() {
-        if (sliceServiceIdsBuilder_ == null) {
-          sliceServiceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000004);
-          onChanged();
-        } else {
-          sliceServiceIdsBuilder_.clear();
-        }
-        return this;
+      public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
+        
+        onChanged();
+        return getTimestampFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public Builder removeSliceServiceIds(int index) {
-        if (sliceServiceIdsBuilder_ == null) {
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.remove(index);
-          onChanged();
+      public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
+        if (timestampBuilder_ != null) {
+          return timestampBuilder_.getMessageOrBuilder();
         } else {
-          sliceServiceIdsBuilder_.remove(index);
+          return timestamp_ == null ?
+              context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
         }
-        return this;
-      }
-      /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
-       */
-      public context.ContextOuterClass.ServiceId.Builder getSliceServiceIdsBuilder(
-          int index) {
-        return getSliceServiceIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
+       * <code>.context.Timestamp timestamp = 10;</code>
        */
-      public context.ContextOuterClass.ServiceIdOrBuilder getSliceServiceIdsOrBuilder(
-          int index) {
-        if (sliceServiceIdsBuilder_ == null) {
-          return sliceServiceIds_.get(index);  } else {
-          return sliceServiceIdsBuilder_.getMessageOrBuilder(index);
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
+          getTimestampFieldBuilder() {
+        if (timestampBuilder_ == null) {
+          timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder>(
+                  getTimestamp(),
+                  getParentForChildren(),
+                  isClean());
+          timestamp_ = null;
         }
+        return timestampBuilder_;
       }
-      /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
-       */
-      public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-           getSliceServiceIdsOrBuilderList() {
-        if (sliceServiceIdsBuilder_ != null) {
-          return sliceServiceIdsBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(sliceServiceIds_);
-        }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
       }
-      /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
-       */
-      public context.ContextOuterClass.ServiceId.Builder addSliceServiceIdsBuilder() {
-        return getSliceServiceIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.ServiceId.getDefaultInstance());
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
       }
-      /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
-       */
-      public context.ContextOuterClass.ServiceId.Builder addSliceServiceIdsBuilder(
-          int index) {
-        return getSliceServiceIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.ServiceId.getDefaultInstance());
+
+
+      // @@protoc_insertion_point(builder_scope:context.Slice)
+    }
+
+    // @@protoc_insertion_point(class_scope:context.Slice)
+    private static final context.ContextOuterClass.Slice DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Slice();
+    }
+
+    public static context.ContextOuterClass.Slice getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Slice>
+        PARSER = new com.google.protobuf.AbstractParser<Slice>() {
+      @java.lang.Override
+      public Slice parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Slice(input, extensionRegistry);
       }
-      /**
-       * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
-       */
-      public java.util.List<context.ContextOuterClass.ServiceId.Builder> 
-           getSliceServiceIdsBuilderList() {
-        return getSliceServiceIdsFieldBuilder().getBuilderList();
+    };
+
+    public static com.google.protobuf.Parser<Slice> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Slice> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public context.ContextOuterClass.Slice getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface SliceOwnerOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceOwner)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.Uuid owner_uuid = 1;</code>
+     * @return Whether the ownerUuid field is set.
+     */
+    boolean hasOwnerUuid();
+    /**
+     * <code>.context.Uuid owner_uuid = 1;</code>
+     * @return The ownerUuid.
+     */
+    context.ContextOuterClass.Uuid getOwnerUuid();
+    /**
+     * <code>.context.Uuid owner_uuid = 1;</code>
+     */
+    context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder();
+
+    /**
+     * <code>string owner_string = 2;</code>
+     * @return The ownerString.
+     */
+    java.lang.String getOwnerString();
+    /**
+     * <code>string owner_string = 2;</code>
+     * @return The bytes for ownerString.
+     */
+    com.google.protobuf.ByteString
+        getOwnerStringBytes();
+  }
+  /**
+   * Protobuf type {@code context.SliceOwner}
+   */
+  public static final class SliceOwner extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.SliceOwner)
+      SliceOwnerOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use SliceOwner.newBuilder() to construct.
+    private SliceOwner(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private SliceOwner() {
+      ownerString_ = "";
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new SliceOwner();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private SliceOwner(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
       }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getSliceServiceIdsFieldBuilder() {
-        if (sliceServiceIdsBuilder_ == null) {
-          sliceServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  sliceServiceIds_,
-                  ((bitField0_ & 0x00000004) != 0),
-                  getParentForChildren(),
-                  isClean());
-          sliceServiceIds_ = null;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              context.ContextOuterClass.Uuid.Builder subBuilder = null;
+              if (ownerUuid_ != null) {
+                subBuilder = ownerUuid_.toBuilder();
+              }
+              ownerUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(ownerUuid_);
+                ownerUuid_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              ownerString_ = s;
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
         }
-        return sliceServiceIdsBuilder_;
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return context.ContextOuterClass.internal_static_context_SliceOwner_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              context.ContextOuterClass.SliceOwner.class, context.ContextOuterClass.SliceOwner.Builder.class);
+    }
+
+    public static final int OWNER_UUID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Uuid ownerUuid_;
+    /**
+     * <code>.context.Uuid owner_uuid = 1;</code>
+     * @return Whether the ownerUuid field is set.
+     */
+    @java.lang.Override
+    public boolean hasOwnerUuid() {
+      return ownerUuid_ != null;
+    }
+    /**
+     * <code>.context.Uuid owner_uuid = 1;</code>
+     * @return The ownerUuid.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Uuid getOwnerUuid() {
+      return ownerUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+    }
+    /**
+     * <code>.context.Uuid owner_uuid = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder() {
+      return getOwnerUuid();
+    }
+
+    public static final int OWNER_STRING_FIELD_NUMBER = 2;
+    private volatile java.lang.Object ownerString_;
+    /**
+     * <code>string owner_string = 2;</code>
+     * @return The ownerString.
+     */
+    @java.lang.Override
+    public java.lang.String getOwnerString() {
+      java.lang.Object ref = ownerString_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        ownerString_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string owner_string = 2;</code>
+     * @return The bytes for ownerString.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getOwnerStringBytes() {
+      java.lang.Object ref = ownerString_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        ownerString_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (ownerUuid_ != null) {
+        output.writeMessage(1, getOwnerUuid());
+      }
+      if (!getOwnerStringBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ownerString_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (ownerUuid_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getOwnerUuid());
+      }
+      if (!getOwnerStringBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ownerString_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof context.ContextOuterClass.SliceOwner)) {
+        return super.equals(obj);
       }
+      context.ContextOuterClass.SliceOwner other = (context.ContextOuterClass.SliceOwner) obj;
+
+      if (hasOwnerUuid() != other.hasOwnerUuid()) return false;
+      if (hasOwnerUuid()) {
+        if (!getOwnerUuid()
+            .equals(other.getOwnerUuid())) return false;
+      }
+      if (!getOwnerString()
+          .equals(other.getOwnerString())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasOwnerUuid()) {
+        hash = (37 * hash) + OWNER_UUID_FIELD_NUMBER;
+        hash = (53 * hash) + getOwnerUuid().hashCode();
+      }
+      hash = (37 * hash) + OWNER_STRING_FIELD_NUMBER;
+      hash = (53 * hash) + getOwnerString().hashCode();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceOwner parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.SliceOwner parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.SliceOwner parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
 
-      private java.util.List<context.ContextOuterClass.SliceId> sliceSubsliceIds_ =
-        java.util.Collections.emptyList();
-      private void ensureSliceSubsliceIdsIsMutable() {
-        if (!((bitField0_ & 0x00000008) != 0)) {
-          sliceSubsliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>(sliceSubsliceIds_);
-          bitField0_ |= 0x00000008;
-         }
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(context.ContextOuterClass.SliceOwner prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code context.SliceOwner}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.SliceOwner)
+        context.ContextOuterClass.SliceOwnerOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
       }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceSubsliceIdsBuilder_;
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return context.ContextOuterClass.internal_static_context_SliceOwner_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                context.ContextOuterClass.SliceOwner.class, context.ContextOuterClass.SliceOwner.Builder.class);
+      }
 
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public java.util.List<context.ContextOuterClass.SliceId> getSliceSubsliceIdsList() {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(sliceSubsliceIds_);
-        } else {
-          return sliceSubsliceIdsBuilder_.getMessageList();
-        }
+      // Construct using context.ContextOuterClass.SliceOwner.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public int getSliceSubsliceIdsCount() {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          return sliceSubsliceIds_.size();
-        } else {
-          return sliceSubsliceIdsBuilder_.getCount();
-        }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public context.ContextOuterClass.SliceId getSliceSubsliceIds(int index) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          return sliceSubsliceIds_.get(index);
-        } else {
-          return sliceSubsliceIdsBuilder_.getMessage(index);
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
         }
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder setSliceSubsliceIds(
-          int index, context.ContextOuterClass.SliceId value) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.set(index, value);
-          onChanged();
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (ownerUuidBuilder_ == null) {
+          ownerUuid_ = null;
         } else {
-          sliceSubsliceIdsBuilder_.setMessage(index, value);
+          ownerUuid_ = null;
+          ownerUuidBuilder_ = null;
         }
+        ownerString_ = "";
+
         return this;
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder setSliceSubsliceIds(
-          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder addSliceSubsliceIds(context.ContextOuterClass.SliceId value) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.add(value);
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.addMessage(value);
-        }
-        return this;
+
+      @java.lang.Override
+      public context.ContextOuterClass.SliceOwner getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceOwner.getDefaultInstance();
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder addSliceSubsliceIds(
-          int index, context.ContextOuterClass.SliceId value) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.add(index, value);
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.addMessage(index, value);
+
+      @java.lang.Override
+      public context.ContextOuterClass.SliceOwner build() {
+        context.ContextOuterClass.SliceOwner result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
         }
-        return this;
+        return result;
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder addSliceSubsliceIds(
-          context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.add(builderForValue.build());
-          onChanged();
+
+      @java.lang.Override
+      public context.ContextOuterClass.SliceOwner buildPartial() {
+        context.ContextOuterClass.SliceOwner result = new context.ContextOuterClass.SliceOwner(this);
+        if (ownerUuidBuilder_ == null) {
+          result.ownerUuid_ = ownerUuid_;
         } else {
-          sliceSubsliceIdsBuilder_.addMessage(builderForValue.build());
+          result.ownerUuid_ = ownerUuidBuilder_.build();
         }
-        return this;
+        result.ownerString_ = ownerString_;
+        onBuilt();
+        return result;
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder addSliceSubsliceIds(
-          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.addMessage(index, builderForValue.build());
-        }
-        return this;
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder addAllSliceSubsliceIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.SliceId> values) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          ensureSliceSubsliceIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, sliceSubsliceIds_);
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.addAllMessages(values);
-        }
-        return this;
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder clearSliceSubsliceIds() {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          sliceSubsliceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000008);
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.clear();
-        }
-        return this;
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder removeSliceSubsliceIds(int index) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.remove(index);
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.remove(index);
-        }
-        return this;
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public context.ContextOuterClass.SliceId.Builder getSliceSubsliceIdsBuilder(
-          int index) {
-        return getSliceSubsliceIdsFieldBuilder().getBuilder(index);
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public context.ContextOuterClass.SliceIdOrBuilder getSliceSubsliceIdsOrBuilder(
-          int index) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          return sliceSubsliceIds_.get(index);  } else {
-          return sliceSubsliceIdsBuilder_.getMessageOrBuilder(index);
-        }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
-           getSliceSubsliceIdsOrBuilderList() {
-        if (sliceSubsliceIdsBuilder_ != null) {
-          return sliceSubsliceIdsBuilder_.getMessageOrBuilderList();
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.SliceOwner) {
+          return mergeFrom((context.ContextOuterClass.SliceOwner)other);
         } else {
-          return java.util.Collections.unmodifiableList(sliceSubsliceIds_);
-        }
-      }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public context.ContextOuterClass.SliceId.Builder addSliceSubsliceIdsBuilder() {
-        return getSliceSubsliceIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.SliceId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public context.ContextOuterClass.SliceId.Builder addSliceSubsliceIdsBuilder(
-          int index) {
-        return getSliceSubsliceIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.SliceId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public java.util.List<context.ContextOuterClass.SliceId.Builder> 
-           getSliceSubsliceIdsBuilderList() {
-        return getSliceSubsliceIdsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
-          getSliceSubsliceIdsFieldBuilder() {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          sliceSubsliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
-                  sliceSubsliceIds_,
-                  ((bitField0_ & 0x00000008) != 0),
-                  getParentForChildren(),
-                  isClean());
-          sliceSubsliceIds_ = null;
+          super.mergeFrom(other);
+          return this;
         }
-        return sliceSubsliceIdsBuilder_;
       }
 
-      private context.ContextOuterClass.SliceStatus sliceStatus_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceStatus, context.ContextOuterClass.SliceStatus.Builder, context.ContextOuterClass.SliceStatusOrBuilder> sliceStatusBuilder_;
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       * @return Whether the sliceStatus field is set.
-       */
-      public boolean hasSliceStatus() {
-        return sliceStatusBuilder_ != null || sliceStatus_ != null;
-      }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       * @return The sliceStatus.
-       */
-      public context.ContextOuterClass.SliceStatus getSliceStatus() {
-        if (sliceStatusBuilder_ == null) {
-          return sliceStatus_ == null ? context.ContextOuterClass.SliceStatus.getDefaultInstance() : sliceStatus_;
-        } else {
-          return sliceStatusBuilder_.getMessage();
+      public Builder mergeFrom(context.ContextOuterClass.SliceOwner other) {
+        if (other == context.ContextOuterClass.SliceOwner.getDefaultInstance()) return this;
+        if (other.hasOwnerUuid()) {
+          mergeOwnerUuid(other.getOwnerUuid());
         }
-      }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder setSliceStatus(context.ContextOuterClass.SliceStatus value) {
-        if (sliceStatusBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          sliceStatus_ = value;
+        if (!other.getOwnerString().isEmpty()) {
+          ownerString_ = other.ownerString_;
           onChanged();
-        } else {
-          sliceStatusBuilder_.setMessage(value);
         }
-
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
         return this;
       }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder setSliceStatus(
-          context.ContextOuterClass.SliceStatus.Builder builderForValue) {
-        if (sliceStatusBuilder_ == null) {
-          sliceStatus_ = builderForValue.build();
-          onChanged();
-        } else {
-          sliceStatusBuilder_.setMessage(builderForValue.build());
-        }
 
-        return this;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder mergeSliceStatus(context.ContextOuterClass.SliceStatus value) {
-        if (sliceStatusBuilder_ == null) {
-          if (sliceStatus_ != null) {
-            sliceStatus_ =
-              context.ContextOuterClass.SliceStatus.newBuilder(sliceStatus_).mergeFrom(value).buildPartial();
-          } else {
-            sliceStatus_ = value;
-          }
-          onChanged();
-        } else {
-          sliceStatusBuilder_.mergeFrom(value);
-        }
 
-        return this;
-      }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder clearSliceStatus() {
-        if (sliceStatusBuilder_ == null) {
-          sliceStatus_ = null;
-          onChanged();
-        } else {
-          sliceStatus_ = null;
-          sliceStatusBuilder_ = null;
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.SliceOwner parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.SliceOwner) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
         }
-
         return this;
       }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public context.ContextOuterClass.SliceStatus.Builder getSliceStatusBuilder() {
-        
-        onChanged();
-        return getSliceStatusFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public context.ContextOuterClass.SliceStatusOrBuilder getSliceStatusOrBuilder() {
-        if (sliceStatusBuilder_ != null) {
-          return sliceStatusBuilder_.getMessageOrBuilder();
-        } else {
-          return sliceStatus_ == null ?
-              context.ContextOuterClass.SliceStatus.getDefaultInstance() : sliceStatus_;
-        }
-      }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceStatus, context.ContextOuterClass.SliceStatus.Builder, context.ContextOuterClass.SliceStatusOrBuilder> 
-          getSliceStatusFieldBuilder() {
-        if (sliceStatusBuilder_ == null) {
-          sliceStatusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.SliceStatus, context.ContextOuterClass.SliceStatus.Builder, context.ContextOuterClass.SliceStatusOrBuilder>(
-                  getSliceStatus(),
-                  getParentForChildren(),
-                  isClean());
-          sliceStatus_ = null;
-        }
-        return sliceStatusBuilder_;
-      }
 
-      private context.ContextOuterClass.SliceConfig sliceConfig_;
+      private context.ContextOuterClass.Uuid ownerUuid_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder> sliceConfigBuilder_;
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> ownerUuidBuilder_;
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
-       * @return Whether the sliceConfig field is set.
+       * <code>.context.Uuid owner_uuid = 1;</code>
+       * @return Whether the ownerUuid field is set.
        */
-      public boolean hasSliceConfig() {
-        return sliceConfigBuilder_ != null || sliceConfig_ != null;
+      public boolean hasOwnerUuid() {
+        return ownerUuidBuilder_ != null || ownerUuid_ != null;
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
-       * @return The sliceConfig.
+       * <code>.context.Uuid owner_uuid = 1;</code>
+       * @return The ownerUuid.
        */
-      public context.ContextOuterClass.SliceConfig getSliceConfig() {
-        if (sliceConfigBuilder_ == null) {
-          return sliceConfig_ == null ? context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
+      public context.ContextOuterClass.Uuid getOwnerUuid() {
+        if (ownerUuidBuilder_ == null) {
+          return ownerUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
         } else {
-          return sliceConfigBuilder_.getMessage();
+          return ownerUuidBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
+       * <code>.context.Uuid owner_uuid = 1;</code>
        */
-      public Builder setSliceConfig(context.ContextOuterClass.SliceConfig value) {
-        if (sliceConfigBuilder_ == null) {
+      public Builder setOwnerUuid(context.ContextOuterClass.Uuid value) {
+        if (ownerUuidBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          sliceConfig_ = value;
+          ownerUuid_ = value;
           onChanged();
         } else {
-          sliceConfigBuilder_.setMessage(value);
+          ownerUuidBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
+       * <code>.context.Uuid owner_uuid = 1;</code>
        */
-      public Builder setSliceConfig(
-          context.ContextOuterClass.SliceConfig.Builder builderForValue) {
-        if (sliceConfigBuilder_ == null) {
-          sliceConfig_ = builderForValue.build();
+      public Builder setOwnerUuid(
+          context.ContextOuterClass.Uuid.Builder builderForValue) {
+        if (ownerUuidBuilder_ == null) {
+          ownerUuid_ = builderForValue.build();
           onChanged();
         } else {
-          sliceConfigBuilder_.setMessage(builderForValue.build());
+          ownerUuidBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
+       * <code>.context.Uuid owner_uuid = 1;</code>
        */
-      public Builder mergeSliceConfig(context.ContextOuterClass.SliceConfig value) {
-        if (sliceConfigBuilder_ == null) {
-          if (sliceConfig_ != null) {
-            sliceConfig_ =
-              context.ContextOuterClass.SliceConfig.newBuilder(sliceConfig_).mergeFrom(value).buildPartial();
+      public Builder mergeOwnerUuid(context.ContextOuterClass.Uuid value) {
+        if (ownerUuidBuilder_ == null) {
+          if (ownerUuid_ != null) {
+            ownerUuid_ =
+              context.ContextOuterClass.Uuid.newBuilder(ownerUuid_).mergeFrom(value).buildPartial();
           } else {
-            sliceConfig_ = value;
+            ownerUuid_ = value;
           }
           onChanged();
         } else {
-          sliceConfigBuilder_.mergeFrom(value);
+          ownerUuidBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
+       * <code>.context.Uuid owner_uuid = 1;</code>
        */
-      public Builder clearSliceConfig() {
-        if (sliceConfigBuilder_ == null) {
-          sliceConfig_ = null;
+      public Builder clearOwnerUuid() {
+        if (ownerUuidBuilder_ == null) {
+          ownerUuid_ = null;
           onChanged();
         } else {
-          sliceConfig_ = null;
-          sliceConfigBuilder_ = null;
+          ownerUuid_ = null;
+          ownerUuidBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
+       * <code>.context.Uuid owner_uuid = 1;</code>
        */
-      public context.ContextOuterClass.SliceConfig.Builder getSliceConfigBuilder() {
+      public context.ContextOuterClass.Uuid.Builder getOwnerUuidBuilder() {
         
         onChanged();
-        return getSliceConfigFieldBuilder().getBuilder();
+        return getOwnerUuidFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
+       * <code>.context.Uuid owner_uuid = 1;</code>
        */
-      public context.ContextOuterClass.SliceConfigOrBuilder getSliceConfigOrBuilder() {
-        if (sliceConfigBuilder_ != null) {
-          return sliceConfigBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder() {
+        if (ownerUuidBuilder_ != null) {
+          return ownerUuidBuilder_.getMessageOrBuilder();
         } else {
-          return sliceConfig_ == null ?
-              context.ContextOuterClass.SliceConfig.getDefaultInstance() : sliceConfig_;
+          return ownerUuid_ == null ?
+              context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+        }
+      }
+      /**
+       * <code>.context.Uuid owner_uuid = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
+          getOwnerUuidFieldBuilder() {
+        if (ownerUuidBuilder_ == null) {
+          ownerUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
+                  getOwnerUuid(),
+                  getParentForChildren(),
+                  isClean());
+          ownerUuid_ = null;
+        }
+        return ownerUuidBuilder_;
+      }
+
+      private java.lang.Object ownerString_ = "";
+      /**
+       * <code>string owner_string = 2;</code>
+       * @return The ownerString.
+       */
+      public java.lang.String getOwnerString() {
+        java.lang.Object ref = ownerString_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          ownerString_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string owner_string = 2;</code>
+       * @return The bytes for ownerString.
+       */
+      public com.google.protobuf.ByteString
+          getOwnerStringBytes() {
+        java.lang.Object ref = ownerString_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          ownerString_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string owner_string = 2;</code>
+       * @param value The ownerString to set.
+       * @return This builder for chaining.
+       */
+      public Builder setOwnerString(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        ownerString_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string owner_string = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearOwnerString() {
+        
+        ownerString_ = getDefaultInstance().getOwnerString();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string owner_string = 2;</code>
+       * @param value The bytes for ownerString to set.
+       * @return This builder for chaining.
+       */
+      public Builder setOwnerStringBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        ownerString_ = value;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:context.SliceOwner)
+    }
+
+    // @@protoc_insertion_point(class_scope:context.SliceOwner)
+    private static final context.ContextOuterClass.SliceOwner DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceOwner();
+    }
+
+    public static context.ContextOuterClass.SliceOwner getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<SliceOwner>
+        PARSER = new com.google.protobuf.AbstractParser<SliceOwner>() {
+      @java.lang.Override
+      public SliceOwner parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new SliceOwner(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<SliceOwner> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<SliceOwner> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public context.ContextOuterClass.SliceOwner getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface SliceStatusOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceStatus)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.SliceStatusEnum slice_status = 1;</code>
+     * @return The enum numeric value on the wire for sliceStatus.
+     */
+    int getSliceStatusValue();
+    /**
+     * <code>.context.SliceStatusEnum slice_status = 1;</code>
+     * @return The sliceStatus.
+     */
+    context.ContextOuterClass.SliceStatusEnum getSliceStatus();
+  }
+  /**
+   * Protobuf type {@code context.SliceStatus}
+   */
+  public static final class SliceStatus extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.SliceStatus)
+      SliceStatusOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use SliceStatus.newBuilder() to construct.
+    private SliceStatus(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private SliceStatus() {
+      sliceStatus_ = 0;
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new SliceStatus();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private SliceStatus(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+              int rawValue = input.readEnum();
+
+              sliceStatus_ = rawValue;
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
         }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return context.ContextOuterClass.internal_static_context_SliceStatus_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              context.ContextOuterClass.SliceStatus.class, context.ContextOuterClass.SliceStatus.Builder.class);
+    }
+
+    public static final int SLICE_STATUS_FIELD_NUMBER = 1;
+    private int sliceStatus_;
+    /**
+     * <code>.context.SliceStatusEnum slice_status = 1;</code>
+     * @return The enum numeric value on the wire for sliceStatus.
+     */
+    @java.lang.Override public int getSliceStatusValue() {
+      return sliceStatus_;
+    }
+    /**
+     * <code>.context.SliceStatusEnum slice_status = 1;</code>
+     * @return The sliceStatus.
+     */
+    @java.lang.Override public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
+      @SuppressWarnings("deprecation")
+      context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
+      return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
+        output.writeEnum(1, sliceStatus_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, sliceStatus_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof context.ContextOuterClass.SliceStatus)) {
+        return super.equals(obj);
+      }
+      context.ContextOuterClass.SliceStatus other = (context.ContextOuterClass.SliceStatus) obj;
+
+      if (sliceStatus_ != other.sliceStatus_) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + SLICE_STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + sliceStatus_;
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceStatus parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.SliceStatus parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.SliceStatus parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(context.ContextOuterClass.SliceStatus prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code context.SliceStatus}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.SliceStatus)
+        context.ContextOuterClass.SliceStatusOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return context.ContextOuterClass.internal_static_context_SliceStatus_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                context.ContextOuterClass.SliceStatus.class, context.ContextOuterClass.SliceStatus.Builder.class);
       }
-      /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder> 
-          getSliceConfigFieldBuilder() {
-        if (sliceConfigBuilder_ == null) {
-          sliceConfigBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder>(
-                  getSliceConfig(),
-                  getParentForChildren(),
-                  isClean());
-          sliceConfig_ = null;
-        }
-        return sliceConfigBuilder_;
+
+      // Construct using context.ContextOuterClass.SliceStatus.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
       }
 
-      private context.ContextOuterClass.SliceOwner sliceOwner_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceOwner, context.ContextOuterClass.SliceOwner.Builder, context.ContextOuterClass.SliceOwnerOrBuilder> sliceOwnerBuilder_;
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       * @return Whether the sliceOwner field is set.
-       */
-      public boolean hasSliceOwner() {
-        return sliceOwnerBuilder_ != null || sliceOwner_ != null;
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       * @return The sliceOwner.
-       */
-      public context.ContextOuterClass.SliceOwner getSliceOwner() {
-        if (sliceOwnerBuilder_ == null) {
-          return sliceOwner_ == null ? context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
-        } else {
-          return sliceOwnerBuilder_.getMessage();
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
         }
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      public Builder setSliceOwner(context.ContextOuterClass.SliceOwner value) {
-        if (sliceOwnerBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          sliceOwner_ = value;
-          onChanged();
-        } else {
-          sliceOwnerBuilder_.setMessage(value);
-        }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        sliceStatus_ = 0;
 
         return this;
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      public Builder setSliceOwner(
-          context.ContextOuterClass.SliceOwner.Builder builderForValue) {
-        if (sliceOwnerBuilder_ == null) {
-          sliceOwner_ = builderForValue.build();
-          onChanged();
-        } else {
-          sliceOwnerBuilder_.setMessage(builderForValue.build());
-        }
 
-        return this;
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      public Builder mergeSliceOwner(context.ContextOuterClass.SliceOwner value) {
-        if (sliceOwnerBuilder_ == null) {
-          if (sliceOwner_ != null) {
-            sliceOwner_ =
-              context.ContextOuterClass.SliceOwner.newBuilder(sliceOwner_).mergeFrom(value).buildPartial();
-          } else {
-            sliceOwner_ = value;
-          }
-          onChanged();
-        } else {
-          sliceOwnerBuilder_.mergeFrom(value);
-        }
 
-        return this;
+      @java.lang.Override
+      public context.ContextOuterClass.SliceStatus getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceStatus.getDefaultInstance();
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      public Builder clearSliceOwner() {
-        if (sliceOwnerBuilder_ == null) {
-          sliceOwner_ = null;
-          onChanged();
-        } else {
-          sliceOwner_ = null;
-          sliceOwnerBuilder_ = null;
+
+      @java.lang.Override
+      public context.ContextOuterClass.SliceStatus build() {
+        context.ContextOuterClass.SliceStatus result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
         }
+        return result;
+      }
 
-        return this;
+      @java.lang.Override
+      public context.ContextOuterClass.SliceStatus buildPartial() {
+        context.ContextOuterClass.SliceStatus result = new context.ContextOuterClass.SliceStatus(this);
+        result.sliceStatus_ = sliceStatus_;
+        onBuilt();
+        return result;
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      public context.ContextOuterClass.SliceOwner.Builder getSliceOwnerBuilder() {
-        
-        onChanged();
-        return getSliceOwnerFieldBuilder().getBuilder();
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      public context.ContextOuterClass.SliceOwnerOrBuilder getSliceOwnerOrBuilder() {
-        if (sliceOwnerBuilder_ != null) {
-          return sliceOwnerBuilder_.getMessageOrBuilder();
-        } else {
-          return sliceOwner_ == null ?
-              context.ContextOuterClass.SliceOwner.getDefaultInstance() : sliceOwner_;
-        }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
       }
-      /**
-       * <code>.context.SliceOwner slice_owner = 9;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceOwner, context.ContextOuterClass.SliceOwner.Builder, context.ContextOuterClass.SliceOwnerOrBuilder> 
-          getSliceOwnerFieldBuilder() {
-        if (sliceOwnerBuilder_ == null) {
-          sliceOwnerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.SliceOwner, context.ContextOuterClass.SliceOwner.Builder, context.ContextOuterClass.SliceOwnerOrBuilder>(
-                  getSliceOwner(),
-                  getParentForChildren(),
-                  isClean());
-          sliceOwner_ = null;
-        }
-        return sliceOwnerBuilder_;
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
       }
-
-      private context.ContextOuterClass.Timestamp timestamp_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> timestampBuilder_;
-      /**
-       * <code>.context.Timestamp timestamp = 10;</code>
-       * @return Whether the timestamp field is set.
-       */
-      public boolean hasTimestamp() {
-        return timestampBuilder_ != null || timestamp_ != null;
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
       }
-      /**
-       * <code>.context.Timestamp timestamp = 10;</code>
-       * @return The timestamp.
-       */
-      public context.ContextOuterClass.Timestamp getTimestamp() {
-        if (timestampBuilder_ == null) {
-          return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
-        } else {
-          return timestampBuilder_.getMessage();
-        }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
       }
-      /**
-       * <code>.context.Timestamp timestamp = 10;</code>
-       */
-      public Builder setTimestamp(context.ContextOuterClass.Timestamp value) {
-        if (timestampBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          timestamp_ = value;
-          onChanged();
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.SliceStatus) {
+          return mergeFrom((context.ContextOuterClass.SliceStatus)other);
         } else {
-          timestampBuilder_.setMessage(value);
+          super.mergeFrom(other);
+          return this;
         }
+      }
 
+      public Builder mergeFrom(context.ContextOuterClass.SliceStatus other) {
+        if (other == context.ContextOuterClass.SliceStatus.getDefaultInstance()) return this;
+        if (other.sliceStatus_ != 0) {
+          setSliceStatusValue(other.getSliceStatusValue());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
         return this;
       }
-      /**
-       * <code>.context.Timestamp timestamp = 10;</code>
-       */
-      public Builder setTimestamp(
-          context.ContextOuterClass.Timestamp.Builder builderForValue) {
-        if (timestampBuilder_ == null) {
-          timestamp_ = builderForValue.build();
-          onChanged();
-        } else {
-          timestampBuilder_.setMessage(builderForValue.build());
-        }
 
-        return this;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
-      /**
-       * <code>.context.Timestamp timestamp = 10;</code>
-       */
-      public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
-        if (timestampBuilder_ == null) {
-          if (timestamp_ != null) {
-            timestamp_ =
-              context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
-          } else {
-            timestamp_ = value;
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.SliceStatus parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.SliceStatus) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
           }
-          onChanged();
-        } else {
-          timestampBuilder_.mergeFrom(value);
         }
-
         return this;
       }
+
+      private int sliceStatus_ = 0;
       /**
-       * <code>.context.Timestamp timestamp = 10;</code>
+       * <code>.context.SliceStatusEnum slice_status = 1;</code>
+       * @return The enum numeric value on the wire for sliceStatus.
        */
-      public Builder clearTimestamp() {
-        if (timestampBuilder_ == null) {
-          timestamp_ = null;
-          onChanged();
-        } else {
-          timestamp_ = null;
-          timestampBuilder_ = null;
-        }
-
-        return this;
+      @java.lang.Override public int getSliceStatusValue() {
+        return sliceStatus_;
       }
       /**
-       * <code>.context.Timestamp timestamp = 10;</code>
+       * <code>.context.SliceStatusEnum slice_status = 1;</code>
+       * @param value The enum numeric value on the wire for sliceStatus to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
+      public Builder setSliceStatusValue(int value) {
         
+        sliceStatus_ = value;
         onChanged();
-        return getTimestampFieldBuilder().getBuilder();
+        return this;
       }
       /**
-       * <code>.context.Timestamp timestamp = 10;</code>
+       * <code>.context.SliceStatusEnum slice_status = 1;</code>
+       * @return The sliceStatus.
        */
-      public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-        if (timestampBuilder_ != null) {
-          return timestampBuilder_.getMessageOrBuilder();
-        } else {
-          return timestamp_ == null ?
-              context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
-        }
+      @java.lang.Override
+      public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
+        @SuppressWarnings("deprecation")
+        context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
+        return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
       }
       /**
-       * <code>.context.Timestamp timestamp = 10;</code>
+       * <code>.context.SliceStatusEnum slice_status = 1;</code>
+       * @param value The sliceStatus to set.
+       * @return This builder for chaining.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
-          getTimestampFieldBuilder() {
-        if (timestampBuilder_ == null) {
-          timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder>(
-                  getTimestamp(),
-                  getParentForChildren(),
-                  isClean());
-          timestamp_ = null;
+      public Builder setSliceStatus(context.ContextOuterClass.SliceStatusEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
         }
-        return timestampBuilder_;
+        
+        sliceStatus_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.SliceStatusEnum slice_status = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSliceStatus() {
+        
+        sliceStatus_ = 0;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -36650,98 +40016,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Slice)
+      // @@protoc_insertion_point(builder_scope:context.SliceStatus)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Slice)
-    private static final context.ContextOuterClass.Slice DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.SliceStatus)
+    private static final context.ContextOuterClass.SliceStatus DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Slice();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceStatus();
     }
 
-    public static context.ContextOuterClass.Slice getDefaultInstance() {
+    public static context.ContextOuterClass.SliceStatus getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Slice>
-        PARSER = new com.google.protobuf.AbstractParser<Slice>() {
+    private static final com.google.protobuf.Parser<SliceStatus>
+        PARSER = new com.google.protobuf.AbstractParser<SliceStatus>() {
       @java.lang.Override
-      public Slice parsePartialFrom(
+      public SliceStatus parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Slice(input, extensionRegistry);
+        return new SliceStatus(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Slice> parser() {
+    public static com.google.protobuf.Parser<SliceStatus> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Slice> getParserForType() {
+    public com.google.protobuf.Parser<SliceStatus> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Slice getDefaultInstanceForType() {
+    public context.ContextOuterClass.SliceStatus getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface SliceOwnerOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.SliceOwner)
+  public interface SliceConfigOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceConfig)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Uuid owner_uuid = 1;</code>
-     * @return Whether the ownerUuid field is set.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    boolean hasOwnerUuid();
+    java.util.List<context.ContextOuterClass.ConfigRule> 
+        getConfigRulesList();
     /**
-     * <code>.context.Uuid owner_uuid = 1;</code>
-     * @return The ownerUuid.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    context.ContextOuterClass.Uuid getOwnerUuid();
+    context.ContextOuterClass.ConfigRule getConfigRules(int index);
     /**
-     * <code>.context.Uuid owner_uuid = 1;</code>
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder();
-
+    int getConfigRulesCount();
     /**
-     * <code>string owner_string = 2;</code>
-     * @return The ownerString.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    java.lang.String getOwnerString();
+    java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
+        getConfigRulesOrBuilderList();
     /**
-     * <code>string owner_string = 2;</code>
-     * @return The bytes for ownerString.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
-    com.google.protobuf.ByteString
-        getOwnerStringBytes();
+    context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.SliceOwner}
+   * Protobuf type {@code context.SliceConfig}
    */
-  public static final class SliceOwner extends
+  public static final class SliceConfig extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.SliceOwner)
-      SliceOwnerOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.SliceConfig)
+      SliceConfigOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use SliceOwner.newBuilder() to construct.
-    private SliceOwner(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use SliceConfig.newBuilder() to construct.
+    private SliceConfig(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SliceOwner() {
-      ownerString_ = "";
+    private SliceConfig() {
+      configRules_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SliceOwner();
+      return new SliceConfig();
     }
 
     @java.lang.Override
@@ -36749,7 +40112,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SliceOwner(
+    private SliceConfig(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -36757,6 +40120,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -36768,22 +40132,12 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Uuid.Builder subBuilder = null;
-              if (ownerUuid_ != null) {
-                subBuilder = ownerUuid_.toBuilder();
-              }
-              ownerUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(ownerUuid_);
-                ownerUuid_ = subBuilder.buildPartial();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>();
+                mutable_bitField0_ |= 0x00000001;
               }
-
-              break;
-            }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              ownerString_ = s;
+              configRules_.add(
+                  input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -36801,85 +40155,64 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          configRules_ = java.util.Collections.unmodifiableList(configRules_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
+      return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_SliceOwner_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_SliceConfig_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.SliceOwner.class, context.ContextOuterClass.SliceOwner.Builder.class);
+              context.ContextOuterClass.SliceConfig.class, context.ContextOuterClass.SliceConfig.Builder.class);
     }
 
-    public static final int OWNER_UUID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Uuid ownerUuid_;
+    public static final int CONFIG_RULES_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.ConfigRule> configRules_;
     /**
-     * <code>.context.Uuid owner_uuid = 1;</code>
-     * @return Whether the ownerUuid field is set.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
     @java.lang.Override
-    public boolean hasOwnerUuid() {
-      return ownerUuid_ != null;
+    public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
+      return configRules_;
     }
     /**
-     * <code>.context.Uuid owner_uuid = 1;</code>
-     * @return The ownerUuid.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.Uuid getOwnerUuid() {
-      return ownerUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+    public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
+        getConfigRulesOrBuilderList() {
+      return configRules_;
     }
     /**
-     * <code>.context.Uuid owner_uuid = 1;</code>
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder() {
-      return getOwnerUuid();
+    public int getConfigRulesCount() {
+      return configRules_.size();
     }
-
-    public static final int OWNER_STRING_FIELD_NUMBER = 2;
-    private volatile java.lang.Object ownerString_;
     /**
-     * <code>string owner_string = 2;</code>
-     * @return The ownerString.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
     @java.lang.Override
-    public java.lang.String getOwnerString() {
-      java.lang.Object ref = ownerString_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        ownerString_ = s;
-        return s;
-      }
+    public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
+      return configRules_.get(index);
     }
     /**
-     * <code>string owner_string = 2;</code>
-     * @return The bytes for ownerString.
+     * <code>repeated .context.ConfigRule config_rules = 1;</code>
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getOwnerStringBytes() {
-      java.lang.Object ref = ownerString_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        ownerString_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+        int index) {
+      return configRules_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -36896,11 +40229,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (ownerUuid_ != null) {
-        output.writeMessage(1, getOwnerUuid());
-      }
-      if (!getOwnerStringBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ownerString_);
+      for (int i = 0; i < configRules_.size(); i++) {
+        output.writeMessage(1, configRules_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -36911,12 +40241,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (ownerUuid_ != null) {
+      for (int i = 0; i < configRules_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getOwnerUuid());
-      }
-      if (!getOwnerStringBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ownerString_);
+          .computeMessageSize(1, configRules_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -36928,18 +40255,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.SliceOwner)) {
+      if (!(obj instanceof context.ContextOuterClass.SliceConfig)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.SliceOwner other = (context.ContextOuterClass.SliceOwner) obj;
+      context.ContextOuterClass.SliceConfig other = (context.ContextOuterClass.SliceConfig) obj;
 
-      if (hasOwnerUuid() != other.hasOwnerUuid()) return false;
-      if (hasOwnerUuid()) {
-        if (!getOwnerUuid()
-            .equals(other.getOwnerUuid())) return false;
-      }
-      if (!getOwnerString()
-          .equals(other.getOwnerString())) return false;
+      if (!getConfigRulesList()
+          .equals(other.getConfigRulesList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -36951,80 +40273,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasOwnerUuid()) {
-        hash = (37 * hash) + OWNER_UUID_FIELD_NUMBER;
-        hash = (53 * hash) + getOwnerUuid().hashCode();
+      if (getConfigRulesCount() > 0) {
+        hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
+        hash = (53 * hash) + getConfigRulesList().hashCode();
       }
-      hash = (37 * hash) + OWNER_STRING_FIELD_NUMBER;
-      hash = (53 * hash) + getOwnerString().hashCode();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(byte[] data)
+    public static context.ContextOuterClass.SliceConfig parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceConfig parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceOwner parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceConfig parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceOwner parseDelimitedFrom(
+    public static context.ContextOuterClass.SliceConfig parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceOwner parseFrom(
+    public static context.ContextOuterClass.SliceConfig parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -37037,7 +40357,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.SliceOwner prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.SliceConfig prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -37053,26 +40373,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.SliceOwner}
+     * Protobuf type {@code context.SliceConfig}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        context.ContextOuterClass.SliceOwnerOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.SliceConfig)
+        context.ContextOuterClass.SliceConfigOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_SliceOwner_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_SliceConfig_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.SliceOwner.class, context.ContextOuterClass.SliceOwner.Builder.class);
+                context.ContextOuterClass.SliceConfig.class, context.ContextOuterClass.SliceConfig.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.SliceOwner.newBuilder()
+      // Construct using context.ContextOuterClass.SliceConfig.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -37085,36 +40405,35 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getConfigRulesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (ownerUuidBuilder_ == null) {
-          ownerUuid_ = null;
+        if (configRulesBuilder_ == null) {
+          configRules_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          ownerUuid_ = null;
-          ownerUuidBuilder_ = null;
+          configRulesBuilder_.clear();
         }
-        ownerString_ = "";
-
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceOwner getDefaultInstanceForType() {
-        return context.ContextOuterClass.SliceOwner.getDefaultInstance();
+      public context.ContextOuterClass.SliceConfig getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceConfig.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceOwner build() {
-        context.ContextOuterClass.SliceOwner result = buildPartial();
+      public context.ContextOuterClass.SliceConfig build() {
+        context.ContextOuterClass.SliceConfig result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -37122,14 +40441,18 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceOwner buildPartial() {
-        context.ContextOuterClass.SliceOwner result = new context.ContextOuterClass.SliceOwner(this);
-        if (ownerUuidBuilder_ == null) {
-          result.ownerUuid_ = ownerUuid_;
+      public context.ContextOuterClass.SliceConfig buildPartial() {
+        context.ContextOuterClass.SliceConfig result = new context.ContextOuterClass.SliceConfig(this);
+        int from_bitField0_ = bitField0_;
+        if (configRulesBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            configRules_ = java.util.Collections.unmodifiableList(configRules_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.configRules_ = configRules_;
         } else {
-          result.ownerUuid_ = ownerUuidBuilder_.build();
+          result.configRules_ = configRulesBuilder_.build();
         }
-        result.ownerString_ = ownerString_;
         onBuilt();
         return result;
       }
@@ -37168,22 +40491,41 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.SliceOwner) {
-          return mergeFrom((context.ContextOuterClass.SliceOwner)other);
+        if (other instanceof context.ContextOuterClass.SliceConfig) {
+          return mergeFrom((context.ContextOuterClass.SliceConfig)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.SliceOwner other) {
-        if (other == context.ContextOuterClass.SliceOwner.getDefaultInstance()) return this;
-        if (other.hasOwnerUuid()) {
-          mergeOwnerUuid(other.getOwnerUuid());
-        }
-        if (!other.getOwnerString().isEmpty()) {
-          ownerString_ = other.ownerString_;
-          onChanged();
+      public Builder mergeFrom(context.ContextOuterClass.SliceConfig other) {
+        if (other == context.ContextOuterClass.SliceConfig.getDefaultInstance()) return this;
+        if (configRulesBuilder_ == null) {
+          if (!other.configRules_.isEmpty()) {
+            if (configRules_.isEmpty()) {
+              configRules_ = other.configRules_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureConfigRulesIsMutable();
+              configRules_.addAll(other.configRules_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.configRules_.isEmpty()) {
+            if (configRulesBuilder_.isEmpty()) {
+              configRulesBuilder_.dispose();
+              configRulesBuilder_ = null;
+              configRules_ = other.configRules_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              configRulesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getConfigRulesFieldBuilder() : null;
+            } else {
+              configRulesBuilder_.addAllMessages(other.configRules_);
+            }
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -37200,11 +40542,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.SliceOwner parsedMessage = null;
+        context.ContextOuterClass.SliceConfig parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.SliceOwner) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.SliceConfig) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -37213,200 +40555,246 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
+
+      private java.util.List<context.ContextOuterClass.ConfigRule> configRules_ =
+        java.util.Collections.emptyList();
+      private void ensureConfigRulesIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>(configRules_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> configRulesBuilder_;
 
-      private context.ContextOuterClass.Uuid ownerUuid_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> ownerUuidBuilder_;
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
-       * @return Whether the ownerUuid field is set.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public boolean hasOwnerUuid() {
-        return ownerUuidBuilder_ != null || ownerUuid_ != null;
+      public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
+        if (configRulesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(configRules_);
+        } else {
+          return configRulesBuilder_.getMessageList();
+        }
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
-       * @return The ownerUuid.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public context.ContextOuterClass.Uuid getOwnerUuid() {
-        if (ownerUuidBuilder_ == null) {
-          return ownerUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+      public int getConfigRulesCount() {
+        if (configRulesBuilder_ == null) {
+          return configRules_.size();
         } else {
-          return ownerUuidBuilder_.getMessage();
+          return configRulesBuilder_.getCount();
         }
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder setOwnerUuid(context.ContextOuterClass.Uuid value) {
-        if (ownerUuidBuilder_ == null) {
+      public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
+        if (configRulesBuilder_ == null) {
+          return configRules_.get(index);
+        } else {
+          return configRulesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public Builder setConfigRules(
+          int index, context.ContextOuterClass.ConfigRule value) {
+        if (configRulesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ownerUuid_ = value;
+          ensureConfigRulesIsMutable();
+          configRules_.set(index, value);
           onChanged();
         } else {
-          ownerUuidBuilder_.setMessage(value);
+          configRulesBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder setOwnerUuid(
-          context.ContextOuterClass.Uuid.Builder builderForValue) {
-        if (ownerUuidBuilder_ == null) {
-          ownerUuid_ = builderForValue.build();
+      public Builder setConfigRules(
+          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.set(index, builderForValue.build());
           onChanged();
         } else {
-          ownerUuidBuilder_.setMessage(builderForValue.build());
+          configRulesBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder mergeOwnerUuid(context.ContextOuterClass.Uuid value) {
-        if (ownerUuidBuilder_ == null) {
-          if (ownerUuid_ != null) {
-            ownerUuid_ =
-              context.ContextOuterClass.Uuid.newBuilder(ownerUuid_).mergeFrom(value).buildPartial();
-          } else {
-            ownerUuid_ = value;
+      public Builder addConfigRules(context.ContextOuterClass.ConfigRule value) {
+        if (configRulesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureConfigRulesIsMutable();
+          configRules_.add(value);
           onChanged();
         } else {
-          ownerUuidBuilder_.mergeFrom(value);
+          configRulesBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder clearOwnerUuid() {
-        if (ownerUuidBuilder_ == null) {
-          ownerUuid_ = null;
+      public Builder addConfigRules(
+          int index, context.ContextOuterClass.ConfigRule value) {
+        if (configRulesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConfigRulesIsMutable();
+          configRules_.add(index, value);
           onChanged();
         } else {
-          ownerUuid_ = null;
-          ownerUuidBuilder_ = null;
+          configRulesBuilder_.addMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public context.ContextOuterClass.Uuid.Builder getOwnerUuidBuilder() {
-        
-        onChanged();
-        return getOwnerUuidFieldBuilder().getBuilder();
+      public Builder addConfigRules(
+          context.ContextOuterClass.ConfigRule.Builder builderForValue) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.add(builderForValue.build());
+          onChanged();
+        } else {
+          configRulesBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public context.ContextOuterClass.UuidOrBuilder getOwnerUuidOrBuilder() {
-        if (ownerUuidBuilder_ != null) {
-          return ownerUuidBuilder_.getMessageOrBuilder();
+      public Builder addConfigRules(
+          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.add(index, builderForValue.build());
+          onChanged();
         } else {
-          return ownerUuid_ == null ?
-              context.ContextOuterClass.Uuid.getDefaultInstance() : ownerUuid_;
+          configRulesBuilder_.addMessage(index, builderForValue.build());
         }
+        return this;
       }
       /**
-       * <code>.context.Uuid owner_uuid = 1;</code>
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
-          getOwnerUuidFieldBuilder() {
-        if (ownerUuidBuilder_ == null) {
-          ownerUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
-                  getOwnerUuid(),
-                  getParentForChildren(),
-                  isClean());
-          ownerUuid_ = null;
+      public Builder addAllConfigRules(
+          java.lang.Iterable<? extends context.ContextOuterClass.ConfigRule> values) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, configRules_);
+          onChanged();
+        } else {
+          configRulesBuilder_.addAllMessages(values);
         }
-        return ownerUuidBuilder_;
+        return this;
       }
-
-      private java.lang.Object ownerString_ = "";
       /**
-       * <code>string owner_string = 2;</code>
-       * @return The ownerString.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public java.lang.String getOwnerString() {
-        java.lang.Object ref = ownerString_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          ownerString_ = s;
-          return s;
+      public Builder clearConfigRules() {
+        if (configRulesBuilder_ == null) {
+          configRules_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
         } else {
-          return (java.lang.String) ref;
+          configRulesBuilder_.clear();
         }
+        return this;
       }
       /**
-       * <code>string owner_string = 2;</code>
-       * @return The bytes for ownerString.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public com.google.protobuf.ByteString
-          getOwnerStringBytes() {
-        java.lang.Object ref = ownerString_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          ownerString_ = b;
-          return b;
+      public Builder removeConfigRules(int index) {
+        if (configRulesBuilder_ == null) {
+          ensureConfigRulesIsMutable();
+          configRules_.remove(index);
+          onChanged();
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          configRulesBuilder_.remove(index);
         }
+        return this;
       }
       /**
-       * <code>string owner_string = 2;</code>
-       * @param value The ownerString to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder setOwnerString(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        ownerString_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConfigRule.Builder getConfigRulesBuilder(
+          int index) {
+        return getConfigRulesFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>string owner_string = 2;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder clearOwnerString() {
-        
-        ownerString_ = getDefaultInstance().getOwnerString();
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+          int index) {
+        if (configRulesBuilder_ == null) {
+          return configRules_.get(index);  } else {
+          return configRulesBuilder_.getMessageOrBuilder(index);
+        }
       }
       /**
-       * <code>string owner_string = 2;</code>
-       * @param value The bytes for ownerString to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
-      public Builder setOwnerStringBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        ownerString_ = value;
-        onChanged();
-        return this;
+      public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
+           getConfigRulesOrBuilderList() {
+        if (configRulesBuilder_ != null) {
+          return configRulesBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(configRules_);
+        }
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder() {
+        return getConfigRulesFieldBuilder().addBuilder(
+            context.ContextOuterClass.ConfigRule.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder(
+          int index) {
+        return getConfigRulesFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.ConfigRule.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       */
+      public java.util.List<context.ContextOuterClass.ConfigRule.Builder> 
+           getConfigRulesBuilderList() {
+        return getConfigRulesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> 
+          getConfigRulesFieldBuilder() {
+        if (configRulesBuilder_ == null) {
+          configRulesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder>(
+                  configRules_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          configRules_ = null;
+        }
+        return configRulesBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -37421,82 +40809,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.SliceOwner)
+      // @@protoc_insertion_point(builder_scope:context.SliceConfig)
     }
 
-    // @@protoc_insertion_point(class_scope:context.SliceOwner)
-    private static final context.ContextOuterClass.SliceOwner DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.SliceConfig)
+    private static final context.ContextOuterClass.SliceConfig DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceOwner();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceConfig();
     }
 
-    public static context.ContextOuterClass.SliceOwner getDefaultInstance() {
+    public static context.ContextOuterClass.SliceConfig getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SliceOwner>
-        PARSER = new com.google.protobuf.AbstractParser<SliceOwner>() {
+    private static final com.google.protobuf.Parser<SliceConfig>
+        PARSER = new com.google.protobuf.AbstractParser<SliceConfig>() {
       @java.lang.Override
-      public SliceOwner parsePartialFrom(
+      public SliceConfig parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SliceOwner(input, extensionRegistry);
+        return new SliceConfig(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SliceOwner> parser() {
+    public static com.google.protobuf.Parser<SliceConfig> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SliceOwner> getParserForType() {
+    public com.google.protobuf.Parser<SliceConfig> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.SliceOwner getDefaultInstanceForType() {
+    public context.ContextOuterClass.SliceConfig getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface SliceStatusOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.SliceStatus)
+  public interface SliceIdListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceIdList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.SliceStatusEnum slice_status = 1;</code>
-     * @return The enum numeric value on the wire for sliceStatus.
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
      */
-    int getSliceStatusValue();
+    java.util.List<context.ContextOuterClass.SliceId> 
+        getSliceIdsList();
     /**
-     * <code>.context.SliceStatusEnum slice_status = 1;</code>
-     * @return The sliceStatus.
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
      */
-    context.ContextOuterClass.SliceStatusEnum getSliceStatus();
+    context.ContextOuterClass.SliceId getSliceIds(int index);
+    /**
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     */
+    int getSliceIdsCount();
+    /**
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
+        getSliceIdsOrBuilderList();
+    /**
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     */
+    context.ContextOuterClass.SliceIdOrBuilder getSliceIdsOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.SliceStatus}
+   * Protobuf type {@code context.SliceIdList}
    */
-  public static final class SliceStatus extends
+  public static final class SliceIdList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.SliceStatus)
-      SliceStatusOrBuilder {
-  private static final long serialVersionUID = 0L;
-    // Use SliceStatus.newBuilder() to construct.
-    private SliceStatus(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      // @@protoc_insertion_point(message_implements:context.SliceIdList)
+      SliceIdListOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use SliceIdList.newBuilder() to construct.
+    private SliceIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SliceStatus() {
-      sliceStatus_ = 0;
+    private SliceIdList() {
+      sliceIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SliceStatus();
+      return new SliceIdList();
     }
 
     @java.lang.Override
@@ -37504,7 +40905,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SliceStatus(
+    private SliceIdList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -37512,6 +40913,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -37522,10 +40924,13 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 8: {
-              int rawValue = input.readEnum();
-
-              sliceStatus_ = rawValue;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                sliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              sliceIds_.add(
+                  input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -37543,40 +40948,64 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
+      return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_SliceStatus_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_SliceIdList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.SliceStatus.class, context.ContextOuterClass.SliceStatus.Builder.class);
+              context.ContextOuterClass.SliceIdList.class, context.ContextOuterClass.SliceIdList.Builder.class);
     }
 
-    public static final int SLICE_STATUS_FIELD_NUMBER = 1;
-    private int sliceStatus_;
+    public static final int SLICE_IDS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.SliceId> sliceIds_;
     /**
-     * <code>.context.SliceStatusEnum slice_status = 1;</code>
-     * @return The enum numeric value on the wire for sliceStatus.
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
      */
-    @java.lang.Override public int getSliceStatusValue() {
-      return sliceStatus_;
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.SliceId> getSliceIdsList() {
+      return sliceIds_;
     }
     /**
-     * <code>.context.SliceStatusEnum slice_status = 1;</code>
-     * @return The sliceStatus.
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
      */
-    @java.lang.Override public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
-      @SuppressWarnings("deprecation")
-      context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
-      return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
+        getSliceIdsOrBuilderList() {
+      return sliceIds_;
+    }
+    /**
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     */
+    @java.lang.Override
+    public int getSliceIdsCount() {
+      return sliceIds_.size();
+    }
+    /**
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.SliceId getSliceIds(int index) {
+      return sliceIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.SliceIdOrBuilder getSliceIdsOrBuilder(
+        int index) {
+      return sliceIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -37593,8 +41022,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
-        output.writeEnum(1, sliceStatus_);
+      for (int i = 0; i < sliceIds_.size(); i++) {
+        output.writeMessage(1, sliceIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -37605,9 +41034,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (sliceStatus_ != context.ContextOuterClass.SliceStatusEnum.SLICESTATUS_UNDEFINED.getNumber()) {
+      for (int i = 0; i < sliceIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(1, sliceStatus_);
+          .computeMessageSize(1, sliceIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -37619,12 +41048,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.SliceStatus)) {
+      if (!(obj instanceof context.ContextOuterClass.SliceIdList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.SliceStatus other = (context.ContextOuterClass.SliceStatus) obj;
+      context.ContextOuterClass.SliceIdList other = (context.ContextOuterClass.SliceIdList) obj;
 
-      if (sliceStatus_ != other.sliceStatus_) return false;
+      if (!getSliceIdsList()
+          .equals(other.getSliceIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -37636,76 +41066,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + SLICE_STATUS_FIELD_NUMBER;
-      hash = (53 * hash) + sliceStatus_;
+      if (getSliceIdsCount() > 0) {
+        hash = (37 * hash) + SLICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceIdsList().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(byte[] data)
+    public static context.ContextOuterClass.SliceIdList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceIdList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceStatus parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceIdList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceStatus parseDelimitedFrom(
+    public static context.ContextOuterClass.SliceIdList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceStatus parseFrom(
+    public static context.ContextOuterClass.SliceIdList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -37718,7 +41150,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.SliceStatus prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.SliceIdList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -37734,26 +41166,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.SliceStatus}
+     * Protobuf type {@code context.SliceIdList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceStatus)
-        context.ContextOuterClass.SliceStatusOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.SliceIdList)
+        context.ContextOuterClass.SliceIdListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_SliceStatus_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_SliceIdList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.SliceStatus.class, context.ContextOuterClass.SliceStatus.Builder.class);
+                context.ContextOuterClass.SliceIdList.class, context.ContextOuterClass.SliceIdList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.SliceStatus.newBuilder()
+      // Construct using context.ContextOuterClass.SliceIdList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -37766,30 +41198,35 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getSliceIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        sliceStatus_ = 0;
-
+        if (sliceIdsBuilder_ == null) {
+          sliceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          sliceIdsBuilder_.clear();
+        }
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_SliceStatus_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceStatus getDefaultInstanceForType() {
-        return context.ContextOuterClass.SliceStatus.getDefaultInstance();
+      public context.ContextOuterClass.SliceIdList getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceIdList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceStatus build() {
-        context.ContextOuterClass.SliceStatus result = buildPartial();
+      public context.ContextOuterClass.SliceIdList build() {
+        context.ContextOuterClass.SliceIdList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -37797,9 +41234,18 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceStatus buildPartial() {
-        context.ContextOuterClass.SliceStatus result = new context.ContextOuterClass.SliceStatus(this);
-        result.sliceStatus_ = sliceStatus_;
+      public context.ContextOuterClass.SliceIdList buildPartial() {
+        context.ContextOuterClass.SliceIdList result = new context.ContextOuterClass.SliceIdList(this);
+        int from_bitField0_ = bitField0_;
+        if (sliceIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.sliceIds_ = sliceIds_;
+        } else {
+          result.sliceIds_ = sliceIdsBuilder_.build();
+        }
         onBuilt();
         return result;
       }
@@ -37838,18 +41284,41 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.SliceStatus) {
-          return mergeFrom((context.ContextOuterClass.SliceStatus)other);
+        if (other instanceof context.ContextOuterClass.SliceIdList) {
+          return mergeFrom((context.ContextOuterClass.SliceIdList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.SliceStatus other) {
-        if (other == context.ContextOuterClass.SliceStatus.getDefaultInstance()) return this;
-        if (other.sliceStatus_ != 0) {
-          setSliceStatusValue(other.getSliceStatusValue());
+      public Builder mergeFrom(context.ContextOuterClass.SliceIdList other) {
+        if (other == context.ContextOuterClass.SliceIdList.getDefaultInstance()) return this;
+        if (sliceIdsBuilder_ == null) {
+          if (!other.sliceIds_.isEmpty()) {
+            if (sliceIds_.isEmpty()) {
+              sliceIds_ = other.sliceIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureSliceIdsIsMutable();
+              sliceIds_.addAll(other.sliceIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.sliceIds_.isEmpty()) {
+            if (sliceIdsBuilder_.isEmpty()) {
+              sliceIdsBuilder_.dispose();
+              sliceIdsBuilder_ = null;
+              sliceIds_ = other.sliceIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              sliceIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSliceIdsFieldBuilder() : null;
+            } else {
+              sliceIdsBuilder_.addAllMessages(other.sliceIds_);
+            }
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -37866,11 +41335,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.SliceStatus parsedMessage = null;
+        context.ContextOuterClass.SliceIdList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.SliceStatus) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.SliceIdList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -37879,60 +41348,247 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
+
+      private java.util.List<context.ContextOuterClass.SliceId> sliceIds_ =
+        java.util.Collections.emptyList();
+      private void ensureSliceIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          sliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>(sliceIds_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdsBuilder_;
 
-      private int sliceStatus_ = 0;
       /**
-       * <code>.context.SliceStatusEnum slice_status = 1;</code>
-       * @return The enum numeric value on the wire for sliceStatus.
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
        */
-      @java.lang.Override public int getSliceStatusValue() {
-        return sliceStatus_;
+      public java.util.List<context.ContextOuterClass.SliceId> getSliceIdsList() {
+        if (sliceIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(sliceIds_);
+        } else {
+          return sliceIdsBuilder_.getMessageList();
+        }
       }
       /**
-       * <code>.context.SliceStatusEnum slice_status = 1;</code>
-       * @param value The enum numeric value on the wire for sliceStatus to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
        */
-      public Builder setSliceStatusValue(int value) {
-        
-        sliceStatus_ = value;
-        onChanged();
+      public int getSliceIdsCount() {
+        if (sliceIdsBuilder_ == null) {
+          return sliceIds_.size();
+        } else {
+          return sliceIdsBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public context.ContextOuterClass.SliceId getSliceIds(int index) {
+        if (sliceIdsBuilder_ == null) {
+          return sliceIds_.get(index);
+        } else {
+          return sliceIdsBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public Builder setSliceIds(
+          int index, context.ContextOuterClass.SliceId value) {
+        if (sliceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceIdsIsMutable();
+          sliceIds_.set(index, value);
+          onChanged();
+        } else {
+          sliceIdsBuilder_.setMessage(index, value);
+        }
         return this;
       }
       /**
-       * <code>.context.SliceStatusEnum slice_status = 1;</code>
-       * @return The sliceStatus.
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
        */
-      @java.lang.Override
-      public context.ContextOuterClass.SliceStatusEnum getSliceStatus() {
-        @SuppressWarnings("deprecation")
-        context.ContextOuterClass.SliceStatusEnum result = context.ContextOuterClass.SliceStatusEnum.valueOf(sliceStatus_);
-        return result == null ? context.ContextOuterClass.SliceStatusEnum.UNRECOGNIZED : result;
+      public Builder setSliceIds(
+          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceIdsBuilder_ == null) {
+          ensureSliceIdsIsMutable();
+          sliceIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          sliceIdsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
       }
       /**
-       * <code>.context.SliceStatusEnum slice_status = 1;</code>
-       * @param value The sliceStatus to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
        */
-      public Builder setSliceStatus(context.ContextOuterClass.SliceStatusEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
+      public Builder addSliceIds(context.ContextOuterClass.SliceId value) {
+        if (sliceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceIdsIsMutable();
+          sliceIds_.add(value);
+          onChanged();
+        } else {
+          sliceIdsBuilder_.addMessage(value);
         }
-        
-        sliceStatus_ = value.getNumber();
-        onChanged();
         return this;
       }
       /**
-       * <code>.context.SliceStatusEnum slice_status = 1;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
        */
-      public Builder clearSliceStatus() {
-        
-        sliceStatus_ = 0;
-        onChanged();
+      public Builder addSliceIds(
+          int index, context.ContextOuterClass.SliceId value) {
+        if (sliceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSliceIdsIsMutable();
+          sliceIds_.add(index, value);
+          onChanged();
+        } else {
+          sliceIdsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public Builder addSliceIds(
+          context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceIdsBuilder_ == null) {
+          ensureSliceIdsIsMutable();
+          sliceIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          sliceIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public Builder addSliceIds(
+          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceIdsBuilder_ == null) {
+          ensureSliceIdsIsMutable();
+          sliceIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          sliceIdsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public Builder addAllSliceIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.SliceId> values) {
+        if (sliceIdsBuilder_ == null) {
+          ensureSliceIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, sliceIds_);
+          onChanged();
+        } else {
+          sliceIdsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public Builder clearSliceIds() {
+        if (sliceIdsBuilder_ == null) {
+          sliceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          sliceIdsBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public Builder removeSliceIds(int index) {
+        if (sliceIdsBuilder_ == null) {
+          ensureSliceIdsIsMutable();
+          sliceIds_.remove(index);
+          onChanged();
+        } else {
+          sliceIdsBuilder_.remove(index);
+        }
         return this;
       }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public context.ContextOuterClass.SliceId.Builder getSliceIdsBuilder(
+          int index) {
+        return getSliceIdsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public context.ContextOuterClass.SliceIdOrBuilder getSliceIdsOrBuilder(
+          int index) {
+        if (sliceIdsBuilder_ == null) {
+          return sliceIds_.get(index);  } else {
+          return sliceIdsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
+           getSliceIdsOrBuilderList() {
+        if (sliceIdsBuilder_ != null) {
+          return sliceIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(sliceIds_);
+        }
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public context.ContextOuterClass.SliceId.Builder addSliceIdsBuilder() {
+        return getSliceIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.SliceId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public context.ContextOuterClass.SliceId.Builder addSliceIdsBuilder(
+          int index) {
+        return getSliceIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.SliceId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       */
+      public java.util.List<context.ContextOuterClass.SliceId.Builder> 
+           getSliceIdsBuilderList() {
+        return getSliceIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
+          getSliceIdsFieldBuilder() {
+        if (sliceIdsBuilder_ == null) {
+          sliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
+                  sliceIds_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          sliceIds_ = null;
+        }
+        return sliceIdsBuilder_;
+      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -37946,95 +41602,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.SliceStatus)
+      // @@protoc_insertion_point(builder_scope:context.SliceIdList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.SliceStatus)
-    private static final context.ContextOuterClass.SliceStatus DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.SliceIdList)
+    private static final context.ContextOuterClass.SliceIdList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceStatus();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceIdList();
     }
 
-    public static context.ContextOuterClass.SliceStatus getDefaultInstance() {
+    public static context.ContextOuterClass.SliceIdList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SliceStatus>
-        PARSER = new com.google.protobuf.AbstractParser<SliceStatus>() {
+    private static final com.google.protobuf.Parser<SliceIdList>
+        PARSER = new com.google.protobuf.AbstractParser<SliceIdList>() {
       @java.lang.Override
-      public SliceStatus parsePartialFrom(
+      public SliceIdList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SliceStatus(input, extensionRegistry);
+        return new SliceIdList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SliceStatus> parser() {
+    public static com.google.protobuf.Parser<SliceIdList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SliceStatus> getParserForType() {
+    public com.google.protobuf.Parser<SliceIdList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.SliceStatus getDefaultInstanceForType() {
+    public context.ContextOuterClass.SliceIdList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface SliceConfigOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.SliceConfig)
+  public interface SliceListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
-    java.util.List<context.ContextOuterClass.ConfigRule> 
-        getConfigRulesList();
+    java.util.List<context.ContextOuterClass.Slice> 
+        getSlicesList();
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
-    context.ContextOuterClass.ConfigRule getConfigRules(int index);
+    context.ContextOuterClass.Slice getSlices(int index);
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
-    int getConfigRulesCount();
+    int getSlicesCount();
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
-    java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
-        getConfigRulesOrBuilderList();
+    java.util.List<? extends context.ContextOuterClass.SliceOrBuilder> 
+        getSlicesOrBuilderList();
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
-    context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+    context.ContextOuterClass.SliceOrBuilder getSlicesOrBuilder(
         int index);
   }
   /**
-   * Protobuf type {@code context.SliceConfig}
+   * Protobuf type {@code context.SliceList}
    */
-  public static final class SliceConfig extends
+  public static final class SliceList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.SliceConfig)
-      SliceConfigOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.SliceList)
+      SliceListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use SliceConfig.newBuilder() to construct.
-    private SliceConfig(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use SliceList.newBuilder() to construct.
+    private SliceList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SliceConfig() {
-      configRules_ = java.util.Collections.emptyList();
+    private SliceList() {
+      slices_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SliceConfig();
+      return new SliceList();
     }
 
     @java.lang.Override
@@ -38042,7 +41698,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SliceConfig(
+    private SliceList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -38063,11 +41719,11 @@ public final class ContextOuterClass {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>();
+                slices_ = new java.util.ArrayList<context.ContextOuterClass.Slice>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              configRules_.add(
-                  input.readMessage(context.ContextOuterClass.ConfigRule.parser(), extensionRegistry));
+              slices_.add(
+                  input.readMessage(context.ContextOuterClass.Slice.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -38086,7 +41742,7 @@ public final class ContextOuterClass {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          configRules_ = java.util.Collections.unmodifiableList(configRules_);
+          slices_ = java.util.Collections.unmodifiableList(slices_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -38094,55 +41750,55 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
+      return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_SliceConfig_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_SliceList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.SliceConfig.class, context.ContextOuterClass.SliceConfig.Builder.class);
+              context.ContextOuterClass.SliceList.class, context.ContextOuterClass.SliceList.Builder.class);
     }
 
-    public static final int CONFIG_RULES_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.ConfigRule> configRules_;
+    public static final int SLICES_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.Slice> slices_;
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
-      return configRules_;
+    public java.util.List<context.ContextOuterClass.Slice> getSlicesList() {
+      return slices_;
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
-        getConfigRulesOrBuilderList() {
-      return configRules_;
+    public java.util.List<? extends context.ContextOuterClass.SliceOrBuilder> 
+        getSlicesOrBuilderList() {
+      return slices_;
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
     @java.lang.Override
-    public int getConfigRulesCount() {
-      return configRules_.size();
+    public int getSlicesCount() {
+      return slices_.size();
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
-      return configRules_.get(index);
+    public context.ContextOuterClass.Slice getSlices(int index) {
+      return slices_.get(index);
     }
     /**
-     * <code>repeated .context.ConfigRule config_rules = 1;</code>
+     * <code>repeated .context.Slice slices = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+    public context.ContextOuterClass.SliceOrBuilder getSlicesOrBuilder(
         int index) {
-      return configRules_.get(index);
+      return slices_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -38159,8 +41815,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < configRules_.size(); i++) {
-        output.writeMessage(1, configRules_.get(i));
+      for (int i = 0; i < slices_.size(); i++) {
+        output.writeMessage(1, slices_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -38171,9 +41827,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < configRules_.size(); i++) {
+      for (int i = 0; i < slices_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, configRules_.get(i));
+          .computeMessageSize(1, slices_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -38185,13 +41841,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.SliceConfig)) {
+      if (!(obj instanceof context.ContextOuterClass.SliceList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.SliceConfig other = (context.ContextOuterClass.SliceConfig) obj;
+      context.ContextOuterClass.SliceList other = (context.ContextOuterClass.SliceList) obj;
 
-      if (!getConfigRulesList()
-          .equals(other.getConfigRulesList())) return false;
+      if (!getSlicesList()
+          .equals(other.getSlicesList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -38203,78 +41859,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getConfigRulesCount() > 0) {
-        hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
-        hash = (53 * hash) + getConfigRulesList().hashCode();
+      if (getSlicesCount() > 0) {
+        hash = (37 * hash) + SLICES_FIELD_NUMBER;
+        hash = (53 * hash) + getSlicesList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(byte[] data)
+    public static context.ContextOuterClass.SliceList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceConfig parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceConfig parseDelimitedFrom(
+    public static context.ContextOuterClass.SliceList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceConfig parseFrom(
+    public static context.ContextOuterClass.SliceList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -38287,7 +41943,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.SliceConfig prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.SliceList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -38303,26 +41959,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.SliceConfig}
+     * Protobuf type {@code context.SliceList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceConfig)
-        context.ContextOuterClass.SliceConfigOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.SliceList)
+        context.ContextOuterClass.SliceListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_SliceConfig_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_SliceList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.SliceConfig.class, context.ContextOuterClass.SliceConfig.Builder.class);
+                context.ContextOuterClass.SliceList.class, context.ContextOuterClass.SliceList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.SliceConfig.newBuilder()
+      // Construct using context.ContextOuterClass.SliceList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -38335,17 +41991,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getConfigRulesFieldBuilder();
+          getSlicesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (configRulesBuilder_ == null) {
-          configRules_ = java.util.Collections.emptyList();
+        if (slicesBuilder_ == null) {
+          slices_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          configRulesBuilder_.clear();
+          slicesBuilder_.clear();
         }
         return this;
       }
@@ -38353,17 +42009,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_SliceConfig_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceConfig getDefaultInstanceForType() {
-        return context.ContextOuterClass.SliceConfig.getDefaultInstance();
+      public context.ContextOuterClass.SliceList getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceConfig build() {
-        context.ContextOuterClass.SliceConfig result = buildPartial();
+      public context.ContextOuterClass.SliceList build() {
+        context.ContextOuterClass.SliceList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -38371,17 +42027,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceConfig buildPartial() {
-        context.ContextOuterClass.SliceConfig result = new context.ContextOuterClass.SliceConfig(this);
+      public context.ContextOuterClass.SliceList buildPartial() {
+        context.ContextOuterClass.SliceList result = new context.ContextOuterClass.SliceList(this);
         int from_bitField0_ = bitField0_;
-        if (configRulesBuilder_ == null) {
+        if (slicesBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            configRules_ = java.util.Collections.unmodifiableList(configRules_);
+            slices_ = java.util.Collections.unmodifiableList(slices_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.configRules_ = configRules_;
+          result.slices_ = slices_;
         } else {
-          result.configRules_ = configRulesBuilder_.build();
+          result.slices_ = slicesBuilder_.build();
         }
         onBuilt();
         return result;
@@ -38421,39 +42077,39 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.SliceConfig) {
-          return mergeFrom((context.ContextOuterClass.SliceConfig)other);
+        if (other instanceof context.ContextOuterClass.SliceList) {
+          return mergeFrom((context.ContextOuterClass.SliceList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.SliceConfig other) {
-        if (other == context.ContextOuterClass.SliceConfig.getDefaultInstance()) return this;
-        if (configRulesBuilder_ == null) {
-          if (!other.configRules_.isEmpty()) {
-            if (configRules_.isEmpty()) {
-              configRules_ = other.configRules_;
+      public Builder mergeFrom(context.ContextOuterClass.SliceList other) {
+        if (other == context.ContextOuterClass.SliceList.getDefaultInstance()) return this;
+        if (slicesBuilder_ == null) {
+          if (!other.slices_.isEmpty()) {
+            if (slices_.isEmpty()) {
+              slices_ = other.slices_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureConfigRulesIsMutable();
-              configRules_.addAll(other.configRules_);
+              ensureSlicesIsMutable();
+              slices_.addAll(other.slices_);
             }
             onChanged();
           }
         } else {
-          if (!other.configRules_.isEmpty()) {
-            if (configRulesBuilder_.isEmpty()) {
-              configRulesBuilder_.dispose();
-              configRulesBuilder_ = null;
-              configRules_ = other.configRules_;
+          if (!other.slices_.isEmpty()) {
+            if (slicesBuilder_.isEmpty()) {
+              slicesBuilder_.dispose();
+              slicesBuilder_ = null;
+              slices_ = other.slices_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              configRulesBuilder_ = 
+              slicesBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getConfigRulesFieldBuilder() : null;
+                   getSlicesFieldBuilder() : null;
             } else {
-              configRulesBuilder_.addAllMessages(other.configRules_);
+              slicesBuilder_.addAllMessages(other.slices_);
             }
           }
         }
@@ -38472,11 +42128,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.SliceConfig parsedMessage = null;
+        context.ContextOuterClass.SliceList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.SliceConfig) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.SliceList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -38487,244 +42143,244 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.ConfigRule> configRules_ =
+      private java.util.List<context.ContextOuterClass.Slice> slices_ =
         java.util.Collections.emptyList();
-      private void ensureConfigRulesIsMutable() {
+      private void ensureSlicesIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          configRules_ = new java.util.ArrayList<context.ContextOuterClass.ConfigRule>(configRules_);
+          slices_ = new java.util.ArrayList<context.ContextOuterClass.Slice>(slices_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> configRulesBuilder_;
+          context.ContextOuterClass.Slice, context.ContextOuterClass.Slice.Builder, context.ContextOuterClass.SliceOrBuilder> slicesBuilder_;
 
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ConfigRule> getConfigRulesList() {
-        if (configRulesBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(configRules_);
+      public java.util.List<context.ContextOuterClass.Slice> getSlicesList() {
+        if (slicesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(slices_);
         } else {
-          return configRulesBuilder_.getMessageList();
+          return slicesBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public int getConfigRulesCount() {
-        if (configRulesBuilder_ == null) {
-          return configRules_.size();
+      public int getSlicesCount() {
+        if (slicesBuilder_ == null) {
+          return slices_.size();
         } else {
-          return configRulesBuilder_.getCount();
+          return slicesBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule getConfigRules(int index) {
-        if (configRulesBuilder_ == null) {
-          return configRules_.get(index);
+      public context.ContextOuterClass.Slice getSlices(int index) {
+        if (slicesBuilder_ == null) {
+          return slices_.get(index);
         } else {
-          return configRulesBuilder_.getMessage(index);
+          return slicesBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder setConfigRules(
-          int index, context.ContextOuterClass.ConfigRule value) {
-        if (configRulesBuilder_ == null) {
+      public Builder setSlices(
+          int index, context.ContextOuterClass.Slice value) {
+        if (slicesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConfigRulesIsMutable();
-          configRules_.set(index, value);
+          ensureSlicesIsMutable();
+          slices_.set(index, value);
           onChanged();
         } else {
-          configRulesBuilder_.setMessage(index, value);
+          slicesBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder setConfigRules(
-          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.set(index, builderForValue.build());
+      public Builder setSlices(
+          int index, context.ContextOuterClass.Slice.Builder builderForValue) {
+        if (slicesBuilder_ == null) {
+          ensureSlicesIsMutable();
+          slices_.set(index, builderForValue.build());
           onChanged();
         } else {
-          configRulesBuilder_.setMessage(index, builderForValue.build());
+          slicesBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder addConfigRules(context.ContextOuterClass.ConfigRule value) {
-        if (configRulesBuilder_ == null) {
+      public Builder addSlices(context.ContextOuterClass.Slice value) {
+        if (slicesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConfigRulesIsMutable();
-          configRules_.add(value);
+          ensureSlicesIsMutable();
+          slices_.add(value);
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(value);
+          slicesBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder addConfigRules(
-          int index, context.ContextOuterClass.ConfigRule value) {
-        if (configRulesBuilder_ == null) {
+      public Builder addSlices(
+          int index, context.ContextOuterClass.Slice value) {
+        if (slicesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConfigRulesIsMutable();
-          configRules_.add(index, value);
+          ensureSlicesIsMutable();
+          slices_.add(index, value);
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(index, value);
+          slicesBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder addConfigRules(
-          context.ContextOuterClass.ConfigRule.Builder builderForValue) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.add(builderForValue.build());
+      public Builder addSlices(
+          context.ContextOuterClass.Slice.Builder builderForValue) {
+        if (slicesBuilder_ == null) {
+          ensureSlicesIsMutable();
+          slices_.add(builderForValue.build());
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(builderForValue.build());
+          slicesBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder addConfigRules(
-          int index, context.ContextOuterClass.ConfigRule.Builder builderForValue) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.add(index, builderForValue.build());
+      public Builder addSlices(
+          int index, context.ContextOuterClass.Slice.Builder builderForValue) {
+        if (slicesBuilder_ == null) {
+          ensureSlicesIsMutable();
+          slices_.add(index, builderForValue.build());
           onChanged();
         } else {
-          configRulesBuilder_.addMessage(index, builderForValue.build());
+          slicesBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder addAllConfigRules(
-          java.lang.Iterable<? extends context.ContextOuterClass.ConfigRule> values) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
+      public Builder addAllSlices(
+          java.lang.Iterable<? extends context.ContextOuterClass.Slice> values) {
+        if (slicesBuilder_ == null) {
+          ensureSlicesIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, configRules_);
+              values, slices_);
           onChanged();
         } else {
-          configRulesBuilder_.addAllMessages(values);
+          slicesBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder clearConfigRules() {
-        if (configRulesBuilder_ == null) {
-          configRules_ = java.util.Collections.emptyList();
+      public Builder clearSlices() {
+        if (slicesBuilder_ == null) {
+          slices_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          configRulesBuilder_.clear();
+          slicesBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public Builder removeConfigRules(int index) {
-        if (configRulesBuilder_ == null) {
-          ensureConfigRulesIsMutable();
-          configRules_.remove(index);
+      public Builder removeSlices(int index) {
+        if (slicesBuilder_ == null) {
+          ensureSlicesIsMutable();
+          slices_.remove(index);
           onChanged();
         } else {
-          configRulesBuilder_.remove(index);
+          slicesBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule.Builder getConfigRulesBuilder(
+      public context.ContextOuterClass.Slice.Builder getSlicesBuilder(
           int index) {
-        return getConfigRulesFieldBuilder().getBuilder(index);
+        return getSlicesFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRuleOrBuilder getConfigRulesOrBuilder(
+      public context.ContextOuterClass.SliceOrBuilder getSlicesOrBuilder(
           int index) {
-        if (configRulesBuilder_ == null) {
-          return configRules_.get(index);  } else {
-          return configRulesBuilder_.getMessageOrBuilder(index);
+        if (slicesBuilder_ == null) {
+          return slices_.get(index);  } else {
+          return slicesBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ConfigRuleOrBuilder> 
-           getConfigRulesOrBuilderList() {
-        if (configRulesBuilder_ != null) {
-          return configRulesBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.SliceOrBuilder> 
+           getSlicesOrBuilderList() {
+        if (slicesBuilder_ != null) {
+          return slicesBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(configRules_);
+          return java.util.Collections.unmodifiableList(slices_);
         }
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder() {
-        return getConfigRulesFieldBuilder().addBuilder(
-            context.ContextOuterClass.ConfigRule.getDefaultInstance());
+      public context.ContextOuterClass.Slice.Builder addSlicesBuilder() {
+        return getSlicesFieldBuilder().addBuilder(
+            context.ContextOuterClass.Slice.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public context.ContextOuterClass.ConfigRule.Builder addConfigRulesBuilder(
+      public context.ContextOuterClass.Slice.Builder addSlicesBuilder(
           int index) {
-        return getConfigRulesFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.ConfigRule.getDefaultInstance());
+        return getSlicesFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.Slice.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ConfigRule config_rules = 1;</code>
+       * <code>repeated .context.Slice slices = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ConfigRule.Builder> 
-           getConfigRulesBuilderList() {
-        return getConfigRulesFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.Slice.Builder> 
+           getSlicesBuilderList() {
+        return getSlicesFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder> 
-          getConfigRulesFieldBuilder() {
-        if (configRulesBuilder_ == null) {
-          configRulesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.ConfigRule, context.ContextOuterClass.ConfigRule.Builder, context.ContextOuterClass.ConfigRuleOrBuilder>(
-                  configRules_,
+          context.ContextOuterClass.Slice, context.ContextOuterClass.Slice.Builder, context.ContextOuterClass.SliceOrBuilder> 
+          getSlicesFieldBuilder() {
+        if (slicesBuilder_ == null) {
+          slicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.Slice, context.ContextOuterClass.Slice.Builder, context.ContextOuterClass.SliceOrBuilder>(
+                  slices_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          configRules_ = null;
+          slices_ = null;
         }
-        return configRulesBuilder_;
+        return slicesBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -38739,95 +42395,115 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.SliceConfig)
+      // @@protoc_insertion_point(builder_scope:context.SliceList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.SliceConfig)
-    private static final context.ContextOuterClass.SliceConfig DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.SliceList)
+    private static final context.ContextOuterClass.SliceList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceConfig();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceList();
     }
 
-    public static context.ContextOuterClass.SliceConfig getDefaultInstance() {
+    public static context.ContextOuterClass.SliceList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SliceConfig>
-        PARSER = new com.google.protobuf.AbstractParser<SliceConfig>() {
+    private static final com.google.protobuf.Parser<SliceList>
+        PARSER = new com.google.protobuf.AbstractParser<SliceList>() {
       @java.lang.Override
-      public SliceConfig parsePartialFrom(
+      public SliceList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SliceConfig(input, extensionRegistry);
+        return new SliceList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SliceConfig> parser() {
+    public static com.google.protobuf.Parser<SliceList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SliceConfig> getParserForType() {
+    public com.google.protobuf.Parser<SliceList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.SliceConfig getDefaultInstanceForType() {
+    public context.ContextOuterClass.SliceList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface SliceIdListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.SliceIdList)
+  public interface SliceFilterOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceFilter)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>.context.SliceIdList slice_ids = 1;</code>
+     * @return Whether the sliceIds field is set.
      */
-    java.util.List<context.ContextOuterClass.SliceId> 
-        getSliceIdsList();
+    boolean hasSliceIds();
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>.context.SliceIdList slice_ids = 1;</code>
+     * @return The sliceIds.
      */
-    context.ContextOuterClass.SliceId getSliceIds(int index);
+    context.ContextOuterClass.SliceIdList getSliceIds();
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>.context.SliceIdList slice_ids = 1;</code>
      */
-    int getSliceIdsCount();
+    context.ContextOuterClass.SliceIdListOrBuilder getSliceIdsOrBuilder();
+
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>bool include_endpoint_ids = 2;</code>
+     * @return The includeEndpointIds.
      */
-    java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
-        getSliceIdsOrBuilderList();
+    boolean getIncludeEndpointIds();
+
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>bool include_constraints = 3;</code>
+     * @return The includeConstraints.
      */
-    context.ContextOuterClass.SliceIdOrBuilder getSliceIdsOrBuilder(
-        int index);
+    boolean getIncludeConstraints();
+
+    /**
+     * <code>bool include_service_ids = 4;</code>
+     * @return The includeServiceIds.
+     */
+    boolean getIncludeServiceIds();
+
+    /**
+     * <code>bool include_subslice_ids = 5;</code>
+     * @return The includeSubsliceIds.
+     */
+    boolean getIncludeSubsliceIds();
+
+    /**
+     * <code>bool include_config_rules = 6;</code>
+     * @return The includeConfigRules.
+     */
+    boolean getIncludeConfigRules();
   }
   /**
-   * Protobuf type {@code context.SliceIdList}
+   * Protobuf type {@code context.SliceFilter}
    */
-  public static final class SliceIdList extends
+  public static final class SliceFilter extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.SliceIdList)
-      SliceIdListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.SliceFilter)
+      SliceFilterOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use SliceIdList.newBuilder() to construct.
-    private SliceIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use SliceFilter.newBuilder() to construct.
+    private SliceFilter(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SliceIdList() {
-      sliceIds_ = java.util.Collections.emptyList();
+    private SliceFilter() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SliceIdList();
+      return new SliceFilter();
     }
 
     @java.lang.Override
@@ -38835,7 +42511,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SliceIdList(
+    private SliceFilter(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -38843,7 +42519,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -38854,13 +42529,42 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                sliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              sliceIds_.add(
-                  input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry));
+            case 10: {
+              context.ContextOuterClass.SliceIdList.Builder subBuilder = null;
+              if (sliceIds_ != null) {
+                subBuilder = sliceIds_.toBuilder();
+              }
+              sliceIds_ = input.readMessage(context.ContextOuterClass.SliceIdList.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(sliceIds_);
+                sliceIds_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 16: {
+
+              includeEndpointIds_ = input.readBool();
+              break;
+            }
+            case 24: {
+
+              includeConstraints_ = input.readBool();
+              break;
+            }
+            case 32: {
+
+              includeServiceIds_ = input.readBool();
+              break;
+            }
+            case 40: {
+
+              includeSubsliceIds_ = input.readBool();
+              break;
+            }
+            case 48: {
+
+              includeConfigRules_ = input.readBool();
               break;
             }
             default: {
@@ -38878,64 +42582,102 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
+      return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_SliceIdList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_SliceFilter_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.SliceIdList.class, context.ContextOuterClass.SliceIdList.Builder.class);
+              context.ContextOuterClass.SliceFilter.class, context.ContextOuterClass.SliceFilter.Builder.class);
     }
 
     public static final int SLICE_IDS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.SliceId> sliceIds_;
+    private context.ContextOuterClass.SliceIdList sliceIds_;
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>.context.SliceIdList slice_ids = 1;</code>
+     * @return Whether the sliceIds field is set.
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.SliceId> getSliceIdsList() {
-      return sliceIds_;
+    public boolean hasSliceIds() {
+      return sliceIds_ != null;
     }
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>.context.SliceIdList slice_ids = 1;</code>
+     * @return The sliceIds.
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
-        getSliceIdsOrBuilderList() {
-      return sliceIds_;
+    public context.ContextOuterClass.SliceIdList getSliceIds() {
+      return sliceIds_ == null ? context.ContextOuterClass.SliceIdList.getDefaultInstance() : sliceIds_;
     }
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>.context.SliceIdList slice_ids = 1;</code>
      */
     @java.lang.Override
-    public int getSliceIdsCount() {
-      return sliceIds_.size();
+    public context.ContextOuterClass.SliceIdListOrBuilder getSliceIdsOrBuilder() {
+      return getSliceIds();
     }
+
+    public static final int INCLUDE_ENDPOINT_IDS_FIELD_NUMBER = 2;
+    private boolean includeEndpointIds_;
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>bool include_endpoint_ids = 2;</code>
+     * @return The includeEndpointIds.
      */
     @java.lang.Override
-    public context.ContextOuterClass.SliceId getSliceIds(int index) {
-      return sliceIds_.get(index);
+    public boolean getIncludeEndpointIds() {
+      return includeEndpointIds_;
     }
+
+    public static final int INCLUDE_CONSTRAINTS_FIELD_NUMBER = 3;
+    private boolean includeConstraints_;
     /**
-     * <code>repeated .context.SliceId slice_ids = 1;</code>
+     * <code>bool include_constraints = 3;</code>
+     * @return The includeConstraints.
      */
     @java.lang.Override
-    public context.ContextOuterClass.SliceIdOrBuilder getSliceIdsOrBuilder(
-        int index) {
-      return sliceIds_.get(index);
+    public boolean getIncludeConstraints() {
+      return includeConstraints_;
+    }
+
+    public static final int INCLUDE_SERVICE_IDS_FIELD_NUMBER = 4;
+    private boolean includeServiceIds_;
+    /**
+     * <code>bool include_service_ids = 4;</code>
+     * @return The includeServiceIds.
+     */
+    @java.lang.Override
+    public boolean getIncludeServiceIds() {
+      return includeServiceIds_;
+    }
+
+    public static final int INCLUDE_SUBSLICE_IDS_FIELD_NUMBER = 5;
+    private boolean includeSubsliceIds_;
+    /**
+     * <code>bool include_subslice_ids = 5;</code>
+     * @return The includeSubsliceIds.
+     */
+    @java.lang.Override
+    public boolean getIncludeSubsliceIds() {
+      return includeSubsliceIds_;
+    }
+
+    public static final int INCLUDE_CONFIG_RULES_FIELD_NUMBER = 6;
+    private boolean includeConfigRules_;
+    /**
+     * <code>bool include_config_rules = 6;</code>
+     * @return The includeConfigRules.
+     */
+    @java.lang.Override
+    public boolean getIncludeConfigRules() {
+      return includeConfigRules_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -38952,8 +42694,23 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < sliceIds_.size(); i++) {
-        output.writeMessage(1, sliceIds_.get(i));
+      if (sliceIds_ != null) {
+        output.writeMessage(1, getSliceIds());
+      }
+      if (includeEndpointIds_ != false) {
+        output.writeBool(2, includeEndpointIds_);
+      }
+      if (includeConstraints_ != false) {
+        output.writeBool(3, includeConstraints_);
+      }
+      if (includeServiceIds_ != false) {
+        output.writeBool(4, includeServiceIds_);
+      }
+      if (includeSubsliceIds_ != false) {
+        output.writeBool(5, includeSubsliceIds_);
+      }
+      if (includeConfigRules_ != false) {
+        output.writeBool(6, includeConfigRules_);
       }
       unknownFields.writeTo(output);
     }
@@ -38964,9 +42721,29 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < sliceIds_.size(); i++) {
+      if (sliceIds_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, sliceIds_.get(i));
+          .computeMessageSize(1, getSliceIds());
+      }
+      if (includeEndpointIds_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(2, includeEndpointIds_);
+      }
+      if (includeConstraints_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(3, includeConstraints_);
+      }
+      if (includeServiceIds_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(4, includeServiceIds_);
+      }
+      if (includeSubsliceIds_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(5, includeSubsliceIds_);
+      }
+      if (includeConfigRules_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(6, includeConfigRules_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -38978,13 +42755,26 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.SliceIdList)) {
+      if (!(obj instanceof context.ContextOuterClass.SliceFilter)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.SliceIdList other = (context.ContextOuterClass.SliceIdList) obj;
-
-      if (!getSliceIdsList()
-          .equals(other.getSliceIdsList())) return false;
+      context.ContextOuterClass.SliceFilter other = (context.ContextOuterClass.SliceFilter) obj;
+
+      if (hasSliceIds() != other.hasSliceIds()) return false;
+      if (hasSliceIds()) {
+        if (!getSliceIds()
+            .equals(other.getSliceIds())) return false;
+      }
+      if (getIncludeEndpointIds()
+          != other.getIncludeEndpointIds()) return false;
+      if (getIncludeConstraints()
+          != other.getIncludeConstraints()) return false;
+      if (getIncludeServiceIds()
+          != other.getIncludeServiceIds()) return false;
+      if (getIncludeSubsliceIds()
+          != other.getIncludeSubsliceIds()) return false;
+      if (getIncludeConfigRules()
+          != other.getIncludeConfigRules()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -38996,78 +42786,93 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getSliceIdsCount() > 0) {
+      if (hasSliceIds()) {
         hash = (37 * hash) + SLICE_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceIdsList().hashCode();
+        hash = (53 * hash) + getSliceIds().hashCode();
       }
+      hash = (37 * hash) + INCLUDE_ENDPOINT_IDS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeEndpointIds());
+      hash = (37 * hash) + INCLUDE_CONSTRAINTS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeConstraints());
+      hash = (37 * hash) + INCLUDE_SERVICE_IDS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeServiceIds());
+      hash = (37 * hash) + INCLUDE_SUBSLICE_IDS_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeSubsliceIds());
+      hash = (37 * hash) + INCLUDE_CONFIG_RULES_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getIncludeConfigRules());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(byte[] data)
+    public static context.ContextOuterClass.SliceFilter parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceFilter parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceIdList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceFilter parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceIdList parseDelimitedFrom(
+    public static context.ContextOuterClass.SliceFilter parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceIdList parseFrom(
+    public static context.ContextOuterClass.SliceFilter parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -39080,7 +42885,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.SliceIdList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.SliceFilter prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -39096,26 +42901,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.SliceIdList}
+     * Protobuf type {@code context.SliceFilter}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceIdList)
-        context.ContextOuterClass.SliceIdListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.SliceFilter)
+        context.ContextOuterClass.SliceFilterOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_SliceIdList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_SliceFilter_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.SliceIdList.class, context.ContextOuterClass.SliceIdList.Builder.class);
+                context.ContextOuterClass.SliceFilter.class, context.ContextOuterClass.SliceFilter.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.SliceIdList.newBuilder()
+      // Construct using context.ContextOuterClass.SliceFilter.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -39128,35 +42933,44 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getSliceIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
         if (sliceIdsBuilder_ == null) {
-          sliceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+          sliceIds_ = null;
         } else {
-          sliceIdsBuilder_.clear();
+          sliceIds_ = null;
+          sliceIdsBuilder_ = null;
         }
+        includeEndpointIds_ = false;
+
+        includeConstraints_ = false;
+
+        includeServiceIds_ = false;
+
+        includeSubsliceIds_ = false;
+
+        includeConfigRules_ = false;
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_SliceIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceFilter_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceIdList getDefaultInstanceForType() {
-        return context.ContextOuterClass.SliceIdList.getDefaultInstance();
+      public context.ContextOuterClass.SliceFilter getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceFilter.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceIdList build() {
-        context.ContextOuterClass.SliceIdList result = buildPartial();
+      public context.ContextOuterClass.SliceFilter build() {
+        context.ContextOuterClass.SliceFilter result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -39164,18 +42978,18 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceIdList buildPartial() {
-        context.ContextOuterClass.SliceIdList result = new context.ContextOuterClass.SliceIdList(this);
-        int from_bitField0_ = bitField0_;
+      public context.ContextOuterClass.SliceFilter buildPartial() {
+        context.ContextOuterClass.SliceFilter result = new context.ContextOuterClass.SliceFilter(this);
         if (sliceIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            sliceIds_ = java.util.Collections.unmodifiableList(sliceIds_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
           result.sliceIds_ = sliceIds_;
         } else {
           result.sliceIds_ = sliceIdsBuilder_.build();
         }
+        result.includeEndpointIds_ = includeEndpointIds_;
+        result.includeConstraints_ = includeConstraints_;
+        result.includeServiceIds_ = includeServiceIds_;
+        result.includeSubsliceIds_ = includeSubsliceIds_;
+        result.includeConfigRules_ = includeConfigRules_;
         onBuilt();
         return result;
       }
@@ -39214,41 +43028,33 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.SliceIdList) {
-          return mergeFrom((context.ContextOuterClass.SliceIdList)other);
+        if (other instanceof context.ContextOuterClass.SliceFilter) {
+          return mergeFrom((context.ContextOuterClass.SliceFilter)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.SliceIdList other) {
-        if (other == context.ContextOuterClass.SliceIdList.getDefaultInstance()) return this;
-        if (sliceIdsBuilder_ == null) {
-          if (!other.sliceIds_.isEmpty()) {
-            if (sliceIds_.isEmpty()) {
-              sliceIds_ = other.sliceIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureSliceIdsIsMutable();
-              sliceIds_.addAll(other.sliceIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.sliceIds_.isEmpty()) {
-            if (sliceIdsBuilder_.isEmpty()) {
-              sliceIdsBuilder_.dispose();
-              sliceIdsBuilder_ = null;
-              sliceIds_ = other.sliceIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              sliceIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSliceIdsFieldBuilder() : null;
-            } else {
-              sliceIdsBuilder_.addAllMessages(other.sliceIds_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.SliceFilter other) {
+        if (other == context.ContextOuterClass.SliceFilter.getDefaultInstance()) return this;
+        if (other.hasSliceIds()) {
+          mergeSliceIds(other.getSliceIds());
+        }
+        if (other.getIncludeEndpointIds() != false) {
+          setIncludeEndpointIds(other.getIncludeEndpointIds());
+        }
+        if (other.getIncludeConstraints() != false) {
+          setIncludeConstraints(other.getIncludeConstraints());
+        }
+        if (other.getIncludeServiceIds() != false) {
+          setIncludeServiceIds(other.getIncludeServiceIds());
+        }
+        if (other.getIncludeSubsliceIds() != false) {
+          setIncludeSubsliceIds(other.getIncludeSubsliceIds());
+        }
+        if (other.getIncludeConfigRules() != false) {
+          setIncludeConfigRules(other.getIncludeConfigRules());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -39265,11 +43071,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.SliceIdList parsedMessage = null;
+        context.ContextOuterClass.SliceFilter parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.SliceIdList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.SliceFilter) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -39278,246 +43084,279 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<context.ContextOuterClass.SliceId> sliceIds_ =
-        java.util.Collections.emptyList();
-      private void ensureSliceIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          sliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>(sliceIds_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdsBuilder_;
 
+      private context.ContextOuterClass.SliceIdList sliceIds_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceIdList, context.ContextOuterClass.SliceIdList.Builder, context.ContextOuterClass.SliceIdListOrBuilder> sliceIdsBuilder_;
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
-       */
-      public java.util.List<context.ContextOuterClass.SliceId> getSliceIdsList() {
-        if (sliceIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(sliceIds_);
-        } else {
-          return sliceIdsBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
+       * @return Whether the sliceIds field is set.
        */
-      public int getSliceIdsCount() {
-        if (sliceIdsBuilder_ == null) {
-          return sliceIds_.size();
-        } else {
-          return sliceIdsBuilder_.getCount();
-        }
+      public boolean hasSliceIds() {
+        return sliceIdsBuilder_ != null || sliceIds_ != null;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
+       * @return The sliceIds.
        */
-      public context.ContextOuterClass.SliceId getSliceIds(int index) {
+      public context.ContextOuterClass.SliceIdList getSliceIds() {
         if (sliceIdsBuilder_ == null) {
-          return sliceIds_.get(index);
+          return sliceIds_ == null ? context.ContextOuterClass.SliceIdList.getDefaultInstance() : sliceIds_;
         } else {
-          return sliceIdsBuilder_.getMessage(index);
+          return sliceIdsBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
        */
-      public Builder setSliceIds(
-          int index, context.ContextOuterClass.SliceId value) {
+      public Builder setSliceIds(context.ContextOuterClass.SliceIdList value) {
         if (sliceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSliceIdsIsMutable();
-          sliceIds_.set(index, value);
+          sliceIds_ = value;
           onChanged();
         } else {
-          sliceIdsBuilder_.setMessage(index, value);
+          sliceIdsBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
        */
       public Builder setSliceIds(
-          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
+          context.ContextOuterClass.SliceIdList.Builder builderForValue) {
         if (sliceIdsBuilder_ == null) {
-          ensureSliceIdsIsMutable();
-          sliceIds_.set(index, builderForValue.build());
+          sliceIds_ = builderForValue.build();
           onChanged();
         } else {
-          sliceIdsBuilder_.setMessage(index, builderForValue.build());
+          sliceIdsBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
        */
-      public Builder addSliceIds(context.ContextOuterClass.SliceId value) {
+      public Builder mergeSliceIds(context.ContextOuterClass.SliceIdList value) {
         if (sliceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+          if (sliceIds_ != null) {
+            sliceIds_ =
+              context.ContextOuterClass.SliceIdList.newBuilder(sliceIds_).mergeFrom(value).buildPartial();
+          } else {
+            sliceIds_ = value;
           }
-          ensureSliceIdsIsMutable();
-          sliceIds_.add(value);
           onChanged();
         } else {
-          sliceIdsBuilder_.addMessage(value);
+          sliceIdsBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
        */
-      public Builder addSliceIds(
-          int index, context.ContextOuterClass.SliceId value) {
+      public Builder clearSliceIds() {
         if (sliceIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSliceIdsIsMutable();
-          sliceIds_.add(index, value);
+          sliceIds_ = null;
           onChanged();
         } else {
-          sliceIdsBuilder_.addMessage(index, value);
+          sliceIds_ = null;
+          sliceIdsBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
        */
-      public Builder addSliceIds(
-          context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceIdsBuilder_ == null) {
-          ensureSliceIdsIsMutable();
-          sliceIds_.add(builderForValue.build());
-          onChanged();
+      public context.ContextOuterClass.SliceIdList.Builder getSliceIdsBuilder() {
+        
+        onChanged();
+        return getSliceIdsFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.SliceIdList slice_ids = 1;</code>
+       */
+      public context.ContextOuterClass.SliceIdListOrBuilder getSliceIdsOrBuilder() {
+        if (sliceIdsBuilder_ != null) {
+          return sliceIdsBuilder_.getMessageOrBuilder();
         } else {
-          sliceIdsBuilder_.addMessage(builderForValue.build());
+          return sliceIds_ == null ?
+              context.ContextOuterClass.SliceIdList.getDefaultInstance() : sliceIds_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>.context.SliceIdList slice_ids = 1;</code>
        */
-      public Builder addSliceIds(
-          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceIdList, context.ContextOuterClass.SliceIdList.Builder, context.ContextOuterClass.SliceIdListOrBuilder> 
+          getSliceIdsFieldBuilder() {
         if (sliceIdsBuilder_ == null) {
-          ensureSliceIdsIsMutable();
-          sliceIds_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          sliceIdsBuilder_.addMessage(index, builderForValue.build());
+          sliceIdsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.SliceIdList, context.ContextOuterClass.SliceIdList.Builder, context.ContextOuterClass.SliceIdListOrBuilder>(
+                  getSliceIds(),
+                  getParentForChildren(),
+                  isClean());
+          sliceIds_ = null;
         }
+        return sliceIdsBuilder_;
+      }
+
+      private boolean includeEndpointIds_ ;
+      /**
+       * <code>bool include_endpoint_ids = 2;</code>
+       * @return The includeEndpointIds.
+       */
+      @java.lang.Override
+      public boolean getIncludeEndpointIds() {
+        return includeEndpointIds_;
+      }
+      /**
+       * <code>bool include_endpoint_ids = 2;</code>
+       * @param value The includeEndpointIds to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIncludeEndpointIds(boolean value) {
+        
+        includeEndpointIds_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_endpoint_ids = 2;</code>
+       * @return This builder for chaining.
        */
-      public Builder addAllSliceIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.SliceId> values) {
-        if (sliceIdsBuilder_ == null) {
-          ensureSliceIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, sliceIds_);
-          onChanged();
-        } else {
-          sliceIdsBuilder_.addAllMessages(values);
-        }
+      public Builder clearIncludeEndpointIds() {
+        
+        includeEndpointIds_ = false;
+        onChanged();
         return this;
       }
+
+      private boolean includeConstraints_ ;
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_constraints = 3;</code>
+       * @return The includeConstraints.
        */
-      public Builder clearSliceIds() {
-        if (sliceIdsBuilder_ == null) {
-          sliceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          sliceIdsBuilder_.clear();
-        }
+      @java.lang.Override
+      public boolean getIncludeConstraints() {
+        return includeConstraints_;
+      }
+      /**
+       * <code>bool include_constraints = 3;</code>
+       * @param value The includeConstraints to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIncludeConstraints(boolean value) {
+        
+        includeConstraints_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_constraints = 3;</code>
+       * @return This builder for chaining.
        */
-      public Builder removeSliceIds(int index) {
-        if (sliceIdsBuilder_ == null) {
-          ensureSliceIdsIsMutable();
-          sliceIds_.remove(index);
-          onChanged();
-        } else {
-          sliceIdsBuilder_.remove(index);
-        }
+      public Builder clearIncludeConstraints() {
+        
+        includeConstraints_ = false;
+        onChanged();
         return this;
       }
+
+      private boolean includeServiceIds_ ;
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_service_ids = 4;</code>
+       * @return The includeServiceIds.
        */
-      public context.ContextOuterClass.SliceId.Builder getSliceIdsBuilder(
-          int index) {
-        return getSliceIdsFieldBuilder().getBuilder(index);
+      @java.lang.Override
+      public boolean getIncludeServiceIds() {
+        return includeServiceIds_;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_service_ids = 4;</code>
+       * @param value The includeServiceIds to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.SliceIdOrBuilder getSliceIdsOrBuilder(
-          int index) {
-        if (sliceIdsBuilder_ == null) {
-          return sliceIds_.get(index);  } else {
-          return sliceIdsBuilder_.getMessageOrBuilder(index);
-        }
+      public Builder setIncludeServiceIds(boolean value) {
+        
+        includeServiceIds_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_service_ids = 4;</code>
+       * @return This builder for chaining.
        */
-      public java.util.List<? extends context.ContextOuterClass.SliceIdOrBuilder> 
-           getSliceIdsOrBuilderList() {
-        if (sliceIdsBuilder_ != null) {
-          return sliceIdsBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(sliceIds_);
-        }
+      public Builder clearIncludeServiceIds() {
+        
+        includeServiceIds_ = false;
+        onChanged();
+        return this;
       }
+
+      private boolean includeSubsliceIds_ ;
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_subslice_ids = 5;</code>
+       * @return The includeSubsliceIds.
        */
-      public context.ContextOuterClass.SliceId.Builder addSliceIdsBuilder() {
-        return getSliceIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.SliceId.getDefaultInstance());
+      @java.lang.Override
+      public boolean getIncludeSubsliceIds() {
+        return includeSubsliceIds_;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_subslice_ids = 5;</code>
+       * @param value The includeSubsliceIds to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.SliceId.Builder addSliceIdsBuilder(
-          int index) {
-        return getSliceIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.SliceId.getDefaultInstance());
+      public Builder setIncludeSubsliceIds(boolean value) {
+        
+        includeSubsliceIds_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>repeated .context.SliceId slice_ids = 1;</code>
+       * <code>bool include_subslice_ids = 5;</code>
+       * @return This builder for chaining.
        */
-      public java.util.List<context.ContextOuterClass.SliceId.Builder> 
-           getSliceIdsBuilderList() {
-        return getSliceIdsFieldBuilder().getBuilderList();
+      public Builder clearIncludeSubsliceIds() {
+        
+        includeSubsliceIds_ = false;
+        onChanged();
+        return this;
       }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
-          getSliceIdsFieldBuilder() {
-        if (sliceIdsBuilder_ == null) {
-          sliceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
-                  sliceIds_,
-                  ((bitField0_ & 0x00000001) != 0),
-                  getParentForChildren(),
-                  isClean());
-          sliceIds_ = null;
-        }
-        return sliceIdsBuilder_;
+
+      private boolean includeConfigRules_ ;
+      /**
+       * <code>bool include_config_rules = 6;</code>
+       * @return The includeConfigRules.
+       */
+      @java.lang.Override
+      public boolean getIncludeConfigRules() {
+        return includeConfigRules_;
+      }
+      /**
+       * <code>bool include_config_rules = 6;</code>
+       * @param value The includeConfigRules to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIncludeConfigRules(boolean value) {
+        
+        includeConfigRules_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>bool include_config_rules = 6;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearIncludeConfigRules() {
+        
+        includeConfigRules_ = false;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -39532,95 +43371,100 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.SliceIdList)
+      // @@protoc_insertion_point(builder_scope:context.SliceFilter)
     }
 
-    // @@protoc_insertion_point(class_scope:context.SliceIdList)
-    private static final context.ContextOuterClass.SliceIdList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.SliceFilter)
+    private static final context.ContextOuterClass.SliceFilter DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceIdList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceFilter();
     }
 
-    public static context.ContextOuterClass.SliceIdList getDefaultInstance() {
+    public static context.ContextOuterClass.SliceFilter getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SliceIdList>
-        PARSER = new com.google.protobuf.AbstractParser<SliceIdList>() {
+    private static final com.google.protobuf.Parser<SliceFilter>
+        PARSER = new com.google.protobuf.AbstractParser<SliceFilter>() {
       @java.lang.Override
-      public SliceIdList parsePartialFrom(
+      public SliceFilter parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SliceIdList(input, extensionRegistry);
+        return new SliceFilter(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SliceIdList> parser() {
+    public static com.google.protobuf.Parser<SliceFilter> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SliceIdList> getParserForType() {
+    public com.google.protobuf.Parser<SliceFilter> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.SliceIdList getDefaultInstanceForType() {
+    public context.ContextOuterClass.SliceFilter getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface SliceListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.SliceList)
+  public interface SliceEventOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.SliceEvent)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
-    java.util.List<context.ContextOuterClass.Slice> 
-        getSlicesList();
+    boolean hasEvent();
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
-    context.ContextOuterClass.Slice getSlices(int index);
+    context.ContextOuterClass.Event getEvent();
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
-    int getSlicesCount();
+    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
+
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.SliceId slice_id = 2;</code>
+     * @return Whether the sliceId field is set.
      */
-    java.util.List<? extends context.ContextOuterClass.SliceOrBuilder> 
-        getSlicesOrBuilderList();
+    boolean hasSliceId();
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.SliceId slice_id = 2;</code>
+     * @return The sliceId.
      */
-    context.ContextOuterClass.SliceOrBuilder getSlicesOrBuilder(
-        int index);
+    context.ContextOuterClass.SliceId getSliceId();
+    /**
+     * <code>.context.SliceId slice_id = 2;</code>
+     */
+    context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder();
   }
   /**
-   * Protobuf type {@code context.SliceList}
+   * Protobuf type {@code context.SliceEvent}
    */
-  public static final class SliceList extends
+  public static final class SliceEvent extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.SliceList)
-      SliceListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.SliceEvent)
+      SliceEventOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use SliceList.newBuilder() to construct.
-    private SliceList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use SliceEvent.newBuilder() to construct.
+    private SliceEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SliceList() {
-      slices_ = java.util.Collections.emptyList();
+    private SliceEvent() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SliceList();
+      return new SliceEvent();
     }
 
     @java.lang.Override
@@ -39628,7 +43472,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SliceList(
+    private SliceEvent(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -39636,7 +43480,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -39648,12 +43491,29 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                slices_ = new java.util.ArrayList<context.ContextOuterClass.Slice>();
-                mutable_bitField0_ |= 0x00000001;
+              context.ContextOuterClass.Event.Builder subBuilder = null;
+              if (event_ != null) {
+                subBuilder = event_.toBuilder();
               }
-              slices_.add(
-                  input.readMessage(context.ContextOuterClass.Slice.parser(), extensionRegistry));
+              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(event_);
+                event_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              context.ContextOuterClass.SliceId.Builder subBuilder = null;
+              if (sliceId_ != null) {
+                subBuilder = sliceId_.toBuilder();
+              }
+              sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(sliceId_);
+                sliceId_ = subBuilder.buildPartial();
+              }
+
               break;
             }
             default: {
@@ -39671,64 +43531,73 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          slices_ = java.util.Collections.unmodifiableList(slices_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
+      return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_SliceList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_SliceEvent_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.SliceList.class, context.ContextOuterClass.SliceList.Builder.class);
+              context.ContextOuterClass.SliceEvent.class, context.ContextOuterClass.SliceEvent.Builder.class);
+    }
+
+    public static final int EVENT_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Event event_;
+    /**
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
+     */
+    @java.lang.Override
+    public boolean hasEvent() {
+      return event_ != null;
     }
-
-    public static final int SLICES_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.Slice> slices_;
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.Slice> getSlicesList() {
-      return slices_;
+    public context.ContextOuterClass.Event getEvent() {
+      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
     }
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.SliceOrBuilder> 
-        getSlicesOrBuilderList() {
-      return slices_;
+    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+      return getEvent();
     }
+
+    public static final int SLICE_ID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.SliceId sliceId_;
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.SliceId slice_id = 2;</code>
+     * @return Whether the sliceId field is set.
      */
     @java.lang.Override
-    public int getSlicesCount() {
-      return slices_.size();
+    public boolean hasSliceId() {
+      return sliceId_ != null;
     }
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.SliceId slice_id = 2;</code>
+     * @return The sliceId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Slice getSlices(int index) {
-      return slices_.get(index);
+    public context.ContextOuterClass.SliceId getSliceId() {
+      return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
     }
     /**
-     * <code>repeated .context.Slice slices = 1;</code>
+     * <code>.context.SliceId slice_id = 2;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.SliceOrBuilder getSlicesOrBuilder(
-        int index) {
-      return slices_.get(index);
+    public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
+      return getSliceId();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -39745,8 +43614,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < slices_.size(); i++) {
-        output.writeMessage(1, slices_.get(i));
+      if (event_ != null) {
+        output.writeMessage(1, getEvent());
+      }
+      if (sliceId_ != null) {
+        output.writeMessage(2, getSliceId());
       }
       unknownFields.writeTo(output);
     }
@@ -39757,9 +43629,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < slices_.size(); i++) {
+      if (event_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, slices_.get(i));
+          .computeMessageSize(1, getEvent());
+      }
+      if (sliceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getSliceId());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -39771,13 +43647,21 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.SliceList)) {
+      if (!(obj instanceof context.ContextOuterClass.SliceEvent)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.SliceList other = (context.ContextOuterClass.SliceList) obj;
+      context.ContextOuterClass.SliceEvent other = (context.ContextOuterClass.SliceEvent) obj;
 
-      if (!getSlicesList()
-          .equals(other.getSlicesList())) return false;
+      if (hasEvent() != other.hasEvent()) return false;
+      if (hasEvent()) {
+        if (!getEvent()
+            .equals(other.getEvent())) return false;
+      }
+      if (hasSliceId() != other.hasSliceId()) return false;
+      if (hasSliceId()) {
+        if (!getSliceId()
+            .equals(other.getSliceId())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -39789,78 +43673,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getSlicesCount() > 0) {
-        hash = (37 * hash) + SLICES_FIELD_NUMBER;
-        hash = (53 * hash) + getSlicesList().hashCode();
+      if (hasEvent()) {
+        hash = (37 * hash) + EVENT_FIELD_NUMBER;
+        hash = (53 * hash) + getEvent().hashCode();
+      }
+      if (hasSliceId()) {
+        hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getSliceId().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(byte[] data)
+    public static context.ContextOuterClass.SliceEvent parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceEvent parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.SliceEvent parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceList parseDelimitedFrom(
+    public static context.ContextOuterClass.SliceEvent parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceList parseFrom(
+    public static context.ContextOuterClass.SliceEvent parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -39873,7 +43761,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.SliceList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.SliceEvent prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -39889,26 +43777,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.SliceList}
+     * Protobuf type {@code context.SliceEvent}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceList)
-        context.ContextOuterClass.SliceListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.SliceEvent)
+        context.ContextOuterClass.SliceEventOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_SliceList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_SliceEvent_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.SliceList.class, context.ContextOuterClass.SliceList.Builder.class);
+                context.ContextOuterClass.SliceEvent.class, context.ContextOuterClass.SliceEvent.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.SliceList.newBuilder()
+      // Construct using context.ContextOuterClass.SliceEvent.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -39921,17 +43809,22 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getSlicesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (slicesBuilder_ == null) {
-          slices_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+        if (eventBuilder_ == null) {
+          event_ = null;
         } else {
-          slicesBuilder_.clear();
+          event_ = null;
+          eventBuilder_ = null;
+        }
+        if (sliceIdBuilder_ == null) {
+          sliceId_ = null;
+        } else {
+          sliceId_ = null;
+          sliceIdBuilder_ = null;
         }
         return this;
       }
@@ -39939,17 +43832,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_SliceList_descriptor;
+        return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceList getDefaultInstanceForType() {
-        return context.ContextOuterClass.SliceList.getDefaultInstance();
+      public context.ContextOuterClass.SliceEvent getDefaultInstanceForType() {
+        return context.ContextOuterClass.SliceEvent.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceList build() {
-        context.ContextOuterClass.SliceList result = buildPartial();
+      public context.ContextOuterClass.SliceEvent build() {
+        context.ContextOuterClass.SliceEvent result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -39957,17 +43850,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceList buildPartial() {
-        context.ContextOuterClass.SliceList result = new context.ContextOuterClass.SliceList(this);
-        int from_bitField0_ = bitField0_;
-        if (slicesBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            slices_ = java.util.Collections.unmodifiableList(slices_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.slices_ = slices_;
+      public context.ContextOuterClass.SliceEvent buildPartial() {
+        context.ContextOuterClass.SliceEvent result = new context.ContextOuterClass.SliceEvent(this);
+        if (eventBuilder_ == null) {
+          result.event_ = event_;
         } else {
-          result.slices_ = slicesBuilder_.build();
+          result.event_ = eventBuilder_.build();
+        }
+        if (sliceIdBuilder_ == null) {
+          result.sliceId_ = sliceId_;
+        } else {
+          result.sliceId_ = sliceIdBuilder_.build();
         }
         onBuilt();
         return result;
@@ -40007,41 +43900,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.SliceList) {
-          return mergeFrom((context.ContextOuterClass.SliceList)other);
+        if (other instanceof context.ContextOuterClass.SliceEvent) {
+          return mergeFrom((context.ContextOuterClass.SliceEvent)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.SliceList other) {
-        if (other == context.ContextOuterClass.SliceList.getDefaultInstance()) return this;
-        if (slicesBuilder_ == null) {
-          if (!other.slices_.isEmpty()) {
-            if (slices_.isEmpty()) {
-              slices_ = other.slices_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureSlicesIsMutable();
-              slices_.addAll(other.slices_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.slices_.isEmpty()) {
-            if (slicesBuilder_.isEmpty()) {
-              slicesBuilder_.dispose();
-              slicesBuilder_ = null;
-              slices_ = other.slices_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              slicesBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSlicesFieldBuilder() : null;
-            } else {
-              slicesBuilder_.addAllMessages(other.slices_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.SliceEvent other) {
+        if (other == context.ContextOuterClass.SliceEvent.getDefaultInstance()) return this;
+        if (other.hasEvent()) {
+          mergeEvent(other.getEvent());
+        }
+        if (other.hasSliceId()) {
+          mergeSliceId(other.getSliceId());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -40058,11 +43931,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.SliceList parsedMessage = null;
+        context.ContextOuterClass.SliceEvent parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.SliceList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.SliceEvent) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -40071,246 +43944,243 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<context.ContextOuterClass.Slice> slices_ =
-        java.util.Collections.emptyList();
-      private void ensureSlicesIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          slices_ = new java.util.ArrayList<context.ContextOuterClass.Slice>(slices_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Slice, context.ContextOuterClass.Slice.Builder, context.ContextOuterClass.SliceOrBuilder> slicesBuilder_;
 
+      private context.ContextOuterClass.Event event_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
-       */
-      public java.util.List<context.ContextOuterClass.Slice> getSlicesList() {
-        if (slicesBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(slices_);
-        } else {
-          return slicesBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
+       * @return Whether the event field is set.
        */
-      public int getSlicesCount() {
-        if (slicesBuilder_ == null) {
-          return slices_.size();
-        } else {
-          return slicesBuilder_.getCount();
-        }
+      public boolean hasEvent() {
+        return eventBuilder_ != null || event_ != null;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
+       * @return The event.
        */
-      public context.ContextOuterClass.Slice getSlices(int index) {
-        if (slicesBuilder_ == null) {
-          return slices_.get(index);
+      public context.ContextOuterClass.Event getEvent() {
+        if (eventBuilder_ == null) {
+          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
         } else {
-          return slicesBuilder_.getMessage(index);
+          return eventBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setSlices(
-          int index, context.ContextOuterClass.Slice value) {
-        if (slicesBuilder_ == null) {
+      public Builder setEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSlicesIsMutable();
-          slices_.set(index, value);
+          event_ = value;
           onChanged();
         } else {
-          slicesBuilder_.setMessage(index, value);
+          eventBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setSlices(
-          int index, context.ContextOuterClass.Slice.Builder builderForValue) {
-        if (slicesBuilder_ == null) {
-          ensureSlicesIsMutable();
-          slices_.set(index, builderForValue.build());
+      public Builder setEvent(
+          context.ContextOuterClass.Event.Builder builderForValue) {
+        if (eventBuilder_ == null) {
+          event_ = builderForValue.build();
           onChanged();
         } else {
-          slicesBuilder_.setMessage(index, builderForValue.build());
+          eventBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addSlices(context.ContextOuterClass.Slice value) {
-        if (slicesBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
+          if (event_ != null) {
+            event_ =
+              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
+          } else {
+            event_ = value;
           }
-          ensureSlicesIsMutable();
-          slices_.add(value);
           onChanged();
         } else {
-          slicesBuilder_.addMessage(value);
+          eventBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addSlices(
-          int index, context.ContextOuterClass.Slice value) {
-        if (slicesBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureSlicesIsMutable();
-          slices_.add(index, value);
+      public Builder clearEvent() {
+        if (eventBuilder_ == null) {
+          event_ = null;
           onChanged();
         } else {
-          slicesBuilder_.addMessage(index, value);
+          event_ = null;
+          eventBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addSlices(
-          context.ContextOuterClass.Slice.Builder builderForValue) {
-        if (slicesBuilder_ == null) {
-          ensureSlicesIsMutable();
-          slices_.add(builderForValue.build());
-          onChanged();
+      public context.ContextOuterClass.Event.Builder getEventBuilder() {
+        
+        onChanged();
+        return getEventFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+        if (eventBuilder_ != null) {
+          return eventBuilder_.getMessageOrBuilder();
         } else {
-          slicesBuilder_.addMessage(builderForValue.build());
+          return event_ == null ?
+              context.ContextOuterClass.Event.getDefaultInstance() : event_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addSlices(
-          int index, context.ContextOuterClass.Slice.Builder builderForValue) {
-        if (slicesBuilder_ == null) {
-          ensureSlicesIsMutable();
-          slices_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          slicesBuilder_.addMessage(index, builderForValue.build());
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
+          getEventFieldBuilder() {
+        if (eventBuilder_ == null) {
+          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
+                  getEvent(),
+                  getParentForChildren(),
+                  isClean());
+          event_ = null;
         }
-        return this;
+        return eventBuilder_;
       }
+
+      private context.ContextOuterClass.SliceId sliceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdBuilder_;
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
+       * @return Whether the sliceId field is set.
        */
-      public Builder addAllSlices(
-          java.lang.Iterable<? extends context.ContextOuterClass.Slice> values) {
-        if (slicesBuilder_ == null) {
-          ensureSlicesIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, slices_);
-          onChanged();
+      public boolean hasSliceId() {
+        return sliceIdBuilder_ != null || sliceId_ != null;
+      }
+      /**
+       * <code>.context.SliceId slice_id = 2;</code>
+       * @return The sliceId.
+       */
+      public context.ContextOuterClass.SliceId getSliceId() {
+        if (sliceIdBuilder_ == null) {
+          return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
         } else {
-          slicesBuilder_.addAllMessages(values);
+          return sliceIdBuilder_.getMessage();
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public Builder clearSlices() {
-        if (slicesBuilder_ == null) {
-          slices_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+      public Builder setSliceId(context.ContextOuterClass.SliceId value) {
+        if (sliceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          sliceId_ = value;
           onChanged();
         } else {
-          slicesBuilder_.clear();
+          sliceIdBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public Builder removeSlices(int index) {
-        if (slicesBuilder_ == null) {
-          ensureSlicesIsMutable();
-          slices_.remove(index);
+      public Builder setSliceId(
+          context.ContextOuterClass.SliceId.Builder builderForValue) {
+        if (sliceIdBuilder_ == null) {
+          sliceId_ = builderForValue.build();
           onChanged();
         } else {
-          slicesBuilder_.remove(index);
+          sliceIdBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
-       */
-      public context.ContextOuterClass.Slice.Builder getSlicesBuilder(
-          int index) {
-        return getSlicesFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public context.ContextOuterClass.SliceOrBuilder getSlicesOrBuilder(
-          int index) {
-        if (slicesBuilder_ == null) {
-          return slices_.get(index);  } else {
-          return slicesBuilder_.getMessageOrBuilder(index);
+      public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
+        if (sliceIdBuilder_ == null) {
+          if (sliceId_ != null) {
+            sliceId_ =
+              context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
+          } else {
+            sliceId_ = value;
+          }
+          onChanged();
+        } else {
+          sliceIdBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.SliceOrBuilder> 
-           getSlicesOrBuilderList() {
-        if (slicesBuilder_ != null) {
-          return slicesBuilder_.getMessageOrBuilderList();
+      public Builder clearSliceId() {
+        if (sliceIdBuilder_ == null) {
+          sliceId_ = null;
+          onChanged();
         } else {
-          return java.util.Collections.unmodifiableList(slices_);
+          sliceId_ = null;
+          sliceIdBuilder_ = null;
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public context.ContextOuterClass.Slice.Builder addSlicesBuilder() {
-        return getSlicesFieldBuilder().addBuilder(
-            context.ContextOuterClass.Slice.getDefaultInstance());
+      public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
+        
+        onChanged();
+        return getSliceIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public context.ContextOuterClass.Slice.Builder addSlicesBuilder(
-          int index) {
-        return getSlicesFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.Slice.getDefaultInstance());
+      public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
+        if (sliceIdBuilder_ != null) {
+          return sliceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return sliceId_ == null ?
+              context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+        }
       }
       /**
-       * <code>repeated .context.Slice slices = 1;</code>
+       * <code>.context.SliceId slice_id = 2;</code>
        */
-      public java.util.List<context.ContextOuterClass.Slice.Builder> 
-           getSlicesBuilderList() {
-        return getSlicesFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Slice, context.ContextOuterClass.Slice.Builder, context.ContextOuterClass.SliceOrBuilder> 
-          getSlicesFieldBuilder() {
-        if (slicesBuilder_ == null) {
-          slicesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.Slice, context.ContextOuterClass.Slice.Builder, context.ContextOuterClass.SliceOrBuilder>(
-                  slices_,
-                  ((bitField0_ & 0x00000001) != 0),
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
+          getSliceIdFieldBuilder() {
+        if (sliceIdBuilder_ == null) {
+          sliceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
+                  getSliceId(),
                   getParentForChildren(),
                   isClean());
-          slices_ = null;
+          sliceId_ = null;
         }
-        return slicesBuilder_;
+        return sliceIdBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -40325,100 +44195,89 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.SliceList)
+      // @@protoc_insertion_point(builder_scope:context.SliceEvent)
     }
 
-    // @@protoc_insertion_point(class_scope:context.SliceList)
-    private static final context.ContextOuterClass.SliceList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.SliceEvent)
+    private static final context.ContextOuterClass.SliceEvent DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceEvent();
     }
 
-    public static context.ContextOuterClass.SliceList getDefaultInstance() {
+    public static context.ContextOuterClass.SliceEvent getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SliceList>
-        PARSER = new com.google.protobuf.AbstractParser<SliceList>() {
+    private static final com.google.protobuf.Parser<SliceEvent>
+        PARSER = new com.google.protobuf.AbstractParser<SliceEvent>() {
       @java.lang.Override
-      public SliceList parsePartialFrom(
+      public SliceEvent parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SliceList(input, extensionRegistry);
+        return new SliceEvent(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SliceList> parser() {
+    public static com.google.protobuf.Parser<SliceEvent> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SliceList> getParserForType() {
+    public com.google.protobuf.Parser<SliceEvent> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.SliceList getDefaultInstanceForType() {
+    public context.ContextOuterClass.SliceEvent getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface SliceEventOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.SliceEvent)
+  public interface ConnectionIdOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionId)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
-     */
-    boolean hasEvent();
-    /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
-     */
-    context.ContextOuterClass.Event getEvent();
-    /**
-     * <code>.context.Event event = 1;</code>
-     */
-    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
-
-    /**
-     * <code>.context.SliceId slice_id = 2;</code>
-     * @return Whether the sliceId field is set.
+     * <code>.context.Uuid connection_uuid = 1;</code>
+     * @return Whether the connectionUuid field is set.
      */
-    boolean hasSliceId();
+    boolean hasConnectionUuid();
     /**
-     * <code>.context.SliceId slice_id = 2;</code>
-     * @return The sliceId.
+     * <code>.context.Uuid connection_uuid = 1;</code>
+     * @return The connectionUuid.
      */
-    context.ContextOuterClass.SliceId getSliceId();
+    context.ContextOuterClass.Uuid getConnectionUuid();
     /**
-     * <code>.context.SliceId slice_id = 2;</code>
+     * <code>.context.Uuid connection_uuid = 1;</code>
      */
-    context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder();
+    context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder();
   }
   /**
-   * Protobuf type {@code context.SliceEvent}
+   * <pre>
+   * ----- Connection ----------------------------------------------------------------------------------------------------
+   * </pre>
+   *
+   * Protobuf type {@code context.ConnectionId}
    */
-  public static final class SliceEvent extends
+  public static final class ConnectionId extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.SliceEvent)
-      SliceEventOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionId)
+      ConnectionIdOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use SliceEvent.newBuilder() to construct.
-    private SliceEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionId.newBuilder() to construct.
+    private ConnectionId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SliceEvent() {
+    private ConnectionId() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SliceEvent();
+      return new ConnectionId();
     }
 
     @java.lang.Override
@@ -40426,7 +44285,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SliceEvent(
+    private ConnectionId(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -40445,27 +44304,14 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Event.Builder subBuilder = null;
-              if (event_ != null) {
-                subBuilder = event_.toBuilder();
-              }
-              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(event_);
-                event_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 18: {
-              context.ContextOuterClass.SliceId.Builder subBuilder = null;
-              if (sliceId_ != null) {
-                subBuilder = sliceId_.toBuilder();
+              context.ContextOuterClass.Uuid.Builder subBuilder = null;
+              if (connectionUuid_ != null) {
+                subBuilder = connectionUuid_.toBuilder();
               }
-              sliceId_ = input.readMessage(context.ContextOuterClass.SliceId.parser(), extensionRegistry);
+              connectionUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(sliceId_);
-                sliceId_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(connectionUuid_);
+                connectionUuid_ = subBuilder.buildPartial();
               }
 
               break;
@@ -40491,67 +44337,41 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_SliceEvent_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionId_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.SliceEvent.class, context.ContextOuterClass.SliceEvent.Builder.class);
-    }
-
-    public static final int EVENT_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Event event_;
-    /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
-     */
-    @java.lang.Override
-    public boolean hasEvent() {
-      return event_ != null;
-    }
-    /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.Event getEvent() {
-      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
-    }
-    /**
-     * <code>.context.Event event = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-      return getEvent();
+              context.ContextOuterClass.ConnectionId.class, context.ContextOuterClass.ConnectionId.Builder.class);
     }
 
-    public static final int SLICE_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.SliceId sliceId_;
+    public static final int CONNECTION_UUID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Uuid connectionUuid_;
     /**
-     * <code>.context.SliceId slice_id = 2;</code>
-     * @return Whether the sliceId field is set.
+     * <code>.context.Uuid connection_uuid = 1;</code>
+     * @return Whether the connectionUuid field is set.
      */
     @java.lang.Override
-    public boolean hasSliceId() {
-      return sliceId_ != null;
+    public boolean hasConnectionUuid() {
+      return connectionUuid_ != null;
     }
     /**
-     * <code>.context.SliceId slice_id = 2;</code>
-     * @return The sliceId.
+     * <code>.context.Uuid connection_uuid = 1;</code>
+     * @return The connectionUuid.
      */
     @java.lang.Override
-    public context.ContextOuterClass.SliceId getSliceId() {
-      return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+    public context.ContextOuterClass.Uuid getConnectionUuid() {
+      return connectionUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
     }
     /**
-     * <code>.context.SliceId slice_id = 2;</code>
+     * <code>.context.Uuid connection_uuid = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-      return getSliceId();
+    public context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder() {
+      return getConnectionUuid();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -40568,11 +44388,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (event_ != null) {
-        output.writeMessage(1, getEvent());
-      }
-      if (sliceId_ != null) {
-        output.writeMessage(2, getSliceId());
+      if (connectionUuid_ != null) {
+        output.writeMessage(1, getConnectionUuid());
       }
       unknownFields.writeTo(output);
     }
@@ -40583,13 +44400,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (event_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEvent());
-      }
-      if (sliceId_ != null) {
+      if (connectionUuid_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getSliceId());
+          .computeMessageSize(1, getConnectionUuid());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -40601,20 +44414,15 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.SliceEvent)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionId)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.SliceEvent other = (context.ContextOuterClass.SliceEvent) obj;
+      context.ContextOuterClass.ConnectionId other = (context.ContextOuterClass.ConnectionId) obj;
 
-      if (hasEvent() != other.hasEvent()) return false;
-      if (hasEvent()) {
-        if (!getEvent()
-            .equals(other.getEvent())) return false;
-      }
-      if (hasSliceId() != other.hasSliceId()) return false;
-      if (hasSliceId()) {
-        if (!getSliceId()
-            .equals(other.getSliceId())) return false;
+      if (hasConnectionUuid() != other.hasConnectionUuid()) return false;
+      if (hasConnectionUuid()) {
+        if (!getConnectionUuid()
+            .equals(other.getConnectionUuid())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -40627,82 +44435,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEvent()) {
-        hash = (37 * hash) + EVENT_FIELD_NUMBER;
-        hash = (53 * hash) + getEvent().hashCode();
-      }
-      if (hasSliceId()) {
-        hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getSliceId().hashCode();
+      if (hasConnectionUuid()) {
+        hash = (37 * hash) + CONNECTION_UUID_FIELD_NUMBER;
+        hash = (53 * hash) + getConnectionUuid().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionId parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionId parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceEvent parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionId parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceEvent parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionId parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.SliceEvent parseFrom(
+    public static context.ContextOuterClass.ConnectionId parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -40715,7 +44519,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.SliceEvent prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionId prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -40731,26 +44535,30 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.SliceEvent}
+     * <pre>
+     * ----- Connection ----------------------------------------------------------------------------------------------------
+     * </pre>
+     *
+     * Protobuf type {@code context.ConnectionId}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceEvent)
-        context.ContextOuterClass.SliceEventOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionId)
+        context.ContextOuterClass.ConnectionIdOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_SliceEvent_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionId_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.SliceEvent.class, context.ContextOuterClass.SliceEvent.Builder.class);
+                context.ContextOuterClass.ConnectionId.class, context.ContextOuterClass.ConnectionId.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.SliceEvent.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionId.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -40768,17 +44576,11 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (eventBuilder_ == null) {
-          event_ = null;
-        } else {
-          event_ = null;
-          eventBuilder_ = null;
-        }
-        if (sliceIdBuilder_ == null) {
-          sliceId_ = null;
+        if (connectionUuidBuilder_ == null) {
+          connectionUuid_ = null;
         } else {
-          sliceId_ = null;
-          sliceIdBuilder_ = null;
+          connectionUuid_ = null;
+          connectionUuidBuilder_ = null;
         }
         return this;
       }
@@ -40786,17 +44588,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_SliceEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceEvent getDefaultInstanceForType() {
-        return context.ContextOuterClass.SliceEvent.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionId getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionId.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceEvent build() {
-        context.ContextOuterClass.SliceEvent result = buildPartial();
+      public context.ContextOuterClass.ConnectionId build() {
+        context.ContextOuterClass.ConnectionId result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -40804,17 +44606,12 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.SliceEvent buildPartial() {
-        context.ContextOuterClass.SliceEvent result = new context.ContextOuterClass.SliceEvent(this);
-        if (eventBuilder_ == null) {
-          result.event_ = event_;
-        } else {
-          result.event_ = eventBuilder_.build();
-        }
-        if (sliceIdBuilder_ == null) {
-          result.sliceId_ = sliceId_;
+      public context.ContextOuterClass.ConnectionId buildPartial() {
+        context.ContextOuterClass.ConnectionId result = new context.ContextOuterClass.ConnectionId(this);
+        if (connectionUuidBuilder_ == null) {
+          result.connectionUuid_ = connectionUuid_;
         } else {
-          result.sliceId_ = sliceIdBuilder_.build();
+          result.connectionUuid_ = connectionUuidBuilder_.build();
         }
         onBuilt();
         return result;
@@ -40854,21 +44651,18 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.SliceEvent) {
-          return mergeFrom((context.ContextOuterClass.SliceEvent)other);
+        if (other instanceof context.ContextOuterClass.ConnectionId) {
+          return mergeFrom((context.ContextOuterClass.ConnectionId)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.SliceEvent other) {
-        if (other == context.ContextOuterClass.SliceEvent.getDefaultInstance()) return this;
-        if (other.hasEvent()) {
-          mergeEvent(other.getEvent());
-        }
-        if (other.hasSliceId()) {
-          mergeSliceId(other.getSliceId());
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionId other) {
+        if (other == context.ContextOuterClass.ConnectionId.getDefaultInstance()) return this;
+        if (other.hasConnectionUuid()) {
+          mergeConnectionUuid(other.getConnectionUuid());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -40885,11 +44679,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.SliceEvent parsedMessage = null;
+        context.ContextOuterClass.ConnectionId parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.SliceEvent) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionId) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -40899,242 +44693,123 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.Event event_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
-      /**
-       * <code>.context.Event event = 1;</code>
-       * @return Whether the event field is set.
-       */
-      public boolean hasEvent() {
-        return eventBuilder_ != null || event_ != null;
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       * @return The event.
-       */
-      public context.ContextOuterClass.Event getEvent() {
-        if (eventBuilder_ == null) {
-          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
-        } else {
-          return eventBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      public Builder setEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          event_ = value;
-          onChanged();
-        } else {
-          eventBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      public Builder setEvent(
-          context.ContextOuterClass.Event.Builder builderForValue) {
-        if (eventBuilder_ == null) {
-          event_ = builderForValue.build();
-          onChanged();
-        } else {
-          eventBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      public Builder mergeEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
-          if (event_ != null) {
-            event_ =
-              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
-          } else {
-            event_ = value;
-          }
-          onChanged();
-        } else {
-          eventBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      public Builder clearEvent() {
-        if (eventBuilder_ == null) {
-          event_ = null;
-          onChanged();
-        } else {
-          event_ = null;
-          eventBuilder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      public context.ContextOuterClass.Event.Builder getEventBuilder() {
-        
-        onChanged();
-        return getEventFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-        if (eventBuilder_ != null) {
-          return eventBuilder_.getMessageOrBuilder();
-        } else {
-          return event_ == null ?
-              context.ContextOuterClass.Event.getDefaultInstance() : event_;
-        }
-      }
-      /**
-       * <code>.context.Event event = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
-          getEventFieldBuilder() {
-        if (eventBuilder_ == null) {
-          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
-                  getEvent(),
-                  getParentForChildren(),
-                  isClean());
-          event_ = null;
-        }
-        return eventBuilder_;
-      }
-
-      private context.ContextOuterClass.SliceId sliceId_;
+      private context.ContextOuterClass.Uuid connectionUuid_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdBuilder_;
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> connectionUuidBuilder_;
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
-       * @return Whether the sliceId field is set.
+       * <code>.context.Uuid connection_uuid = 1;</code>
+       * @return Whether the connectionUuid field is set.
        */
-      public boolean hasSliceId() {
-        return sliceIdBuilder_ != null || sliceId_ != null;
+      public boolean hasConnectionUuid() {
+        return connectionUuidBuilder_ != null || connectionUuid_ != null;
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
-       * @return The sliceId.
+       * <code>.context.Uuid connection_uuid = 1;</code>
+       * @return The connectionUuid.
        */
-      public context.ContextOuterClass.SliceId getSliceId() {
-        if (sliceIdBuilder_ == null) {
-          return sliceId_ == null ? context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+      public context.ContextOuterClass.Uuid getConnectionUuid() {
+        if (connectionUuidBuilder_ == null) {
+          return connectionUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
         } else {
-          return sliceIdBuilder_.getMessage();
+          return connectionUuidBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
-      public Builder setSliceId(context.ContextOuterClass.SliceId value) {
-        if (sliceIdBuilder_ == null) {
+      public Builder setConnectionUuid(context.ContextOuterClass.Uuid value) {
+        if (connectionUuidBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          sliceId_ = value;
+          connectionUuid_ = value;
           onChanged();
         } else {
-          sliceIdBuilder_.setMessage(value);
+          connectionUuidBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
-      public Builder setSliceId(
-          context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceIdBuilder_ == null) {
-          sliceId_ = builderForValue.build();
+      public Builder setConnectionUuid(
+          context.ContextOuterClass.Uuid.Builder builderForValue) {
+        if (connectionUuidBuilder_ == null) {
+          connectionUuid_ = builderForValue.build();
           onChanged();
         } else {
-          sliceIdBuilder_.setMessage(builderForValue.build());
+          connectionUuidBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
-      public Builder mergeSliceId(context.ContextOuterClass.SliceId value) {
-        if (sliceIdBuilder_ == null) {
-          if (sliceId_ != null) {
-            sliceId_ =
-              context.ContextOuterClass.SliceId.newBuilder(sliceId_).mergeFrom(value).buildPartial();
+      public Builder mergeConnectionUuid(context.ContextOuterClass.Uuid value) {
+        if (connectionUuidBuilder_ == null) {
+          if (connectionUuid_ != null) {
+            connectionUuid_ =
+              context.ContextOuterClass.Uuid.newBuilder(connectionUuid_).mergeFrom(value).buildPartial();
           } else {
-            sliceId_ = value;
+            connectionUuid_ = value;
           }
           onChanged();
         } else {
-          sliceIdBuilder_.mergeFrom(value);
+          connectionUuidBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
-      public Builder clearSliceId() {
-        if (sliceIdBuilder_ == null) {
-          sliceId_ = null;
+      public Builder clearConnectionUuid() {
+        if (connectionUuidBuilder_ == null) {
+          connectionUuid_ = null;
           onChanged();
         } else {
-          sliceId_ = null;
-          sliceIdBuilder_ = null;
+          connectionUuid_ = null;
+          connectionUuidBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
-      public context.ContextOuterClass.SliceId.Builder getSliceIdBuilder() {
+      public context.ContextOuterClass.Uuid.Builder getConnectionUuidBuilder() {
         
         onChanged();
-        return getSliceIdFieldBuilder().getBuilder();
+        return getConnectionUuidFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
-      public context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder() {
-        if (sliceIdBuilder_ != null) {
-          return sliceIdBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder() {
+        if (connectionUuidBuilder_ != null) {
+          return connectionUuidBuilder_.getMessageOrBuilder();
         } else {
-          return sliceId_ == null ?
-              context.ContextOuterClass.SliceId.getDefaultInstance() : sliceId_;
+          return connectionUuid_ == null ?
+              context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
         }
       }
       /**
-       * <code>.context.SliceId slice_id = 2;</code>
+       * <code>.context.Uuid connection_uuid = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> 
-          getSliceIdFieldBuilder() {
-        if (sliceIdBuilder_ == null) {
-          sliceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder>(
-                  getSliceId(),
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
+          getConnectionUuidFieldBuilder() {
+        if (connectionUuidBuilder_ == null) {
+          connectionUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
+                  getConnectionUuid(),
                   getParentForChildren(),
                   isClean());
-          sliceId_ = null;
+          connectionUuid_ = null;
         }
-        return sliceIdBuilder_;
+        return connectionUuidBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -41149,89 +44824,83 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.SliceEvent)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionId)
     }
 
-    // @@protoc_insertion_point(class_scope:context.SliceEvent)
-    private static final context.ContextOuterClass.SliceEvent DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionId)
+    private static final context.ContextOuterClass.ConnectionId DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.SliceEvent();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionId();
     }
 
-    public static context.ContextOuterClass.SliceEvent getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionId getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SliceEvent>
-        PARSER = new com.google.protobuf.AbstractParser<SliceEvent>() {
+    private static final com.google.protobuf.Parser<ConnectionId>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionId>() {
       @java.lang.Override
-      public SliceEvent parsePartialFrom(
+      public ConnectionId parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SliceEvent(input, extensionRegistry);
+        return new ConnectionId(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SliceEvent> parser() {
+    public static com.google.protobuf.Parser<ConnectionId> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SliceEvent> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionId> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.SliceEvent getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionId getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionIdOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionId)
+  public interface ConnectionSettings_L0OrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Uuid connection_uuid = 1;</code>
-     * @return Whether the connectionUuid field is set.
-     */
-    boolean hasConnectionUuid();
-    /**
-     * <code>.context.Uuid connection_uuid = 1;</code>
-     * @return The connectionUuid.
+     * <code>string lsp_symbolic_name = 1;</code>
+     * @return The lspSymbolicName.
      */
-    context.ContextOuterClass.Uuid getConnectionUuid();
+    java.lang.String getLspSymbolicName();
     /**
-     * <code>.context.Uuid connection_uuid = 1;</code>
+     * <code>string lsp_symbolic_name = 1;</code>
+     * @return The bytes for lspSymbolicName.
      */
-    context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder();
+    com.google.protobuf.ByteString
+        getLspSymbolicNameBytes();
   }
   /**
-   * <pre>
-   * ----- Connection ----------------------------------------------------------------------------------------------------
-   * </pre>
-   *
-   * Protobuf type {@code context.ConnectionId}
+   * Protobuf type {@code context.ConnectionSettings_L0}
    */
-  public static final class ConnectionId extends
+  public static final class ConnectionSettings_L0 extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionId)
-      ConnectionIdOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
+      ConnectionSettings_L0OrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionId.newBuilder() to construct.
-    private ConnectionId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionSettings_L0.newBuilder() to construct.
+    private ConnectionSettings_L0(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionId() {
+    private ConnectionSettings_L0() {
+      lspSymbolicName_ = "";
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionId();
+      return new ConnectionSettings_L0();
     }
 
     @java.lang.Override
@@ -41239,7 +44908,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionId(
+    private ConnectionSettings_L0(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -41258,16 +44927,9 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Uuid.Builder subBuilder = null;
-              if (connectionUuid_ != null) {
-                subBuilder = connectionUuid_.toBuilder();
-              }
-              connectionUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(connectionUuid_);
-                connectionUuid_ = subBuilder.buildPartial();
-              }
+              java.lang.String s = input.readStringRequireUtf8();
 
+              lspSymbolicName_ = s;
               break;
             }
             default: {
@@ -41291,41 +44953,53 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionId_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionId.class, context.ContextOuterClass.ConnectionId.Builder.class);
+              context.ContextOuterClass.ConnectionSettings_L0.class, context.ContextOuterClass.ConnectionSettings_L0.Builder.class);
     }
 
-    public static final int CONNECTION_UUID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Uuid connectionUuid_;
-    /**
-     * <code>.context.Uuid connection_uuid = 1;</code>
-     * @return Whether the connectionUuid field is set.
-     */
-    @java.lang.Override
-    public boolean hasConnectionUuid() {
-      return connectionUuid_ != null;
-    }
+    public static final int LSP_SYMBOLIC_NAME_FIELD_NUMBER = 1;
+    private volatile java.lang.Object lspSymbolicName_;
     /**
-     * <code>.context.Uuid connection_uuid = 1;</code>
-     * @return The connectionUuid.
+     * <code>string lsp_symbolic_name = 1;</code>
+     * @return The lspSymbolicName.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Uuid getConnectionUuid() {
-      return connectionUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
+    public java.lang.String getLspSymbolicName() {
+      java.lang.Object ref = lspSymbolicName_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        lspSymbolicName_ = s;
+        return s;
+      }
     }
     /**
-     * <code>.context.Uuid connection_uuid = 1;</code>
+     * <code>string lsp_symbolic_name = 1;</code>
+     * @return The bytes for lspSymbolicName.
      */
     @java.lang.Override
-    public context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder() {
-      return getConnectionUuid();
+    public com.google.protobuf.ByteString
+        getLspSymbolicNameBytes() {
+      java.lang.Object ref = lspSymbolicName_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        lspSymbolicName_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
     private byte memoizedIsInitialized = -1;
@@ -41342,8 +45016,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (connectionUuid_ != null) {
-        output.writeMessage(1, getConnectionUuid());
+      if (!getLspSymbolicNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, lspSymbolicName_);
       }
       unknownFields.writeTo(output);
     }
@@ -41354,9 +45028,8 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (connectionUuid_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getConnectionUuid());
+      if (!getLspSymbolicNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, lspSymbolicName_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -41368,16 +45041,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionId)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L0)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionId other = (context.ContextOuterClass.ConnectionId) obj;
+      context.ContextOuterClass.ConnectionSettings_L0 other = (context.ContextOuterClass.ConnectionSettings_L0) obj;
 
-      if (hasConnectionUuid() != other.hasConnectionUuid()) return false;
-      if (hasConnectionUuid()) {
-        if (!getConnectionUuid()
-            .equals(other.getConnectionUuid())) return false;
-      }
+      if (!getLspSymbolicName()
+          .equals(other.getLspSymbolicName())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -41389,78 +45059,76 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasConnectionUuid()) {
-        hash = (37 * hash) + CONNECTION_UUID_FIELD_NUMBER;
-        hash = (53 * hash) + getConnectionUuid().hashCode();
-      }
+      hash = (37 * hash) + LSP_SYMBOLIC_NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getLspSymbolicName().hashCode();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionId parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionId parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionId parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -41473,7 +45141,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionId prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L0 prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -41489,30 +45157,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * <pre>
-     * ----- Connection ----------------------------------------------------------------------------------------------------
-     * </pre>
-     *
-     * Protobuf type {@code context.ConnectionId}
+     * Protobuf type {@code context.ConnectionSettings_L0}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionId)
-        context.ContextOuterClass.ConnectionIdOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
+        context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionId_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionId.class, context.ContextOuterClass.ConnectionId.Builder.class);
+                context.ContextOuterClass.ConnectionSettings_L0.class, context.ContextOuterClass.ConnectionSettings_L0.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionId.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionSettings_L0.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -41530,29 +45194,25 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (connectionUuidBuilder_ == null) {
-          connectionUuid_ = null;
-        } else {
-          connectionUuid_ = null;
-          connectionUuidBuilder_ = null;
-        }
+        lspSymbolicName_ = "";
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionId_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionId getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionId.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionSettings_L0 getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionId build() {
-        context.ContextOuterClass.ConnectionId result = buildPartial();
+      public context.ContextOuterClass.ConnectionSettings_L0 build() {
+        context.ContextOuterClass.ConnectionSettings_L0 result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -41560,13 +45220,9 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionId buildPartial() {
-        context.ContextOuterClass.ConnectionId result = new context.ContextOuterClass.ConnectionId(this);
-        if (connectionUuidBuilder_ == null) {
-          result.connectionUuid_ = connectionUuid_;
-        } else {
-          result.connectionUuid_ = connectionUuidBuilder_.build();
-        }
+      public context.ContextOuterClass.ConnectionSettings_L0 buildPartial() {
+        context.ContextOuterClass.ConnectionSettings_L0 result = new context.ContextOuterClass.ConnectionSettings_L0(this);
+        result.lspSymbolicName_ = lspSymbolicName_;
         onBuilt();
         return result;
       }
@@ -41605,18 +45261,19 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionId) {
-          return mergeFrom((context.ContextOuterClass.ConnectionId)other);
+        if (other instanceof context.ContextOuterClass.ConnectionSettings_L0) {
+          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L0)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionId other) {
-        if (other == context.ContextOuterClass.ConnectionId.getDefaultInstance()) return this;
-        if (other.hasConnectionUuid()) {
-          mergeConnectionUuid(other.getConnectionUuid());
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L0 other) {
+        if (other == context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance()) return this;
+        if (!other.getLspSymbolicName().isEmpty()) {
+          lspSymbolicName_ = other.lspSymbolicName_;
+          onChanged();
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -41633,11 +45290,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionId parsedMessage = null;
+        context.ContextOuterClass.ConnectionSettings_L0 parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionId) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L0) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -41647,123 +45304,80 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.Uuid connectionUuid_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> connectionUuidBuilder_;
-      /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
-       * @return Whether the connectionUuid field is set.
-       */
-      public boolean hasConnectionUuid() {
-        return connectionUuidBuilder_ != null || connectionUuid_ != null;
-      }
-      /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
-       * @return The connectionUuid.
-       */
-      public context.ContextOuterClass.Uuid getConnectionUuid() {
-        if (connectionUuidBuilder_ == null) {
-          return connectionUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
-        } else {
-          return connectionUuidBuilder_.getMessage();
-        }
-      }
+      private java.lang.Object lspSymbolicName_ = "";
       /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
+       * <code>string lsp_symbolic_name = 1;</code>
+       * @return The lspSymbolicName.
        */
-      public Builder setConnectionUuid(context.ContextOuterClass.Uuid value) {
-        if (connectionUuidBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          connectionUuid_ = value;
-          onChanged();
+      public java.lang.String getLspSymbolicName() {
+        java.lang.Object ref = lspSymbolicName_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          lspSymbolicName_ = s;
+          return s;
         } else {
-          connectionUuidBuilder_.setMessage(value);
+          return (java.lang.String) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
+       * <code>string lsp_symbolic_name = 1;</code>
+       * @return The bytes for lspSymbolicName.
        */
-      public Builder setConnectionUuid(
-          context.ContextOuterClass.Uuid.Builder builderForValue) {
-        if (connectionUuidBuilder_ == null) {
-          connectionUuid_ = builderForValue.build();
-          onChanged();
+      public com.google.protobuf.ByteString
+          getLspSymbolicNameBytes() {
+        java.lang.Object ref = lspSymbolicName_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          lspSymbolicName_ = b;
+          return b;
         } else {
-          connectionUuidBuilder_.setMessage(builderForValue.build());
+          return (com.google.protobuf.ByteString) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
+       * <code>string lsp_symbolic_name = 1;</code>
+       * @param value The lspSymbolicName to set.
+       * @return This builder for chaining.
        */
-      public Builder mergeConnectionUuid(context.ContextOuterClass.Uuid value) {
-        if (connectionUuidBuilder_ == null) {
-          if (connectionUuid_ != null) {
-            connectionUuid_ =
-              context.ContextOuterClass.Uuid.newBuilder(connectionUuid_).mergeFrom(value).buildPartial();
-          } else {
-            connectionUuid_ = value;
-          }
-          onChanged();
-        } else {
-          connectionUuidBuilder_.mergeFrom(value);
-        }
-
+      public Builder setLspSymbolicName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        lspSymbolicName_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
+       * <code>string lsp_symbolic_name = 1;</code>
+       * @return This builder for chaining.
        */
-      public Builder clearConnectionUuid() {
-        if (connectionUuidBuilder_ == null) {
-          connectionUuid_ = null;
-          onChanged();
-        } else {
-          connectionUuid_ = null;
-          connectionUuidBuilder_ = null;
-        }
-
+      public Builder clearLspSymbolicName() {
+        
+        lspSymbolicName_ = getDefaultInstance().getLspSymbolicName();
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
+       * <code>string lsp_symbolic_name = 1;</code>
+       * @param value The bytes for lspSymbolicName to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Uuid.Builder getConnectionUuidBuilder() {
+      public Builder setLspSymbolicNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
         
+        lspSymbolicName_ = value;
         onChanged();
-        return getConnectionUuidFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
-       */
-      public context.ContextOuterClass.UuidOrBuilder getConnectionUuidOrBuilder() {
-        if (connectionUuidBuilder_ != null) {
-          return connectionUuidBuilder_.getMessageOrBuilder();
-        } else {
-          return connectionUuid_ == null ?
-              context.ContextOuterClass.Uuid.getDefaultInstance() : connectionUuid_;
-        }
-      }
-      /**
-       * <code>.context.Uuid connection_uuid = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
-          getConnectionUuidFieldBuilder() {
-        if (connectionUuidBuilder_ == null) {
-          connectionUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
-                  getConnectionUuid(),
-                  getParentForChildren(),
-                  isClean());
-          connectionUuid_ = null;
-        }
-        return connectionUuidBuilder_;
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -41778,83 +45392,120 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionId)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L0)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionId)
-    private static final context.ContextOuterClass.ConnectionId DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L0)
+    private static final context.ContextOuterClass.ConnectionSettings_L0 DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionId();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L0();
     }
 
-    public static context.ContextOuterClass.ConnectionId getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionSettings_L0 getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionId>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionId>() {
+    private static final com.google.protobuf.Parser<ConnectionSettings_L0>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L0>() {
       @java.lang.Override
-      public ConnectionId parsePartialFrom(
+      public ConnectionSettings_L0 parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionId(input, extensionRegistry);
+        return new ConnectionSettings_L0(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionId> parser() {
+    public static com.google.protobuf.Parser<ConnectionSettings_L0> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionId> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionSettings_L0> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionId getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionSettings_L0 getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionSettings_L0OrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L0)
+  public interface ConnectionSettings_L2OrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>string lsp_symbolic_name = 1;</code>
-     * @return The lspSymbolicName.
+     * <code>string src_mac_address = 1;</code>
+     * @return The srcMacAddress.
      */
-    java.lang.String getLspSymbolicName();
+    java.lang.String getSrcMacAddress();
     /**
-     * <code>string lsp_symbolic_name = 1;</code>
-     * @return The bytes for lspSymbolicName.
+     * <code>string src_mac_address = 1;</code>
+     * @return The bytes for srcMacAddress.
      */
     com.google.protobuf.ByteString
-        getLspSymbolicNameBytes();
+        getSrcMacAddressBytes();
+
+    /**
+     * <code>string dst_mac_address = 2;</code>
+     * @return The dstMacAddress.
+     */
+    java.lang.String getDstMacAddress();
+    /**
+     * <code>string dst_mac_address = 2;</code>
+     * @return The bytes for dstMacAddress.
+     */
+    com.google.protobuf.ByteString
+        getDstMacAddressBytes();
+
+    /**
+     * <code>uint32 ether_type = 3;</code>
+     * @return The etherType.
+     */
+    int getEtherType();
+
+    /**
+     * <code>uint32 vlan_id = 4;</code>
+     * @return The vlanId.
+     */
+    int getVlanId();
+
+    /**
+     * <code>uint32 mpls_label = 5;</code>
+     * @return The mplsLabel.
+     */
+    int getMplsLabel();
+
+    /**
+     * <code>uint32 mpls_traffic_class = 6;</code>
+     * @return The mplsTrafficClass.
+     */
+    int getMplsTrafficClass();
   }
   /**
-   * Protobuf type {@code context.ConnectionSettings_L0}
+   * Protobuf type {@code context.ConnectionSettings_L2}
    */
-  public static final class ConnectionSettings_L0 extends
+  public static final class ConnectionSettings_L2 extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L0)
-      ConnectionSettings_L0OrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
+      ConnectionSettings_L2OrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionSettings_L0.newBuilder() to construct.
-    private ConnectionSettings_L0(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionSettings_L2.newBuilder() to construct.
+    private ConnectionSettings_L2(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionSettings_L0() {
-      lspSymbolicName_ = "";
+    private ConnectionSettings_L2() {
+      srcMacAddress_ = "";
+      dstMacAddress_ = "";
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionSettings_L0();
+      return new ConnectionSettings_L2();
     }
 
     @java.lang.Override
@@ -41862,7 +45513,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionSettings_L0(
+    private ConnectionSettings_L2(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -41883,7 +45534,33 @@ public final class ContextOuterClass {
             case 10: {
               java.lang.String s = input.readStringRequireUtf8();
 
-              lspSymbolicName_ = s;
+              srcMacAddress_ = s;
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              dstMacAddress_ = s;
+              break;
+            }
+            case 24: {
+
+              etherType_ = input.readUInt32();
+              break;
+            }
+            case 32: {
+
+              vlanId_ = input.readUInt32();
+              break;
+            }
+            case 40: {
+
+              mplsLabel_ = input.readUInt32();
+              break;
+            }
+            case 48: {
+
+              mplsTrafficClass_ = input.readUInt32();
               break;
             }
             default: {
@@ -41907,55 +45584,137 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionSettings_L0.class, context.ContextOuterClass.ConnectionSettings_L0.Builder.class);
+              context.ContextOuterClass.ConnectionSettings_L2.class, context.ContextOuterClass.ConnectionSettings_L2.Builder.class);
     }
 
-    public static final int LSP_SYMBOLIC_NAME_FIELD_NUMBER = 1;
-    private volatile java.lang.Object lspSymbolicName_;
+    public static final int SRC_MAC_ADDRESS_FIELD_NUMBER = 1;
+    private volatile java.lang.Object srcMacAddress_;
     /**
-     * <code>string lsp_symbolic_name = 1;</code>
-     * @return The lspSymbolicName.
+     * <code>string src_mac_address = 1;</code>
+     * @return The srcMacAddress.
      */
     @java.lang.Override
-    public java.lang.String getLspSymbolicName() {
-      java.lang.Object ref = lspSymbolicName_;
+    public java.lang.String getSrcMacAddress() {
+      java.lang.Object ref = srcMacAddress_;
       if (ref instanceof java.lang.String) {
         return (java.lang.String) ref;
       } else {
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        lspSymbolicName_ = s;
+        srcMacAddress_ = s;
         return s;
       }
     }
     /**
-     * <code>string lsp_symbolic_name = 1;</code>
-     * @return The bytes for lspSymbolicName.
+     * <code>string src_mac_address = 1;</code>
+     * @return The bytes for srcMacAddress.
      */
     @java.lang.Override
     public com.google.protobuf.ByteString
-        getLspSymbolicNameBytes() {
-      java.lang.Object ref = lspSymbolicName_;
+        getSrcMacAddressBytes() {
+      java.lang.Object ref = srcMacAddress_;
       if (ref instanceof java.lang.String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        lspSymbolicName_ = b;
+        srcMacAddress_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int DST_MAC_ADDRESS_FIELD_NUMBER = 2;
+    private volatile java.lang.Object dstMacAddress_;
+    /**
+     * <code>string dst_mac_address = 2;</code>
+     * @return The dstMacAddress.
+     */
+    @java.lang.Override
+    public java.lang.String getDstMacAddress() {
+      java.lang.Object ref = dstMacAddress_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        dstMacAddress_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string dst_mac_address = 2;</code>
+     * @return The bytes for dstMacAddress.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getDstMacAddressBytes() {
+      java.lang.Object ref = dstMacAddress_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        dstMacAddress_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
       }
     }
 
+    public static final int ETHER_TYPE_FIELD_NUMBER = 3;
+    private int etherType_;
+    /**
+     * <code>uint32 ether_type = 3;</code>
+     * @return The etherType.
+     */
+    @java.lang.Override
+    public int getEtherType() {
+      return etherType_;
+    }
+
+    public static final int VLAN_ID_FIELD_NUMBER = 4;
+    private int vlanId_;
+    /**
+     * <code>uint32 vlan_id = 4;</code>
+     * @return The vlanId.
+     */
+    @java.lang.Override
+    public int getVlanId() {
+      return vlanId_;
+    }
+
+    public static final int MPLS_LABEL_FIELD_NUMBER = 5;
+    private int mplsLabel_;
+    /**
+     * <code>uint32 mpls_label = 5;</code>
+     * @return The mplsLabel.
+     */
+    @java.lang.Override
+    public int getMplsLabel() {
+      return mplsLabel_;
+    }
+
+    public static final int MPLS_TRAFFIC_CLASS_FIELD_NUMBER = 6;
+    private int mplsTrafficClass_;
+    /**
+     * <code>uint32 mpls_traffic_class = 6;</code>
+     * @return The mplsTrafficClass.
+     */
+    @java.lang.Override
+    public int getMplsTrafficClass() {
+      return mplsTrafficClass_;
+    }
+
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -41970,8 +45729,23 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (!getLspSymbolicNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, lspSymbolicName_);
+      if (!getSrcMacAddressBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcMacAddress_);
+      }
+      if (!getDstMacAddressBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstMacAddress_);
+      }
+      if (etherType_ != 0) {
+        output.writeUInt32(3, etherType_);
+      }
+      if (vlanId_ != 0) {
+        output.writeUInt32(4, vlanId_);
+      }
+      if (mplsLabel_ != 0) {
+        output.writeUInt32(5, mplsLabel_);
+      }
+      if (mplsTrafficClass_ != 0) {
+        output.writeUInt32(6, mplsTrafficClass_);
       }
       unknownFields.writeTo(output);
     }
@@ -41982,8 +45756,27 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (!getLspSymbolicNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, lspSymbolicName_);
+      if (!getSrcMacAddressBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcMacAddress_);
+      }
+      if (!getDstMacAddressBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstMacAddress_);
+      }
+      if (etherType_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(3, etherType_);
+      }
+      if (vlanId_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(4, vlanId_);
+      }
+      if (mplsLabel_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(5, mplsLabel_);
+      }
+      if (mplsTrafficClass_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(6, mplsTrafficClass_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -41995,13 +45788,23 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L0)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L2)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionSettings_L0 other = (context.ContextOuterClass.ConnectionSettings_L0) obj;
+      context.ContextOuterClass.ConnectionSettings_L2 other = (context.ContextOuterClass.ConnectionSettings_L2) obj;
 
-      if (!getLspSymbolicName()
-          .equals(other.getLspSymbolicName())) return false;
+      if (!getSrcMacAddress()
+          .equals(other.getSrcMacAddress())) return false;
+      if (!getDstMacAddress()
+          .equals(other.getDstMacAddress())) return false;
+      if (getEtherType()
+          != other.getEtherType()) return false;
+      if (getVlanId()
+          != other.getVlanId()) return false;
+      if (getMplsLabel()
+          != other.getMplsLabel()) return false;
+      if (getMplsTrafficClass()
+          != other.getMplsTrafficClass()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -42013,76 +45816,86 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + LSP_SYMBOLIC_NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getLspSymbolicName().hashCode();
+      hash = (37 * hash) + SRC_MAC_ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getSrcMacAddress().hashCode();
+      hash = (37 * hash) + DST_MAC_ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getDstMacAddress().hashCode();
+      hash = (37 * hash) + ETHER_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getEtherType();
+      hash = (37 * hash) + VLAN_ID_FIELD_NUMBER;
+      hash = (53 * hash) + getVlanId();
+      hash = (37 * hash) + MPLS_LABEL_FIELD_NUMBER;
+      hash = (53 * hash) + getMplsLabel();
+      hash = (37 * hash) + MPLS_TRAFFIC_CLASS_FIELD_NUMBER;
+      hash = (53 * hash) + getMplsTrafficClass();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L0 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -42095,7 +45908,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L0 prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L2 prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -42111,26 +45924,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionSettings_L0}
+     * Protobuf type {@code context.ConnectionSettings_L2}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L0)
-        context.ContextOuterClass.ConnectionSettings_L0OrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
+        context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionSettings_L0.class, context.ContextOuterClass.ConnectionSettings_L0.Builder.class);
+                context.ContextOuterClass.ConnectionSettings_L2.class, context.ContextOuterClass.ConnectionSettings_L2.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionSettings_L0.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionSettings_L2.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -42148,7 +45961,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        lspSymbolicName_ = "";
+        srcMacAddress_ = "";
+
+        dstMacAddress_ = "";
+
+        etherType_ = 0;
+
+        vlanId_ = 0;
+
+        mplsLabel_ = 0;
+
+        mplsTrafficClass_ = 0;
 
         return this;
       }
@@ -42156,17 +45979,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L0_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L0 getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionSettings_L2 getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L0 build() {
-        context.ContextOuterClass.ConnectionSettings_L0 result = buildPartial();
+      public context.ContextOuterClass.ConnectionSettings_L2 build() {
+        context.ContextOuterClass.ConnectionSettings_L2 result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -42174,9 +45997,14 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L0 buildPartial() {
-        context.ContextOuterClass.ConnectionSettings_L0 result = new context.ContextOuterClass.ConnectionSettings_L0(this);
-        result.lspSymbolicName_ = lspSymbolicName_;
+      public context.ContextOuterClass.ConnectionSettings_L2 buildPartial() {
+        context.ContextOuterClass.ConnectionSettings_L2 result = new context.ContextOuterClass.ConnectionSettings_L2(this);
+        result.srcMacAddress_ = srcMacAddress_;
+        result.dstMacAddress_ = dstMacAddress_;
+        result.etherType_ = etherType_;
+        result.vlanId_ = vlanId_;
+        result.mplsLabel_ = mplsLabel_;
+        result.mplsTrafficClass_ = mplsTrafficClass_;
         onBuilt();
         return result;
       }
@@ -42215,20 +46043,36 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionSettings_L0) {
-          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L0)other);
+        if (other instanceof context.ContextOuterClass.ConnectionSettings_L2) {
+          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L2)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L0 other) {
-        if (other == context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance()) return this;
-        if (!other.getLspSymbolicName().isEmpty()) {
-          lspSymbolicName_ = other.lspSymbolicName_;
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L2 other) {
+        if (other == context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance()) return this;
+        if (!other.getSrcMacAddress().isEmpty()) {
+          srcMacAddress_ = other.srcMacAddress_;
+          onChanged();
+        }
+        if (!other.getDstMacAddress().isEmpty()) {
+          dstMacAddress_ = other.dstMacAddress_;
           onChanged();
         }
+        if (other.getEtherType() != 0) {
+          setEtherType(other.getEtherType());
+        }
+        if (other.getVlanId() != 0) {
+          setVlanId(other.getVlanId());
+        }
+        if (other.getMplsLabel() != 0) {
+          setMplsLabel(other.getMplsLabel());
+        }
+        if (other.getMplsTrafficClass() != 0) {
+          setMplsTrafficClass(other.getMplsTrafficClass());
+        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -42244,11 +46088,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionSettings_L0 parsedMessage = null;
+        context.ContextOuterClass.ConnectionSettings_L2 parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L0) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L2) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -42258,78 +46102,278 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private java.lang.Object lspSymbolicName_ = "";
+      private java.lang.Object srcMacAddress_ = "";
+      /**
+       * <code>string src_mac_address = 1;</code>
+       * @return The srcMacAddress.
+       */
+      public java.lang.String getSrcMacAddress() {
+        java.lang.Object ref = srcMacAddress_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          srcMacAddress_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string src_mac_address = 1;</code>
+       * @return The bytes for srcMacAddress.
+       */
+      public com.google.protobuf.ByteString
+          getSrcMacAddressBytes() {
+        java.lang.Object ref = srcMacAddress_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          srcMacAddress_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string src_mac_address = 1;</code>
+       * @param value The srcMacAddress to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSrcMacAddress(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        srcMacAddress_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string src_mac_address = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearSrcMacAddress() {
+        
+        srcMacAddress_ = getDefaultInstance().getSrcMacAddress();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string src_mac_address = 1;</code>
+       * @param value The bytes for srcMacAddress to set.
+       * @return This builder for chaining.
+       */
+      public Builder setSrcMacAddressBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        srcMacAddress_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object dstMacAddress_ = "";
+      /**
+       * <code>string dst_mac_address = 2;</code>
+       * @return The dstMacAddress.
+       */
+      public java.lang.String getDstMacAddress() {
+        java.lang.Object ref = dstMacAddress_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          dstMacAddress_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string dst_mac_address = 2;</code>
+       * @return The bytes for dstMacAddress.
+       */
+      public com.google.protobuf.ByteString
+          getDstMacAddressBytes() {
+        java.lang.Object ref = dstMacAddress_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          dstMacAddress_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string dst_mac_address = 2;</code>
+       * @param value The dstMacAddress to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDstMacAddress(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        dstMacAddress_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string dst_mac_address = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearDstMacAddress() {
+        
+        dstMacAddress_ = getDefaultInstance().getDstMacAddress();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string dst_mac_address = 2;</code>
+       * @param value The bytes for dstMacAddress to set.
+       * @return This builder for chaining.
+       */
+      public Builder setDstMacAddressBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        dstMacAddress_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int etherType_ ;
+      /**
+       * <code>uint32 ether_type = 3;</code>
+       * @return The etherType.
+       */
+      @java.lang.Override
+      public int getEtherType() {
+        return etherType_;
+      }
+      /**
+       * <code>uint32 ether_type = 3;</code>
+       * @param value The etherType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEtherType(int value) {
+        
+        etherType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 ether_type = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearEtherType() {
+        
+        etherType_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int vlanId_ ;
+      /**
+       * <code>uint32 vlan_id = 4;</code>
+       * @return The vlanId.
+       */
+      @java.lang.Override
+      public int getVlanId() {
+        return vlanId_;
+      }
+      /**
+       * <code>uint32 vlan_id = 4;</code>
+       * @param value The vlanId to set.
+       * @return This builder for chaining.
+       */
+      public Builder setVlanId(int value) {
+        
+        vlanId_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 vlan_id = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearVlanId() {
+        
+        vlanId_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int mplsLabel_ ;
       /**
-       * <code>string lsp_symbolic_name = 1;</code>
-       * @return The lspSymbolicName.
+       * <code>uint32 mpls_label = 5;</code>
+       * @return The mplsLabel.
        */
-      public java.lang.String getLspSymbolicName() {
-        java.lang.Object ref = lspSymbolicName_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          lspSymbolicName_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
+      @java.lang.Override
+      public int getMplsLabel() {
+        return mplsLabel_;
       }
       /**
-       * <code>string lsp_symbolic_name = 1;</code>
-       * @return The bytes for lspSymbolicName.
+       * <code>uint32 mpls_label = 5;</code>
+       * @param value The mplsLabel to set.
+       * @return This builder for chaining.
        */
-      public com.google.protobuf.ByteString
-          getLspSymbolicNameBytes() {
-        java.lang.Object ref = lspSymbolicName_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          lspSymbolicName_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
+      public Builder setMplsLabel(int value) {
+        
+        mplsLabel_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>string lsp_symbolic_name = 1;</code>
-       * @param value The lspSymbolicName to set.
+       * <code>uint32 mpls_label = 5;</code>
        * @return This builder for chaining.
        */
-      public Builder setLspSymbolicName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        lspSymbolicName_ = value;
+      public Builder clearMplsLabel() {
+        
+        mplsLabel_ = 0;
         onChanged();
         return this;
       }
+
+      private int mplsTrafficClass_ ;
+      /**
+       * <code>uint32 mpls_traffic_class = 6;</code>
+       * @return The mplsTrafficClass.
+       */
+      @java.lang.Override
+      public int getMplsTrafficClass() {
+        return mplsTrafficClass_;
+      }
       /**
-       * <code>string lsp_symbolic_name = 1;</code>
+       * <code>uint32 mpls_traffic_class = 6;</code>
+       * @param value The mplsTrafficClass to set.
        * @return This builder for chaining.
        */
-      public Builder clearLspSymbolicName() {
+      public Builder setMplsTrafficClass(int value) {
         
-        lspSymbolicName_ = getDefaultInstance().getLspSymbolicName();
+        mplsTrafficClass_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string lsp_symbolic_name = 1;</code>
-       * @param value The bytes for lspSymbolicName to set.
+       * <code>uint32 mpls_traffic_class = 6;</code>
        * @return This builder for chaining.
        */
-      public Builder setLspSymbolicNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+      public Builder clearMplsTrafficClass() {
         
-        lspSymbolicName_ = value;
+        mplsTrafficClass_ = 0;
         onChanged();
         return this;
       }
@@ -42346,120 +46390,114 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L0)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L2)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L0)
-    private static final context.ContextOuterClass.ConnectionSettings_L0 DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L2)
+    private static final context.ContextOuterClass.ConnectionSettings_L2 DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L0();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L2();
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L0 getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionSettings_L2 getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionSettings_L0>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L0>() {
+    private static final com.google.protobuf.Parser<ConnectionSettings_L2>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L2>() {
       @java.lang.Override
-      public ConnectionSettings_L0 parsePartialFrom(
+      public ConnectionSettings_L2 parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionSettings_L0(input, extensionRegistry);
+        return new ConnectionSettings_L2(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionSettings_L0> parser() {
+    public static com.google.protobuf.Parser<ConnectionSettings_L2> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionSettings_L0> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionSettings_L2> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L0 getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionSettings_L2 getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionSettings_L2OrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L2)
+  public interface ConnectionSettings_L3OrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>string src_mac_address = 1;</code>
-     * @return The srcMacAddress.
+     * <code>string src_ip_address = 1;</code>
+     * @return The srcIpAddress.
      */
-    java.lang.String getSrcMacAddress();
+    java.lang.String getSrcIpAddress();
     /**
-     * <code>string src_mac_address = 1;</code>
-     * @return The bytes for srcMacAddress.
+     * <code>string src_ip_address = 1;</code>
+     * @return The bytes for srcIpAddress.
      */
     com.google.protobuf.ByteString
-        getSrcMacAddressBytes();
+        getSrcIpAddressBytes();
 
     /**
-     * <code>string dst_mac_address = 2;</code>
-     * @return The dstMacAddress.
+     * <code>string dst_ip_address = 2;</code>
+     * @return The dstIpAddress.
      */
-    java.lang.String getDstMacAddress();
+    java.lang.String getDstIpAddress();
     /**
-     * <code>string dst_mac_address = 2;</code>
-     * @return The bytes for dstMacAddress.
+     * <code>string dst_ip_address = 2;</code>
+     * @return The bytes for dstIpAddress.
      */
     com.google.protobuf.ByteString
-        getDstMacAddressBytes();
-
-    /**
-     * <code>uint32 ether_type = 3;</code>
-     * @return The etherType.
-     */
-    int getEtherType();
+        getDstIpAddressBytes();
 
     /**
-     * <code>uint32 vlan_id = 4;</code>
-     * @return The vlanId.
+     * <code>uint32 dscp = 3;</code>
+     * @return The dscp.
      */
-    int getVlanId();
+    int getDscp();
 
     /**
-     * <code>uint32 mpls_label = 5;</code>
-     * @return The mplsLabel.
+     * <code>uint32 protocol = 4;</code>
+     * @return The protocol.
      */
-    int getMplsLabel();
+    int getProtocol();
 
     /**
-     * <code>uint32 mpls_traffic_class = 6;</code>
-     * @return The mplsTrafficClass.
+     * <code>uint32 ttl = 5;</code>
+     * @return The ttl.
      */
-    int getMplsTrafficClass();
+    int getTtl();
   }
   /**
-   * Protobuf type {@code context.ConnectionSettings_L2}
+   * Protobuf type {@code context.ConnectionSettings_L3}
    */
-  public static final class ConnectionSettings_L2 extends
+  public static final class ConnectionSettings_L3 extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L2)
-      ConnectionSettings_L2OrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
+      ConnectionSettings_L3OrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionSettings_L2.newBuilder() to construct.
-    private ConnectionSettings_L2(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionSettings_L3.newBuilder() to construct.
+    private ConnectionSettings_L3(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionSettings_L2() {
-      srcMacAddress_ = "";
-      dstMacAddress_ = "";
+    private ConnectionSettings_L3() {
+      srcIpAddress_ = "";
+      dstIpAddress_ = "";
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionSettings_L2();
+      return new ConnectionSettings_L3();
     }
 
     @java.lang.Override
@@ -42467,7 +46505,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionSettings_L2(
+    private ConnectionSettings_L3(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -42488,33 +46526,28 @@ public final class ContextOuterClass {
             case 10: {
               java.lang.String s = input.readStringRequireUtf8();
 
-              srcMacAddress_ = s;
+              srcIpAddress_ = s;
               break;
             }
             case 18: {
               java.lang.String s = input.readStringRequireUtf8();
 
-              dstMacAddress_ = s;
+              dstIpAddress_ = s;
               break;
             }
             case 24: {
 
-              etherType_ = input.readUInt32();
+              dscp_ = input.readUInt32();
               break;
             }
             case 32: {
 
-              vlanId_ = input.readUInt32();
+              protocol_ = input.readUInt32();
               break;
             }
             case 40: {
 
-              mplsLabel_ = input.readUInt32();
-              break;
-            }
-            case 48: {
-
-              mplsTrafficClass_ = input.readUInt32();
+              ttl_ = input.readUInt32();
               break;
             }
             default: {
@@ -42538,135 +46571,124 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionSettings_L2.class, context.ContextOuterClass.ConnectionSettings_L2.Builder.class);
+              context.ContextOuterClass.ConnectionSettings_L3.class, context.ContextOuterClass.ConnectionSettings_L3.Builder.class);
     }
 
-    public static final int SRC_MAC_ADDRESS_FIELD_NUMBER = 1;
-    private volatile java.lang.Object srcMacAddress_;
+    public static final int SRC_IP_ADDRESS_FIELD_NUMBER = 1;
+    private volatile java.lang.Object srcIpAddress_;
     /**
-     * <code>string src_mac_address = 1;</code>
-     * @return The srcMacAddress.
+     * <code>string src_ip_address = 1;</code>
+     * @return The srcIpAddress.
      */
     @java.lang.Override
-    public java.lang.String getSrcMacAddress() {
-      java.lang.Object ref = srcMacAddress_;
+    public java.lang.String getSrcIpAddress() {
+      java.lang.Object ref = srcIpAddress_;
       if (ref instanceof java.lang.String) {
         return (java.lang.String) ref;
       } else {
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        srcMacAddress_ = s;
+        srcIpAddress_ = s;
         return s;
       }
     }
     /**
-     * <code>string src_mac_address = 1;</code>
-     * @return The bytes for srcMacAddress.
+     * <code>string src_ip_address = 1;</code>
+     * @return The bytes for srcIpAddress.
      */
     @java.lang.Override
     public com.google.protobuf.ByteString
-        getSrcMacAddressBytes() {
-      java.lang.Object ref = srcMacAddress_;
+        getSrcIpAddressBytes() {
+      java.lang.Object ref = srcIpAddress_;
       if (ref instanceof java.lang.String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        srcMacAddress_ = b;
+        srcIpAddress_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
       }
     }
 
-    public static final int DST_MAC_ADDRESS_FIELD_NUMBER = 2;
-    private volatile java.lang.Object dstMacAddress_;
+    public static final int DST_IP_ADDRESS_FIELD_NUMBER = 2;
+    private volatile java.lang.Object dstIpAddress_;
     /**
-     * <code>string dst_mac_address = 2;</code>
-     * @return The dstMacAddress.
+     * <code>string dst_ip_address = 2;</code>
+     * @return The dstIpAddress.
      */
     @java.lang.Override
-    public java.lang.String getDstMacAddress() {
-      java.lang.Object ref = dstMacAddress_;
+    public java.lang.String getDstIpAddress() {
+      java.lang.Object ref = dstIpAddress_;
       if (ref instanceof java.lang.String) {
         return (java.lang.String) ref;
       } else {
         com.google.protobuf.ByteString bs = 
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        dstMacAddress_ = s;
+        dstIpAddress_ = s;
         return s;
       }
     }
     /**
-     * <code>string dst_mac_address = 2;</code>
-     * @return The bytes for dstMacAddress.
+     * <code>string dst_ip_address = 2;</code>
+     * @return The bytes for dstIpAddress.
      */
     @java.lang.Override
     public com.google.protobuf.ByteString
-        getDstMacAddressBytes() {
-      java.lang.Object ref = dstMacAddress_;
+        getDstIpAddressBytes() {
+      java.lang.Object ref = dstIpAddress_;
       if (ref instanceof java.lang.String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        dstMacAddress_ = b;
+        dstIpAddress_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
       }
     }
 
-    public static final int ETHER_TYPE_FIELD_NUMBER = 3;
-    private int etherType_;
-    /**
-     * <code>uint32 ether_type = 3;</code>
-     * @return The etherType.
-     */
-    @java.lang.Override
-    public int getEtherType() {
-      return etherType_;
-    }
-
-    public static final int VLAN_ID_FIELD_NUMBER = 4;
-    private int vlanId_;
+    public static final int DSCP_FIELD_NUMBER = 3;
+    private int dscp_;
     /**
-     * <code>uint32 vlan_id = 4;</code>
-     * @return The vlanId.
+     * <code>uint32 dscp = 3;</code>
+     * @return The dscp.
      */
     @java.lang.Override
-    public int getVlanId() {
-      return vlanId_;
+    public int getDscp() {
+      return dscp_;
     }
 
-    public static final int MPLS_LABEL_FIELD_NUMBER = 5;
-    private int mplsLabel_;
+    public static final int PROTOCOL_FIELD_NUMBER = 4;
+    private int protocol_;
     /**
-     * <code>uint32 mpls_label = 5;</code>
-     * @return The mplsLabel.
+     * <code>uint32 protocol = 4;</code>
+     * @return The protocol.
      */
     @java.lang.Override
-    public int getMplsLabel() {
-      return mplsLabel_;
+    public int getProtocol() {
+      return protocol_;
     }
 
-    public static final int MPLS_TRAFFIC_CLASS_FIELD_NUMBER = 6;
-    private int mplsTrafficClass_;
+    public static final int TTL_FIELD_NUMBER = 5;
+    private int ttl_;
     /**
-     * <code>uint32 mpls_traffic_class = 6;</code>
-     * @return The mplsTrafficClass.
+     * <code>uint32 ttl = 5;</code>
+     * @return The ttl.
      */
     @java.lang.Override
-    public int getMplsTrafficClass() {
-      return mplsTrafficClass_;
+    public int getTtl() {
+      return ttl_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -42683,23 +46705,20 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (!getSrcMacAddressBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcMacAddress_);
-      }
-      if (!getDstMacAddressBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstMacAddress_);
+      if (!getSrcIpAddressBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcIpAddress_);
       }
-      if (etherType_ != 0) {
-        output.writeUInt32(3, etherType_);
+      if (!getDstIpAddressBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstIpAddress_);
       }
-      if (vlanId_ != 0) {
-        output.writeUInt32(4, vlanId_);
+      if (dscp_ != 0) {
+        output.writeUInt32(3, dscp_);
       }
-      if (mplsLabel_ != 0) {
-        output.writeUInt32(5, mplsLabel_);
+      if (protocol_ != 0) {
+        output.writeUInt32(4, protocol_);
       }
-      if (mplsTrafficClass_ != 0) {
-        output.writeUInt32(6, mplsTrafficClass_);
+      if (ttl_ != 0) {
+        output.writeUInt32(5, ttl_);
       }
       unknownFields.writeTo(output);
     }
@@ -42710,27 +46729,23 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (!getSrcMacAddressBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcMacAddress_);
-      }
-      if (!getDstMacAddressBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstMacAddress_);
+      if (!getSrcIpAddressBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcIpAddress_);
       }
-      if (etherType_ != 0) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(3, etherType_);
+      if (!getDstIpAddressBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstIpAddress_);
       }
-      if (vlanId_ != 0) {
+      if (dscp_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(4, vlanId_);
+          .computeUInt32Size(3, dscp_);
       }
-      if (mplsLabel_ != 0) {
+      if (protocol_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(5, mplsLabel_);
+          .computeUInt32Size(4, protocol_);
       }
-      if (mplsTrafficClass_ != 0) {
+      if (ttl_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(6, mplsTrafficClass_);
+          .computeUInt32Size(5, ttl_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -42742,23 +46757,21 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L2)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L3)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionSettings_L2 other = (context.ContextOuterClass.ConnectionSettings_L2) obj;
+      context.ContextOuterClass.ConnectionSettings_L3 other = (context.ContextOuterClass.ConnectionSettings_L3) obj;
 
-      if (!getSrcMacAddress()
-          .equals(other.getSrcMacAddress())) return false;
-      if (!getDstMacAddress()
-          .equals(other.getDstMacAddress())) return false;
-      if (getEtherType()
-          != other.getEtherType()) return false;
-      if (getVlanId()
-          != other.getVlanId()) return false;
-      if (getMplsLabel()
-          != other.getMplsLabel()) return false;
-      if (getMplsTrafficClass()
-          != other.getMplsTrafficClass()) return false;
+      if (!getSrcIpAddress()
+          .equals(other.getSrcIpAddress())) return false;
+      if (!getDstIpAddress()
+          .equals(other.getDstIpAddress())) return false;
+      if (getDscp()
+          != other.getDscp()) return false;
+      if (getProtocol()
+          != other.getProtocol()) return false;
+      if (getTtl()
+          != other.getTtl()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -42770,86 +46783,84 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + SRC_MAC_ADDRESS_FIELD_NUMBER;
-      hash = (53 * hash) + getSrcMacAddress().hashCode();
-      hash = (37 * hash) + DST_MAC_ADDRESS_FIELD_NUMBER;
-      hash = (53 * hash) + getDstMacAddress().hashCode();
-      hash = (37 * hash) + ETHER_TYPE_FIELD_NUMBER;
-      hash = (53 * hash) + getEtherType();
-      hash = (37 * hash) + VLAN_ID_FIELD_NUMBER;
-      hash = (53 * hash) + getVlanId();
-      hash = (37 * hash) + MPLS_LABEL_FIELD_NUMBER;
-      hash = (53 * hash) + getMplsLabel();
-      hash = (37 * hash) + MPLS_TRAFFIC_CLASS_FIELD_NUMBER;
-      hash = (53 * hash) + getMplsTrafficClass();
+      hash = (37 * hash) + SRC_IP_ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getSrcIpAddress().hashCode();
+      hash = (37 * hash) + DST_IP_ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getDstIpAddress().hashCode();
+      hash = (37 * hash) + DSCP_FIELD_NUMBER;
+      hash = (53 * hash) + getDscp();
+      hash = (37 * hash) + PROTOCOL_FIELD_NUMBER;
+      hash = (53 * hash) + getProtocol();
+      hash = (37 * hash) + TTL_FIELD_NUMBER;
+      hash = (53 * hash) + getTtl();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L2 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -42862,7 +46873,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L2 prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L3 prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -42878,26 +46889,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionSettings_L2}
+     * Protobuf type {@code context.ConnectionSettings_L3}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L2)
-        context.ContextOuterClass.ConnectionSettings_L2OrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
+        context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionSettings_L2.class, context.ContextOuterClass.ConnectionSettings_L2.Builder.class);
+                context.ContextOuterClass.ConnectionSettings_L3.class, context.ContextOuterClass.ConnectionSettings_L3.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionSettings_L2.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionSettings_L3.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -42915,17 +46926,15 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        srcMacAddress_ = "";
-
-        dstMacAddress_ = "";
+        srcIpAddress_ = "";
 
-        etherType_ = 0;
+        dstIpAddress_ = "";
 
-        vlanId_ = 0;
+        dscp_ = 0;
 
-        mplsLabel_ = 0;
+        protocol_ = 0;
 
-        mplsTrafficClass_ = 0;
+        ttl_ = 0;
 
         return this;
       }
@@ -42933,17 +46942,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L2_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L2 getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionSettings_L3 getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L2 build() {
-        context.ContextOuterClass.ConnectionSettings_L2 result = buildPartial();
+      public context.ContextOuterClass.ConnectionSettings_L3 build() {
+        context.ContextOuterClass.ConnectionSettings_L3 result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -42951,14 +46960,13 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L2 buildPartial() {
-        context.ContextOuterClass.ConnectionSettings_L2 result = new context.ContextOuterClass.ConnectionSettings_L2(this);
-        result.srcMacAddress_ = srcMacAddress_;
-        result.dstMacAddress_ = dstMacAddress_;
-        result.etherType_ = etherType_;
-        result.vlanId_ = vlanId_;
-        result.mplsLabel_ = mplsLabel_;
-        result.mplsTrafficClass_ = mplsTrafficClass_;
+      public context.ContextOuterClass.ConnectionSettings_L3 buildPartial() {
+        context.ContextOuterClass.ConnectionSettings_L3 result = new context.ContextOuterClass.ConnectionSettings_L3(this);
+        result.srcIpAddress_ = srcIpAddress_;
+        result.dstIpAddress_ = dstIpAddress_;
+        result.dscp_ = dscp_;
+        result.protocol_ = protocol_;
+        result.ttl_ = ttl_;
         onBuilt();
         return result;
       }
@@ -42997,35 +47005,32 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionSettings_L2) {
-          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L2)other);
+        if (other instanceof context.ContextOuterClass.ConnectionSettings_L3) {
+          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L3)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L2 other) {
-        if (other == context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance()) return this;
-        if (!other.getSrcMacAddress().isEmpty()) {
-          srcMacAddress_ = other.srcMacAddress_;
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L3 other) {
+        if (other == context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance()) return this;
+        if (!other.getSrcIpAddress().isEmpty()) {
+          srcIpAddress_ = other.srcIpAddress_;
           onChanged();
         }
-        if (!other.getDstMacAddress().isEmpty()) {
-          dstMacAddress_ = other.dstMacAddress_;
+        if (!other.getDstIpAddress().isEmpty()) {
+          dstIpAddress_ = other.dstIpAddress_;
           onChanged();
         }
-        if (other.getEtherType() != 0) {
-          setEtherType(other.getEtherType());
-        }
-        if (other.getVlanId() != 0) {
-          setVlanId(other.getVlanId());
+        if (other.getDscp() != 0) {
+          setDscp(other.getDscp());
         }
-        if (other.getMplsLabel() != 0) {
-          setMplsLabel(other.getMplsLabel());
+        if (other.getProtocol() != 0) {
+          setProtocol(other.getProtocol());
         }
-        if (other.getMplsTrafficClass() != 0) {
-          setMplsTrafficClass(other.getMplsTrafficClass());
+        if (other.getTtl() != 0) {
+          setTtl(other.getTtl());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -43042,11 +47047,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionSettings_L2 parsedMessage = null;
+        context.ContextOuterClass.ConnectionSettings_L3 parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L2) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L3) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -43056,278 +47061,247 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private java.lang.Object srcMacAddress_ = "";
+      private java.lang.Object srcIpAddress_ = "";
       /**
-       * <code>string src_mac_address = 1;</code>
-       * @return The srcMacAddress.
+       * <code>string src_ip_address = 1;</code>
+       * @return The srcIpAddress.
        */
-      public java.lang.String getSrcMacAddress() {
-        java.lang.Object ref = srcMacAddress_;
+      public java.lang.String getSrcIpAddress() {
+        java.lang.Object ref = srcIpAddress_;
         if (!(ref instanceof java.lang.String)) {
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          srcMacAddress_ = s;
+          srcIpAddress_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
         }
       }
       /**
-       * <code>string src_mac_address = 1;</code>
-       * @return The bytes for srcMacAddress.
+       * <code>string src_ip_address = 1;</code>
+       * @return The bytes for srcIpAddress.
        */
       public com.google.protobuf.ByteString
-          getSrcMacAddressBytes() {
-        java.lang.Object ref = srcMacAddress_;
+          getSrcIpAddressBytes() {
+        java.lang.Object ref = srcIpAddress_;
         if (ref instanceof String) {
           com.google.protobuf.ByteString b = 
               com.google.protobuf.ByteString.copyFromUtf8(
                   (java.lang.String) ref);
-          srcMacAddress_ = b;
+          srcIpAddress_ = b;
           return b;
         } else {
           return (com.google.protobuf.ByteString) ref;
         }
       }
       /**
-       * <code>string src_mac_address = 1;</code>
-       * @param value The srcMacAddress to set.
+       * <code>string src_ip_address = 1;</code>
+       * @param value The srcIpAddress to set.
        * @return This builder for chaining.
        */
-      public Builder setSrcMacAddress(
+      public Builder setSrcIpAddress(
           java.lang.String value) {
         if (value == null) {
     throw new NullPointerException();
   }
   
-        srcMacAddress_ = value;
+        srcIpAddress_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string src_mac_address = 1;</code>
+       * <code>string src_ip_address = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder clearSrcMacAddress() {
+      public Builder clearSrcIpAddress() {
         
-        srcMacAddress_ = getDefaultInstance().getSrcMacAddress();
+        srcIpAddress_ = getDefaultInstance().getSrcIpAddress();
         onChanged();
         return this;
       }
       /**
-       * <code>string src_mac_address = 1;</code>
-       * @param value The bytes for srcMacAddress to set.
+       * <code>string src_ip_address = 1;</code>
+       * @param value The bytes for srcIpAddress to set.
        * @return This builder for chaining.
        */
-      public Builder setSrcMacAddressBytes(
+      public Builder setSrcIpAddressBytes(
           com.google.protobuf.ByteString value) {
         if (value == null) {
     throw new NullPointerException();
   }
   checkByteStringIsUtf8(value);
         
-        srcMacAddress_ = value;
+        srcIpAddress_ = value;
         onChanged();
         return this;
       }
 
-      private java.lang.Object dstMacAddress_ = "";
+      private java.lang.Object dstIpAddress_ = "";
       /**
-       * <code>string dst_mac_address = 2;</code>
-       * @return The dstMacAddress.
+       * <code>string dst_ip_address = 2;</code>
+       * @return The dstIpAddress.
        */
-      public java.lang.String getDstMacAddress() {
-        java.lang.Object ref = dstMacAddress_;
+      public java.lang.String getDstIpAddress() {
+        java.lang.Object ref = dstIpAddress_;
         if (!(ref instanceof java.lang.String)) {
           com.google.protobuf.ByteString bs =
               (com.google.protobuf.ByteString) ref;
           java.lang.String s = bs.toStringUtf8();
-          dstMacAddress_ = s;
+          dstIpAddress_ = s;
           return s;
         } else {
           return (java.lang.String) ref;
         }
       }
       /**
-       * <code>string dst_mac_address = 2;</code>
-       * @return The bytes for dstMacAddress.
+       * <code>string dst_ip_address = 2;</code>
+       * @return The bytes for dstIpAddress.
        */
       public com.google.protobuf.ByteString
-          getDstMacAddressBytes() {
-        java.lang.Object ref = dstMacAddress_;
+          getDstIpAddressBytes() {
+        java.lang.Object ref = dstIpAddress_;
         if (ref instanceof String) {
           com.google.protobuf.ByteString b = 
               com.google.protobuf.ByteString.copyFromUtf8(
                   (java.lang.String) ref);
-          dstMacAddress_ = b;
+          dstIpAddress_ = b;
           return b;
         } else {
           return (com.google.protobuf.ByteString) ref;
         }
       }
       /**
-       * <code>string dst_mac_address = 2;</code>
-       * @param value The dstMacAddress to set.
+       * <code>string dst_ip_address = 2;</code>
+       * @param value The dstIpAddress to set.
        * @return This builder for chaining.
        */
-      public Builder setDstMacAddress(
+      public Builder setDstIpAddress(
           java.lang.String value) {
         if (value == null) {
     throw new NullPointerException();
   }
   
-        dstMacAddress_ = value;
+        dstIpAddress_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string dst_mac_address = 2;</code>
+       * <code>string dst_ip_address = 2;</code>
        * @return This builder for chaining.
        */
-      public Builder clearDstMacAddress() {
+      public Builder clearDstIpAddress() {
         
-        dstMacAddress_ = getDefaultInstance().getDstMacAddress();
+        dstIpAddress_ = getDefaultInstance().getDstIpAddress();
         onChanged();
         return this;
       }
       /**
-       * <code>string dst_mac_address = 2;</code>
-       * @param value The bytes for dstMacAddress to set.
+       * <code>string dst_ip_address = 2;</code>
+       * @param value The bytes for dstIpAddress to set.
        * @return This builder for chaining.
        */
-      public Builder setDstMacAddressBytes(
+      public Builder setDstIpAddressBytes(
           com.google.protobuf.ByteString value) {
         if (value == null) {
     throw new NullPointerException();
   }
   checkByteStringIsUtf8(value);
         
-        dstMacAddress_ = value;
-        onChanged();
-        return this;
-      }
-
-      private int etherType_ ;
-      /**
-       * <code>uint32 ether_type = 3;</code>
-       * @return The etherType.
-       */
-      @java.lang.Override
-      public int getEtherType() {
-        return etherType_;
-      }
-      /**
-       * <code>uint32 ether_type = 3;</code>
-       * @param value The etherType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setEtherType(int value) {
-        
-        etherType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>uint32 ether_type = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearEtherType() {
-        
-        etherType_ = 0;
+        dstIpAddress_ = value;
         onChanged();
         return this;
       }
 
-      private int vlanId_ ;
+      private int dscp_ ;
       /**
-       * <code>uint32 vlan_id = 4;</code>
-       * @return The vlanId.
+       * <code>uint32 dscp = 3;</code>
+       * @return The dscp.
        */
       @java.lang.Override
-      public int getVlanId() {
-        return vlanId_;
+      public int getDscp() {
+        return dscp_;
       }
       /**
-       * <code>uint32 vlan_id = 4;</code>
-       * @param value The vlanId to set.
+       * <code>uint32 dscp = 3;</code>
+       * @param value The dscp to set.
        * @return This builder for chaining.
        */
-      public Builder setVlanId(int value) {
+      public Builder setDscp(int value) {
         
-        vlanId_ = value;
+        dscp_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 vlan_id = 4;</code>
+       * <code>uint32 dscp = 3;</code>
        * @return This builder for chaining.
        */
-      public Builder clearVlanId() {
+      public Builder clearDscp() {
         
-        vlanId_ = 0;
+        dscp_ = 0;
         onChanged();
         return this;
       }
 
-      private int mplsLabel_ ;
+      private int protocol_ ;
       /**
-       * <code>uint32 mpls_label = 5;</code>
-       * @return The mplsLabel.
+       * <code>uint32 protocol = 4;</code>
+       * @return The protocol.
        */
       @java.lang.Override
-      public int getMplsLabel() {
-        return mplsLabel_;
+      public int getProtocol() {
+        return protocol_;
       }
       /**
-       * <code>uint32 mpls_label = 5;</code>
-       * @param value The mplsLabel to set.
+       * <code>uint32 protocol = 4;</code>
+       * @param value The protocol to set.
        * @return This builder for chaining.
        */
-      public Builder setMplsLabel(int value) {
+      public Builder setProtocol(int value) {
         
-        mplsLabel_ = value;
+        protocol_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 mpls_label = 5;</code>
+       * <code>uint32 protocol = 4;</code>
        * @return This builder for chaining.
        */
-      public Builder clearMplsLabel() {
+      public Builder clearProtocol() {
         
-        mplsLabel_ = 0;
+        protocol_ = 0;
         onChanged();
         return this;
       }
 
-      private int mplsTrafficClass_ ;
+      private int ttl_ ;
       /**
-       * <code>uint32 mpls_traffic_class = 6;</code>
-       * @return The mplsTrafficClass.
+       * <code>uint32 ttl = 5;</code>
+       * @return The ttl.
        */
       @java.lang.Override
-      public int getMplsTrafficClass() {
-        return mplsTrafficClass_;
+      public int getTtl() {
+        return ttl_;
       }
       /**
-       * <code>uint32 mpls_traffic_class = 6;</code>
-       * @param value The mplsTrafficClass to set.
+       * <code>uint32 ttl = 5;</code>
+       * @param value The ttl to set.
        * @return This builder for chaining.
        */
-      public Builder setMplsTrafficClass(int value) {
+      public Builder setTtl(int value) {
         
-        mplsTrafficClass_ = value;
+        ttl_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 mpls_traffic_class = 6;</code>
+       * <code>uint32 ttl = 5;</code>
        * @return This builder for chaining.
        */
-      public Builder clearMplsTrafficClass() {
+      public Builder clearTtl() {
         
-        mplsTrafficClass_ = 0;
+        ttl_ = 0;
         onChanged();
         return this;
       }
@@ -43344,114 +47318,94 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L2)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L3)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L2)
-    private static final context.ContextOuterClass.ConnectionSettings_L2 DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L3)
+    private static final context.ContextOuterClass.ConnectionSettings_L3 DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L2();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L3();
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L2 getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionSettings_L3 getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionSettings_L2>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L2>() {
+    private static final com.google.protobuf.Parser<ConnectionSettings_L3>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L3>() {
       @java.lang.Override
-      public ConnectionSettings_L2 parsePartialFrom(
+      public ConnectionSettings_L3 parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionSettings_L2(input, extensionRegistry);
+        return new ConnectionSettings_L3(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionSettings_L2> parser() {
+    public static com.google.protobuf.Parser<ConnectionSettings_L3> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionSettings_L2> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionSettings_L3> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L2 getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionSettings_L3 getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionSettings_L3OrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L3)
+  public interface ConnectionSettings_L4OrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>string src_ip_address = 1;</code>
-     * @return The srcIpAddress.
-     */
-    java.lang.String getSrcIpAddress();
-    /**
-     * <code>string src_ip_address = 1;</code>
-     * @return The bytes for srcIpAddress.
-     */
-    com.google.protobuf.ByteString
-        getSrcIpAddressBytes();
-
-    /**
-     * <code>string dst_ip_address = 2;</code>
-     * @return The dstIpAddress.
-     */
-    java.lang.String getDstIpAddress();
-    /**
-     * <code>string dst_ip_address = 2;</code>
-     * @return The bytes for dstIpAddress.
+     * <code>uint32 src_port = 1;</code>
+     * @return The srcPort.
      */
-    com.google.protobuf.ByteString
-        getDstIpAddressBytes();
+    int getSrcPort();
 
     /**
-     * <code>uint32 dscp = 3;</code>
-     * @return The dscp.
+     * <code>uint32 dst_port = 2;</code>
+     * @return The dstPort.
      */
-    int getDscp();
+    int getDstPort();
 
     /**
-     * <code>uint32 protocol = 4;</code>
-     * @return The protocol.
+     * <code>uint32 tcp_flags = 3;</code>
+     * @return The tcpFlags.
      */
-    int getProtocol();
+    int getTcpFlags();
 
     /**
-     * <code>uint32 ttl = 5;</code>
+     * <code>uint32 ttl = 4;</code>
      * @return The ttl.
      */
     int getTtl();
   }
   /**
-   * Protobuf type {@code context.ConnectionSettings_L3}
+   * Protobuf type {@code context.ConnectionSettings_L4}
    */
-  public static final class ConnectionSettings_L3 extends
+  public static final class ConnectionSettings_L4 extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L3)
-      ConnectionSettings_L3OrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
+      ConnectionSettings_L4OrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionSettings_L3.newBuilder() to construct.
-    private ConnectionSettings_L3(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionSettings_L4.newBuilder() to construct.
+    private ConnectionSettings_L4(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionSettings_L3() {
-      srcIpAddress_ = "";
-      dstIpAddress_ = "";
+    private ConnectionSettings_L4() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionSettings_L3();
+      return new ConnectionSettings_L4();
     }
 
     @java.lang.Override
@@ -43459,7 +47413,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionSettings_L3(
+    private ConnectionSettings_L4(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -43477,30 +47431,23 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
-              java.lang.String s = input.readStringRequireUtf8();
+            case 8: {
 
-              srcIpAddress_ = s;
+              srcPort_ = input.readUInt32();
               break;
             }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
+            case 16: {
 
-              dstIpAddress_ = s;
+              dstPort_ = input.readUInt32();
               break;
             }
             case 24: {
 
-              dscp_ = input.readUInt32();
+              tcpFlags_ = input.readUInt32();
               break;
             }
             case 32: {
 
-              protocol_ = input.readUInt32();
-              break;
-            }
-            case 40: {
-
               ttl_ = input.readUInt32();
               break;
             }
@@ -43525,119 +47472,54 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionSettings_L3.class, context.ContextOuterClass.ConnectionSettings_L3.Builder.class);
-    }
-
-    public static final int SRC_IP_ADDRESS_FIELD_NUMBER = 1;
-    private volatile java.lang.Object srcIpAddress_;
-    /**
-     * <code>string src_ip_address = 1;</code>
-     * @return The srcIpAddress.
-     */
-    @java.lang.Override
-    public java.lang.String getSrcIpAddress() {
-      java.lang.Object ref = srcIpAddress_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        srcIpAddress_ = s;
-        return s;
-      }
-    }
-    /**
-     * <code>string src_ip_address = 1;</code>
-     * @return The bytes for srcIpAddress.
-     */
-    @java.lang.Override
-    public com.google.protobuf.ByteString
-        getSrcIpAddressBytes() {
-      java.lang.Object ref = srcIpAddress_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        srcIpAddress_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+              context.ContextOuterClass.ConnectionSettings_L4.class, context.ContextOuterClass.ConnectionSettings_L4.Builder.class);
     }
 
-    public static final int DST_IP_ADDRESS_FIELD_NUMBER = 2;
-    private volatile java.lang.Object dstIpAddress_;
-    /**
-     * <code>string dst_ip_address = 2;</code>
-     * @return The dstIpAddress.
-     */
-    @java.lang.Override
-    public java.lang.String getDstIpAddress() {
-      java.lang.Object ref = dstIpAddress_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        dstIpAddress_ = s;
-        return s;
-      }
-    }
+    public static final int SRC_PORT_FIELD_NUMBER = 1;
+    private int srcPort_;
     /**
-     * <code>string dst_ip_address = 2;</code>
-     * @return The bytes for dstIpAddress.
+     * <code>uint32 src_port = 1;</code>
+     * @return The srcPort.
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getDstIpAddressBytes() {
-      java.lang.Object ref = dstIpAddress_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        dstIpAddress_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public int getSrcPort() {
+      return srcPort_;
     }
 
-    public static final int DSCP_FIELD_NUMBER = 3;
-    private int dscp_;
+    public static final int DST_PORT_FIELD_NUMBER = 2;
+    private int dstPort_;
     /**
-     * <code>uint32 dscp = 3;</code>
-     * @return The dscp.
+     * <code>uint32 dst_port = 2;</code>
+     * @return The dstPort.
      */
     @java.lang.Override
-    public int getDscp() {
-      return dscp_;
+    public int getDstPort() {
+      return dstPort_;
     }
 
-    public static final int PROTOCOL_FIELD_NUMBER = 4;
-    private int protocol_;
+    public static final int TCP_FLAGS_FIELD_NUMBER = 3;
+    private int tcpFlags_;
     /**
-     * <code>uint32 protocol = 4;</code>
-     * @return The protocol.
+     * <code>uint32 tcp_flags = 3;</code>
+     * @return The tcpFlags.
      */
     @java.lang.Override
-    public int getProtocol() {
-      return protocol_;
+    public int getTcpFlags() {
+      return tcpFlags_;
     }
 
-    public static final int TTL_FIELD_NUMBER = 5;
+    public static final int TTL_FIELD_NUMBER = 4;
     private int ttl_;
     /**
-     * <code>uint32 ttl = 5;</code>
+     * <code>uint32 ttl = 4;</code>
      * @return The ttl.
      */
     @java.lang.Override
@@ -43659,20 +47541,17 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (!getSrcIpAddressBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, srcIpAddress_);
-      }
-      if (!getDstIpAddressBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, dstIpAddress_);
+      if (srcPort_ != 0) {
+        output.writeUInt32(1, srcPort_);
       }
-      if (dscp_ != 0) {
-        output.writeUInt32(3, dscp_);
+      if (dstPort_ != 0) {
+        output.writeUInt32(2, dstPort_);
       }
-      if (protocol_ != 0) {
-        output.writeUInt32(4, protocol_);
+      if (tcpFlags_ != 0) {
+        output.writeUInt32(3, tcpFlags_);
       }
       if (ttl_ != 0) {
-        output.writeUInt32(5, ttl_);
+        output.writeUInt32(4, ttl_);
       }
       unknownFields.writeTo(output);
     }
@@ -43683,23 +47562,21 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (!getSrcIpAddressBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, srcIpAddress_);
-      }
-      if (!getDstIpAddressBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, dstIpAddress_);
+      if (srcPort_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeUInt32Size(1, srcPort_);
       }
-      if (dscp_ != 0) {
+      if (dstPort_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(3, dscp_);
+          .computeUInt32Size(2, dstPort_);
       }
-      if (protocol_ != 0) {
+      if (tcpFlags_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(4, protocol_);
+          .computeUInt32Size(3, tcpFlags_);
       }
       if (ttl_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(5, ttl_);
+          .computeUInt32Size(4, ttl_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -43711,19 +47588,17 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L3)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L4)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionSettings_L3 other = (context.ContextOuterClass.ConnectionSettings_L3) obj;
+      context.ContextOuterClass.ConnectionSettings_L4 other = (context.ContextOuterClass.ConnectionSettings_L4) obj;
 
-      if (!getSrcIpAddress()
-          .equals(other.getSrcIpAddress())) return false;
-      if (!getDstIpAddress()
-          .equals(other.getDstIpAddress())) return false;
-      if (getDscp()
-          != other.getDscp()) return false;
-      if (getProtocol()
-          != other.getProtocol()) return false;
+      if (getSrcPort()
+          != other.getSrcPort()) return false;
+      if (getDstPort()
+          != other.getDstPort()) return false;
+      if (getTcpFlags()
+          != other.getTcpFlags()) return false;
       if (getTtl()
           != other.getTtl()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
@@ -43737,14 +47612,12 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + SRC_IP_ADDRESS_FIELD_NUMBER;
-      hash = (53 * hash) + getSrcIpAddress().hashCode();
-      hash = (37 * hash) + DST_IP_ADDRESS_FIELD_NUMBER;
-      hash = (53 * hash) + getDstIpAddress().hashCode();
-      hash = (37 * hash) + DSCP_FIELD_NUMBER;
-      hash = (53 * hash) + getDscp();
-      hash = (37 * hash) + PROTOCOL_FIELD_NUMBER;
-      hash = (53 * hash) + getProtocol();
+      hash = (37 * hash) + SRC_PORT_FIELD_NUMBER;
+      hash = (53 * hash) + getSrcPort();
+      hash = (37 * hash) + DST_PORT_FIELD_NUMBER;
+      hash = (53 * hash) + getDstPort();
+      hash = (37 * hash) + TCP_FLAGS_FIELD_NUMBER;
+      hash = (53 * hash) + getTcpFlags();
       hash = (37 * hash) + TTL_FIELD_NUMBER;
       hash = (53 * hash) + getTtl();
       hash = (29 * hash) + unknownFields.hashCode();
@@ -43752,69 +47625,69 @@ public final class ContextOuterClass {
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L3 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -43827,7 +47700,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L3 prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L4 prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -43843,26 +47716,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionSettings_L3}
+     * Protobuf type {@code context.ConnectionSettings_L4}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L3)
-        context.ContextOuterClass.ConnectionSettings_L3OrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
+        context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionSettings_L3.class, context.ContextOuterClass.ConnectionSettings_L3.Builder.class);
+                context.ContextOuterClass.ConnectionSettings_L4.class, context.ContextOuterClass.ConnectionSettings_L4.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionSettings_L3.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionSettings_L4.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -43880,13 +47753,11 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        srcIpAddress_ = "";
-
-        dstIpAddress_ = "";
+        srcPort_ = 0;
 
-        dscp_ = 0;
+        dstPort_ = 0;
 
-        protocol_ = 0;
+        tcpFlags_ = 0;
 
         ttl_ = 0;
 
@@ -43896,17 +47767,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L3_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L3 getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionSettings_L4 getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L3 build() {
-        context.ContextOuterClass.ConnectionSettings_L3 result = buildPartial();
+      public context.ContextOuterClass.ConnectionSettings_L4 build() {
+        context.ContextOuterClass.ConnectionSettings_L4 result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -43914,12 +47785,11 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L3 buildPartial() {
-        context.ContextOuterClass.ConnectionSettings_L3 result = new context.ContextOuterClass.ConnectionSettings_L3(this);
-        result.srcIpAddress_ = srcIpAddress_;
-        result.dstIpAddress_ = dstIpAddress_;
-        result.dscp_ = dscp_;
-        result.protocol_ = protocol_;
+      public context.ContextOuterClass.ConnectionSettings_L4 buildPartial() {
+        context.ContextOuterClass.ConnectionSettings_L4 result = new context.ContextOuterClass.ConnectionSettings_L4(this);
+        result.srcPort_ = srcPort_;
+        result.dstPort_ = dstPort_;
+        result.tcpFlags_ = tcpFlags_;
         result.ttl_ = ttl_;
         onBuilt();
         return result;
@@ -43959,29 +47829,24 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionSettings_L3) {
-          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L3)other);
+        if (other instanceof context.ContextOuterClass.ConnectionSettings_L4) {
+          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L4)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L3 other) {
-        if (other == context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance()) return this;
-        if (!other.getSrcIpAddress().isEmpty()) {
-          srcIpAddress_ = other.srcIpAddress_;
-          onChanged();
-        }
-        if (!other.getDstIpAddress().isEmpty()) {
-          dstIpAddress_ = other.dstIpAddress_;
-          onChanged();
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L4 other) {
+        if (other == context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance()) return this;
+        if (other.getSrcPort() != 0) {
+          setSrcPort(other.getSrcPort());
         }
-        if (other.getDscp() != 0) {
-          setDscp(other.getDscp());
+        if (other.getDstPort() != 0) {
+          setDstPort(other.getDstPort());
         }
-        if (other.getProtocol() != 0) {
-          setProtocol(other.getProtocol());
+        if (other.getTcpFlags() != 0) {
+          setTcpFlags(other.getTcpFlags());
         }
         if (other.getTtl() != 0) {
           setTtl(other.getTtl());
@@ -44001,11 +47866,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionSettings_L3 parsedMessage = null;
+        context.ContextOuterClass.ConnectionSettings_L4 parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L3) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L4) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -44015,223 +47880,102 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private java.lang.Object srcIpAddress_ = "";
-      /**
-       * <code>string src_ip_address = 1;</code>
-       * @return The srcIpAddress.
-       */
-      public java.lang.String getSrcIpAddress() {
-        java.lang.Object ref = srcIpAddress_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          srcIpAddress_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string src_ip_address = 1;</code>
-       * @return The bytes for srcIpAddress.
-       */
-      public com.google.protobuf.ByteString
-          getSrcIpAddressBytes() {
-        java.lang.Object ref = srcIpAddress_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          srcIpAddress_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>string src_ip_address = 1;</code>
-       * @param value The srcIpAddress to set.
-       * @return This builder for chaining.
-       */
-      public Builder setSrcIpAddress(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        srcIpAddress_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string src_ip_address = 1;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearSrcIpAddress() {
-        
-        srcIpAddress_ = getDefaultInstance().getSrcIpAddress();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string src_ip_address = 1;</code>
-       * @param value The bytes for srcIpAddress to set.
-       * @return This builder for chaining.
-       */
-      public Builder setSrcIpAddressBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        srcIpAddress_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.lang.Object dstIpAddress_ = "";
-      /**
-       * <code>string dst_ip_address = 2;</code>
-       * @return The dstIpAddress.
-       */
-      public java.lang.String getDstIpAddress() {
-        java.lang.Object ref = dstIpAddress_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          dstIpAddress_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string dst_ip_address = 2;</code>
-       * @return The bytes for dstIpAddress.
-       */
-      public com.google.protobuf.ByteString
-          getDstIpAddressBytes() {
-        java.lang.Object ref = dstIpAddress_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          dstIpAddress_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
+      private int srcPort_ ;
       /**
-       * <code>string dst_ip_address = 2;</code>
-       * @param value The dstIpAddress to set.
-       * @return This builder for chaining.
+       * <code>uint32 src_port = 1;</code>
+       * @return The srcPort.
        */
-      public Builder setDstIpAddress(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        dstIpAddress_ = value;
-        onChanged();
-        return this;
+      @java.lang.Override
+      public int getSrcPort() {
+        return srcPort_;
       }
       /**
-       * <code>string dst_ip_address = 2;</code>
+       * <code>uint32 src_port = 1;</code>
+       * @param value The srcPort to set.
        * @return This builder for chaining.
        */
-      public Builder clearDstIpAddress() {
+      public Builder setSrcPort(int value) {
         
-        dstIpAddress_ = getDefaultInstance().getDstIpAddress();
+        srcPort_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string dst_ip_address = 2;</code>
-       * @param value The bytes for dstIpAddress to set.
+       * <code>uint32 src_port = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder setDstIpAddressBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+      public Builder clearSrcPort() {
         
-        dstIpAddress_ = value;
+        srcPort_ = 0;
         onChanged();
         return this;
       }
 
-      private int dscp_ ;
+      private int dstPort_ ;
       /**
-       * <code>uint32 dscp = 3;</code>
-       * @return The dscp.
+       * <code>uint32 dst_port = 2;</code>
+       * @return The dstPort.
        */
       @java.lang.Override
-      public int getDscp() {
-        return dscp_;
+      public int getDstPort() {
+        return dstPort_;
       }
       /**
-       * <code>uint32 dscp = 3;</code>
-       * @param value The dscp to set.
+       * <code>uint32 dst_port = 2;</code>
+       * @param value The dstPort to set.
        * @return This builder for chaining.
        */
-      public Builder setDscp(int value) {
+      public Builder setDstPort(int value) {
         
-        dscp_ = value;
+        dstPort_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 dscp = 3;</code>
+       * <code>uint32 dst_port = 2;</code>
        * @return This builder for chaining.
        */
-      public Builder clearDscp() {
+      public Builder clearDstPort() {
         
-        dscp_ = 0;
+        dstPort_ = 0;
         onChanged();
         return this;
       }
 
-      private int protocol_ ;
+      private int tcpFlags_ ;
       /**
-       * <code>uint32 protocol = 4;</code>
-       * @return The protocol.
+       * <code>uint32 tcp_flags = 3;</code>
+       * @return The tcpFlags.
        */
       @java.lang.Override
-      public int getProtocol() {
-        return protocol_;
+      public int getTcpFlags() {
+        return tcpFlags_;
       }
       /**
-       * <code>uint32 protocol = 4;</code>
-       * @param value The protocol to set.
+       * <code>uint32 tcp_flags = 3;</code>
+       * @param value The tcpFlags to set.
        * @return This builder for chaining.
        */
-      public Builder setProtocol(int value) {
+      public Builder setTcpFlags(int value) {
         
-        protocol_ = value;
+        tcpFlags_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 protocol = 4;</code>
+       * <code>uint32 tcp_flags = 3;</code>
        * @return This builder for chaining.
        */
-      public Builder clearProtocol() {
+      public Builder clearTcpFlags() {
         
-        protocol_ = 0;
+        tcpFlags_ = 0;
         onChanged();
         return this;
       }
 
       private int ttl_ ;
       /**
-       * <code>uint32 ttl = 5;</code>
+       * <code>uint32 ttl = 4;</code>
        * @return The ttl.
        */
       @java.lang.Override
@@ -44239,7 +47983,7 @@ public final class ContextOuterClass {
         return ttl_;
       }
       /**
-       * <code>uint32 ttl = 5;</code>
+       * <code>uint32 ttl = 4;</code>
        * @param value The ttl to set.
        * @return This builder for chaining.
        */
@@ -44250,7 +47994,7 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>uint32 ttl = 5;</code>
+       * <code>uint32 ttl = 4;</code>
        * @return This builder for chaining.
        */
       public Builder clearTtl() {
@@ -44272,94 +48016,130 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L3)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L4)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L3)
-    private static final context.ContextOuterClass.ConnectionSettings_L3 DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L4)
+    private static final context.ContextOuterClass.ConnectionSettings_L4 DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L3();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L4();
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L3 getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionSettings_L4 getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionSettings_L3>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L3>() {
+    private static final com.google.protobuf.Parser<ConnectionSettings_L4>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L4>() {
       @java.lang.Override
-      public ConnectionSettings_L3 parsePartialFrom(
+      public ConnectionSettings_L4 parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionSettings_L3(input, extensionRegistry);
+        return new ConnectionSettings_L4(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionSettings_L3> parser() {
+    public static com.google.protobuf.Parser<ConnectionSettings_L4> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionSettings_L3> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionSettings_L4> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L3 getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionSettings_L4 getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionSettings_L4OrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings_L4)
+  public interface ConnectionSettingsOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>uint32 src_port = 1;</code>
-     * @return The srcPort.
+     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     * @return Whether the l0 field is set.
      */
-    int getSrcPort();
+    boolean hasL0();
+    /**
+     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     * @return The l0.
+     */
+    context.ContextOuterClass.ConnectionSettings_L0 getL0();
+    /**
+     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     */
+    context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder();
 
     /**
-     * <code>uint32 dst_port = 2;</code>
-     * @return The dstPort.
+     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     * @return Whether the l2 field is set.
      */
-    int getDstPort();
+    boolean hasL2();
+    /**
+     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     * @return The l2.
+     */
+    context.ContextOuterClass.ConnectionSettings_L2 getL2();
+    /**
+     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     */
+    context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder();
 
     /**
-     * <code>uint32 tcp_flags = 3;</code>
-     * @return The tcpFlags.
+     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     * @return Whether the l3 field is set.
      */
-    int getTcpFlags();
+    boolean hasL3();
+    /**
+     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     * @return The l3.
+     */
+    context.ContextOuterClass.ConnectionSettings_L3 getL3();
+    /**
+     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     */
+    context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder();
 
     /**
-     * <code>uint32 ttl = 4;</code>
-     * @return The ttl.
+     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     * @return Whether the l4 field is set.
      */
-    int getTtl();
+    boolean hasL4();
+    /**
+     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     * @return The l4.
+     */
+    context.ContextOuterClass.ConnectionSettings_L4 getL4();
+    /**
+     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     */
+    context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder();
   }
   /**
-   * Protobuf type {@code context.ConnectionSettings_L4}
+   * Protobuf type {@code context.ConnectionSettings}
    */
-  public static final class ConnectionSettings_L4 extends
+  public static final class ConnectionSettings extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionSettings_L4)
-      ConnectionSettings_L4OrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
+      ConnectionSettingsOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionSettings_L4.newBuilder() to construct.
-    private ConnectionSettings_L4(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionSettings.newBuilder() to construct.
+    private ConnectionSettings(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionSettings_L4() {
+    private ConnectionSettings() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionSettings_L4();
+      return new ConnectionSettings();
     }
 
     @java.lang.Override
@@ -44367,7 +48147,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionSettings_L4(
+    private ConnectionSettings(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -44385,24 +48165,56 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 8: {
+            case 10: {
+              context.ContextOuterClass.ConnectionSettings_L0.Builder subBuilder = null;
+              if (l0_ != null) {
+                subBuilder = l0_.toBuilder();
+              }
+              l0_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L0.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(l0_);
+                l0_ = subBuilder.buildPartial();
+              }
 
-              srcPort_ = input.readUInt32();
               break;
             }
-            case 16: {
+            case 18: {
+              context.ContextOuterClass.ConnectionSettings_L2.Builder subBuilder = null;
+              if (l2_ != null) {
+                subBuilder = l2_.toBuilder();
+              }
+              l2_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L2.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(l2_);
+                l2_ = subBuilder.buildPartial();
+              }
 
-              dstPort_ = input.readUInt32();
               break;
             }
-            case 24: {
+            case 26: {
+              context.ContextOuterClass.ConnectionSettings_L3.Builder subBuilder = null;
+              if (l3_ != null) {
+                subBuilder = l3_.toBuilder();
+              }
+              l3_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L3.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(l3_);
+                l3_ = subBuilder.buildPartial();
+              }
 
-              tcpFlags_ = input.readUInt32();
               break;
             }
-            case 32: {
+            case 34: {
+              context.ContextOuterClass.ConnectionSettings_L4.Builder subBuilder = null;
+              if (l4_ != null) {
+                subBuilder = l4_.toBuilder();
+              }
+              l4_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L4.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(l4_);
+                l4_ = subBuilder.buildPartial();
+              }
 
-              ttl_ = input.readUInt32();
               break;
             }
             default: {
@@ -44426,59 +48238,119 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionSettings_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionSettings_L4.class, context.ContextOuterClass.ConnectionSettings_L4.Builder.class);
+              context.ContextOuterClass.ConnectionSettings.class, context.ContextOuterClass.ConnectionSettings.Builder.class);
     }
 
-    public static final int SRC_PORT_FIELD_NUMBER = 1;
-    private int srcPort_;
+    public static final int L0_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.ConnectionSettings_L0 l0_;
     /**
-     * <code>uint32 src_port = 1;</code>
-     * @return The srcPort.
+     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     * @return Whether the l0 field is set.
      */
     @java.lang.Override
-    public int getSrcPort() {
-      return srcPort_;
+    public boolean hasL0() {
+      return l0_ != null;
+    }
+    /**
+     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     * @return The l0.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings_L0 getL0() {
+      return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+    }
+    /**
+     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
+      return getL0();
+    }
+
+    public static final int L2_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.ConnectionSettings_L2 l2_;
+    /**
+     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     * @return Whether the l2 field is set.
+     */
+    @java.lang.Override
+    public boolean hasL2() {
+      return l2_ != null;
+    }
+    /**
+     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     * @return The l2.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings_L2 getL2() {
+      return l2_ == null ? context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+    }
+    /**
+     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder() {
+      return getL2();
+    }
+
+    public static final int L3_FIELD_NUMBER = 3;
+    private context.ContextOuterClass.ConnectionSettings_L3 l3_;
+    /**
+     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     * @return Whether the l3 field is set.
+     */
+    @java.lang.Override
+    public boolean hasL3() {
+      return l3_ != null;
+    }
+    /**
+     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     * @return The l3.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings_L3 getL3() {
+      return l3_ == null ? context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
+    }
+    /**
+     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder() {
+      return getL3();
     }
 
-    public static final int DST_PORT_FIELD_NUMBER = 2;
-    private int dstPort_;
+    public static final int L4_FIELD_NUMBER = 4;
+    private context.ContextOuterClass.ConnectionSettings_L4 l4_;
     /**
-     * <code>uint32 dst_port = 2;</code>
-     * @return The dstPort.
+     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     * @return Whether the l4 field is set.
      */
     @java.lang.Override
-    public int getDstPort() {
-      return dstPort_;
+    public boolean hasL4() {
+      return l4_ != null;
     }
-
-    public static final int TCP_FLAGS_FIELD_NUMBER = 3;
-    private int tcpFlags_;
     /**
-     * <code>uint32 tcp_flags = 3;</code>
-     * @return The tcpFlags.
+     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     * @return The l4.
      */
     @java.lang.Override
-    public int getTcpFlags() {
-      return tcpFlags_;
+    public context.ContextOuterClass.ConnectionSettings_L4 getL4() {
+      return l4_ == null ? context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
     }
-
-    public static final int TTL_FIELD_NUMBER = 4;
-    private int ttl_;
     /**
-     * <code>uint32 ttl = 4;</code>
-     * @return The ttl.
+     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
      */
     @java.lang.Override
-    public int getTtl() {
-      return ttl_;
+    public context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder() {
+      return getL4();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -44495,17 +48367,17 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (srcPort_ != 0) {
-        output.writeUInt32(1, srcPort_);
+      if (l0_ != null) {
+        output.writeMessage(1, getL0());
       }
-      if (dstPort_ != 0) {
-        output.writeUInt32(2, dstPort_);
+      if (l2_ != null) {
+        output.writeMessage(2, getL2());
       }
-      if (tcpFlags_ != 0) {
-        output.writeUInt32(3, tcpFlags_);
+      if (l3_ != null) {
+        output.writeMessage(3, getL3());
       }
-      if (ttl_ != 0) {
-        output.writeUInt32(4, ttl_);
+      if (l4_ != null) {
+        output.writeMessage(4, getL4());
       }
       unknownFields.writeTo(output);
     }
@@ -44516,21 +48388,21 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (srcPort_ != 0) {
+      if (l0_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(1, srcPort_);
+          .computeMessageSize(1, getL0());
       }
-      if (dstPort_ != 0) {
+      if (l2_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(2, dstPort_);
+          .computeMessageSize(2, getL2());
       }
-      if (tcpFlags_ != 0) {
+      if (l3_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(3, tcpFlags_);
+          .computeMessageSize(3, getL3());
       }
-      if (ttl_ != 0) {
+      if (l4_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(4, ttl_);
+          .computeMessageSize(4, getL4());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -44542,19 +48414,31 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings_L4)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionSettings_L4 other = (context.ContextOuterClass.ConnectionSettings_L4) obj;
+      context.ContextOuterClass.ConnectionSettings other = (context.ContextOuterClass.ConnectionSettings) obj;
 
-      if (getSrcPort()
-          != other.getSrcPort()) return false;
-      if (getDstPort()
-          != other.getDstPort()) return false;
-      if (getTcpFlags()
-          != other.getTcpFlags()) return false;
-      if (getTtl()
-          != other.getTtl()) return false;
+      if (hasL0() != other.hasL0()) return false;
+      if (hasL0()) {
+        if (!getL0()
+            .equals(other.getL0())) return false;
+      }
+      if (hasL2() != other.hasL2()) return false;
+      if (hasL2()) {
+        if (!getL2()
+            .equals(other.getL2())) return false;
+      }
+      if (hasL3() != other.hasL3()) return false;
+      if (hasL3()) {
+        if (!getL3()
+            .equals(other.getL3())) return false;
+      }
+      if (hasL4() != other.hasL4()) return false;
+      if (hasL4()) {
+        if (!getL4()
+            .equals(other.getL4())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -44566,82 +48450,90 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + SRC_PORT_FIELD_NUMBER;
-      hash = (53 * hash) + getSrcPort();
-      hash = (37 * hash) + DST_PORT_FIELD_NUMBER;
-      hash = (53 * hash) + getDstPort();
-      hash = (37 * hash) + TCP_FLAGS_FIELD_NUMBER;
-      hash = (53 * hash) + getTcpFlags();
-      hash = (37 * hash) + TTL_FIELD_NUMBER;
-      hash = (53 * hash) + getTtl();
+      if (hasL0()) {
+        hash = (37 * hash) + L0_FIELD_NUMBER;
+        hash = (53 * hash) + getL0().hashCode();
+      }
+      if (hasL2()) {
+        hash = (37 * hash) + L2_FIELD_NUMBER;
+        hash = (53 * hash) + getL2().hashCode();
+      }
+      if (hasL3()) {
+        hash = (37 * hash) + L3_FIELD_NUMBER;
+        hash = (53 * hash) + getL3().hashCode();
+      }
+      if (hasL4()) {
+        hash = (37 * hash) + L4_FIELD_NUMBER;
+        hash = (53 * hash) + getL4().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionSettings parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings_L4 parseFrom(
+    public static context.ContextOuterClass.ConnectionSettings parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -44654,7 +48546,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings_L4 prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -44670,26 +48562,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionSettings_L4}
+     * Protobuf type {@code context.ConnectionSettings}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings_L4)
-        context.ContextOuterClass.ConnectionSettings_L4OrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
+        context.ContextOuterClass.ConnectionSettingsOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionSettings_L4.class, context.ContextOuterClass.ConnectionSettings_L4.Builder.class);
+                context.ContextOuterClass.ConnectionSettings.class, context.ContextOuterClass.ConnectionSettings.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionSettings_L4.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionSettings.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -44707,31 +48599,47 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        srcPort_ = 0;
-
-        dstPort_ = 0;
-
-        tcpFlags_ = 0;
-
-        ttl_ = 0;
-
+        if (l0Builder_ == null) {
+          l0_ = null;
+        } else {
+          l0_ = null;
+          l0Builder_ = null;
+        }
+        if (l2Builder_ == null) {
+          l2_ = null;
+        } else {
+          l2_ = null;
+          l2Builder_ = null;
+        }
+        if (l3Builder_ == null) {
+          l3_ = null;
+        } else {
+          l3_ = null;
+          l3Builder_ = null;
+        }
+        if (l4Builder_ == null) {
+          l4_ = null;
+        } else {
+          l4_ = null;
+          l4Builder_ = null;
+        }
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_L4_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L4 getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionSettings getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionSettings.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L4 build() {
-        context.ContextOuterClass.ConnectionSettings_L4 result = buildPartial();
+      public context.ContextOuterClass.ConnectionSettings build() {
+        context.ContextOuterClass.ConnectionSettings result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -44739,223 +48647,591 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings_L4 buildPartial() {
-        context.ContextOuterClass.ConnectionSettings_L4 result = new context.ContextOuterClass.ConnectionSettings_L4(this);
-        result.srcPort_ = srcPort_;
-        result.dstPort_ = dstPort_;
-        result.tcpFlags_ = tcpFlags_;
-        result.ttl_ = ttl_;
+      public context.ContextOuterClass.ConnectionSettings buildPartial() {
+        context.ContextOuterClass.ConnectionSettings result = new context.ContextOuterClass.ConnectionSettings(this);
+        if (l0Builder_ == null) {
+          result.l0_ = l0_;
+        } else {
+          result.l0_ = l0Builder_.build();
+        }
+        if (l2Builder_ == null) {
+          result.l2_ = l2_;
+        } else {
+          result.l2_ = l2Builder_.build();
+        }
+        if (l3Builder_ == null) {
+          result.l3_ = l3_;
+        } else {
+          result.l3_ = l3Builder_.build();
+        }
+        if (l4Builder_ == null) {
+          result.l4_ = l4_;
+        } else {
+          result.l4_ = l4Builder_.build();
+        }
         onBuilt();
         return result;
       }
 
-      @java.lang.Override
-      public Builder clone() {
-        return super.clone();
-      }
-      @java.lang.Override
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          java.lang.Object value) {
-        return super.setField(field, value);
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.ConnectionSettings) {
+          return mergeFrom((context.ContextOuterClass.ConnectionSettings)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings other) {
+        if (other == context.ContextOuterClass.ConnectionSettings.getDefaultInstance()) return this;
+        if (other.hasL0()) {
+          mergeL0(other.getL0());
+        }
+        if (other.hasL2()) {
+          mergeL2(other.getL2());
+        }
+        if (other.hasL3()) {
+          mergeL3(other.getL3());
+        }
+        if (other.hasL4()) {
+          mergeL4(other.getL4());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.ConnectionSettings parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.ConnectionSettings) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private context.ContextOuterClass.ConnectionSettings_L0 l0_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder> l0Builder_;
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * @return Whether the l0 field is set.
+       */
+      public boolean hasL0() {
+        return l0Builder_ != null || l0_ != null;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * @return The l0.
+       */
+      public context.ContextOuterClass.ConnectionSettings_L0 getL0() {
+        if (l0Builder_ == null) {
+          return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+        } else {
+          return l0Builder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      public Builder setL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
+        if (l0Builder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          l0_ = value;
+          onChanged();
+        } else {
+          l0Builder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      public Builder setL0(
+          context.ContextOuterClass.ConnectionSettings_L0.Builder builderForValue) {
+        if (l0Builder_ == null) {
+          l0_ = builderForValue.build();
+          onChanged();
+        } else {
+          l0Builder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      public Builder mergeL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
+        if (l0Builder_ == null) {
+          if (l0_ != null) {
+            l0_ =
+              context.ContextOuterClass.ConnectionSettings_L0.newBuilder(l0_).mergeFrom(value).buildPartial();
+          } else {
+            l0_ = value;
+          }
+          onChanged();
+        } else {
+          l0Builder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      public Builder clearL0() {
+        if (l0Builder_ == null) {
+          l0_ = null;
+          onChanged();
+        } else {
+          l0_ = null;
+          l0Builder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionSettings_L0.Builder getL0Builder() {
+        
+        onChanged();
+        return getL0FieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
+        if (l0Builder_ != null) {
+          return l0Builder_.getMessageOrBuilder();
+        } else {
+          return l0_ == null ?
+              context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+        }
+      }
+      /**
+       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder> 
+          getL0FieldBuilder() {
+        if (l0Builder_ == null) {
+          l0Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder>(
+                  getL0(),
+                  getParentForChildren(),
+                  isClean());
+          l0_ = null;
+        }
+        return l0Builder_;
+      }
+
+      private context.ContextOuterClass.ConnectionSettings_L2 l2_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder> l2Builder_;
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * @return Whether the l2 field is set.
+       */
+      public boolean hasL2() {
+        return l2Builder_ != null || l2_ != null;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * @return The l2.
+       */
+      public context.ContextOuterClass.ConnectionSettings_L2 getL2() {
+        if (l2Builder_ == null) {
+          return l2_ == null ? context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+        } else {
+          return l2Builder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      public Builder setL2(context.ContextOuterClass.ConnectionSettings_L2 value) {
+        if (l2Builder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          l2_ = value;
+          onChanged();
+        } else {
+          l2Builder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      public Builder setL2(
+          context.ContextOuterClass.ConnectionSettings_L2.Builder builderForValue) {
+        if (l2Builder_ == null) {
+          l2_ = builderForValue.build();
+          onChanged();
+        } else {
+          l2Builder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      public Builder mergeL2(context.ContextOuterClass.ConnectionSettings_L2 value) {
+        if (l2Builder_ == null) {
+          if (l2_ != null) {
+            l2_ =
+              context.ContextOuterClass.ConnectionSettings_L2.newBuilder(l2_).mergeFrom(value).buildPartial();
+          } else {
+            l2_ = value;
+          }
+          onChanged();
+        } else {
+          l2Builder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      public Builder clearL2() {
+        if (l2Builder_ == null) {
+          l2_ = null;
+          onChanged();
+        } else {
+          l2_ = null;
+          l2Builder_ = null;
+        }
+
+        return this;
       }
-      @java.lang.Override
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return super.clearField(field);
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      public context.ContextOuterClass.ConnectionSettings_L2.Builder getL2Builder() {
+        
+        onChanged();
+        return getL2FieldBuilder().getBuilder();
       }
-      @java.lang.Override
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return super.clearOneof(oneof);
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      public context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder() {
+        if (l2Builder_ != null) {
+          return l2Builder_.getMessageOrBuilder();
+        } else {
+          return l2_ == null ?
+              context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+        }
       }
-      @java.lang.Override
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, java.lang.Object value) {
-        return super.setRepeatedField(field, index, value);
+      /**
+       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder> 
+          getL2FieldBuilder() {
+        if (l2Builder_ == null) {
+          l2Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder>(
+                  getL2(),
+                  getParentForChildren(),
+                  isClean());
+          l2_ = null;
+        }
+        return l2Builder_;
       }
-      @java.lang.Override
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          java.lang.Object value) {
-        return super.addRepeatedField(field, value);
+
+      private context.ContextOuterClass.ConnectionSettings_L3 l3_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder> l3Builder_;
+      /**
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * @return Whether the l3 field is set.
+       */
+      public boolean hasL3() {
+        return l3Builder_ != null || l3_ != null;
       }
-      @java.lang.Override
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionSettings_L4) {
-          return mergeFrom((context.ContextOuterClass.ConnectionSettings_L4)other);
+      /**
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * @return The l3.
+       */
+      public context.ContextOuterClass.ConnectionSettings_L3 getL3() {
+        if (l3Builder_ == null) {
+          return l3_ == null ? context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
         } else {
-          super.mergeFrom(other);
-          return this;
+          return l3Builder_.getMessage();
         }
       }
-
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings_L4 other) {
-        if (other == context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance()) return this;
-        if (other.getSrcPort() != 0) {
-          setSrcPort(other.getSrcPort());
-        }
-        if (other.getDstPort() != 0) {
-          setDstPort(other.getDstPort());
-        }
-        if (other.getTcpFlags() != 0) {
-          setTcpFlags(other.getTcpFlags());
-        }
-        if (other.getTtl() != 0) {
-          setTtl(other.getTtl());
+      /**
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       */
+      public Builder setL3(context.ContextOuterClass.ConnectionSettings_L3 value) {
+        if (l3Builder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          l3_ = value;
+          onChanged();
+        } else {
+          l3Builder_.setMessage(value);
         }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
+
         return this;
       }
+      /**
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       */
+      public Builder setL3(
+          context.ContextOuterClass.ConnectionSettings_L3.Builder builderForValue) {
+        if (l3Builder_ == null) {
+          l3_ = builderForValue.build();
+          onChanged();
+        } else {
+          l3Builder_.setMessage(builderForValue.build());
+        }
 
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
+        return this;
       }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.ConnectionSettings_L4 parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionSettings_L4) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
+      /**
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       */
+      public Builder mergeL3(context.ContextOuterClass.ConnectionSettings_L3 value) {
+        if (l3Builder_ == null) {
+          if (l3_ != null) {
+            l3_ =
+              context.ContextOuterClass.ConnectionSettings_L3.newBuilder(l3_).mergeFrom(value).buildPartial();
+          } else {
+            l3_ = value;
           }
+          onChanged();
+        } else {
+          l3Builder_.mergeFrom(value);
         }
+
         return this;
       }
-
-      private int srcPort_ ;
       /**
-       * <code>uint32 src_port = 1;</code>
-       * @return The srcPort.
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
        */
-      @java.lang.Override
-      public int getSrcPort() {
-        return srcPort_;
+      public Builder clearL3() {
+        if (l3Builder_ == null) {
+          l3_ = null;
+          onChanged();
+        } else {
+          l3_ = null;
+          l3Builder_ = null;
+        }
+
+        return this;
       }
       /**
-       * <code>uint32 src_port = 1;</code>
-       * @param value The srcPort to set.
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
        */
-      public Builder setSrcPort(int value) {
+      public context.ContextOuterClass.ConnectionSettings_L3.Builder getL3Builder() {
         
-        srcPort_ = value;
         onChanged();
-        return this;
+        return getL3FieldBuilder().getBuilder();
       }
       /**
-       * <code>uint32 src_port = 1;</code>
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
        */
-      public Builder clearSrcPort() {
-        
-        srcPort_ = 0;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder() {
+        if (l3Builder_ != null) {
+          return l3Builder_.getMessageOrBuilder();
+        } else {
+          return l3_ == null ?
+              context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
+        }
       }
-
-      private int dstPort_ ;
       /**
-       * <code>uint32 dst_port = 2;</code>
-       * @return The dstPort.
+       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
        */
-      @java.lang.Override
-      public int getDstPort() {
-        return dstPort_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder> 
+          getL3FieldBuilder() {
+        if (l3Builder_ == null) {
+          l3Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder>(
+                  getL3(),
+                  getParentForChildren(),
+                  isClean());
+          l3_ = null;
+        }
+        return l3Builder_;
       }
+
+      private context.ContextOuterClass.ConnectionSettings_L4 l4_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder> l4Builder_;
       /**
-       * <code>uint32 dst_port = 2;</code>
-       * @param value The dstPort to set.
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * @return Whether the l4 field is set.
        */
-      public Builder setDstPort(int value) {
-        
-        dstPort_ = value;
-        onChanged();
-        return this;
+      public boolean hasL4() {
+        return l4Builder_ != null || l4_ != null;
       }
       /**
-       * <code>uint32 dst_port = 2;</code>
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * @return The l4.
        */
-      public Builder clearDstPort() {
-        
-        dstPort_ = 0;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConnectionSettings_L4 getL4() {
+        if (l4Builder_ == null) {
+          return l4_ == null ? context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+        } else {
+          return l4Builder_.getMessage();
+        }
       }
-
-      private int tcpFlags_ ;
       /**
-       * <code>uint32 tcp_flags = 3;</code>
-       * @return The tcpFlags.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
-      @java.lang.Override
-      public int getTcpFlags() {
-        return tcpFlags_;
+      public Builder setL4(context.ContextOuterClass.ConnectionSettings_L4 value) {
+        if (l4Builder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          l4_ = value;
+          onChanged();
+        } else {
+          l4Builder_.setMessage(value);
+        }
+
+        return this;
       }
       /**
-       * <code>uint32 tcp_flags = 3;</code>
-       * @param value The tcpFlags to set.
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
-      public Builder setTcpFlags(int value) {
-        
-        tcpFlags_ = value;
-        onChanged();
+      public Builder setL4(
+          context.ContextOuterClass.ConnectionSettings_L4.Builder builderForValue) {
+        if (l4Builder_ == null) {
+          l4_ = builderForValue.build();
+          onChanged();
+        } else {
+          l4Builder_.setMessage(builderForValue.build());
+        }
+
         return this;
       }
       /**
-       * <code>uint32 tcp_flags = 3;</code>
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
-      public Builder clearTcpFlags() {
-        
-        tcpFlags_ = 0;
-        onChanged();
+      public Builder mergeL4(context.ContextOuterClass.ConnectionSettings_L4 value) {
+        if (l4Builder_ == null) {
+          if (l4_ != null) {
+            l4_ =
+              context.ContextOuterClass.ConnectionSettings_L4.newBuilder(l4_).mergeFrom(value).buildPartial();
+          } else {
+            l4_ = value;
+          }
+          onChanged();
+        } else {
+          l4Builder_.mergeFrom(value);
+        }
+
         return this;
       }
-
-      private int ttl_ ;
       /**
-       * <code>uint32 ttl = 4;</code>
-       * @return The ttl.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
-      @java.lang.Override
-      public int getTtl() {
-        return ttl_;
+      public Builder clearL4() {
+        if (l4Builder_ == null) {
+          l4_ = null;
+          onChanged();
+        } else {
+          l4_ = null;
+          l4Builder_ = null;
+        }
+
+        return this;
       }
       /**
-       * <code>uint32 ttl = 4;</code>
-       * @param value The ttl to set.
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
-      public Builder setTtl(int value) {
+      public context.ContextOuterClass.ConnectionSettings_L4.Builder getL4Builder() {
         
-        ttl_ = value;
         onChanged();
-        return this;
+        return getL4FieldBuilder().getBuilder();
       }
       /**
-       * <code>uint32 ttl = 4;</code>
-       * @return This builder for chaining.
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
-      public Builder clearTtl() {
-        
-        ttl_ = 0;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder() {
+        if (l4Builder_ != null) {
+          return l4Builder_.getMessageOrBuilder();
+        } else {
+          return l4_ == null ?
+              context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+        }
+      }
+      /**
+       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder> 
+          getL4FieldBuilder() {
+        if (l4Builder_ == null) {
+          l4Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder>(
+                  getL4(),
+                  getParentForChildren(),
+                  isClean());
+          l4_ = null;
+        }
+        return l4Builder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -44970,130 +49246,165 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings_L4)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionSettings_L4)
-    private static final context.ContextOuterClass.ConnectionSettings_L4 DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionSettings)
+    private static final context.ContextOuterClass.ConnectionSettings DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings_L4();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings();
     }
 
-    public static context.ContextOuterClass.ConnectionSettings_L4 getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionSettings getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionSettings_L4>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings_L4>() {
+    private static final com.google.protobuf.Parser<ConnectionSettings>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings>() {
       @java.lang.Override
-      public ConnectionSettings_L4 parsePartialFrom(
+      public ConnectionSettings parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionSettings_L4(input, extensionRegistry);
+        return new ConnectionSettings(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionSettings_L4> parser() {
+    public static com.google.protobuf.Parser<ConnectionSettings> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionSettings_L4> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionSettings> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L4 getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionSettings getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionSettingsOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionSettings)
+  public interface ConnectionOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Connection)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-     * @return Whether the l0 field is set.
+     * <code>.context.ConnectionId connection_id = 1;</code>
+     * @return Whether the connectionId field is set.
      */
-    boolean hasL0();
+    boolean hasConnectionId();
     /**
-     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-     * @return The l0.
+     * <code>.context.ConnectionId connection_id = 1;</code>
+     * @return The connectionId.
      */
-    context.ContextOuterClass.ConnectionSettings_L0 getL0();
+    context.ContextOuterClass.ConnectionId getConnectionId();
     /**
-     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     * <code>.context.ConnectionId connection_id = 1;</code>
      */
-    context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder();
+    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder();
 
     /**
-     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-     * @return Whether the l2 field is set.
+     * <code>.context.ServiceId service_id = 2;</code>
+     * @return Whether the serviceId field is set.
      */
-    boolean hasL2();
+    boolean hasServiceId();
     /**
-     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-     * @return The l2.
+     * <code>.context.ServiceId service_id = 2;</code>
+     * @return The serviceId.
      */
-    context.ContextOuterClass.ConnectionSettings_L2 getL2();
+    context.ContextOuterClass.ServiceId getServiceId();
     /**
-     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     * <code>.context.ServiceId service_id = 2;</code>
      */
-    context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder();
+    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
 
     /**
-     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
-     * @return Whether the l3 field is set.
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
      */
-    boolean hasL3();
+    java.util.List<context.ContextOuterClass.EndPointId> 
+        getPathHopsEndpointIdsList();
     /**
-     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
-     * @return The l3.
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
      */
-    context.ContextOuterClass.ConnectionSettings_L3 getL3();
+    context.ContextOuterClass.EndPointId getPathHopsEndpointIds(int index);
     /**
-     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
      */
-    context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder();
+    int getPathHopsEndpointIdsCount();
+    /**
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getPathHopsEndpointIdsOrBuilderList();
+    /**
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+     */
+    context.ContextOuterClass.EndPointIdOrBuilder getPathHopsEndpointIdsOrBuilder(
+        int index);
 
     /**
-     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
-     * @return Whether the l4 field is set.
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
      */
-    boolean hasL4();
+    java.util.List<context.ContextOuterClass.ServiceId> 
+        getSubServiceIdsList();
     /**
-     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
-     * @return The l4.
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
      */
-    context.ContextOuterClass.ConnectionSettings_L4 getL4();
+    context.ContextOuterClass.ServiceId getSubServiceIds(int index);
     /**
-     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
      */
-    context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder();
+    int getSubServiceIdsCount();
+    /**
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+        getSubServiceIdsOrBuilderList();
+    /**
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     */
+    context.ContextOuterClass.ServiceIdOrBuilder getSubServiceIdsOrBuilder(
+        int index);
+
+    /**
+     * <code>.context.ConnectionSettings settings = 5;</code>
+     * @return Whether the settings field is set.
+     */
+    boolean hasSettings();
+    /**
+     * <code>.context.ConnectionSettings settings = 5;</code>
+     * @return The settings.
+     */
+    context.ContextOuterClass.ConnectionSettings getSettings();
+    /**
+     * <code>.context.ConnectionSettings settings = 5;</code>
+     */
+    context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder();
   }
   /**
-   * Protobuf type {@code context.ConnectionSettings}
+   * Protobuf type {@code context.Connection}
    */
-  public static final class ConnectionSettings extends
+  public static final class Connection extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionSettings)
-      ConnectionSettingsOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Connection)
+      ConnectionOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionSettings.newBuilder() to construct.
-    private ConnectionSettings(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Connection.newBuilder() to construct.
+    private Connection(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionSettings() {
+    private Connection() {
+      pathHopsEndpointIds_ = java.util.Collections.emptyList();
+      subServiceIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionSettings();
+      return new Connection();
     }
 
     @java.lang.Override
@@ -45101,7 +49412,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionSettings(
+    private Connection(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -45109,6 +49420,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -45120,53 +49432,58 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.ConnectionSettings_L0.Builder subBuilder = null;
-              if (l0_ != null) {
-                subBuilder = l0_.toBuilder();
+              context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+              if (connectionId_ != null) {
+                subBuilder = connectionId_.toBuilder();
               }
-              l0_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L0.parser(), extensionRegistry);
+              connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(l0_);
-                l0_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(connectionId_);
+                connectionId_ = subBuilder.buildPartial();
               }
 
               break;
             }
             case 18: {
-              context.ContextOuterClass.ConnectionSettings_L2.Builder subBuilder = null;
-              if (l2_ != null) {
-                subBuilder = l2_.toBuilder();
+              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
+              if (serviceId_ != null) {
+                subBuilder = serviceId_.toBuilder();
               }
-              l2_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L2.parser(), extensionRegistry);
+              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(l2_);
-                l2_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(serviceId_);
+                serviceId_ = subBuilder.buildPartial();
               }
 
               break;
             }
             case 26: {
-              context.ContextOuterClass.ConnectionSettings_L3.Builder subBuilder = null;
-              if (l3_ != null) {
-                subBuilder = l3_.toBuilder();
-              }
-              l3_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L3.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(l3_);
-                l3_ = subBuilder.buildPartial();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                pathHopsEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
+                mutable_bitField0_ |= 0x00000001;
               }
-
+              pathHopsEndpointIds_.add(
+                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
               break;
             }
             case 34: {
-              context.ContextOuterClass.ConnectionSettings_L4.Builder subBuilder = null;
-              if (l4_ != null) {
-                subBuilder = l4_.toBuilder();
+              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                subServiceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>();
+                mutable_bitField0_ |= 0x00000002;
               }
-              l4_ = input.readMessage(context.ContextOuterClass.ConnectionSettings_L4.parser(), extensionRegistry);
+              subServiceIds_.add(
+                  input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
+              break;
+            }
+            case 42: {
+              context.ContextOuterClass.ConnectionSettings.Builder subBuilder = null;
+              if (settings_ != null) {
+                subBuilder = settings_.toBuilder();
+              }
+              settings_ = input.readMessage(context.ContextOuterClass.ConnectionSettings.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(l4_);
-                l4_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(settings_);
+                settings_ = subBuilder.buildPartial();
               }
 
               break;
@@ -45186,125 +49503,185 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+        }
+        if (((mutable_bitField0_ & 0x00000002) != 0)) {
+          subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
+      return context.ContextOuterClass.internal_static_context_Connection_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionSettings_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Connection_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionSettings.class, context.ContextOuterClass.ConnectionSettings.Builder.class);
+              context.ContextOuterClass.Connection.class, context.ContextOuterClass.Connection.Builder.class);
     }
 
-    public static final int L0_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.ConnectionSettings_L0 l0_;
+    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.ConnectionId connectionId_;
     /**
-     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-     * @return Whether the l0 field is set.
+     * <code>.context.ConnectionId connection_id = 1;</code>
+     * @return Whether the connectionId field is set.
      */
     @java.lang.Override
-    public boolean hasL0() {
-      return l0_ != null;
+    public boolean hasConnectionId() {
+      return connectionId_ != null;
     }
     /**
-     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-     * @return The l0.
+     * <code>.context.ConnectionId connection_id = 1;</code>
+     * @return The connectionId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L0 getL0() {
-      return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+    public context.ContextOuterClass.ConnectionId getConnectionId() {
+      return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
     }
     /**
-     * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+     * <code>.context.ConnectionId connection_id = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
-      return getL0();
+    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
+      return getConnectionId();
     }
 
-    public static final int L2_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.ConnectionSettings_L2 l2_;
+    public static final int SERVICE_ID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.ServiceId serviceId_;
     /**
-     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-     * @return Whether the l2 field is set.
+     * <code>.context.ServiceId service_id = 2;</code>
+     * @return Whether the serviceId field is set.
      */
     @java.lang.Override
-    public boolean hasL2() {
-      return l2_ != null;
+    public boolean hasServiceId() {
+      return serviceId_ != null;
     }
     /**
-     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-     * @return The l2.
+     * <code>.context.ServiceId service_id = 2;</code>
+     * @return The serviceId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L2 getL2() {
-      return l2_ == null ? context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+    public context.ContextOuterClass.ServiceId getServiceId() {
+      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
     }
     /**
-     * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+     * <code>.context.ServiceId service_id = 2;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder() {
-      return getL2();
+    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+      return getServiceId();
     }
 
-    public static final int L3_FIELD_NUMBER = 3;
-    private context.ContextOuterClass.ConnectionSettings_L3 l3_;
+    public static final int PATH_HOPS_ENDPOINT_IDS_FIELD_NUMBER = 3;
+    private java.util.List<context.ContextOuterClass.EndPointId> pathHopsEndpointIds_;
     /**
-     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
-     * @return Whether the l3 field is set.
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public boolean hasL3() {
-      return l3_ != null;
+    public java.util.List<context.ContextOuterClass.EndPointId> getPathHopsEndpointIdsList() {
+      return pathHopsEndpointIds_;
     }
     /**
-     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
-     * @return The l3.
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L3 getL3() {
-      return l3_ == null ? context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
+    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getPathHopsEndpointIdsOrBuilderList() {
+      return pathHopsEndpointIds_;
     }
     /**
-     * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder() {
-      return getL3();
+    public int getPathHopsEndpointIdsCount() {
+      return pathHopsEndpointIds_.size();
+    }
+    /**
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointId getPathHopsEndpointIds(int index) {
+      return pathHopsEndpointIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointIdOrBuilder getPathHopsEndpointIdsOrBuilder(
+        int index) {
+      return pathHopsEndpointIds_.get(index);
     }
 
-    public static final int L4_FIELD_NUMBER = 4;
-    private context.ContextOuterClass.ConnectionSettings_L4 l4_;
+    public static final int SUB_SERVICE_IDS_FIELD_NUMBER = 4;
+    private java.util.List<context.ContextOuterClass.ServiceId> subServiceIds_;
     /**
-     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
-     * @return Whether the l4 field is set.
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
      */
     @java.lang.Override
-    public boolean hasL4() {
-      return l4_ != null;
+    public java.util.List<context.ContextOuterClass.ServiceId> getSubServiceIdsList() {
+      return subServiceIds_;
     }
     /**
-     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
-     * @return The l4.
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L4 getL4() {
-      return l4_ == null ? context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+    public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+        getSubServiceIdsOrBuilderList() {
+      return subServiceIds_;
     }
     /**
-     * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder() {
-      return getL4();
+    public int getSubServiceIdsCount() {
+      return subServiceIds_.size();
+    }
+    /**
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceId getSubServiceIds(int index) {
+      return subServiceIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ServiceIdOrBuilder getSubServiceIdsOrBuilder(
+        int index) {
+      return subServiceIds_.get(index);
+    }
+
+    public static final int SETTINGS_FIELD_NUMBER = 5;
+    private context.ContextOuterClass.ConnectionSettings settings_;
+    /**
+     * <code>.context.ConnectionSettings settings = 5;</code>
+     * @return Whether the settings field is set.
+     */
+    @java.lang.Override
+    public boolean hasSettings() {
+      return settings_ != null;
+    }
+    /**
+     * <code>.context.ConnectionSettings settings = 5;</code>
+     * @return The settings.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettings getSettings() {
+      return settings_ == null ? context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
+    }
+    /**
+     * <code>.context.ConnectionSettings settings = 5;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder() {
+      return getSettings();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -45321,17 +49698,20 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (l0_ != null) {
-        output.writeMessage(1, getL0());
+      if (connectionId_ != null) {
+        output.writeMessage(1, getConnectionId());
       }
-      if (l2_ != null) {
-        output.writeMessage(2, getL2());
+      if (serviceId_ != null) {
+        output.writeMessage(2, getServiceId());
       }
-      if (l3_ != null) {
-        output.writeMessage(3, getL3());
+      for (int i = 0; i < pathHopsEndpointIds_.size(); i++) {
+        output.writeMessage(3, pathHopsEndpointIds_.get(i));
       }
-      if (l4_ != null) {
-        output.writeMessage(4, getL4());
+      for (int i = 0; i < subServiceIds_.size(); i++) {
+        output.writeMessage(4, subServiceIds_.get(i));
+      }
+      if (settings_ != null) {
+        output.writeMessage(5, getSettings());
       }
       unknownFields.writeTo(output);
     }
@@ -45342,21 +49722,25 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (l0_ != null) {
+      if (connectionId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getL0());
+          .computeMessageSize(1, getConnectionId());
       }
-      if (l2_ != null) {
+      if (serviceId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getL2());
+          .computeMessageSize(2, getServiceId());
       }
-      if (l3_ != null) {
+      for (int i = 0; i < pathHopsEndpointIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, getL3());
+          .computeMessageSize(3, pathHopsEndpointIds_.get(i));
       }
-      if (l4_ != null) {
+      for (int i = 0; i < subServiceIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, getL4());
+          .computeMessageSize(4, subServiceIds_.get(i));
+      }
+      if (settings_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(5, getSettings());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -45368,30 +49752,29 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionSettings)) {
+      if (!(obj instanceof context.ContextOuterClass.Connection)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionSettings other = (context.ContextOuterClass.ConnectionSettings) obj;
+      context.ContextOuterClass.Connection other = (context.ContextOuterClass.Connection) obj;
 
-      if (hasL0() != other.hasL0()) return false;
-      if (hasL0()) {
-        if (!getL0()
-            .equals(other.getL0())) return false;
-      }
-      if (hasL2() != other.hasL2()) return false;
-      if (hasL2()) {
-        if (!getL2()
-            .equals(other.getL2())) return false;
+      if (hasConnectionId() != other.hasConnectionId()) return false;
+      if (hasConnectionId()) {
+        if (!getConnectionId()
+            .equals(other.getConnectionId())) return false;
       }
-      if (hasL3() != other.hasL3()) return false;
-      if (hasL3()) {
-        if (!getL3()
-            .equals(other.getL3())) return false;
+      if (hasServiceId() != other.hasServiceId()) return false;
+      if (hasServiceId()) {
+        if (!getServiceId()
+            .equals(other.getServiceId())) return false;
       }
-      if (hasL4() != other.hasL4()) return false;
-      if (hasL4()) {
-        if (!getL4()
-            .equals(other.getL4())) return false;
+      if (!getPathHopsEndpointIdsList()
+          .equals(other.getPathHopsEndpointIdsList())) return false;
+      if (!getSubServiceIdsList()
+          .equals(other.getSubServiceIdsList())) return false;
+      if (hasSettings() != other.hasSettings()) return false;
+      if (hasSettings()) {
+        if (!getSettings()
+            .equals(other.getSettings())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -45404,90 +49787,94 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasL0()) {
-        hash = (37 * hash) + L0_FIELD_NUMBER;
-        hash = (53 * hash) + getL0().hashCode();
+      if (hasConnectionId()) {
+        hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getConnectionId().hashCode();
       }
-      if (hasL2()) {
-        hash = (37 * hash) + L2_FIELD_NUMBER;
-        hash = (53 * hash) + getL2().hashCode();
+      if (hasServiceId()) {
+        hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getServiceId().hashCode();
       }
-      if (hasL3()) {
-        hash = (37 * hash) + L3_FIELD_NUMBER;
-        hash = (53 * hash) + getL3().hashCode();
+      if (getPathHopsEndpointIdsCount() > 0) {
+        hash = (37 * hash) + PATH_HOPS_ENDPOINT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getPathHopsEndpointIdsList().hashCode();
       }
-      if (hasL4()) {
-        hash = (37 * hash) + L4_FIELD_NUMBER;
-        hash = (53 * hash) + getL4().hashCode();
+      if (getSubServiceIdsCount() > 0) {
+        hash = (37 * hash) + SUB_SERVICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getSubServiceIdsList().hashCode();
+      }
+      if (hasSettings()) {
+        hash = (37 * hash) + SETTINGS_FIELD_NUMBER;
+        hash = (53 * hash) + getSettings().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(byte[] data)
+    public static context.ContextOuterClass.Connection parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Connection parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Connection parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseDelimitedFrom(
+    public static context.ContextOuterClass.Connection parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionSettings parseFrom(
+    public static context.ContextOuterClass.Connection parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -45500,7 +49887,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionSettings prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Connection prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -45516,26 +49903,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionSettings}
+     * Protobuf type {@code context.Connection}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionSettings)
-        context.ContextOuterClass.ConnectionSettingsOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Connection)
+        context.ContextOuterClass.ConnectionOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
+        return context.ContextOuterClass.internal_static_context_Connection_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Connection_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionSettings.class, context.ContextOuterClass.ConnectionSettings.Builder.class);
+                context.ContextOuterClass.Connection.class, context.ContextOuterClass.Connection.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionSettings.newBuilder()
+      // Construct using context.ContextOuterClass.Connection.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -45548,34 +49935,42 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getPathHopsEndpointIdsFieldBuilder();
+          getSubServiceIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (l0Builder_ == null) {
-          l0_ = null;
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = null;
         } else {
-          l0_ = null;
-          l0Builder_ = null;
+          connectionId_ = null;
+          connectionIdBuilder_ = null;
         }
-        if (l2Builder_ == null) {
-          l2_ = null;
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
         } else {
-          l2_ = null;
-          l2Builder_ = null;
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
         }
-        if (l3Builder_ == null) {
-          l3_ = null;
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          pathHopsEndpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          l3_ = null;
-          l3Builder_ = null;
+          pathHopsEndpointIdsBuilder_.clear();
         }
-        if (l4Builder_ == null) {
-          l4_ = null;
+        if (subServiceIdsBuilder_ == null) {
+          subServiceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
         } else {
-          l4_ = null;
-          l4Builder_ = null;
+          subServiceIdsBuilder_.clear();
+        }
+        if (settingsBuilder_ == null) {
+          settings_ = null;
+        } else {
+          settings_ = null;
+          settingsBuilder_ = null;
         }
         return this;
       }
@@ -45583,17 +49978,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionSettings_descriptor;
+        return context.ContextOuterClass.internal_static_context_Connection_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionSettings.getDefaultInstance();
+      public context.ContextOuterClass.Connection getDefaultInstanceForType() {
+        return context.ContextOuterClass.Connection.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings build() {
-        context.ContextOuterClass.ConnectionSettings result = buildPartial();
+      public context.ContextOuterClass.Connection build() {
+        context.ContextOuterClass.Connection result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -45601,27 +49996,41 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionSettings buildPartial() {
-        context.ContextOuterClass.ConnectionSettings result = new context.ContextOuterClass.ConnectionSettings(this);
-        if (l0Builder_ == null) {
-          result.l0_ = l0_;
+      public context.ContextOuterClass.Connection buildPartial() {
+        context.ContextOuterClass.Connection result = new context.ContextOuterClass.Connection(this);
+        int from_bitField0_ = bitField0_;
+        if (connectionIdBuilder_ == null) {
+          result.connectionId_ = connectionId_;
         } else {
-          result.l0_ = l0Builder_.build();
+          result.connectionId_ = connectionIdBuilder_.build();
         }
-        if (l2Builder_ == null) {
-          result.l2_ = l2_;
+        if (serviceIdBuilder_ == null) {
+          result.serviceId_ = serviceId_;
         } else {
-          result.l2_ = l2Builder_.build();
+          result.serviceId_ = serviceIdBuilder_.build();
         }
-        if (l3Builder_ == null) {
-          result.l3_ = l3_;
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.pathHopsEndpointIds_ = pathHopsEndpointIds_;
         } else {
-          result.l3_ = l3Builder_.build();
+          result.pathHopsEndpointIds_ = pathHopsEndpointIdsBuilder_.build();
         }
-        if (l4Builder_ == null) {
-          result.l4_ = l4_;
+        if (subServiceIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0)) {
+            subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.subServiceIds_ = subServiceIds_;
         } else {
-          result.l4_ = l4Builder_.build();
+          result.subServiceIds_ = subServiceIdsBuilder_.build();
+        }
+        if (settingsBuilder_ == null) {
+          result.settings_ = settings_;
+        } else {
+          result.settings_ = settingsBuilder_.build();
         }
         onBuilt();
         return result;
@@ -45661,27 +50070,76 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionSettings) {
-          return mergeFrom((context.ContextOuterClass.ConnectionSettings)other);
+        if (other instanceof context.ContextOuterClass.Connection) {
+          return mergeFrom((context.ContextOuterClass.Connection)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings other) {
-        if (other == context.ContextOuterClass.ConnectionSettings.getDefaultInstance()) return this;
-        if (other.hasL0()) {
-          mergeL0(other.getL0());
+      public Builder mergeFrom(context.ContextOuterClass.Connection other) {
+        if (other == context.ContextOuterClass.Connection.getDefaultInstance()) return this;
+        if (other.hasConnectionId()) {
+          mergeConnectionId(other.getConnectionId());
         }
-        if (other.hasL2()) {
-          mergeL2(other.getL2());
+        if (other.hasServiceId()) {
+          mergeServiceId(other.getServiceId());
+        }
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          if (!other.pathHopsEndpointIds_.isEmpty()) {
+            if (pathHopsEndpointIds_.isEmpty()) {
+              pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensurePathHopsEndpointIdsIsMutable();
+              pathHopsEndpointIds_.addAll(other.pathHopsEndpointIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.pathHopsEndpointIds_.isEmpty()) {
+            if (pathHopsEndpointIdsBuilder_.isEmpty()) {
+              pathHopsEndpointIdsBuilder_.dispose();
+              pathHopsEndpointIdsBuilder_ = null;
+              pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              pathHopsEndpointIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getPathHopsEndpointIdsFieldBuilder() : null;
+            } else {
+              pathHopsEndpointIdsBuilder_.addAllMessages(other.pathHopsEndpointIds_);
+            }
+          }
         }
-        if (other.hasL3()) {
-          mergeL3(other.getL3());
+        if (subServiceIdsBuilder_ == null) {
+          if (!other.subServiceIds_.isEmpty()) {
+            if (subServiceIds_.isEmpty()) {
+              subServiceIds_ = other.subServiceIds_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureSubServiceIdsIsMutable();
+              subServiceIds_.addAll(other.subServiceIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.subServiceIds_.isEmpty()) {
+            if (subServiceIdsBuilder_.isEmpty()) {
+              subServiceIdsBuilder_.dispose();
+              subServiceIdsBuilder_ = null;
+              subServiceIds_ = other.subServiceIds_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              subServiceIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getSubServiceIdsFieldBuilder() : null;
+            } else {
+              subServiceIdsBuilder_.addAllMessages(other.subServiceIds_);
+            }
+          }
         }
-        if (other.hasL4()) {
-          mergeL4(other.getL4());
+        if (other.hasSettings()) {
+          mergeSettings(other.getSettings());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -45698,11 +50156,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionSettings parsedMessage = null;
+        context.ContextOuterClass.Connection parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionSettings) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Connection) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -45711,481 +50169,843 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
 
-      private context.ContextOuterClass.ConnectionSettings_L0 l0_;
+      private context.ContextOuterClass.ConnectionId connectionId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder> l0Builder_;
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdBuilder_;
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       * @return Whether the l0 field is set.
+       * <code>.context.ConnectionId connection_id = 1;</code>
+       * @return Whether the connectionId field is set.
        */
-      public boolean hasL0() {
-        return l0Builder_ != null || l0_ != null;
+      public boolean hasConnectionId() {
+        return connectionIdBuilder_ != null || connectionId_ != null;
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       * @return The l0.
+       * <code>.context.ConnectionId connection_id = 1;</code>
+       * @return The connectionId.
        */
-      public context.ContextOuterClass.ConnectionSettings_L0 getL0() {
-        if (l0Builder_ == null) {
-          return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+      public context.ContextOuterClass.ConnectionId getConnectionId() {
+        if (connectionIdBuilder_ == null) {
+          return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
         } else {
-          return l0Builder_.getMessage();
+          return connectionIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>.context.ConnectionId connection_id = 1;</code>
        */
-      public Builder setL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
-        if (l0Builder_ == null) {
+      public Builder setConnectionId(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          l0_ = value;
+          connectionId_ = value;
           onChanged();
         } else {
-          l0Builder_.setMessage(value);
+          connectionIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>.context.ConnectionId connection_id = 1;</code>
        */
-      public Builder setL0(
-          context.ContextOuterClass.ConnectionSettings_L0.Builder builderForValue) {
-        if (l0Builder_ == null) {
-          l0_ = builderForValue.build();
+      public Builder setConnectionId(
+          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = builderForValue.build();
           onChanged();
         } else {
-          l0Builder_.setMessage(builderForValue.build());
+          connectionIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>.context.ConnectionId connection_id = 1;</code>
        */
-      public Builder mergeL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
-        if (l0Builder_ == null) {
-          if (l0_ != null) {
-            l0_ =
-              context.ContextOuterClass.ConnectionSettings_L0.newBuilder(l0_).mergeFrom(value).buildPartial();
+      public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdBuilder_ == null) {
+          if (connectionId_ != null) {
+            connectionId_ =
+              context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
           } else {
-            l0_ = value;
+            connectionId_ = value;
           }
           onChanged();
         } else {
-          l0Builder_.mergeFrom(value);
+          connectionIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>.context.ConnectionId connection_id = 1;</code>
        */
-      public Builder clearL0() {
-        if (l0Builder_ == null) {
-          l0_ = null;
+      public Builder clearConnectionId() {
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = null;
           onChanged();
         } else {
-          l0_ = null;
-          l0Builder_ = null;
+          connectionId_ = null;
+          connectionIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>.context.ConnectionId connection_id = 1;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L0.Builder getL0Builder() {
+      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
         
         onChanged();
-        return getL0FieldBuilder().getBuilder();
+        return getConnectionIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
+        if (connectionIdBuilder_ != null) {
+          return connectionIdBuilder_.getMessageOrBuilder();
+        } else {
+          return connectionId_ == null ?
+              context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+        }
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> 
+          getConnectionIdFieldBuilder() {
+        if (connectionIdBuilder_ == null) {
+          connectionIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder>(
+                  getConnectionId(),
+                  getParentForChildren(),
+                  isClean());
+          connectionId_ = null;
+        }
+        return connectionIdBuilder_;
+      }
+
+      private context.ContextOuterClass.ServiceId serviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       * @return Whether the serviceId field is set.
+       */
+      public boolean hasServiceId() {
+        return serviceIdBuilder_ != null || serviceId_ != null;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       * @return The serviceId.
+       */
+      public context.ContextOuterClass.ServiceId getServiceId() {
+        if (serviceIdBuilder_ == null) {
+          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        } else {
+          return serviceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          serviceId_ = value;
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      public Builder setServiceId(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = builderForValue.build();
+          onChanged();
+        } else {
+          serviceIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
+        if (serviceIdBuilder_ == null) {
+          if (serviceId_ != null) {
+            serviceId_ =
+              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
+          } else {
+            serviceId_ = value;
+          }
+          onChanged();
+        } else {
+          serviceIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      public Builder clearServiceId() {
+        if (serviceIdBuilder_ == null) {
+          serviceId_ = null;
+          onChanged();
+        } else {
+          serviceId_ = null;
+          serviceIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
+        
+        onChanged();
+        return getServiceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
+        if (serviceIdBuilder_ != null) {
+          return serviceIdBuilder_.getMessageOrBuilder();
+        } else {
+          return serviceId_ == null ?
+              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
+        }
+      }
+      /**
+       * <code>.context.ServiceId service_id = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getServiceIdFieldBuilder() {
+        if (serviceIdBuilder_ == null) {
+          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  getServiceId(),
+                  getParentForChildren(),
+                  isClean());
+          serviceId_ = null;
+        }
+        return serviceIdBuilder_;
+      }
+
+      private java.util.List<context.ContextOuterClass.EndPointId> pathHopsEndpointIds_ =
+        java.util.Collections.emptyList();
+      private void ensurePathHopsEndpointIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          pathHopsEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(pathHopsEndpointIds_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> pathHopsEndpointIdsBuilder_;
+
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId> getPathHopsEndpointIdsList() {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+        } else {
+          return pathHopsEndpointIdsBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public int getPathHopsEndpointIdsCount() {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          return pathHopsEndpointIds_.size();
+        } else {
+          return pathHopsEndpointIdsBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId getPathHopsEndpointIds(int index) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          return pathHopsEndpointIds_.get(index);
+        } else {
+          return pathHopsEndpointIdsBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder setPathHopsEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.set(index, value);
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder setPathHopsEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder addPathHopsEndpointIds(context.ContextOuterClass.EndPointId value) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.add(value);
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder addPathHopsEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.add(index, value);
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder addPathHopsEndpointIds(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder addPathHopsEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder addAllPathHopsEndpointIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          ensurePathHopsEndpointIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, pathHopsEndpointIds_);
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder clearPathHopsEndpointIds() {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          pathHopsEndpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public Builder removePathHopsEndpointIds(int index) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          ensurePathHopsEndpointIdsIsMutable();
+          pathHopsEndpointIds_.remove(index);
+          onChanged();
+        } else {
+          pathHopsEndpointIdsBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder getPathHopsEndpointIdsBuilder(
+          int index) {
+        return getPathHopsEndpointIdsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointIdOrBuilder getPathHopsEndpointIdsOrBuilder(
+          int index) {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          return pathHopsEndpointIds_.get(index);  } else {
+          return pathHopsEndpointIdsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+           getPathHopsEndpointIdsOrBuilderList() {
+        if (pathHopsEndpointIdsBuilder_ != null) {
+          return pathHopsEndpointIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addPathHopsEndpointIdsBuilder() {
+        return getPathHopsEndpointIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addPathHopsEndpointIdsBuilder(
+          int index) {
+        return getPathHopsEndpointIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
+           getPathHopsEndpointIdsBuilderList() {
+        return getPathHopsEndpointIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getPathHopsEndpointIdsFieldBuilder() {
+        if (pathHopsEndpointIdsBuilder_ == null) {
+          pathHopsEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  pathHopsEndpointIds_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          pathHopsEndpointIds_ = null;
+        }
+        return pathHopsEndpointIdsBuilder_;
+      }
+
+      private java.util.List<context.ContextOuterClass.ServiceId> subServiceIds_ =
+        java.util.Collections.emptyList();
+      private void ensureSubServiceIdsIsMutable() {
+        if (!((bitField0_ & 0x00000002) != 0)) {
+          subServiceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>(subServiceIds_);
+          bitField0_ |= 0x00000002;
+         }
       }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> subServiceIdsBuilder_;
+
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
-        if (l0Builder_ != null) {
-          return l0Builder_.getMessageOrBuilder();
+      public java.util.List<context.ContextOuterClass.ServiceId> getSubServiceIdsList() {
+        if (subServiceIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(subServiceIds_);
         } else {
-          return l0_ == null ?
-              context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
+          return subServiceIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder> 
-          getL0FieldBuilder() {
-        if (l0Builder_ == null) {
-          l0Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder>(
-                  getL0(),
-                  getParentForChildren(),
-                  isClean());
-          l0_ = null;
+      public int getSubServiceIdsCount() {
+        if (subServiceIdsBuilder_ == null) {
+          return subServiceIds_.size();
+        } else {
+          return subServiceIdsBuilder_.getCount();
         }
-        return l0Builder_;
-      }
-
-      private context.ContextOuterClass.ConnectionSettings_L2 l2_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder> l2Builder_;
-      /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-       * @return Whether the l2 field is set.
-       */
-      public boolean hasL2() {
-        return l2Builder_ != null || l2_ != null;
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-       * @return The l2.
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L2 getL2() {
-        if (l2Builder_ == null) {
-          return l2_ == null ? context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+      public context.ContextOuterClass.ServiceId getSubServiceIds(int index) {
+        if (subServiceIdsBuilder_ == null) {
+          return subServiceIds_.get(index);
         } else {
-          return l2Builder_.getMessage();
+          return subServiceIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder setL2(context.ContextOuterClass.ConnectionSettings_L2 value) {
-        if (l2Builder_ == null) {
+      public Builder setSubServiceIds(
+          int index, context.ContextOuterClass.ServiceId value) {
+        if (subServiceIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          l2_ = value;
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.set(index, value);
           onChanged();
         } else {
-          l2Builder_.setMessage(value);
+          subServiceIdsBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder setL2(
-          context.ContextOuterClass.ConnectionSettings_L2.Builder builderForValue) {
-        if (l2Builder_ == null) {
-          l2_ = builderForValue.build();
+      public Builder setSubServiceIds(
+          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (subServiceIdsBuilder_ == null) {
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          l2Builder_.setMessage(builderForValue.build());
+          subServiceIdsBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder mergeL2(context.ContextOuterClass.ConnectionSettings_L2 value) {
-        if (l2Builder_ == null) {
-          if (l2_ != null) {
-            l2_ =
-              context.ContextOuterClass.ConnectionSettings_L2.newBuilder(l2_).mergeFrom(value).buildPartial();
-          } else {
-            l2_ = value;
+      public Builder addSubServiceIds(context.ContextOuterClass.ServiceId value) {
+        if (subServiceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.add(value);
           onChanged();
         } else {
-          l2Builder_.mergeFrom(value);
+          subServiceIdsBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder clearL2() {
-        if (l2Builder_ == null) {
-          l2_ = null;
+      public Builder addSubServiceIds(
+          int index, context.ContextOuterClass.ServiceId value) {
+        if (subServiceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.add(index, value);
           onChanged();
         } else {
-          l2_ = null;
-          l2Builder_ = null;
+          subServiceIdsBuilder_.addMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-       */
-      public context.ContextOuterClass.ConnectionSettings_L2.Builder getL2Builder() {
-        
-        onChanged();
-        return getL2FieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L2OrBuilder getL2OrBuilder() {
-        if (l2Builder_ != null) {
-          return l2Builder_.getMessageOrBuilder();
+      public Builder addSubServiceIds(
+          context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (subServiceIdsBuilder_ == null) {
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.add(builderForValue.build());
+          onChanged();
         } else {
-          return l2_ == null ?
-              context.ContextOuterClass.ConnectionSettings_L2.getDefaultInstance() : l2_;
+          subServiceIdsBuilder_.addMessage(builderForValue.build());
         }
+        return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder> 
-          getL2FieldBuilder() {
-        if (l2Builder_ == null) {
-          l2Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder>(
-                  getL2(),
-                  getParentForChildren(),
-                  isClean());
-          l2_ = null;
+      public Builder addSubServiceIds(
+          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
+        if (subServiceIdsBuilder_ == null) {
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          subServiceIdsBuilder_.addMessage(index, builderForValue.build());
         }
-        return l2Builder_;
-      }
-
-      private context.ContextOuterClass.ConnectionSettings_L3 l3_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder> l3Builder_;
-      /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
-       * @return Whether the l3 field is set.
-       */
-      public boolean hasL3() {
-        return l3Builder_ != null || l3_ != null;
+        return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
-       * @return The l3.
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L3 getL3() {
-        if (l3Builder_ == null) {
-          return l3_ == null ? context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
+      public Builder addAllSubServiceIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.ServiceId> values) {
+        if (subServiceIdsBuilder_ == null) {
+          ensureSubServiceIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, subServiceIds_);
+          onChanged();
         } else {
-          return l3Builder_.getMessage();
+          subServiceIdsBuilder_.addAllMessages(values);
         }
+        return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder setL3(context.ContextOuterClass.ConnectionSettings_L3 value) {
-        if (l3Builder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          l3_ = value;
+      public Builder clearSubServiceIds() {
+        if (subServiceIdsBuilder_ == null) {
+          subServiceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
           onChanged();
         } else {
-          l3Builder_.setMessage(value);
+          subServiceIdsBuilder_.clear();
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder setL3(
-          context.ContextOuterClass.ConnectionSettings_L3.Builder builderForValue) {
-        if (l3Builder_ == null) {
-          l3_ = builderForValue.build();
+      public Builder removeSubServiceIds(int index) {
+        if (subServiceIdsBuilder_ == null) {
+          ensureSubServiceIdsIsMutable();
+          subServiceIds_.remove(index);
           onChanged();
         } else {
-          l3Builder_.setMessage(builderForValue.build());
+          subServiceIdsBuilder_.remove(index);
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder mergeL3(context.ContextOuterClass.ConnectionSettings_L3 value) {
-        if (l3Builder_ == null) {
-          if (l3_ != null) {
-            l3_ =
-              context.ContextOuterClass.ConnectionSettings_L3.newBuilder(l3_).mergeFrom(value).buildPartial();
-          } else {
-            l3_ = value;
-          }
-          onChanged();
-        } else {
-          l3Builder_.mergeFrom(value);
+      public context.ContextOuterClass.ServiceId.Builder getSubServiceIdsBuilder(
+          int index) {
+        return getSubServiceIdsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       */
+      public context.ContextOuterClass.ServiceIdOrBuilder getSubServiceIdsOrBuilder(
+          int index) {
+        if (subServiceIdsBuilder_ == null) {
+          return subServiceIds_.get(index);  } else {
+          return subServiceIdsBuilder_.getMessageOrBuilder(index);
         }
-
-        return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public Builder clearL3() {
-        if (l3Builder_ == null) {
-          l3_ = null;
-          onChanged();
+      public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
+           getSubServiceIdsOrBuilderList() {
+        if (subServiceIdsBuilder_ != null) {
+          return subServiceIdsBuilder_.getMessageOrBuilderList();
         } else {
-          l3_ = null;
-          l3Builder_ = null;
+          return java.util.Collections.unmodifiableList(subServiceIds_);
         }
-
-        return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L3.Builder getL3Builder() {
-        
-        onChanged();
-        return getL3FieldBuilder().getBuilder();
+      public context.ContextOuterClass.ServiceId.Builder addSubServiceIdsBuilder() {
+        return getSubServiceIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.ServiceId.getDefaultInstance());
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L3OrBuilder getL3OrBuilder() {
-        if (l3Builder_ != null) {
-          return l3Builder_.getMessageOrBuilder();
-        } else {
-          return l3_ == null ?
-              context.ContextOuterClass.ConnectionSettings_L3.getDefaultInstance() : l3_;
-        }
+      public context.ContextOuterClass.ServiceId.Builder addSubServiceIdsBuilder(
+          int index) {
+        return getSubServiceIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.ServiceId.getDefaultInstance());
       }
       /**
-       * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
+       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder> 
-          getL3FieldBuilder() {
-        if (l3Builder_ == null) {
-          l3Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder>(
-                  getL3(),
+      public java.util.List<context.ContextOuterClass.ServiceId.Builder> 
+           getSubServiceIdsBuilderList() {
+        return getSubServiceIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
+          getSubServiceIdsFieldBuilder() {
+        if (subServiceIdsBuilder_ == null) {
+          subServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
+                  subServiceIds_,
+                  ((bitField0_ & 0x00000002) != 0),
                   getParentForChildren(),
                   isClean());
-          l3_ = null;
+          subServiceIds_ = null;
         }
-        return l3Builder_;
+        return subServiceIdsBuilder_;
       }
 
-      private context.ContextOuterClass.ConnectionSettings_L4 l4_;
+      private context.ContextOuterClass.ConnectionSettings settings_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder> l4Builder_;
+          context.ContextOuterClass.ConnectionSettings, context.ContextOuterClass.ConnectionSettings.Builder, context.ContextOuterClass.ConnectionSettingsOrBuilder> settingsBuilder_;
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
-       * @return Whether the l4 field is set.
+       * <code>.context.ConnectionSettings settings = 5;</code>
+       * @return Whether the settings field is set.
        */
-      public boolean hasL4() {
-        return l4Builder_ != null || l4_ != null;
+      public boolean hasSettings() {
+        return settingsBuilder_ != null || settings_ != null;
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
-       * @return The l4.
+       * <code>.context.ConnectionSettings settings = 5;</code>
+       * @return The settings.
        */
-      public context.ContextOuterClass.ConnectionSettings_L4 getL4() {
-        if (l4Builder_ == null) {
-          return l4_ == null ? context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+      public context.ContextOuterClass.ConnectionSettings getSettings() {
+        if (settingsBuilder_ == null) {
+          return settings_ == null ? context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
         } else {
-          return l4Builder_.getMessage();
+          return settingsBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
-      public Builder setL4(context.ContextOuterClass.ConnectionSettings_L4 value) {
-        if (l4Builder_ == null) {
+      public Builder setSettings(context.ContextOuterClass.ConnectionSettings value) {
+        if (settingsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          l4_ = value;
+          settings_ = value;
           onChanged();
         } else {
-          l4Builder_.setMessage(value);
+          settingsBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
-      public Builder setL4(
-          context.ContextOuterClass.ConnectionSettings_L4.Builder builderForValue) {
-        if (l4Builder_ == null) {
-          l4_ = builderForValue.build();
+      public Builder setSettings(
+          context.ContextOuterClass.ConnectionSettings.Builder builderForValue) {
+        if (settingsBuilder_ == null) {
+          settings_ = builderForValue.build();
           onChanged();
         } else {
-          l4Builder_.setMessage(builderForValue.build());
+          settingsBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
-      public Builder mergeL4(context.ContextOuterClass.ConnectionSettings_L4 value) {
-        if (l4Builder_ == null) {
-          if (l4_ != null) {
-            l4_ =
-              context.ContextOuterClass.ConnectionSettings_L4.newBuilder(l4_).mergeFrom(value).buildPartial();
+      public Builder mergeSettings(context.ContextOuterClass.ConnectionSettings value) {
+        if (settingsBuilder_ == null) {
+          if (settings_ != null) {
+            settings_ =
+              context.ContextOuterClass.ConnectionSettings.newBuilder(settings_).mergeFrom(value).buildPartial();
           } else {
-            l4_ = value;
+            settings_ = value;
           }
           onChanged();
         } else {
-          l4Builder_.mergeFrom(value);
+          settingsBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
-      public Builder clearL4() {
-        if (l4Builder_ == null) {
-          l4_ = null;
+      public Builder clearSettings() {
+        if (settingsBuilder_ == null) {
+          settings_ = null;
           onChanged();
         } else {
-          l4_ = null;
-          l4Builder_ = null;
+          settings_ = null;
+          settingsBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L4.Builder getL4Builder() {
+      public context.ContextOuterClass.ConnectionSettings.Builder getSettingsBuilder() {
         
         onChanged();
-        return getL4FieldBuilder().getBuilder();
+        return getSettingsFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
-      public context.ContextOuterClass.ConnectionSettings_L4OrBuilder getL4OrBuilder() {
-        if (l4Builder_ != null) {
-          return l4Builder_.getMessageOrBuilder();
+      public context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder() {
+        if (settingsBuilder_ != null) {
+          return settingsBuilder_.getMessageOrBuilder();
         } else {
-          return l4_ == null ?
-              context.ContextOuterClass.ConnectionSettings_L4.getDefaultInstance() : l4_;
+          return settings_ == null ?
+              context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
         }
       }
       /**
-       * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
+       * <code>.context.ConnectionSettings settings = 5;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder> 
-          getL4FieldBuilder() {
-        if (l4Builder_ == null) {
-          l4Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder>(
-                  getL4(),
+          context.ContextOuterClass.ConnectionSettings, context.ContextOuterClass.ConnectionSettings.Builder, context.ContextOuterClass.ConnectionSettingsOrBuilder> 
+          getSettingsFieldBuilder() {
+        if (settingsBuilder_ == null) {
+          settingsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionSettings, context.ContextOuterClass.ConnectionSettings.Builder, context.ContextOuterClass.ConnectionSettingsOrBuilder>(
+                  getSettings(),
                   getParentForChildren(),
                   isClean());
-          l4_ = null;
+          settings_ = null;
         }
-        return l4Builder_;
+        return settingsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -46200,165 +51020,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionSettings)
+      // @@protoc_insertion_point(builder_scope:context.Connection)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionSettings)
-    private static final context.ContextOuterClass.ConnectionSettings DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Connection)
+    private static final context.ContextOuterClass.Connection DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionSettings();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Connection();
     }
 
-    public static context.ContextOuterClass.ConnectionSettings getDefaultInstance() {
+    public static context.ContextOuterClass.Connection getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionSettings>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionSettings>() {
+    private static final com.google.protobuf.Parser<Connection>
+        PARSER = new com.google.protobuf.AbstractParser<Connection>() {
       @java.lang.Override
-      public ConnectionSettings parsePartialFrom(
+      public Connection parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionSettings(input, extensionRegistry);
+        return new Connection(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionSettings> parser() {
+    public static com.google.protobuf.Parser<Connection> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionSettings> getParserForType() {
+    public com.google.protobuf.Parser<Connection> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings getDefaultInstanceForType() {
+    public context.ContextOuterClass.Connection getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Connection)
+  public interface ConnectionIdListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.ConnectionId connection_id = 1;</code>
-     * @return Whether the connectionId field is set.
-     */
-    boolean hasConnectionId();
-    /**
-     * <code>.context.ConnectionId connection_id = 1;</code>
-     * @return The connectionId.
-     */
-    context.ContextOuterClass.ConnectionId getConnectionId();
-    /**
-     * <code>.context.ConnectionId connection_id = 1;</code>
-     */
-    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder();
-
-    /**
-     * <code>.context.ServiceId service_id = 2;</code>
-     * @return Whether the serviceId field is set.
-     */
-    boolean hasServiceId();
-    /**
-     * <code>.context.ServiceId service_id = 2;</code>
-     * @return The serviceId.
-     */
-    context.ContextOuterClass.ServiceId getServiceId();
-    /**
-     * <code>.context.ServiceId service_id = 2;</code>
-     */
-    context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder();
-
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    java.util.List<context.ContextOuterClass.EndPointId> 
-        getPathHopsEndpointIdsList();
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    context.ContextOuterClass.EndPointId getPathHopsEndpointIds(int index);
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    int getPathHopsEndpointIdsCount();
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getPathHopsEndpointIdsOrBuilderList();
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    context.ContextOuterClass.EndPointIdOrBuilder getPathHopsEndpointIdsOrBuilder(
-        int index);
-
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
-     */
-    java.util.List<context.ContextOuterClass.ServiceId> 
-        getSubServiceIdsList();
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
-     */
-    context.ContextOuterClass.ServiceId getSubServiceIds(int index);
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
-     */
-    int getSubServiceIdsCount();
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
-    java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-        getSubServiceIdsOrBuilderList();
+    java.util.List<context.ContextOuterClass.ConnectionId> 
+        getConnectionIdsList();
     /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
-    context.ContextOuterClass.ServiceIdOrBuilder getSubServiceIdsOrBuilder(
-        int index);
-
+    context.ContextOuterClass.ConnectionId getConnectionIds(int index);
     /**
-     * <code>.context.ConnectionSettings settings = 5;</code>
-     * @return Whether the settings field is set.
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
-    boolean hasSettings();
+    int getConnectionIdsCount();
     /**
-     * <code>.context.ConnectionSettings settings = 5;</code>
-     * @return The settings.
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
-    context.ContextOuterClass.ConnectionSettings getSettings();
+    java.util.List<? extends context.ContextOuterClass.ConnectionIdOrBuilder> 
+        getConnectionIdsOrBuilderList();
     /**
-     * <code>.context.ConnectionSettings settings = 5;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
-    context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder();
+    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdsOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.Connection}
+   * Protobuf type {@code context.ConnectionIdList}
    */
-  public static final class Connection extends
+  public static final class ConnectionIdList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Connection)
-      ConnectionOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
+      ConnectionIdListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Connection.newBuilder() to construct.
-    private Connection(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionIdList.newBuilder() to construct.
+    private ConnectionIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Connection() {
-      pathHopsEndpointIds_ = java.util.Collections.emptyList();
-      subServiceIds_ = java.util.Collections.emptyList();
+    private ConnectionIdList() {
+      connectionIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Connection();
+      return new ConnectionIdList();
     }
 
     @java.lang.Override
@@ -46366,7 +51116,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Connection(
+    private ConnectionIdList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -46386,60 +51136,12 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
-              if (connectionId_ != null) {
-                subBuilder = connectionId_.toBuilder();
-              }
-              connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(connectionId_);
-                connectionId_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 18: {
-              context.ContextOuterClass.ServiceId.Builder subBuilder = null;
-              if (serviceId_ != null) {
-                subBuilder = serviceId_.toBuilder();
-              }
-              serviceId_ = input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(serviceId_);
-                serviceId_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 26: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                pathHopsEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
+                connectionIds_ = new java.util.ArrayList<context.ContextOuterClass.ConnectionId>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              pathHopsEndpointIds_.add(
-                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
-              break;
-            }
-            case 34: {
-              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-                subServiceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>();
-                mutable_bitField0_ |= 0x00000002;
-              }
-              subServiceIds_.add(
-                  input.readMessage(context.ContextOuterClass.ServiceId.parser(), extensionRegistry));
-              break;
-            }
-            case 42: {
-              context.ContextOuterClass.ConnectionSettings.Builder subBuilder = null;
-              if (settings_ != null) {
-                subBuilder = settings_.toBuilder();
-              }
-              settings_ = input.readMessage(context.ContextOuterClass.ConnectionSettings.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(settings_);
-                settings_ = subBuilder.buildPartial();
-              }
-
+              connectionIds_.add(
+                  input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -46458,10 +51160,7 @@ public final class ContextOuterClass {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
-        }
-        if (((mutable_bitField0_ & 0x00000002) != 0)) {
-          subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
+          connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -46469,173 +51168,55 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Connection_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Connection_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionIdList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Connection.class, context.ContextOuterClass.Connection.Builder.class);
-    }
-
-    public static final int CONNECTION_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.ConnectionId connectionId_;
-    /**
-     * <code>.context.ConnectionId connection_id = 1;</code>
-     * @return Whether the connectionId field is set.
-     */
-    @java.lang.Override
-    public boolean hasConnectionId() {
-      return connectionId_ != null;
-    }
-    /**
-     * <code>.context.ConnectionId connection_id = 1;</code>
-     * @return The connectionId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConnectionId getConnectionId() {
-      return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
-    }
-    /**
-     * <code>.context.ConnectionId connection_id = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-      return getConnectionId();
-    }
-
-    public static final int SERVICE_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.ServiceId serviceId_;
-    /**
-     * <code>.context.ServiceId service_id = 2;</code>
-     * @return Whether the serviceId field is set.
-     */
-    @java.lang.Override
-    public boolean hasServiceId() {
-      return serviceId_ != null;
-    }
-    /**
-     * <code>.context.ServiceId service_id = 2;</code>
-     * @return The serviceId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ServiceId getServiceId() {
-      return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
-    }
-    /**
-     * <code>.context.ServiceId service_id = 2;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-      return getServiceId();
-    }
-
-    public static final int PATH_HOPS_ENDPOINT_IDS_FIELD_NUMBER = 3;
-    private java.util.List<context.ContextOuterClass.EndPointId> pathHopsEndpointIds_;
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public java.util.List<context.ContextOuterClass.EndPointId> getPathHopsEndpointIdsList() {
-      return pathHopsEndpointIds_;
-    }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getPathHopsEndpointIdsOrBuilderList() {
-      return pathHopsEndpointIds_;
-    }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public int getPathHopsEndpointIdsCount() {
-      return pathHopsEndpointIds_.size();
-    }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointId getPathHopsEndpointIds(int index) {
-      return pathHopsEndpointIds_.get(index);
-    }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getPathHopsEndpointIdsOrBuilder(
-        int index) {
-      return pathHopsEndpointIds_.get(index);
+              context.ContextOuterClass.ConnectionIdList.class, context.ContextOuterClass.ConnectionIdList.Builder.class);
     }
 
-    public static final int SUB_SERVICE_IDS_FIELD_NUMBER = 4;
-    private java.util.List<context.ContextOuterClass.ServiceId> subServiceIds_;
+    public static final int CONNECTION_IDS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.ConnectionId> connectionIds_;
     /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.ServiceId> getSubServiceIdsList() {
-      return subServiceIds_;
+    public java.util.List<context.ContextOuterClass.ConnectionId> getConnectionIdsList() {
+      return connectionIds_;
     }
     /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-        getSubServiceIdsOrBuilderList() {
-      return subServiceIds_;
+    public java.util.List<? extends context.ContextOuterClass.ConnectionIdOrBuilder> 
+        getConnectionIdsOrBuilderList() {
+      return connectionIds_;
     }
     /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
     @java.lang.Override
-    public int getSubServiceIdsCount() {
-      return subServiceIds_.size();
+    public int getConnectionIdsCount() {
+      return connectionIds_.size();
     }
     /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceId getSubServiceIds(int index) {
-      return subServiceIds_.get(index);
+    public context.ContextOuterClass.ConnectionId getConnectionIds(int index) {
+      return connectionIds_.get(index);
     }
     /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.ServiceIdOrBuilder getSubServiceIdsOrBuilder(
+    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdsOrBuilder(
         int index) {
-      return subServiceIds_.get(index);
-    }
-
-    public static final int SETTINGS_FIELD_NUMBER = 5;
-    private context.ContextOuterClass.ConnectionSettings settings_;
-    /**
-     * <code>.context.ConnectionSettings settings = 5;</code>
-     * @return Whether the settings field is set.
-     */
-    @java.lang.Override
-    public boolean hasSettings() {
-      return settings_ != null;
-    }
-    /**
-     * <code>.context.ConnectionSettings settings = 5;</code>
-     * @return The settings.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettings getSettings() {
-      return settings_ == null ? context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
-    }
-    /**
-     * <code>.context.ConnectionSettings settings = 5;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder() {
-      return getSettings();
+      return connectionIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -46652,20 +51233,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (connectionId_ != null) {
-        output.writeMessage(1, getConnectionId());
-      }
-      if (serviceId_ != null) {
-        output.writeMessage(2, getServiceId());
-      }
-      for (int i = 0; i < pathHopsEndpointIds_.size(); i++) {
-        output.writeMessage(3, pathHopsEndpointIds_.get(i));
-      }
-      for (int i = 0; i < subServiceIds_.size(); i++) {
-        output.writeMessage(4, subServiceIds_.get(i));
-      }
-      if (settings_ != null) {
-        output.writeMessage(5, getSettings());
+      for (int i = 0; i < connectionIds_.size(); i++) {
+        output.writeMessage(1, connectionIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -46676,25 +51245,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (connectionId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getConnectionId());
-      }
-      if (serviceId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getServiceId());
-      }
-      for (int i = 0; i < pathHopsEndpointIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, pathHopsEndpointIds_.get(i));
-      }
-      for (int i = 0; i < subServiceIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, subServiceIds_.get(i));
-      }
-      if (settings_ != null) {
+      for (int i = 0; i < connectionIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, getSettings());
+          .computeMessageSize(1, connectionIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -46706,30 +51259,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Connection)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionIdList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Connection other = (context.ContextOuterClass.Connection) obj;
+      context.ContextOuterClass.ConnectionIdList other = (context.ContextOuterClass.ConnectionIdList) obj;
 
-      if (hasConnectionId() != other.hasConnectionId()) return false;
-      if (hasConnectionId()) {
-        if (!getConnectionId()
-            .equals(other.getConnectionId())) return false;
-      }
-      if (hasServiceId() != other.hasServiceId()) return false;
-      if (hasServiceId()) {
-        if (!getServiceId()
-            .equals(other.getServiceId())) return false;
-      }
-      if (!getPathHopsEndpointIdsList()
-          .equals(other.getPathHopsEndpointIdsList())) return false;
-      if (!getSubServiceIdsList()
-          .equals(other.getSubServiceIdsList())) return false;
-      if (hasSettings() != other.hasSettings()) return false;
-      if (hasSettings()) {
-        if (!getSettings()
-            .equals(other.getSettings())) return false;
-      }
+      if (!getConnectionIdsList()
+          .equals(other.getConnectionIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -46741,94 +51277,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasConnectionId()) {
-        hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getConnectionId().hashCode();
-      }
-      if (hasServiceId()) {
-        hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getServiceId().hashCode();
-      }
-      if (getPathHopsEndpointIdsCount() > 0) {
-        hash = (37 * hash) + PATH_HOPS_ENDPOINT_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getPathHopsEndpointIdsList().hashCode();
-      }
-      if (getSubServiceIdsCount() > 0) {
-        hash = (37 * hash) + SUB_SERVICE_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getSubServiceIdsList().hashCode();
-      }
-      if (hasSettings()) {
-        hash = (37 * hash) + SETTINGS_FIELD_NUMBER;
-        hash = (53 * hash) + getSettings().hashCode();
+      if (getConnectionIdsCount() > 0) {
+        hash = (37 * hash) + CONNECTION_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getConnectionIdsList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Connection parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Connection parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Connection parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionIdList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Connection parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Connection parseFrom(
+    public static context.ContextOuterClass.ConnectionIdList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -46841,7 +51361,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Connection prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionIdList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -46857,26 +51377,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Connection}
+     * Protobuf type {@code context.ConnectionIdList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Connection)
-        context.ContextOuterClass.ConnectionOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
+        context.ContextOuterClass.ConnectionIdListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Connection_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Connection_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionIdList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Connection.class, context.ContextOuterClass.Connection.Builder.class);
+                context.ContextOuterClass.ConnectionIdList.class, context.ContextOuterClass.ConnectionIdList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Connection.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionIdList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -46889,42 +51409,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getPathHopsEndpointIdsFieldBuilder();
-          getSubServiceIdsFieldBuilder();
+          getConnectionIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (connectionIdBuilder_ == null) {
-          connectionId_ = null;
-        } else {
-          connectionId_ = null;
-          connectionIdBuilder_ = null;
-        }
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
-        } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
-        }
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          pathHopsEndpointIds_ = java.util.Collections.emptyList();
+        if (connectionIdsBuilder_ == null) {
+          connectionIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          pathHopsEndpointIdsBuilder_.clear();
-        }
-        if (subServiceIdsBuilder_ == null) {
-          subServiceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-        } else {
-          subServiceIdsBuilder_.clear();
-        }
-        if (settingsBuilder_ == null) {
-          settings_ = null;
-        } else {
-          settings_ = null;
-          settingsBuilder_ = null;
+          connectionIdsBuilder_.clear();
         }
         return this;
       }
@@ -46932,17 +51427,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Connection_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Connection getDefaultInstanceForType() {
-        return context.ContextOuterClass.Connection.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionIdList getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionIdList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Connection build() {
-        context.ContextOuterClass.Connection result = buildPartial();
+      public context.ContextOuterClass.ConnectionIdList build() {
+        context.ContextOuterClass.ConnectionIdList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -46950,41 +51445,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Connection buildPartial() {
-        context.ContextOuterClass.Connection result = new context.ContextOuterClass.Connection(this);
+      public context.ContextOuterClass.ConnectionIdList buildPartial() {
+        context.ContextOuterClass.ConnectionIdList result = new context.ContextOuterClass.ConnectionIdList(this);
         int from_bitField0_ = bitField0_;
-        if (connectionIdBuilder_ == null) {
-          result.connectionId_ = connectionId_;
-        } else {
-          result.connectionId_ = connectionIdBuilder_.build();
-        }
-        if (serviceIdBuilder_ == null) {
-          result.serviceId_ = serviceId_;
-        } else {
-          result.serviceId_ = serviceIdBuilder_.build();
-        }
-        if (pathHopsEndpointIdsBuilder_ == null) {
+        if (connectionIdsBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            pathHopsEndpointIds_ = java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+            connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.pathHopsEndpointIds_ = pathHopsEndpointIds_;
-        } else {
-          result.pathHopsEndpointIds_ = pathHopsEndpointIdsBuilder_.build();
-        }
-        if (subServiceIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000002) != 0)) {
-            subServiceIds_ = java.util.Collections.unmodifiableList(subServiceIds_);
-            bitField0_ = (bitField0_ & ~0x00000002);
-          }
-          result.subServiceIds_ = subServiceIds_;
-        } else {
-          result.subServiceIds_ = subServiceIdsBuilder_.build();
-        }
-        if (settingsBuilder_ == null) {
-          result.settings_ = settings_;
+          result.connectionIds_ = connectionIds_;
         } else {
-          result.settings_ = settingsBuilder_.build();
+          result.connectionIds_ = connectionIdsBuilder_.build();
         }
         onBuilt();
         return result;
@@ -47021,80 +51492,45 @@ public final class ContextOuterClass {
           com.google.protobuf.Descriptors.FieldDescriptor field,
           java.lang.Object value) {
         return super.addRepeatedField(field, value);
-      }
-      @java.lang.Override
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Connection) {
-          return mergeFrom((context.ContextOuterClass.Connection)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(context.ContextOuterClass.Connection other) {
-        if (other == context.ContextOuterClass.Connection.getDefaultInstance()) return this;
-        if (other.hasConnectionId()) {
-          mergeConnectionId(other.getConnectionId());
-        }
-        if (other.hasServiceId()) {
-          mergeServiceId(other.getServiceId());
-        }
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          if (!other.pathHopsEndpointIds_.isEmpty()) {
-            if (pathHopsEndpointIds_.isEmpty()) {
-              pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensurePathHopsEndpointIdsIsMutable();
-              pathHopsEndpointIds_.addAll(other.pathHopsEndpointIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.pathHopsEndpointIds_.isEmpty()) {
-            if (pathHopsEndpointIdsBuilder_.isEmpty()) {
-              pathHopsEndpointIdsBuilder_.dispose();
-              pathHopsEndpointIdsBuilder_ = null;
-              pathHopsEndpointIds_ = other.pathHopsEndpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              pathHopsEndpointIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getPathHopsEndpointIdsFieldBuilder() : null;
-            } else {
-              pathHopsEndpointIdsBuilder_.addAllMessages(other.pathHopsEndpointIds_);
-            }
-          }
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.ConnectionIdList) {
+          return mergeFrom((context.ContextOuterClass.ConnectionIdList)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
         }
-        if (subServiceIdsBuilder_ == null) {
-          if (!other.subServiceIds_.isEmpty()) {
-            if (subServiceIds_.isEmpty()) {
-              subServiceIds_ = other.subServiceIds_;
-              bitField0_ = (bitField0_ & ~0x00000002);
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionIdList other) {
+        if (other == context.ContextOuterClass.ConnectionIdList.getDefaultInstance()) return this;
+        if (connectionIdsBuilder_ == null) {
+          if (!other.connectionIds_.isEmpty()) {
+            if (connectionIds_.isEmpty()) {
+              connectionIds_ = other.connectionIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureSubServiceIdsIsMutable();
-              subServiceIds_.addAll(other.subServiceIds_);
+              ensureConnectionIdsIsMutable();
+              connectionIds_.addAll(other.connectionIds_);
             }
             onChanged();
           }
         } else {
-          if (!other.subServiceIds_.isEmpty()) {
-            if (subServiceIdsBuilder_.isEmpty()) {
-              subServiceIdsBuilder_.dispose();
-              subServiceIdsBuilder_ = null;
-              subServiceIds_ = other.subServiceIds_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              subServiceIdsBuilder_ = 
+          if (!other.connectionIds_.isEmpty()) {
+            if (connectionIdsBuilder_.isEmpty()) {
+              connectionIdsBuilder_.dispose();
+              connectionIdsBuilder_ = null;
+              connectionIds_ = other.connectionIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              connectionIdsBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSubServiceIdsFieldBuilder() : null;
+                   getConnectionIdsFieldBuilder() : null;
             } else {
-              subServiceIdsBuilder_.addAllMessages(other.subServiceIds_);
+              connectionIdsBuilder_.addAllMessages(other.connectionIds_);
             }
           }
         }
-        if (other.hasSettings()) {
-          mergeSettings(other.getSettings());
-        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -47110,11 +51546,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Connection parsedMessage = null;
+        context.ContextOuterClass.ConnectionIdList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Connection) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionIdList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -47125,841 +51561,1037 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private context.ContextOuterClass.ConnectionId connectionId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdBuilder_;
+      private java.util.List<context.ContextOuterClass.ConnectionId> connectionIds_ =
+        java.util.Collections.emptyList();
+      private void ensureConnectionIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          connectionIds_ = new java.util.ArrayList<context.ContextOuterClass.ConnectionId>(connectionIds_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdsBuilder_;
+
       /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
-       * @return Whether the connectionId field is set.
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
        */
-      public boolean hasConnectionId() {
-        return connectionIdBuilder_ != null || connectionId_ != null;
+      public java.util.List<context.ContextOuterClass.ConnectionId> getConnectionIdsList() {
+        if (connectionIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(connectionIds_);
+        } else {
+          return connectionIdsBuilder_.getMessageList();
+        }
       }
       /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
-       * @return The connectionId.
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
        */
-      public context.ContextOuterClass.ConnectionId getConnectionId() {
-        if (connectionIdBuilder_ == null) {
-          return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+      public int getConnectionIdsCount() {
+        if (connectionIdsBuilder_ == null) {
+          return connectionIds_.size();
         } else {
-          return connectionIdBuilder_.getMessage();
+          return connectionIdsBuilder_.getCount();
         }
       }
       /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
        */
-      public Builder setConnectionId(context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdBuilder_ == null) {
+      public context.ContextOuterClass.ConnectionId getConnectionIds(int index) {
+        if (connectionIdsBuilder_ == null) {
+          return connectionIds_.get(index);
+        } else {
+          return connectionIdsBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public Builder setConnectionIds(
+          int index, context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          connectionId_ = value;
+          ensureConnectionIdsIsMutable();
+          connectionIds_.set(index, value);
           onChanged();
         } else {
-          connectionIdBuilder_.setMessage(value);
+          connectionIdsBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
        */
-      public Builder setConnectionId(
-          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
-        if (connectionIdBuilder_ == null) {
-          connectionId_ = builderForValue.build();
+      public Builder setConnectionIds(
+          int index, context.ContextOuterClass.ConnectionId.Builder builderForValue) {
+        if (connectionIdsBuilder_ == null) {
+          ensureConnectionIdsIsMutable();
+          connectionIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          connectionIdBuilder_.setMessage(builderForValue.build());
+          connectionIdsBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
        */
-      public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdBuilder_ == null) {
-          if (connectionId_ != null) {
-            connectionId_ =
-              context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
-          } else {
-            connectionId_ = value;
+      public Builder addConnectionIds(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureConnectionIdsIsMutable();
+          connectionIds_.add(value);
           onChanged();
         } else {
-          connectionIdBuilder_.mergeFrom(value);
+          connectionIdsBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
        */
-      public Builder clearConnectionId() {
-        if (connectionIdBuilder_ == null) {
-          connectionId_ = null;
+      public Builder addConnectionIds(
+          int index, context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureConnectionIdsIsMutable();
+          connectionIds_.add(index, value);
           onChanged();
         } else {
-          connectionId_ = null;
-          connectionIdBuilder_ = null;
+          connectionIdsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public Builder addConnectionIds(
+          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
+        if (connectionIdsBuilder_ == null) {
+          ensureConnectionIdsIsMutable();
+          connectionIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          connectionIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public Builder addConnectionIds(
+          int index, context.ContextOuterClass.ConnectionId.Builder builderForValue) {
+        if (connectionIdsBuilder_ == null) {
+          ensureConnectionIdsIsMutable();
+          connectionIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          connectionIdsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public Builder addAllConnectionIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.ConnectionId> values) {
+        if (connectionIdsBuilder_ == null) {
+          ensureConnectionIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, connectionIds_);
+          onChanged();
+        } else {
+          connectionIdsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public Builder clearConnectionIds() {
+        if (connectionIdsBuilder_ == null) {
+          connectionIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          connectionIdsBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public Builder removeConnectionIds(int index) {
+        if (connectionIdsBuilder_ == null) {
+          ensureConnectionIdsIsMutable();
+          connectionIds_.remove(index);
+          onChanged();
+        } else {
+          connectionIdsBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdsBuilder(
+          int index) {
+        return getConnectionIdsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdsOrBuilder(
+          int index) {
+        if (connectionIdsBuilder_ == null) {
+          return connectionIds_.get(index);  } else {
+          return connectionIdsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.ConnectionIdOrBuilder> 
+           getConnectionIdsOrBuilderList() {
+        if (connectionIdsBuilder_ != null) {
+          return connectionIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(connectionIds_);
+        }
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionId.Builder addConnectionIdsBuilder() {
+        return getConnectionIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.ConnectionId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public context.ContextOuterClass.ConnectionId.Builder addConnectionIdsBuilder(
+          int index) {
+        return getConnectionIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.ConnectionId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       */
+      public java.util.List<context.ContextOuterClass.ConnectionId.Builder> 
+           getConnectionIdsBuilderList() {
+        return getConnectionIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> 
+          getConnectionIdsFieldBuilder() {
+        if (connectionIdsBuilder_ == null) {
+          connectionIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder>(
+                  connectionIds_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          connectionIds_ = null;
+        }
+        return connectionIdsBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:context.ConnectionIdList)
+    }
+
+    // @@protoc_insertion_point(class_scope:context.ConnectionIdList)
+    private static final context.ContextOuterClass.ConnectionIdList DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionIdList();
+    }
+
+    public static context.ContextOuterClass.ConnectionIdList getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<ConnectionIdList>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionIdList>() {
+      @java.lang.Override
+      public ConnectionIdList parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new ConnectionIdList(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<ConnectionIdList> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<ConnectionIdList> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionIdList getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ConnectionListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionList)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    java.util.List<context.ContextOuterClass.Connection> 
+        getConnectionsList();
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    context.ContextOuterClass.Connection getConnections(int index);
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    int getConnectionsCount();
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.ConnectionOrBuilder> 
+        getConnectionsOrBuilderList();
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    context.ContextOuterClass.ConnectionOrBuilder getConnectionsOrBuilder(
+        int index);
+  }
+  /**
+   * Protobuf type {@code context.ConnectionList}
+   */
+  public static final class ConnectionList extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:context.ConnectionList)
+      ConnectionListOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use ConnectionList.newBuilder() to construct.
+    private ConnectionList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private ConnectionList() {
+      connections_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new ConnectionList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private ConnectionList(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                connections_ = new java.util.ArrayList<context.ContextOuterClass.Connection>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              connections_.add(
+                  input.readMessage(context.ContextOuterClass.Connection.parser(), extensionRegistry));
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          connections_ = java.util.Collections.unmodifiableList(connections_);
         }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return context.ContextOuterClass.internal_static_context_ConnectionList_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              context.ContextOuterClass.ConnectionList.class, context.ContextOuterClass.ConnectionList.Builder.class);
+    }
+
+    public static final int CONNECTIONS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.Connection> connections_;
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.Connection> getConnectionsList() {
+      return connections_;
+    }
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.ConnectionOrBuilder> 
+        getConnectionsOrBuilderList() {
+      return connections_;
+    }
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    @java.lang.Override
+    public int getConnectionsCount() {
+      return connections_.size();
+    }
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Connection getConnections(int index) {
+      return connections_.get(index);
+    }
+    /**
+     * <code>repeated .context.Connection connections = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionOrBuilder getConnectionsOrBuilder(
+        int index) {
+      return connections_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
 
-        return this;
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < connections_.size(); i++) {
+        output.writeMessage(1, connections_.get(i));
       }
-      /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
-       */
-      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
-        
-        onChanged();
-        return getConnectionIdFieldBuilder().getBuilder();
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < connections_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, connections_.get(i));
       }
-      /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
-       */
-      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-        if (connectionIdBuilder_ != null) {
-          return connectionIdBuilder_.getMessageOrBuilder();
-        } else {
-          return connectionId_ == null ?
-              context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
-        }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
       }
-      /**
-       * <code>.context.ConnectionId connection_id = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> 
-          getConnectionIdFieldBuilder() {
-        if (connectionIdBuilder_ == null) {
-          connectionIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder>(
-                  getConnectionId(),
-                  getParentForChildren(),
-                  isClean());
-          connectionId_ = null;
-        }
-        return connectionIdBuilder_;
+      if (!(obj instanceof context.ContextOuterClass.ConnectionList)) {
+        return super.equals(obj);
       }
+      context.ContextOuterClass.ConnectionList other = (context.ContextOuterClass.ConnectionList) obj;
 
-      private context.ContextOuterClass.ServiceId serviceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       * @return Whether the serviceId field is set.
-       */
-      public boolean hasServiceId() {
-        return serviceIdBuilder_ != null || serviceId_ != null;
+      if (!getConnectionsList()
+          .equals(other.getConnectionsList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
       }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       * @return The serviceId.
-       */
-      public context.ContextOuterClass.ServiceId getServiceId() {
-        if (serviceIdBuilder_ == null) {
-          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
-        } else {
-          return serviceIdBuilder_.getMessage();
-        }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getConnectionsCount() > 0) {
+        hash = (37 * hash) + CONNECTIONS_FIELD_NUMBER;
+        hash = (53 * hash) + getConnectionsList().hashCode();
       }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          serviceId_ = value;
-          onChanged();
-        } else {
-          serviceIdBuilder_.setMessage(value);
-        }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
 
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      public Builder setServiceId(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = builderForValue.build();
-          onChanged();
-        } else {
-          serviceIdBuilder_.setMessage(builderForValue.build());
-        }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ConnectionList parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.ConnectionList parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static context.ContextOuterClass.ConnectionList parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
 
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (serviceId_ != null) {
-            serviceId_ =
-              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
-          } else {
-            serviceId_ = value;
-          }
-          onChanged();
-        } else {
-          serviceIdBuilder_.mergeFrom(value);
-        }
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionList prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
 
-        return this;
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code context.ConnectionList}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.ConnectionList)
+        context.ContextOuterClass.ConnectionListOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
       }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      public Builder clearServiceId() {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
-          onChanged();
-        } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
-        }
 
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-        
-        onChanged();
-        return getServiceIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-        if (serviceIdBuilder_ != null) {
-          return serviceIdBuilder_.getMessageOrBuilder();
-        } else {
-          return serviceId_ == null ?
-              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
-        }
-      }
-      /**
-       * <code>.context.ServiceId service_id = 2;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getServiceIdFieldBuilder() {
-        if (serviceIdBuilder_ == null) {
-          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  getServiceId(),
-                  getParentForChildren(),
-                  isClean());
-          serviceId_ = null;
-        }
-        return serviceIdBuilder_;
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return context.ContextOuterClass.internal_static_context_ConnectionList_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                context.ContextOuterClass.ConnectionList.class, context.ContextOuterClass.ConnectionList.Builder.class);
       }
 
-      private java.util.List<context.ContextOuterClass.EndPointId> pathHopsEndpointIds_ =
-        java.util.Collections.emptyList();
-      private void ensurePathHopsEndpointIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          pathHopsEndpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(pathHopsEndpointIds_);
-          bitField0_ |= 0x00000001;
-         }
+      // Construct using context.ContextOuterClass.ConnectionList.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
       }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> pathHopsEndpointIdsBuilder_;
-
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointId> getPathHopsEndpointIdsList() {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
-        } else {
-          return pathHopsEndpointIdsBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public int getPathHopsEndpointIdsCount() {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          return pathHopsEndpointIds_.size();
-        } else {
-          return pathHopsEndpointIdsBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId getPathHopsEndpointIds(int index) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          return pathHopsEndpointIds_.get(index);
-        } else {
-          return pathHopsEndpointIdsBuilder_.getMessage(index);
-        }
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder setPathHopsEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.set(index, value);
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.setMessage(index, value);
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getConnectionsFieldBuilder();
         }
-        return this;
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder setPathHopsEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.set(index, builderForValue.build());
-          onChanged();
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (connectionsBuilder_ == null) {
+          connections_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          pathHopsEndpointIdsBuilder_.setMessage(index, builderForValue.build());
+          connectionsBuilder_.clear();
         }
         return this;
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder addPathHopsEndpointIds(context.ContextOuterClass.EndPointId value) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.add(value);
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.addMessage(value);
-        }
-        return this;
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder addPathHopsEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.add(index, value);
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.addMessage(index, value);
-        }
-        return this;
+
+      @java.lang.Override
+      public context.ContextOuterClass.ConnectionList getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionList.getDefaultInstance();
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder addPathHopsEndpointIds(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.add(builderForValue.build());
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.addMessage(builderForValue.build());
+
+      @java.lang.Override
+      public context.ContextOuterClass.ConnectionList build() {
+        context.ContextOuterClass.ConnectionList result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
         }
-        return this;
+        return result;
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder addPathHopsEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.add(index, builderForValue.build());
-          onChanged();
+
+      @java.lang.Override
+      public context.ContextOuterClass.ConnectionList buildPartial() {
+        context.ContextOuterClass.ConnectionList result = new context.ContextOuterClass.ConnectionList(this);
+        int from_bitField0_ = bitField0_;
+        if (connectionsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            connections_ = java.util.Collections.unmodifiableList(connections_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.connections_ = connections_;
         } else {
-          pathHopsEndpointIdsBuilder_.addMessage(index, builderForValue.build());
+          result.connections_ = connectionsBuilder_.build();
         }
-        return this;
+        onBuilt();
+        return result;
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder addAllPathHopsEndpointIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          ensurePathHopsEndpointIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, pathHopsEndpointIds_);
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.addAllMessages(values);
-        }
-        return this;
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder clearPathHopsEndpointIds() {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          pathHopsEndpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.clear();
-        }
-        return this;
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public Builder removePathHopsEndpointIds(int index) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          ensurePathHopsEndpointIdsIsMutable();
-          pathHopsEndpointIds_.remove(index);
-          onChanged();
-        } else {
-          pathHopsEndpointIdsBuilder_.remove(index);
-        }
-        return this;
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getPathHopsEndpointIdsBuilder(
-          int index) {
-        return getPathHopsEndpointIdsFieldBuilder().getBuilder(index);
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getPathHopsEndpointIdsOrBuilder(
-          int index) {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          return pathHopsEndpointIds_.get(index);  } else {
-          return pathHopsEndpointIdsBuilder_.getMessageOrBuilder(index);
-        }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-           getPathHopsEndpointIdsOrBuilderList() {
-        if (pathHopsEndpointIdsBuilder_ != null) {
-          return pathHopsEndpointIdsBuilder_.getMessageOrBuilderList();
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.ConnectionList) {
+          return mergeFrom((context.ContextOuterClass.ConnectionList)other);
         } else {
-          return java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
+          super.mergeFrom(other);
+          return this;
         }
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder addPathHopsEndpointIdsBuilder() {
-        return getPathHopsEndpointIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.EndPointId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder addPathHopsEndpointIdsBuilder(
-          int index) {
-        return getPathHopsEndpointIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionList other) {
+        if (other == context.ContextOuterClass.ConnectionList.getDefaultInstance()) return this;
+        if (connectionsBuilder_ == null) {
+          if (!other.connections_.isEmpty()) {
+            if (connections_.isEmpty()) {
+              connections_ = other.connections_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureConnectionsIsMutable();
+              connections_.addAll(other.connections_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.connections_.isEmpty()) {
+            if (connectionsBuilder_.isEmpty()) {
+              connectionsBuilder_.dispose();
+              connectionsBuilder_ = null;
+              connections_ = other.connections_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              connectionsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getConnectionsFieldBuilder() : null;
+            } else {
+              connectionsBuilder_.addAllMessages(other.connections_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
       }
-      /**
-       * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
-           getPathHopsEndpointIdsBuilderList() {
-        return getPathHopsEndpointIdsFieldBuilder().getBuilderList();
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getPathHopsEndpointIdsFieldBuilder() {
-        if (pathHopsEndpointIdsBuilder_ == null) {
-          pathHopsEndpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  pathHopsEndpointIds_,
-                  ((bitField0_ & 0x00000001) != 0),
-                  getParentForChildren(),
-                  isClean());
-          pathHopsEndpointIds_ = null;
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.ConnectionList parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.ConnectionList) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
         }
-        return pathHopsEndpointIdsBuilder_;
+        return this;
       }
+      private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.ServiceId> subServiceIds_ =
+      private java.util.List<context.ContextOuterClass.Connection> connections_ =
         java.util.Collections.emptyList();
-      private void ensureSubServiceIdsIsMutable() {
-        if (!((bitField0_ & 0x00000002) != 0)) {
-          subServiceIds_ = new java.util.ArrayList<context.ContextOuterClass.ServiceId>(subServiceIds_);
-          bitField0_ |= 0x00000002;
+      private void ensureConnectionsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          connections_ = new java.util.ArrayList<context.ContextOuterClass.Connection>(connections_);
+          bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> subServiceIdsBuilder_;
+          context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder> connectionsBuilder_;
 
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ServiceId> getSubServiceIdsList() {
-        if (subServiceIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(subServiceIds_);
+      public java.util.List<context.ContextOuterClass.Connection> getConnectionsList() {
+        if (connectionsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(connections_);
         } else {
-          return subServiceIdsBuilder_.getMessageList();
+          return connectionsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public int getSubServiceIdsCount() {
-        if (subServiceIdsBuilder_ == null) {
-          return subServiceIds_.size();
+      public int getConnectionsCount() {
+        if (connectionsBuilder_ == null) {
+          return connections_.size();
         } else {
-          return subServiceIdsBuilder_.getCount();
+          return connectionsBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId getSubServiceIds(int index) {
-        if (subServiceIdsBuilder_ == null) {
-          return subServiceIds_.get(index);
+      public context.ContextOuterClass.Connection getConnections(int index) {
+        if (connectionsBuilder_ == null) {
+          return connections_.get(index);
         } else {
-          return subServiceIdsBuilder_.getMessage(index);
+          return connectionsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder setSubServiceIds(
-          int index, context.ContextOuterClass.ServiceId value) {
-        if (subServiceIdsBuilder_ == null) {
+      public Builder setConnections(
+          int index, context.ContextOuterClass.Connection value) {
+        if (connectionsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.set(index, value);
+          ensureConnectionsIsMutable();
+          connections_.set(index, value);
           onChanged();
         } else {
-          subServiceIdsBuilder_.setMessage(index, value);
+          connectionsBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder setSubServiceIds(
-          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (subServiceIdsBuilder_ == null) {
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.set(index, builderForValue.build());
+      public Builder setConnections(
+          int index, context.ContextOuterClass.Connection.Builder builderForValue) {
+        if (connectionsBuilder_ == null) {
+          ensureConnectionsIsMutable();
+          connections_.set(index, builderForValue.build());
           onChanged();
         } else {
-          subServiceIdsBuilder_.setMessage(index, builderForValue.build());
+          connectionsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder addSubServiceIds(context.ContextOuterClass.ServiceId value) {
-        if (subServiceIdsBuilder_ == null) {
+      public Builder addConnections(context.ContextOuterClass.Connection value) {
+        if (connectionsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.add(value);
+          ensureConnectionsIsMutable();
+          connections_.add(value);
           onChanged();
         } else {
-          subServiceIdsBuilder_.addMessage(value);
+          connectionsBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder addSubServiceIds(
-          int index, context.ContextOuterClass.ServiceId value) {
-        if (subServiceIdsBuilder_ == null) {
+      public Builder addConnections(
+          int index, context.ContextOuterClass.Connection value) {
+        if (connectionsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.add(index, value);
+          ensureConnectionsIsMutable();
+          connections_.add(index, value);
           onChanged();
         } else {
-          subServiceIdsBuilder_.addMessage(index, value);
+          connectionsBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder addSubServiceIds(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (subServiceIdsBuilder_ == null) {
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.add(builderForValue.build());
+      public Builder addConnections(
+          context.ContextOuterClass.Connection.Builder builderForValue) {
+        if (connectionsBuilder_ == null) {
+          ensureConnectionsIsMutable();
+          connections_.add(builderForValue.build());
           onChanged();
         } else {
-          subServiceIdsBuilder_.addMessage(builderForValue.build());
+          connectionsBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder addSubServiceIds(
-          int index, context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (subServiceIdsBuilder_ == null) {
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.add(index, builderForValue.build());
+      public Builder addConnections(
+          int index, context.ContextOuterClass.Connection.Builder builderForValue) {
+        if (connectionsBuilder_ == null) {
+          ensureConnectionsIsMutable();
+          connections_.add(index, builderForValue.build());
           onChanged();
         } else {
-          subServiceIdsBuilder_.addMessage(index, builderForValue.build());
+          connectionsBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder addAllSubServiceIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.ServiceId> values) {
-        if (subServiceIdsBuilder_ == null) {
-          ensureSubServiceIdsIsMutable();
+      public Builder addAllConnections(
+          java.lang.Iterable<? extends context.ContextOuterClass.Connection> values) {
+        if (connectionsBuilder_ == null) {
+          ensureConnectionsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, subServiceIds_);
+              values, connections_);
           onChanged();
         } else {
-          subServiceIdsBuilder_.addAllMessages(values);
+          connectionsBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder clearSubServiceIds() {
-        if (subServiceIdsBuilder_ == null) {
-          subServiceIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
+      public Builder clearConnections() {
+        if (connectionsBuilder_ == null) {
+          connections_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          subServiceIdsBuilder_.clear();
+          connectionsBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public Builder removeSubServiceIds(int index) {
-        if (subServiceIdsBuilder_ == null) {
-          ensureSubServiceIdsIsMutable();
-          subServiceIds_.remove(index);
+      public Builder removeConnections(int index) {
+        if (connectionsBuilder_ == null) {
+          ensureConnectionsIsMutable();
+          connections_.remove(index);
           onChanged();
         } else {
-          subServiceIdsBuilder_.remove(index);
+          connectionsBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder getSubServiceIdsBuilder(
+      public context.ContextOuterClass.Connection.Builder getConnectionsBuilder(
           int index) {
-        return getSubServiceIdsFieldBuilder().getBuilder(index);
+        return getConnectionsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public context.ContextOuterClass.ServiceIdOrBuilder getSubServiceIdsOrBuilder(
+      public context.ContextOuterClass.ConnectionOrBuilder getConnectionsOrBuilder(
           int index) {
-        if (subServiceIdsBuilder_ == null) {
-          return subServiceIds_.get(index);  } else {
-          return subServiceIdsBuilder_.getMessageOrBuilder(index);
+        if (connectionsBuilder_ == null) {
+          return connections_.get(index);  } else {
+          return connectionsBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ServiceIdOrBuilder> 
-           getSubServiceIdsOrBuilderList() {
-        if (subServiceIdsBuilder_ != null) {
-          return subServiceIdsBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends context.ContextOuterClass.ConnectionOrBuilder> 
+           getConnectionsOrBuilderList() {
+        if (connectionsBuilder_ != null) {
+          return connectionsBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(subServiceIds_);
+          return java.util.Collections.unmodifiableList(connections_);
         }
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder addSubServiceIdsBuilder() {
-        return getSubServiceIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.ServiceId.getDefaultInstance());
+      public context.ContextOuterClass.Connection.Builder addConnectionsBuilder() {
+        return getConnectionsFieldBuilder().addBuilder(
+            context.ContextOuterClass.Connection.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public context.ContextOuterClass.ServiceId.Builder addSubServiceIdsBuilder(
+      public context.ContextOuterClass.Connection.Builder addConnectionsBuilder(
           int index) {
-        return getSubServiceIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.ServiceId.getDefaultInstance());
+        return getConnectionsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.Connection.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
+       * <code>repeated .context.Connection connections = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.ServiceId.Builder> 
-           getSubServiceIdsBuilderList() {
-        return getSubServiceIdsFieldBuilder().getBuilderList();
+      public java.util.List<context.ContextOuterClass.Connection.Builder> 
+           getConnectionsBuilderList() {
+        return getConnectionsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getSubServiceIdsFieldBuilder() {
-        if (subServiceIdsBuilder_ == null) {
-          subServiceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  subServiceIds_,
-                  ((bitField0_ & 0x00000002) != 0),
-                  getParentForChildren(),
-                  isClean());
-          subServiceIds_ = null;
-        }
-        return subServiceIdsBuilder_;
-      }
-
-      private context.ContextOuterClass.ConnectionSettings settings_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings, context.ContextOuterClass.ConnectionSettings.Builder, context.ContextOuterClass.ConnectionSettingsOrBuilder> settingsBuilder_;
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       * @return Whether the settings field is set.
-       */
-      public boolean hasSettings() {
-        return settingsBuilder_ != null || settings_ != null;
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       * @return The settings.
-       */
-      public context.ContextOuterClass.ConnectionSettings getSettings() {
-        if (settingsBuilder_ == null) {
-          return settings_ == null ? context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
-        } else {
-          return settingsBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      public Builder setSettings(context.ContextOuterClass.ConnectionSettings value) {
-        if (settingsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          settings_ = value;
-          onChanged();
-        } else {
-          settingsBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      public Builder setSettings(
-          context.ContextOuterClass.ConnectionSettings.Builder builderForValue) {
-        if (settingsBuilder_ == null) {
-          settings_ = builderForValue.build();
-          onChanged();
-        } else {
-          settingsBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      public Builder mergeSettings(context.ContextOuterClass.ConnectionSettings value) {
-        if (settingsBuilder_ == null) {
-          if (settings_ != null) {
-            settings_ =
-              context.ContextOuterClass.ConnectionSettings.newBuilder(settings_).mergeFrom(value).buildPartial();
-          } else {
-            settings_ = value;
-          }
-          onChanged();
-        } else {
-          settingsBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      public Builder clearSettings() {
-        if (settingsBuilder_ == null) {
-          settings_ = null;
-          onChanged();
-        } else {
-          settings_ = null;
-          settingsBuilder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      public context.ContextOuterClass.ConnectionSettings.Builder getSettingsBuilder() {
-        
-        onChanged();
-        return getSettingsFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      public context.ContextOuterClass.ConnectionSettingsOrBuilder getSettingsOrBuilder() {
-        if (settingsBuilder_ != null) {
-          return settingsBuilder_.getMessageOrBuilder();
-        } else {
-          return settings_ == null ?
-              context.ContextOuterClass.ConnectionSettings.getDefaultInstance() : settings_;
-        }
-      }
-      /**
-       * <code>.context.ConnectionSettings settings = 5;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings, context.ContextOuterClass.ConnectionSettings.Builder, context.ContextOuterClass.ConnectionSettingsOrBuilder> 
-          getSettingsFieldBuilder() {
-        if (settingsBuilder_ == null) {
-          settingsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionSettings, context.ContextOuterClass.ConnectionSettings.Builder, context.ContextOuterClass.ConnectionSettingsOrBuilder>(
-                  getSettings(),
+          context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder> 
+          getConnectionsFieldBuilder() {
+        if (connectionsBuilder_ == null) {
+          connectionsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder>(
+                  connections_,
+                  ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          settings_ = null;
+          connections_ = null;
         }
-        return settingsBuilder_;
+        return connectionsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -47974,95 +52606,100 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Connection)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Connection)
-    private static final context.ContextOuterClass.Connection DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionList)
+    private static final context.ContextOuterClass.ConnectionList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Connection();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionList();
     }
 
-    public static context.ContextOuterClass.Connection getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Connection>
-        PARSER = new com.google.protobuf.AbstractParser<Connection>() {
+    private static final com.google.protobuf.Parser<ConnectionList>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionList>() {
       @java.lang.Override
-      public Connection parsePartialFrom(
+      public ConnectionList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Connection(input, extensionRegistry);
+        return new ConnectionList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Connection> parser() {
+    public static com.google.protobuf.Parser<ConnectionList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Connection> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Connection getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
-
-  public interface ConnectionIdListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionIdList)
+
+  public interface ConnectionEventOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
-    java.util.List<context.ContextOuterClass.ConnectionId> 
-        getConnectionIdsList();
+    boolean hasEvent();
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
-    context.ContextOuterClass.ConnectionId getConnectionIds(int index);
+    context.ContextOuterClass.Event getEvent();
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
-    int getConnectionIdsCount();
+    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
+
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.ConnectionId connection_id = 2;</code>
+     * @return Whether the connectionId field is set.
      */
-    java.util.List<? extends context.ContextOuterClass.ConnectionIdOrBuilder> 
-        getConnectionIdsOrBuilderList();
+    boolean hasConnectionId();
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.ConnectionId connection_id = 2;</code>
+     * @return The connectionId.
      */
-    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdsOrBuilder(
-        int index);
+    context.ContextOuterClass.ConnectionId getConnectionId();
+    /**
+     * <code>.context.ConnectionId connection_id = 2;</code>
+     */
+    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder();
   }
   /**
-   * Protobuf type {@code context.ConnectionIdList}
+   * Protobuf type {@code context.ConnectionEvent}
    */
-  public static final class ConnectionIdList extends
+  public static final class ConnectionEvent extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionIdList)
-      ConnectionIdListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
+      ConnectionEventOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionIdList.newBuilder() to construct.
-    private ConnectionIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConnectionEvent.newBuilder() to construct.
+    private ConnectionEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionIdList() {
-      connectionIds_ = java.util.Collections.emptyList();
+    private ConnectionEvent() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionIdList();
+      return new ConnectionEvent();
     }
 
     @java.lang.Override
@@ -48070,7 +52707,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionIdList(
+    private ConnectionEvent(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -48078,7 +52715,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -48090,12 +52726,29 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                connectionIds_ = new java.util.ArrayList<context.ContextOuterClass.ConnectionId>();
-                mutable_bitField0_ |= 0x00000001;
+              context.ContextOuterClass.Event.Builder subBuilder = null;
+              if (event_ != null) {
+                subBuilder = event_.toBuilder();
               }
-              connectionIds_.add(
-                  input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry));
+              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(event_);
+                event_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+              if (connectionId_ != null) {
+                subBuilder = connectionId_.toBuilder();
+              }
+              connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(connectionId_);
+                connectionId_ = subBuilder.buildPartial();
+              }
+
               break;
             }
             default: {
@@ -48113,64 +52766,73 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionIdList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConnectionEvent_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionIdList.class, context.ContextOuterClass.ConnectionIdList.Builder.class);
+              context.ContextOuterClass.ConnectionEvent.class, context.ContextOuterClass.ConnectionEvent.Builder.class);
     }
 
-    public static final int CONNECTION_IDS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.ConnectionId> connectionIds_;
+    public static final int EVENT_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Event event_;
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return Whether the event field is set.
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.ConnectionId> getConnectionIdsList() {
-      return connectionIds_;
+    public boolean hasEvent() {
+      return event_ != null;
     }
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.Event event = 1;</code>
+     * @return The event.
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ConnectionIdOrBuilder> 
-        getConnectionIdsOrBuilderList() {
-      return connectionIds_;
+    public context.ContextOuterClass.Event getEvent() {
+      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
     }
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.Event event = 1;</code>
      */
     @java.lang.Override
-    public int getConnectionIdsCount() {
-      return connectionIds_.size();
+    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+      return getEvent();
     }
+
+    public static final int CONNECTION_ID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.ConnectionId connectionId_;
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.ConnectionId connection_id = 2;</code>
+     * @return Whether the connectionId field is set.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionId getConnectionIds(int index) {
-      return connectionIds_.get(index);
+    public boolean hasConnectionId() {
+      return connectionId_ != null;
     }
     /**
-     * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+     * <code>.context.ConnectionId connection_id = 2;</code>
+     * @return The connectionId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdsOrBuilder(
-        int index) {
-      return connectionIds_.get(index);
+    public context.ContextOuterClass.ConnectionId getConnectionId() {
+      return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+    }
+    /**
+     * <code>.context.ConnectionId connection_id = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
+      return getConnectionId();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -48187,8 +52849,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < connectionIds_.size(); i++) {
-        output.writeMessage(1, connectionIds_.get(i));
+      if (event_ != null) {
+        output.writeMessage(1, getEvent());
+      }
+      if (connectionId_ != null) {
+        output.writeMessage(2, getConnectionId());
       }
       unknownFields.writeTo(output);
     }
@@ -48199,9 +52864,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < connectionIds_.size(); i++) {
+      if (event_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, connectionIds_.get(i));
+          .computeMessageSize(1, getEvent());
+      }
+      if (connectionId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getConnectionId());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -48213,13 +52882,21 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionIdList)) {
+      if (!(obj instanceof context.ContextOuterClass.ConnectionEvent)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionIdList other = (context.ContextOuterClass.ConnectionIdList) obj;
+      context.ContextOuterClass.ConnectionEvent other = (context.ContextOuterClass.ConnectionEvent) obj;
 
-      if (!getConnectionIdsList()
-          .equals(other.getConnectionIdsList())) return false;
+      if (hasEvent() != other.hasEvent()) return false;
+      if (hasEvent()) {
+        if (!getEvent()
+            .equals(other.getEvent())) return false;
+      }
+      if (hasConnectionId() != other.hasConnectionId()) return false;
+      if (hasConnectionId()) {
+        if (!getConnectionId()
+            .equals(other.getConnectionId())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -48231,78 +52908,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getConnectionIdsCount() > 0) {
-        hash = (37 * hash) + CONNECTION_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getConnectionIdsList().hashCode();
+      if (hasEvent()) {
+        hash = (37 * hash) + EVENT_FIELD_NUMBER;
+        hash = (53 * hash) + getEvent().hashCode();
+      }
+      if (hasConnectionId()) {
+        hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getConnectionId().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConnectionEvent parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseDelimitedFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionIdList parseFrom(
+    public static context.ContextOuterClass.ConnectionEvent parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -48315,7 +52996,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionIdList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConnectionEvent prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -48331,26 +53012,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionIdList}
+     * Protobuf type {@code context.ConnectionEvent}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionIdList)
-        context.ContextOuterClass.ConnectionIdListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
+        context.ContextOuterClass.ConnectionEventOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionIdList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConnectionEvent_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionIdList.class, context.ContextOuterClass.ConnectionIdList.Builder.class);
+                context.ContextOuterClass.ConnectionEvent.class, context.ContextOuterClass.ConnectionEvent.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionIdList.newBuilder()
+      // Construct using context.ContextOuterClass.ConnectionEvent.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -48363,17 +53044,22 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getConnectionIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (connectionIdsBuilder_ == null) {
-          connectionIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+        if (eventBuilder_ == null) {
+          event_ = null;
         } else {
-          connectionIdsBuilder_.clear();
+          event_ = null;
+          eventBuilder_ = null;
+        }
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = null;
+        } else {
+          connectionId_ = null;
+          connectionIdBuilder_ = null;
         }
         return this;
       }
@@ -48381,17 +53067,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionIdList getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionIdList.getDefaultInstance();
+      public context.ContextOuterClass.ConnectionEvent getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConnectionEvent.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionIdList build() {
-        context.ContextOuterClass.ConnectionIdList result = buildPartial();
+      public context.ContextOuterClass.ConnectionEvent build() {
+        context.ContextOuterClass.ConnectionEvent result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -48399,17 +53085,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionIdList buildPartial() {
-        context.ContextOuterClass.ConnectionIdList result = new context.ContextOuterClass.ConnectionIdList(this);
-        int from_bitField0_ = bitField0_;
-        if (connectionIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            connectionIds_ = java.util.Collections.unmodifiableList(connectionIds_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.connectionIds_ = connectionIds_;
+      public context.ContextOuterClass.ConnectionEvent buildPartial() {
+        context.ContextOuterClass.ConnectionEvent result = new context.ContextOuterClass.ConnectionEvent(this);
+        if (eventBuilder_ == null) {
+          result.event_ = event_;
         } else {
-          result.connectionIds_ = connectionIdsBuilder_.build();
+          result.event_ = eventBuilder_.build();
+        }
+        if (connectionIdBuilder_ == null) {
+          result.connectionId_ = connectionId_;
+        } else {
+          result.connectionId_ = connectionIdBuilder_.build();
         }
         onBuilt();
         return result;
@@ -48449,41 +53135,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionIdList) {
-          return mergeFrom((context.ContextOuterClass.ConnectionIdList)other);
+        if (other instanceof context.ContextOuterClass.ConnectionEvent) {
+          return mergeFrom((context.ContextOuterClass.ConnectionEvent)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionIdList other) {
-        if (other == context.ContextOuterClass.ConnectionIdList.getDefaultInstance()) return this;
-        if (connectionIdsBuilder_ == null) {
-          if (!other.connectionIds_.isEmpty()) {
-            if (connectionIds_.isEmpty()) {
-              connectionIds_ = other.connectionIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureConnectionIdsIsMutable();
-              connectionIds_.addAll(other.connectionIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.connectionIds_.isEmpty()) {
-            if (connectionIdsBuilder_.isEmpty()) {
-              connectionIdsBuilder_.dispose();
-              connectionIdsBuilder_ = null;
-              connectionIds_ = other.connectionIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              connectionIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getConnectionIdsFieldBuilder() : null;
-            } else {
-              connectionIdsBuilder_.addAllMessages(other.connectionIds_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.ConnectionEvent other) {
+        if (other == context.ContextOuterClass.ConnectionEvent.getDefaultInstance()) return this;
+        if (other.hasEvent()) {
+          mergeEvent(other.getEvent());
+        }
+        if (other.hasConnectionId()) {
+          mergeConnectionId(other.getConnectionId());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -48500,11 +53166,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionIdList parsedMessage = null;
+        context.ContextOuterClass.ConnectionEvent parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionIdList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConnectionEvent) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -48513,246 +53179,243 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<context.ContextOuterClass.ConnectionId> connectionIds_ =
-        java.util.Collections.emptyList();
-      private void ensureConnectionIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          connectionIds_ = new java.util.ArrayList<context.ContextOuterClass.ConnectionId>(connectionIds_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdsBuilder_;
 
+      private context.ContextOuterClass.Event event_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
-       */
-      public java.util.List<context.ContextOuterClass.ConnectionId> getConnectionIdsList() {
-        if (connectionIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(connectionIds_);
-        } else {
-          return connectionIdsBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
+       * @return Whether the event field is set.
        */
-      public int getConnectionIdsCount() {
-        if (connectionIdsBuilder_ == null) {
-          return connectionIds_.size();
-        } else {
-          return connectionIdsBuilder_.getCount();
-        }
+      public boolean hasEvent() {
+        return eventBuilder_ != null || event_ != null;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
+       * @return The event.
        */
-      public context.ContextOuterClass.ConnectionId getConnectionIds(int index) {
-        if (connectionIdsBuilder_ == null) {
-          return connectionIds_.get(index);
+      public context.ContextOuterClass.Event getEvent() {
+        if (eventBuilder_ == null) {
+          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
         } else {
-          return connectionIdsBuilder_.getMessage(index);
+          return eventBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setConnectionIds(
-          int index, context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdsBuilder_ == null) {
+      public Builder setEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConnectionIdsIsMutable();
-          connectionIds_.set(index, value);
+          event_ = value;
           onChanged();
         } else {
-          connectionIdsBuilder_.setMessage(index, value);
+          eventBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder setConnectionIds(
-          int index, context.ContextOuterClass.ConnectionId.Builder builderForValue) {
-        if (connectionIdsBuilder_ == null) {
-          ensureConnectionIdsIsMutable();
-          connectionIds_.set(index, builderForValue.build());
+      public Builder setEvent(
+          context.ContextOuterClass.Event.Builder builderForValue) {
+        if (eventBuilder_ == null) {
+          event_ = builderForValue.build();
           onChanged();
         } else {
-          connectionIdsBuilder_.setMessage(index, builderForValue.build());
+          eventBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addConnectionIds(context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
+          if (event_ != null) {
+            event_ =
+              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
+          } else {
+            event_ = value;
           }
-          ensureConnectionIdsIsMutable();
-          connectionIds_.add(value);
           onChanged();
         } else {
-          connectionIdsBuilder_.addMessage(value);
+          eventBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addConnectionIds(
-          int index, context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureConnectionIdsIsMutable();
-          connectionIds_.add(index, value);
+      public Builder clearEvent() {
+        if (eventBuilder_ == null) {
+          event_ = null;
           onChanged();
         } else {
-          connectionIdsBuilder_.addMessage(index, value);
+          event_ = null;
+          eventBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addConnectionIds(
-          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
-        if (connectionIdsBuilder_ == null) {
-          ensureConnectionIdsIsMutable();
-          connectionIds_.add(builderForValue.build());
-          onChanged();
+      public context.ContextOuterClass.Event.Builder getEventBuilder() {
+        
+        onChanged();
+        return getEventFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+        if (eventBuilder_ != null) {
+          return eventBuilder_.getMessageOrBuilder();
         } else {
-          connectionIdsBuilder_.addMessage(builderForValue.build());
+          return event_ == null ?
+              context.ContextOuterClass.Event.getDefaultInstance() : event_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public Builder addConnectionIds(
-          int index, context.ContextOuterClass.ConnectionId.Builder builderForValue) {
-        if (connectionIdsBuilder_ == null) {
-          ensureConnectionIdsIsMutable();
-          connectionIds_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          connectionIdsBuilder_.addMessage(index, builderForValue.build());
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
+          getEventFieldBuilder() {
+        if (eventBuilder_ == null) {
+          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
+                  getEvent(),
+                  getParentForChildren(),
+                  isClean());
+          event_ = null;
         }
-        return this;
+        return eventBuilder_;
       }
+
+      private context.ContextOuterClass.ConnectionId connectionId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdBuilder_;
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
+       * @return Whether the connectionId field is set.
        */
-      public Builder addAllConnectionIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.ConnectionId> values) {
-        if (connectionIdsBuilder_ == null) {
-          ensureConnectionIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, connectionIds_);
-          onChanged();
+      public boolean hasConnectionId() {
+        return connectionIdBuilder_ != null || connectionId_ != null;
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 2;</code>
+       * @return The connectionId.
+       */
+      public context.ContextOuterClass.ConnectionId getConnectionId() {
+        if (connectionIdBuilder_ == null) {
+          return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
         } else {
-          connectionIdsBuilder_.addAllMessages(values);
+          return connectionIdBuilder_.getMessage();
         }
-        return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public Builder clearConnectionIds() {
-        if (connectionIdsBuilder_ == null) {
-          connectionIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+      public Builder setConnectionId(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          connectionId_ = value;
           onChanged();
         } else {
-          connectionIdsBuilder_.clear();
+          connectionIdBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public Builder removeConnectionIds(int index) {
-        if (connectionIdsBuilder_ == null) {
-          ensureConnectionIdsIsMutable();
-          connectionIds_.remove(index);
+      public Builder setConnectionId(
+          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = builderForValue.build();
           onChanged();
         } else {
-          connectionIdsBuilder_.remove(index);
+          connectionIdBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
-       */
-      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdsBuilder(
-          int index) {
-        return getConnectionIdsFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdsOrBuilder(
-          int index) {
-        if (connectionIdsBuilder_ == null) {
-          return connectionIds_.get(index);  } else {
-          return connectionIdsBuilder_.getMessageOrBuilder(index);
+      public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdBuilder_ == null) {
+          if (connectionId_ != null) {
+            connectionId_ =
+              context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
+          } else {
+            connectionId_ = value;
+          }
+          onChanged();
+        } else {
+          connectionIdBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ConnectionIdOrBuilder> 
-           getConnectionIdsOrBuilderList() {
-        if (connectionIdsBuilder_ != null) {
-          return connectionIdsBuilder_.getMessageOrBuilderList();
+      public Builder clearConnectionId() {
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = null;
+          onChanged();
         } else {
-          return java.util.Collections.unmodifiableList(connectionIds_);
+          connectionId_ = null;
+          connectionIdBuilder_ = null;
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public context.ContextOuterClass.ConnectionId.Builder addConnectionIdsBuilder() {
-        return getConnectionIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.ConnectionId.getDefaultInstance());
+      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
+        
+        onChanged();
+        return getConnectionIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public context.ContextOuterClass.ConnectionId.Builder addConnectionIdsBuilder(
-          int index) {
-        return getConnectionIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.ConnectionId.getDefaultInstance());
+      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
+        if (connectionIdBuilder_ != null) {
+          return connectionIdBuilder_.getMessageOrBuilder();
+        } else {
+          return connectionId_ == null ?
+              context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+        }
       }
       /**
-       * <code>repeated .context.ConnectionId connection_ids = 1;</code>
+       * <code>.context.ConnectionId connection_id = 2;</code>
        */
-      public java.util.List<context.ContextOuterClass.ConnectionId.Builder> 
-           getConnectionIdsBuilderList() {
-        return getConnectionIdsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
+      private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> 
-          getConnectionIdsFieldBuilder() {
-        if (connectionIdsBuilder_ == null) {
-          connectionIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+          getConnectionIdFieldBuilder() {
+        if (connectionIdBuilder_ == null) {
+          connectionIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
               context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder>(
-                  connectionIds_,
-                  ((bitField0_ & 0x00000001) != 0),
+                  getConnectionId(),
                   getParentForChildren(),
                   isClean());
-          connectionIds_ = null;
+          connectionId_ = null;
         }
-        return connectionIdsBuilder_;
+        return connectionIdBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -48767,95 +53430,119 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionIdList)
+      // @@protoc_insertion_point(builder_scope:context.ConnectionEvent)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionIdList)
-    private static final context.ContextOuterClass.ConnectionIdList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConnectionEvent)
+    private static final context.ContextOuterClass.ConnectionEvent DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionIdList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionEvent();
     }
 
-    public static context.ContextOuterClass.ConnectionIdList getDefaultInstance() {
+    public static context.ContextOuterClass.ConnectionEvent getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionIdList>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionIdList>() {
+    private static final com.google.protobuf.Parser<ConnectionEvent>
+        PARSER = new com.google.protobuf.AbstractParser<ConnectionEvent>() {
       @java.lang.Override
-      public ConnectionIdList parsePartialFrom(
+      public ConnectionEvent parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionIdList(input, extensionRegistry);
+        return new ConnectionEvent(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionIdList> parser() {
+    public static com.google.protobuf.Parser<ConnectionEvent> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionIdList> getParserForType() {
+    public com.google.protobuf.Parser<ConnectionEvent> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionIdList getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConnectionEvent getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionList)
+  public interface EndPointIdOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.EndPointId)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.TopologyId topology_id = 1;</code>
+     * @return Whether the topologyId field is set.
      */
-    java.util.List<context.ContextOuterClass.Connection> 
-        getConnectionsList();
+    boolean hasTopologyId();
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.TopologyId topology_id = 1;</code>
+     * @return The topologyId.
      */
-    context.ContextOuterClass.Connection getConnections(int index);
+    context.ContextOuterClass.TopologyId getTopologyId();
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.TopologyId topology_id = 1;</code>
      */
-    int getConnectionsCount();
+    context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder();
+
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return Whether the deviceId field is set.
      */
-    java.util.List<? extends context.ContextOuterClass.ConnectionOrBuilder> 
-        getConnectionsOrBuilderList();
+    boolean hasDeviceId();
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return The deviceId.
      */
-    context.ContextOuterClass.ConnectionOrBuilder getConnectionsOrBuilder(
-        int index);
+    context.ContextOuterClass.DeviceId getDeviceId();
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     */
+    context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder();
+
+    /**
+     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     * @return Whether the endpointUuid field is set.
+     */
+    boolean hasEndpointUuid();
+    /**
+     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     * @return The endpointUuid.
+     */
+    context.ContextOuterClass.Uuid getEndpointUuid();
+    /**
+     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     */
+    context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder();
   }
   /**
-   * Protobuf type {@code context.ConnectionList}
+   * <pre>
+   * ----- Endpoint ------------------------------------------------------------------------------------------------------
+   * </pre>
+   *
+   * Protobuf type {@code context.EndPointId}
    */
-  public static final class ConnectionList extends
+  public static final class EndPointId extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionList)
-      ConnectionListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.EndPointId)
+      EndPointIdOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionList.newBuilder() to construct.
-    private ConnectionList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use EndPointId.newBuilder() to construct.
+    private EndPointId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionList() {
-      connections_ = java.util.Collections.emptyList();
+    private EndPointId() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionList();
+      return new EndPointId();
     }
 
     @java.lang.Override
@@ -48863,7 +53550,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionList(
+    private EndPointId(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -48871,7 +53558,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -48883,12 +53569,42 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                connections_ = new java.util.ArrayList<context.ContextOuterClass.Connection>();
-                mutable_bitField0_ |= 0x00000001;
+              context.ContextOuterClass.TopologyId.Builder subBuilder = null;
+              if (topologyId_ != null) {
+                subBuilder = topologyId_.toBuilder();
               }
-              connections_.add(
-                  input.readMessage(context.ContextOuterClass.Connection.parser(), extensionRegistry));
+              topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(topologyId_);
+                topologyId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              context.ContextOuterClass.DeviceId.Builder subBuilder = null;
+              if (deviceId_ != null) {
+                subBuilder = deviceId_.toBuilder();
+              }
+              deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(deviceId_);
+                deviceId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 26: {
+              context.ContextOuterClass.Uuid.Builder subBuilder = null;
+              if (endpointUuid_ != null) {
+                subBuilder = endpointUuid_.toBuilder();
+              }
+              endpointUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(endpointUuid_);
+                endpointUuid_ = subBuilder.buildPartial();
+              }
+
               break;
             }
             default: {
@@ -48906,64 +53622,99 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          connections_ = java.util.Collections.unmodifiableList(connections_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
+      return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_EndPointId_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionList.class, context.ContextOuterClass.ConnectionList.Builder.class);
+              context.ContextOuterClass.EndPointId.class, context.ContextOuterClass.EndPointId.Builder.class);
     }
 
-    public static final int CONNECTIONS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.Connection> connections_;
+    public static final int TOPOLOGY_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.TopologyId topologyId_;
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.TopologyId topology_id = 1;</code>
+     * @return Whether the topologyId field is set.
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.Connection> getConnectionsList() {
-      return connections_;
+    public boolean hasTopologyId() {
+      return topologyId_ != null;
     }
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.TopologyId topology_id = 1;</code>
+     * @return The topologyId.
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.ConnectionOrBuilder> 
-        getConnectionsOrBuilderList() {
-      return connections_;
+    public context.ContextOuterClass.TopologyId getTopologyId() {
+      return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
     }
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.TopologyId topology_id = 1;</code>
      */
     @java.lang.Override
-    public int getConnectionsCount() {
-      return connections_.size();
+    public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
+      return getTopologyId();
     }
+
+    public static final int DEVICE_ID_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.DeviceId deviceId_;
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return Whether the deviceId field is set.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Connection getConnections(int index) {
-      return connections_.get(index);
+    public boolean hasDeviceId() {
+      return deviceId_ != null;
     }
     /**
-     * <code>repeated .context.Connection connections = 1;</code>
+     * <code>.context.DeviceId device_id = 2;</code>
+     * @return The deviceId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionOrBuilder getConnectionsOrBuilder(
-        int index) {
-      return connections_.get(index);
+    public context.ContextOuterClass.DeviceId getDeviceId() {
+      return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+    }
+    /**
+     * <code>.context.DeviceId device_id = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
+      return getDeviceId();
+    }
+
+    public static final int ENDPOINT_UUID_FIELD_NUMBER = 3;
+    private context.ContextOuterClass.Uuid endpointUuid_;
+    /**
+     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     * @return Whether the endpointUuid field is set.
+     */
+    @java.lang.Override
+    public boolean hasEndpointUuid() {
+      return endpointUuid_ != null;
+    }
+    /**
+     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     * @return The endpointUuid.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Uuid getEndpointUuid() {
+      return endpointUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
+    }
+    /**
+     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder() {
+      return getEndpointUuid();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -48980,8 +53731,14 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < connections_.size(); i++) {
-        output.writeMessage(1, connections_.get(i));
+      if (topologyId_ != null) {
+        output.writeMessage(1, getTopologyId());
+      }
+      if (deviceId_ != null) {
+        output.writeMessage(2, getDeviceId());
+      }
+      if (endpointUuid_ != null) {
+        output.writeMessage(3, getEndpointUuid());
       }
       unknownFields.writeTo(output);
     }
@@ -48992,9 +53749,17 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < connections_.size(); i++) {
+      if (topologyId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, connections_.get(i));
+          .computeMessageSize(1, getTopologyId());
+      }
+      if (deviceId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getDeviceId());
+      }
+      if (endpointUuid_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getEndpointUuid());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -49006,13 +53771,26 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionList)) {
+      if (!(obj instanceof context.ContextOuterClass.EndPointId)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionList other = (context.ContextOuterClass.ConnectionList) obj;
+      context.ContextOuterClass.EndPointId other = (context.ContextOuterClass.EndPointId) obj;
 
-      if (!getConnectionsList()
-          .equals(other.getConnectionsList())) return false;
+      if (hasTopologyId() != other.hasTopologyId()) return false;
+      if (hasTopologyId()) {
+        if (!getTopologyId()
+            .equals(other.getTopologyId())) return false;
+      }
+      if (hasDeviceId() != other.hasDeviceId()) return false;
+      if (hasDeviceId()) {
+        if (!getDeviceId()
+            .equals(other.getDeviceId())) return false;
+      }
+      if (hasEndpointUuid() != other.hasEndpointUuid()) return false;
+      if (hasEndpointUuid()) {
+        if (!getEndpointUuid()
+            .equals(other.getEndpointUuid())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -49024,78 +53802,86 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getConnectionsCount() > 0) {
-        hash = (37 * hash) + CONNECTIONS_FIELD_NUMBER;
-        hash = (53 * hash) + getConnectionsList().hashCode();
+      if (hasTopologyId()) {
+        hash = (37 * hash) + TOPOLOGY_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getTopologyId().hashCode();
+      }
+      if (hasDeviceId()) {
+        hash = (37 * hash) + DEVICE_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceId().hashCode();
+      }
+      if (hasEndpointUuid()) {
+        hash = (37 * hash) + ENDPOINT_UUID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointUuid().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(byte[] data)
+    public static context.ContextOuterClass.EndPointId parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointId parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointId parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionList parseDelimitedFrom(
+    public static context.ContextOuterClass.EndPointId parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionList parseFrom(
+    public static context.ContextOuterClass.EndPointId parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -49108,7 +53894,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.EndPointId prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -49124,26 +53910,30 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionList}
+     * <pre>
+     * ----- Endpoint ------------------------------------------------------------------------------------------------------
+     * </pre>
+     *
+     * Protobuf type {@code context.EndPointId}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionList)
-        context.ContextOuterClass.ConnectionListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.EndPointId)
+        context.ContextOuterClass.EndPointIdOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_EndPointId_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionList.class, context.ContextOuterClass.ConnectionList.Builder.class);
+                context.ContextOuterClass.EndPointId.class, context.ContextOuterClass.EndPointId.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionList.newBuilder()
+      // Construct using context.ContextOuterClass.EndPointId.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -49156,17 +53946,28 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getConnectionsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (connectionsBuilder_ == null) {
-          connections_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+        if (topologyIdBuilder_ == null) {
+          topologyId_ = null;
         } else {
-          connectionsBuilder_.clear();
+          topologyId_ = null;
+          topologyIdBuilder_ = null;
+        }
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = null;
+        } else {
+          deviceId_ = null;
+          deviceIdBuilder_ = null;
+        }
+        if (endpointUuidBuilder_ == null) {
+          endpointUuid_ = null;
+        } else {
+          endpointUuid_ = null;
+          endpointUuidBuilder_ = null;
         }
         return this;
       }
@@ -49174,17 +53975,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionList_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionList getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionList.getDefaultInstance();
+      public context.ContextOuterClass.EndPointId getDefaultInstanceForType() {
+        return context.ContextOuterClass.EndPointId.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionList build() {
-        context.ContextOuterClass.ConnectionList result = buildPartial();
+      public context.ContextOuterClass.EndPointId build() {
+        context.ContextOuterClass.EndPointId result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -49192,17 +53993,22 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionList buildPartial() {
-        context.ContextOuterClass.ConnectionList result = new context.ContextOuterClass.ConnectionList(this);
-        int from_bitField0_ = bitField0_;
-        if (connectionsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            connections_ = java.util.Collections.unmodifiableList(connections_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.connections_ = connections_;
+      public context.ContextOuterClass.EndPointId buildPartial() {
+        context.ContextOuterClass.EndPointId result = new context.ContextOuterClass.EndPointId(this);
+        if (topologyIdBuilder_ == null) {
+          result.topologyId_ = topologyId_;
         } else {
-          result.connections_ = connectionsBuilder_.build();
+          result.topologyId_ = topologyIdBuilder_.build();
+        }
+        if (deviceIdBuilder_ == null) {
+          result.deviceId_ = deviceId_;
+        } else {
+          result.deviceId_ = deviceIdBuilder_.build();
+        }
+        if (endpointUuidBuilder_ == null) {
+          result.endpointUuid_ = endpointUuid_;
+        } else {
+          result.endpointUuid_ = endpointUuidBuilder_.build();
         }
         onBuilt();
         return result;
@@ -49238,45 +54044,28 @@ public final class ContextOuterClass {
       public Builder addRepeatedField(
           com.google.protobuf.Descriptors.FieldDescriptor field,
           java.lang.Object value) {
-        return super.addRepeatedField(field, value);
-      }
-      @java.lang.Override
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionList) {
-          return mergeFrom((context.ContextOuterClass.ConnectionList)other);
-        } else {
-          super.mergeFrom(other);
-          return this;
-        }
-      }
-
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionList other) {
-        if (other == context.ContextOuterClass.ConnectionList.getDefaultInstance()) return this;
-        if (connectionsBuilder_ == null) {
-          if (!other.connections_.isEmpty()) {
-            if (connections_.isEmpty()) {
-              connections_ = other.connections_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureConnectionsIsMutable();
-              connections_.addAll(other.connections_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.connections_.isEmpty()) {
-            if (connectionsBuilder_.isEmpty()) {
-              connectionsBuilder_.dispose();
-              connectionsBuilder_ = null;
-              connections_ = other.connections_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              connectionsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getConnectionsFieldBuilder() : null;
-            } else {
-              connectionsBuilder_.addAllMessages(other.connections_);
-            }
-          }
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof context.ContextOuterClass.EndPointId) {
+          return mergeFrom((context.ContextOuterClass.EndPointId)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.EndPointId other) {
+        if (other == context.ContextOuterClass.EndPointId.getDefaultInstance()) return this;
+        if (other.hasTopologyId()) {
+          mergeTopologyId(other.getTopologyId());
+        }
+        if (other.hasDeviceId()) {
+          mergeDeviceId(other.getDeviceId());
+        }
+        if (other.hasEndpointUuid()) {
+          mergeEndpointUuid(other.getEndpointUuid());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -49293,11 +54082,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionList parsedMessage = null;
+        context.ContextOuterClass.EndPointId parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.EndPointId) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -49306,246 +54095,362 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.Connection> connections_ =
-        java.util.Collections.emptyList();
-      private void ensureConnectionsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          connections_ = new java.util.ArrayList<context.ContextOuterClass.Connection>(connections_);
-          bitField0_ |= 0x00000001;
-         }
+      private context.ContextOuterClass.TopologyId topologyId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.TopologyId, context.ContextOuterClass.TopologyId.Builder, context.ContextOuterClass.TopologyIdOrBuilder> topologyIdBuilder_;
+      /**
+       * <code>.context.TopologyId topology_id = 1;</code>
+       * @return Whether the topologyId field is set.
+       */
+      public boolean hasTopologyId() {
+        return topologyIdBuilder_ != null || topologyId_ != null;
       }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder> connectionsBuilder_;
-
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
+       * @return The topologyId.
        */
-      public java.util.List<context.ContextOuterClass.Connection> getConnectionsList() {
-        if (connectionsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(connections_);
+      public context.ContextOuterClass.TopologyId getTopologyId() {
+        if (topologyIdBuilder_ == null) {
+          return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
         } else {
-          return connectionsBuilder_.getMessageList();
+          return topologyIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
        */
-      public int getConnectionsCount() {
-        if (connectionsBuilder_ == null) {
-          return connections_.size();
+      public Builder setTopologyId(context.ContextOuterClass.TopologyId value) {
+        if (topologyIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          topologyId_ = value;
+          onChanged();
         } else {
-          return connectionsBuilder_.getCount();
+          topologyIdBuilder_.setMessage(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
        */
-      public context.ContextOuterClass.Connection getConnections(int index) {
-        if (connectionsBuilder_ == null) {
-          return connections_.get(index);
+      public Builder setTopologyId(
+          context.ContextOuterClass.TopologyId.Builder builderForValue) {
+        if (topologyIdBuilder_ == null) {
+          topologyId_ = builderForValue.build();
+          onChanged();
         } else {
-          return connectionsBuilder_.getMessage(index);
+          topologyIdBuilder_.setMessage(builderForValue.build());
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
        */
-      public Builder setConnections(
-          int index, context.ContextOuterClass.Connection value) {
-        if (connectionsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
+        if (topologyIdBuilder_ == null) {
+          if (topologyId_ != null) {
+            topologyId_ =
+              context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
+          } else {
+            topologyId_ = value;
           }
-          ensureConnectionsIsMutable();
-          connections_.set(index, value);
           onChanged();
         } else {
-          connectionsBuilder_.setMessage(index, value);
+          topologyIdBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
        */
-      public Builder setConnections(
-          int index, context.ContextOuterClass.Connection.Builder builderForValue) {
-        if (connectionsBuilder_ == null) {
-          ensureConnectionsIsMutable();
-          connections_.set(index, builderForValue.build());
+      public Builder clearTopologyId() {
+        if (topologyIdBuilder_ == null) {
+          topologyId_ = null;
           onChanged();
         } else {
-          connectionsBuilder_.setMessage(index, builderForValue.build());
+          topologyId_ = null;
+          topologyIdBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
        */
-      public Builder addConnections(context.ContextOuterClass.Connection value) {
-        if (connectionsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureConnectionsIsMutable();
-          connections_.add(value);
-          onChanged();
+      public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
+        
+        onChanged();
+        return getTopologyIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.TopologyId topology_id = 1;</code>
+       */
+      public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
+        if (topologyIdBuilder_ != null) {
+          return topologyIdBuilder_.getMessageOrBuilder();
         } else {
-          connectionsBuilder_.addMessage(value);
+          return topologyId_ == null ?
+              context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.TopologyId topology_id = 1;</code>
        */
-      public Builder addConnections(
-          int index, context.ContextOuterClass.Connection value) {
-        if (connectionsBuilder_ == null) {
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.TopologyId, context.ContextOuterClass.TopologyId.Builder, context.ContextOuterClass.TopologyIdOrBuilder> 
+          getTopologyIdFieldBuilder() {
+        if (topologyIdBuilder_ == null) {
+          topologyIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.TopologyId, context.ContextOuterClass.TopologyId.Builder, context.ContextOuterClass.TopologyIdOrBuilder>(
+                  getTopologyId(),
+                  getParentForChildren(),
+                  isClean());
+          topologyId_ = null;
+        }
+        return topologyIdBuilder_;
+      }
+
+      private context.ContextOuterClass.DeviceId deviceId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceIdBuilder_;
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       * @return Whether the deviceId field is set.
+       */
+      public boolean hasDeviceId() {
+        return deviceIdBuilder_ != null || deviceId_ != null;
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       * @return The deviceId.
+       */
+      public context.ContextOuterClass.DeviceId getDeviceId() {
+        if (deviceIdBuilder_ == null) {
+          return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+        } else {
+          return deviceIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public Builder setDeviceId(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureConnectionsIsMutable();
-          connections_.add(index, value);
+          deviceId_ = value;
           onChanged();
         } else {
-          connectionsBuilder_.addMessage(index, value);
+          deviceIdBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.DeviceId device_id = 2;</code>
        */
-      public Builder addConnections(
-          context.ContextOuterClass.Connection.Builder builderForValue) {
-        if (connectionsBuilder_ == null) {
-          ensureConnectionsIsMutable();
-          connections_.add(builderForValue.build());
+      public Builder setDeviceId(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = builderForValue.build();
           onChanged();
         } else {
-          connectionsBuilder_.addMessage(builderForValue.build());
+          deviceIdBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.DeviceId device_id = 2;</code>
        */
-      public Builder addConnections(
-          int index, context.ContextOuterClass.Connection.Builder builderForValue) {
-        if (connectionsBuilder_ == null) {
-          ensureConnectionsIsMutable();
-          connections_.add(index, builderForValue.build());
+      public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdBuilder_ == null) {
+          if (deviceId_ != null) {
+            deviceId_ =
+              context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
+          } else {
+            deviceId_ = value;
+          }
           onChanged();
         } else {
-          connectionsBuilder_.addMessage(index, builderForValue.build());
+          deviceIdBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.DeviceId device_id = 2;</code>
        */
-      public Builder addAllConnections(
-          java.lang.Iterable<? extends context.ContextOuterClass.Connection> values) {
-        if (connectionsBuilder_ == null) {
-          ensureConnectionsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, connections_);
+      public Builder clearDeviceId() {
+        if (deviceIdBuilder_ == null) {
+          deviceId_ = null;
           onChanged();
         } else {
-          connectionsBuilder_.addAllMessages(values);
+          deviceId_ = null;
+          deviceIdBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.DeviceId device_id = 2;</code>
        */
-      public Builder clearConnections() {
-        if (connectionsBuilder_ == null) {
-          connections_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
+      public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
+        
+        onChanged();
+        return getDeviceIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.DeviceId device_id = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
+        if (deviceIdBuilder_ != null) {
+          return deviceIdBuilder_.getMessageOrBuilder();
         } else {
-          connectionsBuilder_.clear();
+          return deviceId_ == null ?
+              context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.DeviceId device_id = 2;</code>
        */
-      public Builder removeConnections(int index) {
-        if (connectionsBuilder_ == null) {
-          ensureConnectionsIsMutable();
-          connections_.remove(index);
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getDeviceIdFieldBuilder() {
+        if (deviceIdBuilder_ == null) {
+          deviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  getDeviceId(),
+                  getParentForChildren(),
+                  isClean());
+          deviceId_ = null;
+        }
+        return deviceIdBuilder_;
+      }
+
+      private context.ContextOuterClass.Uuid endpointUuid_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> endpointUuidBuilder_;
+      /**
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * @return Whether the endpointUuid field is set.
+       */
+      public boolean hasEndpointUuid() {
+        return endpointUuidBuilder_ != null || endpointUuid_ != null;
+      }
+      /**
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * @return The endpointUuid.
+       */
+      public context.ContextOuterClass.Uuid getEndpointUuid() {
+        if (endpointUuidBuilder_ == null) {
+          return endpointUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
+        } else {
+          return endpointUuidBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       */
+      public Builder setEndpointUuid(context.ContextOuterClass.Uuid value) {
+        if (endpointUuidBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          endpointUuid_ = value;
           onChanged();
         } else {
-          connectionsBuilder_.remove(index);
+          endpointUuidBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
        */
-      public context.ContextOuterClass.Connection.Builder getConnectionsBuilder(
-          int index) {
-        return getConnectionsFieldBuilder().getBuilder(index);
+      public Builder setEndpointUuid(
+          context.ContextOuterClass.Uuid.Builder builderForValue) {
+        if (endpointUuidBuilder_ == null) {
+          endpointUuid_ = builderForValue.build();
+          onChanged();
+        } else {
+          endpointUuidBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
        */
-      public context.ContextOuterClass.ConnectionOrBuilder getConnectionsOrBuilder(
-          int index) {
-        if (connectionsBuilder_ == null) {
-          return connections_.get(index);  } else {
-          return connectionsBuilder_.getMessageOrBuilder(index);
+      public Builder mergeEndpointUuid(context.ContextOuterClass.Uuid value) {
+        if (endpointUuidBuilder_ == null) {
+          if (endpointUuid_ != null) {
+            endpointUuid_ =
+              context.ContextOuterClass.Uuid.newBuilder(endpointUuid_).mergeFrom(value).buildPartial();
+          } else {
+            endpointUuid_ = value;
+          }
+          onChanged();
+        } else {
+          endpointUuidBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.ConnectionOrBuilder> 
-           getConnectionsOrBuilderList() {
-        if (connectionsBuilder_ != null) {
-          return connectionsBuilder_.getMessageOrBuilderList();
+      public Builder clearEndpointUuid() {
+        if (endpointUuidBuilder_ == null) {
+          endpointUuid_ = null;
+          onChanged();
         } else {
-          return java.util.Collections.unmodifiableList(connections_);
+          endpointUuid_ = null;
+          endpointUuidBuilder_ = null;
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
        */
-      public context.ContextOuterClass.Connection.Builder addConnectionsBuilder() {
-        return getConnectionsFieldBuilder().addBuilder(
-            context.ContextOuterClass.Connection.getDefaultInstance());
+      public context.ContextOuterClass.Uuid.Builder getEndpointUuidBuilder() {
+        
+        onChanged();
+        return getEndpointUuidFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
        */
-      public context.ContextOuterClass.Connection.Builder addConnectionsBuilder(
-          int index) {
-        return getConnectionsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.Connection.getDefaultInstance());
+      public context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder() {
+        if (endpointUuidBuilder_ != null) {
+          return endpointUuidBuilder_.getMessageOrBuilder();
+        } else {
+          return endpointUuid_ == null ?
+              context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
+        }
       }
       /**
-       * <code>repeated .context.Connection connections = 1;</code>
+       * <code>.context.Uuid endpoint_uuid = 3;</code>
        */
-      public java.util.List<context.ContextOuterClass.Connection.Builder> 
-           getConnectionsBuilderList() {
-        return getConnectionsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder> 
-          getConnectionsFieldBuilder() {
-        if (connectionsBuilder_ == null) {
-          connectionsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder>(
-                  connections_,
-                  ((bitField0_ & 0x00000001) != 0),
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
+          getEndpointUuidFieldBuilder() {
+        if (endpointUuidBuilder_ == null) {
+          endpointUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
+                  getEndpointUuid(),
                   getParentForChildren(),
                   isClean());
-          connections_ = null;
+          endpointUuid_ = null;
         }
-        return connectionsBuilder_;
+        return endpointUuidBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -49560,100 +54465,156 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionList)
+      // @@protoc_insertion_point(builder_scope:context.EndPointId)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionList)
-    private static final context.ContextOuterClass.ConnectionList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.EndPointId)
+    private static final context.ContextOuterClass.EndPointId DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointId();
     }
 
-    public static context.ContextOuterClass.ConnectionList getDefaultInstance() {
+    public static context.ContextOuterClass.EndPointId getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionList>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionList>() {
+    private static final com.google.protobuf.Parser<EndPointId>
+        PARSER = new com.google.protobuf.AbstractParser<EndPointId>() {
       @java.lang.Override
-      public ConnectionList parsePartialFrom(
+      public EndPointId parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionList(input, extensionRegistry);
+        return new EndPointId(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionList> parser() {
+    public static com.google.protobuf.Parser<EndPointId> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionList> getParserForType() {
+    public com.google.protobuf.Parser<EndPointId> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionList getDefaultInstanceForType() {
+    public context.ContextOuterClass.EndPointId getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConnectionEventOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConnectionEvent)
+  public interface EndPointOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.EndPoint)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
-    boolean hasEvent();
+    boolean hasEndpointId();
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
-    context.ContextOuterClass.Event getEvent();
+    context.ContextOuterClass.EndPointId getEndpointId();
     /**
-     * <code>.context.Event event = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
-    context.ContextOuterClass.EventOrBuilder getEventOrBuilder();
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    java.lang.String getName();
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <code>string endpoint_type = 3;</code>
+     * @return The endpointType.
+     */
+    java.lang.String getEndpointType();
+    /**
+     * <code>string endpoint_type = 3;</code>
+     * @return The bytes for endpointType.
+     */
+    com.google.protobuf.ByteString
+        getEndpointTypeBytes();
+
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @return A list containing the kpiSampleTypes.
+     */
+    java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList();
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @return The count of kpiSampleTypes.
+     */
+    int getKpiSampleTypesCount();
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @param index The index of the element to return.
+     * @return The kpiSampleTypes at the given index.
+     */
+    kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index);
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+     */
+    java.util.List<java.lang.Integer>
+    getKpiSampleTypesValueList();
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+     */
+    int getKpiSampleTypesValue(int index);
 
     /**
-     * <code>.context.ConnectionId connection_id = 2;</code>
-     * @return Whether the connectionId field is set.
+     * <code>.context.Location endpoint_location = 5;</code>
+     * @return Whether the endpointLocation field is set.
      */
-    boolean hasConnectionId();
+    boolean hasEndpointLocation();
     /**
-     * <code>.context.ConnectionId connection_id = 2;</code>
-     * @return The connectionId.
+     * <code>.context.Location endpoint_location = 5;</code>
+     * @return The endpointLocation.
      */
-    context.ContextOuterClass.ConnectionId getConnectionId();
+    context.ContextOuterClass.Location getEndpointLocation();
     /**
-     * <code>.context.ConnectionId connection_id = 2;</code>
+     * <code>.context.Location endpoint_location = 5;</code>
      */
-    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder();
+    context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder();
   }
   /**
-   * Protobuf type {@code context.ConnectionEvent}
+   * Protobuf type {@code context.EndPoint}
    */
-  public static final class ConnectionEvent extends
+  public static final class EndPoint extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConnectionEvent)
-      ConnectionEventOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.EndPoint)
+      EndPointOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConnectionEvent.newBuilder() to construct.
-    private ConnectionEvent(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use EndPoint.newBuilder() to construct.
+    private EndPoint(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConnectionEvent() {
+    private EndPoint() {
+      name_ = "";
+      endpointType_ = "";
+      kpiSampleTypes_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConnectionEvent();
+      return new EndPoint();
     }
 
     @java.lang.Override
@@ -49661,7 +54622,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConnectionEvent(
+    private EndPoint(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -49669,6 +54630,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -49680,27 +54642,62 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.Event.Builder subBuilder = null;
-              if (event_ != null) {
-                subBuilder = event_.toBuilder();
+              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+              if (endpointId_ != null) {
+                subBuilder = endpointId_.toBuilder();
               }
-              event_ = input.readMessage(context.ContextOuterClass.Event.parser(), extensionRegistry);
+              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(event_);
-                event_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(endpointId_);
+                endpointId_ = subBuilder.buildPartial();
               }
 
               break;
             }
             case 18: {
-              context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
-              if (connectionId_ != null) {
-                subBuilder = connectionId_.toBuilder();
+              java.lang.String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 26: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              endpointType_ = s;
+              break;
+            }
+            case 32: {
+              int rawValue = input.readEnum();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>();
+                mutable_bitField0_ |= 0x00000001;
               }
-              connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+              kpiSampleTypes_.add(rawValue);
+              break;
+            }
+            case 34: {
+              int length = input.readRawVarint32();
+              int oldLimit = input.pushLimit(length);
+              while(input.getBytesUntilLimit() > 0) {
+                int rawValue = input.readEnum();
+                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                  kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>();
+                  mutable_bitField0_ |= 0x00000001;
+                }
+                kpiSampleTypes_.add(rawValue);
+              }
+              input.popLimit(oldLimit);
+              break;
+            }
+            case 42: {
+              context.ContextOuterClass.Location.Builder subBuilder = null;
+              if (endpointLocation_ != null) {
+                subBuilder = endpointLocation_.toBuilder();
+              }
+              endpointLocation_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(connectionId_);
-                connectionId_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(endpointLocation_);
+                endpointLocation_ = subBuilder.buildPartial();
               }
 
               break;
@@ -49720,73 +54717,210 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
+      return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConnectionEvent_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_EndPoint_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConnectionEvent.class, context.ContextOuterClass.ConnectionEvent.Builder.class);
+              context.ContextOuterClass.EndPoint.class, context.ContextOuterClass.EndPoint.Builder.class);
     }
 
-    public static final int EVENT_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.Event event_;
+    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.EndPointId endpointId_;
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return Whether the event field is set.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
     @java.lang.Override
-    public boolean hasEvent() {
-      return event_ != null;
+    public boolean hasEndpointId() {
+      return endpointId_ != null;
     }
     /**
-     * <code>.context.Event event = 1;</code>
-     * @return The event.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Event getEvent() {
-      return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+    public context.ContextOuterClass.EndPointId getEndpointId() {
+      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
     }
     /**
-     * <code>.context.Event event = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-      return getEvent();
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+      return getEndpointId();
     }
 
-    public static final int CONNECTION_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.ConnectionId connectionId_;
+    public static final int NAME_FIELD_NUMBER = 2;
+    private volatile java.lang.Object name_;
     /**
-     * <code>.context.ConnectionId connection_id = 2;</code>
-     * @return Whether the connectionId field is set.
+     * <code>string name = 2;</code>
+     * @return The name.
      */
     @java.lang.Override
-    public boolean hasConnectionId() {
-      return connectionId_ != null;
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
     }
     /**
-     * <code>.context.ConnectionId connection_id = 2;</code>
-     * @return The connectionId.
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionId getConnectionId() {
-      return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
+
+    public static final int ENDPOINT_TYPE_FIELD_NUMBER = 3;
+    private volatile java.lang.Object endpointType_;
     /**
-     * <code>.context.ConnectionId connection_id = 2;</code>
+     * <code>string endpoint_type = 3;</code>
+     * @return The endpointType.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-      return getConnectionId();
+    public java.lang.String getEndpointType() {
+      java.lang.Object ref = endpointType_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        endpointType_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string endpoint_type = 3;</code>
+     * @return The bytes for endpointType.
+     */
+    @java.lang.Override
+    public com.google.protobuf.ByteString
+        getEndpointTypeBytes() {
+      java.lang.Object ref = endpointType_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        endpointType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int KPI_SAMPLE_TYPES_FIELD_NUMBER = 4;
+    private java.util.List<java.lang.Integer> kpiSampleTypes_;
+    private static final com.google.protobuf.Internal.ListAdapter.Converter<
+        java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType> kpiSampleTypes_converter_ =
+            new com.google.protobuf.Internal.ListAdapter.Converter<
+                java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>() {
+              public kpi_sample_types.KpiSampleTypes.KpiSampleType convert(java.lang.Integer from) {
+                @SuppressWarnings("deprecation")
+                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(from);
+                return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
+              }
+            };
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @return A list containing the kpiSampleTypes.
+     */
+    @java.lang.Override
+    public java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList() {
+      return new com.google.protobuf.Internal.ListAdapter<
+          java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>(kpiSampleTypes_, kpiSampleTypes_converter_);
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @return The count of kpiSampleTypes.
+     */
+    @java.lang.Override
+    public int getKpiSampleTypesCount() {
+      return kpiSampleTypes_.size();
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @param index The index of the element to return.
+     * @return The kpiSampleTypes at the given index.
+     */
+    @java.lang.Override
+    public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
+      return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Integer>
+    getKpiSampleTypesValueList() {
+      return kpiSampleTypes_;
+    }
+    /**
+     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+     */
+    @java.lang.Override
+    public int getKpiSampleTypesValue(int index) {
+      return kpiSampleTypes_.get(index);
+    }
+    private int kpiSampleTypesMemoizedSerializedSize;
+
+    public static final int ENDPOINT_LOCATION_FIELD_NUMBER = 5;
+    private context.ContextOuterClass.Location endpointLocation_;
+    /**
+     * <code>.context.Location endpoint_location = 5;</code>
+     * @return Whether the endpointLocation field is set.
+     */
+    @java.lang.Override
+    public boolean hasEndpointLocation() {
+      return endpointLocation_ != null;
+    }
+    /**
+     * <code>.context.Location endpoint_location = 5;</code>
+     * @return The endpointLocation.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Location getEndpointLocation() {
+      return endpointLocation_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
+    }
+    /**
+     * <code>.context.Location endpoint_location = 5;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder() {
+      return getEndpointLocation();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -49803,11 +54937,25 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (event_ != null) {
-        output.writeMessage(1, getEvent());
+      getSerializedSize();
+      if (endpointId_ != null) {
+        output.writeMessage(1, getEndpointId());
       }
-      if (connectionId_ != null) {
-        output.writeMessage(2, getConnectionId());
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+      }
+      if (!getEndpointTypeBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointType_);
+      }
+      if (getKpiSampleTypesList().size() > 0) {
+        output.writeUInt32NoTag(34);
+        output.writeUInt32NoTag(kpiSampleTypesMemoizedSerializedSize);
+      }
+      for (int i = 0; i < kpiSampleTypes_.size(); i++) {
+        output.writeEnumNoTag(kpiSampleTypes_.get(i));
+      }
+      if (endpointLocation_ != null) {
+        output.writeMessage(5, getEndpointLocation());
       }
       unknownFields.writeTo(output);
     }
@@ -49818,13 +54966,31 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (event_ != null) {
+      if (endpointId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEvent());
+          .computeMessageSize(1, getEndpointId());
       }
-      if (connectionId_ != null) {
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+      }
+      if (!getEndpointTypeBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointType_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < kpiSampleTypes_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeEnumSizeNoTag(kpiSampleTypes_.get(i));
+        }
+        size += dataSize;
+        if (!getKpiSampleTypesList().isEmpty()) {  size += 1;
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32SizeNoTag(dataSize);
+        }kpiSampleTypesMemoizedSerializedSize = dataSize;
+      }
+      if (endpointLocation_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getConnectionId());
+          .computeMessageSize(5, getEndpointLocation());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -49836,20 +55002,25 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConnectionEvent)) {
+      if (!(obj instanceof context.ContextOuterClass.EndPoint)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConnectionEvent other = (context.ContextOuterClass.ConnectionEvent) obj;
+      context.ContextOuterClass.EndPoint other = (context.ContextOuterClass.EndPoint) obj;
 
-      if (hasEvent() != other.hasEvent()) return false;
-      if (hasEvent()) {
-        if (!getEvent()
-            .equals(other.getEvent())) return false;
+      if (hasEndpointId() != other.hasEndpointId()) return false;
+      if (hasEndpointId()) {
+        if (!getEndpointId()
+            .equals(other.getEndpointId())) return false;
       }
-      if (hasConnectionId() != other.hasConnectionId()) return false;
-      if (hasConnectionId()) {
-        if (!getConnectionId()
-            .equals(other.getConnectionId())) return false;
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (!getEndpointType()
+          .equals(other.getEndpointType())) return false;
+      if (!kpiSampleTypes_.equals(other.kpiSampleTypes_)) return false;
+      if (hasEndpointLocation() != other.hasEndpointLocation()) return false;
+      if (hasEndpointLocation()) {
+        if (!getEndpointLocation()
+            .equals(other.getEndpointLocation())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -49862,82 +55033,90 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEvent()) {
-        hash = (37 * hash) + EVENT_FIELD_NUMBER;
-        hash = (53 * hash) + getEvent().hashCode();
+      if (hasEndpointId()) {
+        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointId().hashCode();
       }
-      if (hasConnectionId()) {
-        hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getConnectionId().hashCode();
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getEndpointType().hashCode();
+      if (getKpiSampleTypesCount() > 0) {
+        hash = (37 * hash) + KPI_SAMPLE_TYPES_FIELD_NUMBER;
+        hash = (53 * hash) + kpiSampleTypes_.hashCode();
+      }
+      if (hasEndpointLocation()) {
+        hash = (37 * hash) + ENDPOINT_LOCATION_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointLocation().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(byte[] data)
+    public static context.ContextOuterClass.EndPoint parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPoint parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPoint parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseDelimitedFrom(
+    public static context.ContextOuterClass.EndPoint parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConnectionEvent parseFrom(
+    public static context.ContextOuterClass.EndPoint parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -49950,7 +55129,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConnectionEvent prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.EndPoint prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -49966,26 +55145,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConnectionEvent}
+     * Protobuf type {@code context.EndPoint}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConnectionEvent)
-        context.ContextOuterClass.ConnectionEventOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.EndPoint)
+        context.ContextOuterClass.EndPointOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConnectionEvent_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_EndPoint_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConnectionEvent.class, context.ContextOuterClass.ConnectionEvent.Builder.class);
+                context.ContextOuterClass.EndPoint.class, context.ContextOuterClass.EndPoint.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConnectionEvent.newBuilder()
+      // Construct using context.ContextOuterClass.EndPoint.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -50003,17 +55182,23 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (eventBuilder_ == null) {
-          event_ = null;
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
         } else {
-          event_ = null;
-          eventBuilder_ = null;
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
         }
-        if (connectionIdBuilder_ == null) {
-          connectionId_ = null;
+        name_ = "";
+
+        endpointType_ = "";
+
+        kpiSampleTypes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        if (endpointLocationBuilder_ == null) {
+          endpointLocation_ = null;
         } else {
-          connectionId_ = null;
-          connectionIdBuilder_ = null;
+          endpointLocation_ = null;
+          endpointLocationBuilder_ = null;
         }
         return this;
       }
@@ -50021,17 +55206,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConnectionEvent_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionEvent getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConnectionEvent.getDefaultInstance();
+      public context.ContextOuterClass.EndPoint getDefaultInstanceForType() {
+        return context.ContextOuterClass.EndPoint.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionEvent build() {
-        context.ContextOuterClass.ConnectionEvent result = buildPartial();
+      public context.ContextOuterClass.EndPoint build() {
+        context.ContextOuterClass.EndPoint result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -50039,17 +55224,25 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConnectionEvent buildPartial() {
-        context.ContextOuterClass.ConnectionEvent result = new context.ContextOuterClass.ConnectionEvent(this);
-        if (eventBuilder_ == null) {
-          result.event_ = event_;
+      public context.ContextOuterClass.EndPoint buildPartial() {
+        context.ContextOuterClass.EndPoint result = new context.ContextOuterClass.EndPoint(this);
+        int from_bitField0_ = bitField0_;
+        if (endpointIdBuilder_ == null) {
+          result.endpointId_ = endpointId_;
         } else {
-          result.event_ = eventBuilder_.build();
+          result.endpointId_ = endpointIdBuilder_.build();
         }
-        if (connectionIdBuilder_ == null) {
-          result.connectionId_ = connectionId_;
+        result.name_ = name_;
+        result.endpointType_ = endpointType_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.kpiSampleTypes_ = kpiSampleTypes_;
+        if (endpointLocationBuilder_ == null) {
+          result.endpointLocation_ = endpointLocation_;
         } else {
-          result.connectionId_ = connectionIdBuilder_.build();
+          result.endpointLocation_ = endpointLocationBuilder_.build();
         }
         onBuilt();
         return result;
@@ -50089,21 +55282,39 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionEvent) {
-          return mergeFrom((context.ContextOuterClass.ConnectionEvent)other);
+        if (other instanceof context.ContextOuterClass.EndPoint) {
+          return mergeFrom((context.ContextOuterClass.EndPoint)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionEvent other) {
-        if (other == context.ContextOuterClass.ConnectionEvent.getDefaultInstance()) return this;
-        if (other.hasEvent()) {
-          mergeEvent(other.getEvent());
+      public Builder mergeFrom(context.ContextOuterClass.EndPoint other) {
+        if (other == context.ContextOuterClass.EndPoint.getDefaultInstance()) return this;
+        if (other.hasEndpointId()) {
+          mergeEndpointId(other.getEndpointId());
+        }
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (!other.getEndpointType().isEmpty()) {
+          endpointType_ = other.endpointType_;
+          onChanged();
+        }
+        if (!other.kpiSampleTypes_.isEmpty()) {
+          if (kpiSampleTypes_.isEmpty()) {
+            kpiSampleTypes_ = other.kpiSampleTypes_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureKpiSampleTypesIsMutable();
+            kpiSampleTypes_.addAll(other.kpiSampleTypes_);
+          }
+          onChanged();
         }
-        if (other.hasConnectionId()) {
-          mergeConnectionId(other.getConnectionId());
+        if (other.hasEndpointLocation()) {
+          mergeEndpointLocation(other.getEndpointLocation());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -50120,11 +55331,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConnectionEvent parsedMessage = null;
+        context.ContextOuterClass.EndPoint parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionEvent) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.EndPoint) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -50133,243 +55344,536 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
 
-      private context.ContextOuterClass.Event event_;
+      private context.ContextOuterClass.EndPointId endpointId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return Whether the event field is set.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return Whether the endpointId field is set.
        */
-      public boolean hasEvent() {
-        return eventBuilder_ != null || event_ != null;
+      public boolean hasEndpointId() {
+        return endpointIdBuilder_ != null || endpointId_ != null;
       }
       /**
-       * <code>.context.Event event = 1;</code>
-       * @return The event.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return The endpointId.
        */
-      public context.ContextOuterClass.Event getEvent() {
-        if (eventBuilder_ == null) {
-          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+      public context.ContextOuterClass.EndPointId getEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         } else {
-          return eventBuilder_.getMessage();
+          return endpointIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
+      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          event_ = value;
+          endpointId_ = value;
           onChanged();
         } else {
-          eventBuilder_.setMessage(value);
+          endpointIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setEvent(
-          context.ContextOuterClass.Event.Builder builderForValue) {
-        if (eventBuilder_ == null) {
-          event_ = builderForValue.build();
+      public Builder setEndpointId(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = builderForValue.build();
           onChanged();
         } else {
-          eventBuilder_.setMessage(builderForValue.build());
+          endpointIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder mergeEvent(context.ContextOuterClass.Event value) {
-        if (eventBuilder_ == null) {
-          if (event_ != null) {
-            event_ =
-              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
+      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (endpointId_ != null) {
+            endpointId_ =
+              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
           } else {
-            event_ = value;
+            endpointId_ = value;
           }
           onChanged();
         } else {
-          eventBuilder_.mergeFrom(value);
+          endpointIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder clearEvent() {
-        if (eventBuilder_ == null) {
-          event_ = null;
+      public Builder clearEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
           onChanged();
         } else {
-          event_ = null;
-          eventBuilder_ = null;
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public context.ContextOuterClass.Event.Builder getEventBuilder() {
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
         
         onChanged();
-        return getEventFieldBuilder().getBuilder();
+        return getEndpointIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
-        if (eventBuilder_ != null) {
-          return eventBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+        if (endpointIdBuilder_ != null) {
+          return endpointIdBuilder_.getMessageOrBuilder();
         } else {
-          return event_ == null ?
-              context.ContextOuterClass.Event.getDefaultInstance() : event_;
+          return endpointId_ == null ?
+              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         }
       }
       /**
-       * <code>.context.Event event = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
-          getEventFieldBuilder() {
-        if (eventBuilder_ == null) {
-          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
-                  getEvent(),
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdFieldBuilder() {
+        if (endpointIdBuilder_ == null) {
+          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  getEndpointId(),
                   getParentForChildren(),
                   isClean());
-          event_ = null;
+          endpointId_ = null;
         }
-        return eventBuilder_;
+        return endpointIdBuilder_;
       }
 
-      private context.ContextOuterClass.ConnectionId connectionId_;
+      private java.lang.Object name_ = "";
+      /**
+       * <code>string name = 2;</code>
+       * @return The name.
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @return The bytes for name.
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @param value The name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       * @param value The bytes for name to set.
+       * @return This builder for chaining.
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object endpointType_ = "";
+      /**
+       * <code>string endpoint_type = 3;</code>
+       * @return The endpointType.
+       */
+      public java.lang.String getEndpointType() {
+        java.lang.Object ref = endpointType_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          endpointType_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string endpoint_type = 3;</code>
+       * @return The bytes for endpointType.
+       */
+      public com.google.protobuf.ByteString
+          getEndpointTypeBytes() {
+        java.lang.Object ref = endpointType_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          endpointType_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string endpoint_type = 3;</code>
+       * @param value The endpointType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEndpointType(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        endpointType_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string endpoint_type = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearEndpointType() {
+        
+        endpointType_ = getDefaultInstance().getEndpointType();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string endpoint_type = 3;</code>
+       * @param value The bytes for endpointType to set.
+       * @return This builder for chaining.
+       */
+      public Builder setEndpointTypeBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        endpointType_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.util.List<java.lang.Integer> kpiSampleTypes_ =
+        java.util.Collections.emptyList();
+      private void ensureKpiSampleTypesIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>(kpiSampleTypes_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @return A list containing the kpiSampleTypes.
+       */
+      public java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList() {
+        return new com.google.protobuf.Internal.ListAdapter<
+            java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>(kpiSampleTypes_, kpiSampleTypes_converter_);
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @return The count of kpiSampleTypes.
+       */
+      public int getKpiSampleTypesCount() {
+        return kpiSampleTypes_.size();
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param index The index of the element to return.
+       * @return The kpiSampleTypes at the given index.
+       */
+      public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
+        return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param index The index to set the value at.
+       * @param value The kpiSampleTypes to set.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiSampleTypes(
+          int index, kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.set(index, value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param value The kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addKpiSampleTypes(kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.add(value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param values The kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllKpiSampleTypes(
+          java.lang.Iterable<? extends kpi_sample_types.KpiSampleTypes.KpiSampleType> values) {
+        ensureKpiSampleTypesIsMutable();
+        for (kpi_sample_types.KpiSampleTypes.KpiSampleType value : values) {
+          kpiSampleTypes_.add(value.getNumber());
+        }
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearKpiSampleTypes() {
+        kpiSampleTypes_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+       */
+      public java.util.List<java.lang.Integer>
+      getKpiSampleTypesValueList() {
+        return java.util.Collections.unmodifiableList(kpiSampleTypes_);
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+       */
+      public int getKpiSampleTypesValue(int index) {
+        return kpiSampleTypes_.get(index);
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+       * @return This builder for chaining.
+       */
+      public Builder setKpiSampleTypesValue(
+          int index, int value) {
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.set(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param value The enum numeric value on the wire for kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addKpiSampleTypesValue(int value) {
+        ensureKpiSampleTypesIsMutable();
+        kpiSampleTypes_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
+       * @param values The enum numeric values on the wire for kpiSampleTypes to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllKpiSampleTypesValue(
+          java.lang.Iterable<java.lang.Integer> values) {
+        ensureKpiSampleTypesIsMutable();
+        for (int value : values) {
+          kpiSampleTypes_.add(value);
+        }
+        onChanged();
+        return this;
+      }
+
+      private context.ContextOuterClass.Location endpointLocation_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdBuilder_;
+          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> endpointLocationBuilder_;
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
-       * @return Whether the connectionId field is set.
+       * <code>.context.Location endpoint_location = 5;</code>
+       * @return Whether the endpointLocation field is set.
        */
-      public boolean hasConnectionId() {
-        return connectionIdBuilder_ != null || connectionId_ != null;
+      public boolean hasEndpointLocation() {
+        return endpointLocationBuilder_ != null || endpointLocation_ != null;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
-       * @return The connectionId.
+       * <code>.context.Location endpoint_location = 5;</code>
+       * @return The endpointLocation.
        */
-      public context.ContextOuterClass.ConnectionId getConnectionId() {
-        if (connectionIdBuilder_ == null) {
-          return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+      public context.ContextOuterClass.Location getEndpointLocation() {
+        if (endpointLocationBuilder_ == null) {
+          return endpointLocation_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
         } else {
-          return connectionIdBuilder_.getMessage();
+          return endpointLocationBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
-      public Builder setConnectionId(context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdBuilder_ == null) {
+      public Builder setEndpointLocation(context.ContextOuterClass.Location value) {
+        if (endpointLocationBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          connectionId_ = value;
+          endpointLocation_ = value;
           onChanged();
         } else {
-          connectionIdBuilder_.setMessage(value);
+          endpointLocationBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
-      public Builder setConnectionId(
-          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
-        if (connectionIdBuilder_ == null) {
-          connectionId_ = builderForValue.build();
+      public Builder setEndpointLocation(
+          context.ContextOuterClass.Location.Builder builderForValue) {
+        if (endpointLocationBuilder_ == null) {
+          endpointLocation_ = builderForValue.build();
           onChanged();
         } else {
-          connectionIdBuilder_.setMessage(builderForValue.build());
+          endpointLocationBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
-      public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
-        if (connectionIdBuilder_ == null) {
-          if (connectionId_ != null) {
-            connectionId_ =
-              context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
+      public Builder mergeEndpointLocation(context.ContextOuterClass.Location value) {
+        if (endpointLocationBuilder_ == null) {
+          if (endpointLocation_ != null) {
+            endpointLocation_ =
+              context.ContextOuterClass.Location.newBuilder(endpointLocation_).mergeFrom(value).buildPartial();
           } else {
-            connectionId_ = value;
+            endpointLocation_ = value;
           }
           onChanged();
         } else {
-          connectionIdBuilder_.mergeFrom(value);
+          endpointLocationBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
-      public Builder clearConnectionId() {
-        if (connectionIdBuilder_ == null) {
-          connectionId_ = null;
+      public Builder clearEndpointLocation() {
+        if (endpointLocationBuilder_ == null) {
+          endpointLocation_ = null;
           onChanged();
         } else {
-          connectionId_ = null;
-          connectionIdBuilder_ = null;
+          endpointLocation_ = null;
+          endpointLocationBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
-      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
+      public context.ContextOuterClass.Location.Builder getEndpointLocationBuilder() {
         
         onChanged();
-        return getConnectionIdFieldBuilder().getBuilder();
+        return getEndpointLocationFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
-      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
-        if (connectionIdBuilder_ != null) {
-          return connectionIdBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder() {
+        if (endpointLocationBuilder_ != null) {
+          return endpointLocationBuilder_.getMessageOrBuilder();
         } else {
-          return connectionId_ == null ?
-              context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+          return endpointLocation_ == null ?
+              context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
         }
       }
       /**
-       * <code>.context.ConnectionId connection_id = 2;</code>
+       * <code>.context.Location endpoint_location = 5;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> 
-          getConnectionIdFieldBuilder() {
-        if (connectionIdBuilder_ == null) {
-          connectionIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder>(
-                  getConnectionId(),
+          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> 
+          getEndpointLocationFieldBuilder() {
+        if (endpointLocationBuilder_ == null) {
+          endpointLocationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder>(
+                  getEndpointLocation(),
                   getParentForChildren(),
                   isClean());
-          connectionId_ = null;
+          endpointLocation_ = null;
         }
-        return connectionIdBuilder_;
+        return endpointLocationBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -50384,119 +55888,124 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConnectionEvent)
+      // @@protoc_insertion_point(builder_scope:context.EndPoint)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConnectionEvent)
-    private static final context.ContextOuterClass.ConnectionEvent DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.EndPoint)
+    private static final context.ContextOuterClass.EndPoint DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConnectionEvent();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPoint();
     }
 
-    public static context.ContextOuterClass.ConnectionEvent getDefaultInstance() {
+    public static context.ContextOuterClass.EndPoint getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConnectionEvent>
-        PARSER = new com.google.protobuf.AbstractParser<ConnectionEvent>() {
+    private static final com.google.protobuf.Parser<EndPoint>
+        PARSER = new com.google.protobuf.AbstractParser<EndPoint>() {
       @java.lang.Override
-      public ConnectionEvent parsePartialFrom(
+      public EndPoint parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConnectionEvent(input, extensionRegistry);
+        return new EndPoint(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConnectionEvent> parser() {
+    public static com.google.protobuf.Parser<EndPoint> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConnectionEvent> getParserForType() {
+    public com.google.protobuf.Parser<EndPoint> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConnectionEvent getDefaultInstanceForType() {
+    public context.ContextOuterClass.EndPoint getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface EndPointIdOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.EndPointId)
+  public interface EndPointNameOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.EndPointName)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.TopologyId topology_id = 1;</code>
-     * @return Whether the topologyId field is set.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
-    boolean hasTopologyId();
+    boolean hasEndpointId();
     /**
-     * <code>.context.TopologyId topology_id = 1;</code>
-     * @return The topologyId.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
-    context.ContextOuterClass.TopologyId getTopologyId();
+    context.ContextOuterClass.EndPointId getEndpointId();
     /**
-     * <code>.context.TopologyId topology_id = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
-    context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder();
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
 
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return Whether the deviceId field is set.
+     * <code>string device_name = 2;</code>
+     * @return The deviceName.
      */
-    boolean hasDeviceId();
+    java.lang.String getDeviceName();
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return The deviceId.
+     * <code>string device_name = 2;</code>
+     * @return The bytes for deviceName.
      */
-    context.ContextOuterClass.DeviceId getDeviceId();
+    com.google.protobuf.ByteString
+        getDeviceNameBytes();
+
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
+     * <code>string endpoint_name = 3;</code>
+     * @return The endpointName.
      */
-    context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder();
-
+    java.lang.String getEndpointName();
     /**
-     * <code>.context.Uuid endpoint_uuid = 3;</code>
-     * @return Whether the endpointUuid field is set.
+     * <code>string endpoint_name = 3;</code>
+     * @return The bytes for endpointName.
      */
-    boolean hasEndpointUuid();
+    com.google.protobuf.ByteString
+        getEndpointNameBytes();
+
     /**
-     * <code>.context.Uuid endpoint_uuid = 3;</code>
-     * @return The endpointUuid.
+     * <code>string endpoint_type = 4;</code>
+     * @return The endpointType.
      */
-    context.ContextOuterClass.Uuid getEndpointUuid();
+    java.lang.String getEndpointType();
     /**
-     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     * <code>string endpoint_type = 4;</code>
+     * @return The bytes for endpointType.
      */
-    context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder();
+    com.google.protobuf.ByteString
+        getEndpointTypeBytes();
   }
   /**
-   * <pre>
-   * ----- Endpoint ------------------------------------------------------------------------------------------------------
-   * </pre>
-   *
-   * Protobuf type {@code context.EndPointId}
+   * Protobuf type {@code context.EndPointName}
    */
-  public static final class EndPointId extends
+  public static final class EndPointName extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.EndPointId)
-      EndPointIdOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.EndPointName)
+      EndPointNameOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use EndPointId.newBuilder() to construct.
-    private EndPointId(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use EndPointName.newBuilder() to construct.
+    private EndPointName(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private EndPointId() {
+    private EndPointName() {
+      deviceName_ = "";
+      endpointName_ = "";
+      endpointType_ = "";
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new EndPointId();
+      return new EndPointName();
     }
 
     @java.lang.Override
@@ -50504,7 +56013,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private EndPointId(
+    private EndPointName(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -50523,42 +56032,34 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.TopologyId.Builder subBuilder = null;
-              if (topologyId_ != null) {
-                subBuilder = topologyId_.toBuilder();
+              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+              if (endpointId_ != null) {
+                subBuilder = endpointId_.toBuilder();
               }
-              topologyId_ = input.readMessage(context.ContextOuterClass.TopologyId.parser(), extensionRegistry);
+              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(topologyId_);
-                topologyId_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(endpointId_);
+                endpointId_ = subBuilder.buildPartial();
               }
 
               break;
             }
             case 18: {
-              context.ContextOuterClass.DeviceId.Builder subBuilder = null;
-              if (deviceId_ != null) {
-                subBuilder = deviceId_.toBuilder();
-              }
-              deviceId_ = input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(deviceId_);
-                deviceId_ = subBuilder.buildPartial();
-              }
+              java.lang.String s = input.readStringRequireUtf8();
 
+              deviceName_ = s;
               break;
             }
             case 26: {
-              context.ContextOuterClass.Uuid.Builder subBuilder = null;
-              if (endpointUuid_ != null) {
-                subBuilder = endpointUuid_.toBuilder();
-              }
-              endpointUuid_ = input.readMessage(context.ContextOuterClass.Uuid.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointUuid_);
-                endpointUuid_ = subBuilder.buildPartial();
-              }
+              java.lang.String s = input.readStringRequireUtf8();
+
+              endpointName_ = s;
+              break;
+            }
+            case 34: {
+              java.lang.String s = input.readStringRequireUtf8();
 
+              endpointType_ = s;
               break;
             }
             default: {
@@ -50582,93 +56083,155 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
+      return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_EndPointId_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_EndPointName_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.EndPointId.class, context.ContextOuterClass.EndPointId.Builder.class);
+              context.ContextOuterClass.EndPointName.class, context.ContextOuterClass.EndPointName.Builder.class);
     }
 
-    public static final int TOPOLOGY_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.TopologyId topologyId_;
+    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.EndPointId endpointId_;
     /**
-     * <code>.context.TopologyId topology_id = 1;</code>
-     * @return Whether the topologyId field is set.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
     @java.lang.Override
-    public boolean hasTopologyId() {
-      return topologyId_ != null;
+    public boolean hasEndpointId() {
+      return endpointId_ != null;
     }
     /**
-     * <code>.context.TopologyId topology_id = 1;</code>
-     * @return The topologyId.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
     @java.lang.Override
-    public context.ContextOuterClass.TopologyId getTopologyId() {
-      return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+    public context.ContextOuterClass.EndPointId getEndpointId() {
+      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
     }
     /**
-     * <code>.context.TopologyId topology_id = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-      return getTopologyId();
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+      return getEndpointId();
     }
 
-    public static final int DEVICE_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.DeviceId deviceId_;
+    public static final int DEVICE_NAME_FIELD_NUMBER = 2;
+    private volatile java.lang.Object deviceName_;
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return Whether the deviceId field is set.
+     * <code>string device_name = 2;</code>
+     * @return The deviceName.
      */
     @java.lang.Override
-    public boolean hasDeviceId() {
-      return deviceId_ != null;
+    public java.lang.String getDeviceName() {
+      java.lang.Object ref = deviceName_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        deviceName_ = s;
+        return s;
+      }
     }
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
-     * @return The deviceId.
+     * <code>string device_name = 2;</code>
+     * @return The bytes for deviceName.
      */
     @java.lang.Override
-    public context.ContextOuterClass.DeviceId getDeviceId() {
-      return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+    public com.google.protobuf.ByteString
+        getDeviceNameBytes() {
+      java.lang.Object ref = deviceName_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        deviceName_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
+
+    public static final int ENDPOINT_NAME_FIELD_NUMBER = 3;
+    private volatile java.lang.Object endpointName_;
     /**
-     * <code>.context.DeviceId device_id = 2;</code>
+     * <code>string endpoint_name = 3;</code>
+     * @return The endpointName.
      */
     @java.lang.Override
-    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-      return getDeviceId();
+    public java.lang.String getEndpointName() {
+      java.lang.Object ref = endpointName_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        endpointName_ = s;
+        return s;
+      }
     }
-
-    public static final int ENDPOINT_UUID_FIELD_NUMBER = 3;
-    private context.ContextOuterClass.Uuid endpointUuid_;
     /**
-     * <code>.context.Uuid endpoint_uuid = 3;</code>
-     * @return Whether the endpointUuid field is set.
+     * <code>string endpoint_name = 3;</code>
+     * @return The bytes for endpointName.
      */
     @java.lang.Override
-    public boolean hasEndpointUuid() {
-      return endpointUuid_ != null;
+    public com.google.protobuf.ByteString
+        getEndpointNameBytes() {
+      java.lang.Object ref = endpointName_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        endpointName_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
+
+    public static final int ENDPOINT_TYPE_FIELD_NUMBER = 4;
+    private volatile java.lang.Object endpointType_;
     /**
-     * <code>.context.Uuid endpoint_uuid = 3;</code>
-     * @return The endpointUuid.
+     * <code>string endpoint_type = 4;</code>
+     * @return The endpointType.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Uuid getEndpointUuid() {
-      return endpointUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
+    public java.lang.String getEndpointType() {
+      java.lang.Object ref = endpointType_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        endpointType_ = s;
+        return s;
+      }
     }
     /**
-     * <code>.context.Uuid endpoint_uuid = 3;</code>
+     * <code>string endpoint_type = 4;</code>
+     * @return The bytes for endpointType.
      */
     @java.lang.Override
-    public context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder() {
-      return getEndpointUuid();
+    public com.google.protobuf.ByteString
+        getEndpointTypeBytes() {
+      java.lang.Object ref = endpointType_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        endpointType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
     private byte memoizedIsInitialized = -1;
@@ -50685,14 +56248,17 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (topologyId_ != null) {
-        output.writeMessage(1, getTopologyId());
+      if (endpointId_ != null) {
+        output.writeMessage(1, getEndpointId());
       }
-      if (deviceId_ != null) {
-        output.writeMessage(2, getDeviceId());
+      if (!getDeviceNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, deviceName_);
       }
-      if (endpointUuid_ != null) {
-        output.writeMessage(3, getEndpointUuid());
+      if (!getEndpointNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointName_);
+      }
+      if (!getEndpointTypeBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, endpointType_);
       }
       unknownFields.writeTo(output);
     }
@@ -50703,17 +56269,18 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (topologyId_ != null) {
+      if (endpointId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getTopologyId());
+          .computeMessageSize(1, getEndpointId());
       }
-      if (deviceId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getDeviceId());
+      if (!getDeviceNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, deviceName_);
       }
-      if (endpointUuid_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, getEndpointUuid());
+      if (!getEndpointNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointName_);
+      }
+      if (!getEndpointTypeBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, endpointType_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -50725,26 +56292,22 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.EndPointId)) {
+      if (!(obj instanceof context.ContextOuterClass.EndPointName)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.EndPointId other = (context.ContextOuterClass.EndPointId) obj;
+      context.ContextOuterClass.EndPointName other = (context.ContextOuterClass.EndPointName) obj;
 
-      if (hasTopologyId() != other.hasTopologyId()) return false;
-      if (hasTopologyId()) {
-        if (!getTopologyId()
-            .equals(other.getTopologyId())) return false;
-      }
-      if (hasDeviceId() != other.hasDeviceId()) return false;
-      if (hasDeviceId()) {
-        if (!getDeviceId()
-            .equals(other.getDeviceId())) return false;
-      }
-      if (hasEndpointUuid() != other.hasEndpointUuid()) return false;
-      if (hasEndpointUuid()) {
-        if (!getEndpointUuid()
-            .equals(other.getEndpointUuid())) return false;
+      if (hasEndpointId() != other.hasEndpointId()) return false;
+      if (hasEndpointId()) {
+        if (!getEndpointId()
+            .equals(other.getEndpointId())) return false;
       }
+      if (!getDeviceName()
+          .equals(other.getDeviceName())) return false;
+      if (!getEndpointName()
+          .equals(other.getEndpointName())) return false;
+      if (!getEndpointType()
+          .equals(other.getEndpointType())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -50756,86 +56319,84 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasTopologyId()) {
-        hash = (37 * hash) + TOPOLOGY_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getTopologyId().hashCode();
-      }
-      if (hasDeviceId()) {
-        hash = (37 * hash) + DEVICE_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getDeviceId().hashCode();
-      }
-      if (hasEndpointUuid()) {
-        hash = (37 * hash) + ENDPOINT_UUID_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointUuid().hashCode();
+      if (hasEndpointId()) {
+        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointId().hashCode();
       }
+      hash = (37 * hash) + DEVICE_NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getDeviceName().hashCode();
+      hash = (37 * hash) + ENDPOINT_NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getEndpointName().hashCode();
+      hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getEndpointType().hashCode();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(byte[] data)
+    public static context.ContextOuterClass.EndPointName parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointName parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointId parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointName parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointId parseDelimitedFrom(
+    public static context.ContextOuterClass.EndPointName parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointId parseFrom(
+    public static context.ContextOuterClass.EndPointName parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -50848,7 +56409,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.EndPointId prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.EndPointName prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -50864,30 +56425,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * <pre>
-     * ----- Endpoint ------------------------------------------------------------------------------------------------------
-     * </pre>
-     *
-     * Protobuf type {@code context.EndPointId}
+     * Protobuf type {@code context.EndPointName}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.EndPointId)
-        context.ContextOuterClass.EndPointIdOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.EndPointName)
+        context.ContextOuterClass.EndPointNameOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_EndPointId_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_EndPointName_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.EndPointId.class, context.ContextOuterClass.EndPointId.Builder.class);
+                context.ContextOuterClass.EndPointName.class, context.ContextOuterClass.EndPointName.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.EndPointId.newBuilder()
+      // Construct using context.ContextOuterClass.EndPointName.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -50905,41 +56462,35 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (topologyIdBuilder_ == null) {
-          topologyId_ = null;
-        } else {
-          topologyId_ = null;
-          topologyIdBuilder_ = null;
-        }
-        if (deviceIdBuilder_ == null) {
-          deviceId_ = null;
-        } else {
-          deviceId_ = null;
-          deviceIdBuilder_ = null;
-        }
-        if (endpointUuidBuilder_ == null) {
-          endpointUuid_ = null;
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
         } else {
-          endpointUuid_ = null;
-          endpointUuidBuilder_ = null;
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
         }
+        deviceName_ = "";
+
+        endpointName_ = "";
+
+        endpointType_ = "";
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_EndPointId_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointId getDefaultInstanceForType() {
-        return context.ContextOuterClass.EndPointId.getDefaultInstance();
+      public context.ContextOuterClass.EndPointName getDefaultInstanceForType() {
+        return context.ContextOuterClass.EndPointName.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointId build() {
-        context.ContextOuterClass.EndPointId result = buildPartial();
+      public context.ContextOuterClass.EndPointName build() {
+        context.ContextOuterClass.EndPointName result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -50947,23 +56498,16 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointId buildPartial() {
-        context.ContextOuterClass.EndPointId result = new context.ContextOuterClass.EndPointId(this);
-        if (topologyIdBuilder_ == null) {
-          result.topologyId_ = topologyId_;
-        } else {
-          result.topologyId_ = topologyIdBuilder_.build();
-        }
-        if (deviceIdBuilder_ == null) {
-          result.deviceId_ = deviceId_;
-        } else {
-          result.deviceId_ = deviceIdBuilder_.build();
-        }
-        if (endpointUuidBuilder_ == null) {
-          result.endpointUuid_ = endpointUuid_;
+      public context.ContextOuterClass.EndPointName buildPartial() {
+        context.ContextOuterClass.EndPointName result = new context.ContextOuterClass.EndPointName(this);
+        if (endpointIdBuilder_ == null) {
+          result.endpointId_ = endpointId_;
         } else {
-          result.endpointUuid_ = endpointUuidBuilder_.build();
+          result.endpointId_ = endpointIdBuilder_.build();
         }
+        result.deviceName_ = deviceName_;
+        result.endpointName_ = endpointName_;
+        result.endpointType_ = endpointType_;
         onBuilt();
         return result;
       }
@@ -51002,24 +56546,30 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.EndPointId) {
-          return mergeFrom((context.ContextOuterClass.EndPointId)other);
+        if (other instanceof context.ContextOuterClass.EndPointName) {
+          return mergeFrom((context.ContextOuterClass.EndPointName)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.EndPointId other) {
-        if (other == context.ContextOuterClass.EndPointId.getDefaultInstance()) return this;
-        if (other.hasTopologyId()) {
-          mergeTopologyId(other.getTopologyId());
+      public Builder mergeFrom(context.ContextOuterClass.EndPointName other) {
+        if (other == context.ContextOuterClass.EndPointName.getDefaultInstance()) return this;
+        if (other.hasEndpointId()) {
+          mergeEndpointId(other.getEndpointId());
         }
-        if (other.hasDeviceId()) {
-          mergeDeviceId(other.getDeviceId());
+        if (!other.getDeviceName().isEmpty()) {
+          deviceName_ = other.deviceName_;
+          onChanged();
         }
-        if (other.hasEndpointUuid()) {
-          mergeEndpointUuid(other.getEndpointUuid());
+        if (!other.getEndpointName().isEmpty()) {
+          endpointName_ = other.endpointName_;
+          onChanged();
+        }
+        if (!other.getEndpointType().isEmpty()) {
+          endpointType_ = other.endpointType_;
+          onChanged();
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -51036,11 +56586,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.EndPointId parsedMessage = null;
+        context.ContextOuterClass.EndPointName parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.EndPointId) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.EndPointName) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -51050,361 +56600,351 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.TopologyId topologyId_;
+      private context.ContextOuterClass.EndPointId endpointId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.TopologyId, context.ContextOuterClass.TopologyId.Builder, context.ContextOuterClass.TopologyIdOrBuilder> topologyIdBuilder_;
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
-       * @return Whether the topologyId field is set.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return Whether the endpointId field is set.
        */
-      public boolean hasTopologyId() {
-        return topologyIdBuilder_ != null || topologyId_ != null;
+      public boolean hasEndpointId() {
+        return endpointIdBuilder_ != null || endpointId_ != null;
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
-       * @return The topologyId.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return The endpointId.
        */
-      public context.ContextOuterClass.TopologyId getTopologyId() {
-        if (topologyIdBuilder_ == null) {
-          return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+      public context.ContextOuterClass.EndPointId getEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         } else {
-          return topologyIdBuilder_.getMessage();
+          return endpointIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setTopologyId(context.ContextOuterClass.TopologyId value) {
-        if (topologyIdBuilder_ == null) {
+      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          topologyId_ = value;
+          endpointId_ = value;
           onChanged();
         } else {
-          topologyIdBuilder_.setMessage(value);
+          endpointIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setTopologyId(
-          context.ContextOuterClass.TopologyId.Builder builderForValue) {
-        if (topologyIdBuilder_ == null) {
-          topologyId_ = builderForValue.build();
+      public Builder setEndpointId(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = builderForValue.build();
           onChanged();
         } else {
-          topologyIdBuilder_.setMessage(builderForValue.build());
+          endpointIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder mergeTopologyId(context.ContextOuterClass.TopologyId value) {
-        if (topologyIdBuilder_ == null) {
-          if (topologyId_ != null) {
-            topologyId_ =
-              context.ContextOuterClass.TopologyId.newBuilder(topologyId_).mergeFrom(value).buildPartial();
+      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (endpointId_ != null) {
+            endpointId_ =
+              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
           } else {
-            topologyId_ = value;
+            endpointId_ = value;
           }
           onChanged();
         } else {
-          topologyIdBuilder_.mergeFrom(value);
+          endpointIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder clearTopologyId() {
-        if (topologyIdBuilder_ == null) {
-          topologyId_ = null;
+      public Builder clearEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
           onChanged();
         } else {
-          topologyId_ = null;
-          topologyIdBuilder_ = null;
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public context.ContextOuterClass.TopologyId.Builder getTopologyIdBuilder() {
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
         
         onChanged();
-        return getTopologyIdFieldBuilder().getBuilder();
+        return getEndpointIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public context.ContextOuterClass.TopologyIdOrBuilder getTopologyIdOrBuilder() {
-        if (topologyIdBuilder_ != null) {
-          return topologyIdBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+        if (endpointIdBuilder_ != null) {
+          return endpointIdBuilder_.getMessageOrBuilder();
         } else {
-          return topologyId_ == null ?
-              context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
+          return endpointId_ == null ?
+              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         }
       }
       /**
-       * <code>.context.TopologyId topology_id = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.TopologyId, context.ContextOuterClass.TopologyId.Builder, context.ContextOuterClass.TopologyIdOrBuilder> 
-          getTopologyIdFieldBuilder() {
-        if (topologyIdBuilder_ == null) {
-          topologyIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.TopologyId, context.ContextOuterClass.TopologyId.Builder, context.ContextOuterClass.TopologyIdOrBuilder>(
-                  getTopologyId(),
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdFieldBuilder() {
+        if (endpointIdBuilder_ == null) {
+          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  getEndpointId(),
                   getParentForChildren(),
                   isClean());
-          topologyId_ = null;
+          endpointId_ = null;
         }
-        return topologyIdBuilder_;
+        return endpointIdBuilder_;
       }
 
-      private context.ContextOuterClass.DeviceId deviceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceIdBuilder_;
-      /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       * @return Whether the deviceId field is set.
-       */
-      public boolean hasDeviceId() {
-        return deviceIdBuilder_ != null || deviceId_ != null;
-      }
-      /**
-       * <code>.context.DeviceId device_id = 2;</code>
-       * @return The deviceId.
-       */
-      public context.ContextOuterClass.DeviceId getDeviceId() {
-        if (deviceIdBuilder_ == null) {
-          return deviceId_ == null ? context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
-        } else {
-          return deviceIdBuilder_.getMessage();
-        }
-      }
+      private java.lang.Object deviceName_ = "";
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string device_name = 2;</code>
+       * @return The deviceName.
        */
-      public Builder setDeviceId(context.ContextOuterClass.DeviceId value) {
-        if (deviceIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          deviceId_ = value;
-          onChanged();
+      public java.lang.String getDeviceName() {
+        java.lang.Object ref = deviceName_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          deviceName_ = s;
+          return s;
         } else {
-          deviceIdBuilder_.setMessage(value);
+          return (java.lang.String) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string device_name = 2;</code>
+       * @return The bytes for deviceName.
        */
-      public Builder setDeviceId(
-          context.ContextOuterClass.DeviceId.Builder builderForValue) {
-        if (deviceIdBuilder_ == null) {
-          deviceId_ = builderForValue.build();
-          onChanged();
+      public com.google.protobuf.ByteString
+          getDeviceNameBytes() {
+        java.lang.Object ref = deviceName_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          deviceName_ = b;
+          return b;
         } else {
-          deviceIdBuilder_.setMessage(builderForValue.build());
+          return (com.google.protobuf.ByteString) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string device_name = 2;</code>
+       * @param value The deviceName to set.
+       * @return This builder for chaining.
        */
-      public Builder mergeDeviceId(context.ContextOuterClass.DeviceId value) {
-        if (deviceIdBuilder_ == null) {
-          if (deviceId_ != null) {
-            deviceId_ =
-              context.ContextOuterClass.DeviceId.newBuilder(deviceId_).mergeFrom(value).buildPartial();
-          } else {
-            deviceId_ = value;
-          }
-          onChanged();
-        } else {
-          deviceIdBuilder_.mergeFrom(value);
-        }
-
+      public Builder setDeviceName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        deviceName_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string device_name = 2;</code>
+       * @return This builder for chaining.
        */
-      public Builder clearDeviceId() {
-        if (deviceIdBuilder_ == null) {
-          deviceId_ = null;
-          onChanged();
-        } else {
-          deviceId_ = null;
-          deviceIdBuilder_ = null;
-        }
-
+      public Builder clearDeviceName() {
+        
+        deviceName_ = getDefaultInstance().getDeviceName();
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string device_name = 2;</code>
+       * @param value The bytes for deviceName to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.DeviceId.Builder getDeviceIdBuilder() {
+      public Builder setDeviceNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
         
+        deviceName_ = value;
         onChanged();
-        return getDeviceIdFieldBuilder().getBuilder();
+        return this;
       }
+
+      private java.lang.Object endpointName_ = "";
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string endpoint_name = 3;</code>
+       * @return The endpointName.
        */
-      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdOrBuilder() {
-        if (deviceIdBuilder_ != null) {
-          return deviceIdBuilder_.getMessageOrBuilder();
+      public java.lang.String getEndpointName() {
+        java.lang.Object ref = endpointName_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          endpointName_ = s;
+          return s;
         } else {
-          return deviceId_ == null ?
-              context.ContextOuterClass.DeviceId.getDefaultInstance() : deviceId_;
+          return (java.lang.String) ref;
         }
       }
       /**
-       * <code>.context.DeviceId device_id = 2;</code>
+       * <code>string endpoint_name = 3;</code>
+       * @return The bytes for endpointName.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
-          getDeviceIdFieldBuilder() {
-        if (deviceIdBuilder_ == null) {
-          deviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
-                  getDeviceId(),
-                  getParentForChildren(),
-                  isClean());
-          deviceId_ = null;
+      public com.google.protobuf.ByteString
+          getEndpointNameBytes() {
+        java.lang.Object ref = endpointName_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          endpointName_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
         }
-        return deviceIdBuilder_;
       }
-
-      private context.ContextOuterClass.Uuid endpointUuid_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> endpointUuidBuilder_;
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
-       * @return Whether the endpointUuid field is set.
+       * <code>string endpoint_name = 3;</code>
+       * @param value The endpointName to set.
+       * @return This builder for chaining.
        */
-      public boolean hasEndpointUuid() {
-        return endpointUuidBuilder_ != null || endpointUuid_ != null;
+      public Builder setEndpointName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        endpointName_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
-       * @return The endpointUuid.
+       * <code>string endpoint_name = 3;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Uuid getEndpointUuid() {
-        if (endpointUuidBuilder_ == null) {
-          return endpointUuid_ == null ? context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
-        } else {
-          return endpointUuidBuilder_.getMessage();
-        }
+      public Builder clearEndpointName() {
+        
+        endpointName_ = getDefaultInstance().getEndpointName();
+        onChanged();
+        return this;
       }
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * <code>string endpoint_name = 3;</code>
+       * @param value The bytes for endpointName to set.
+       * @return This builder for chaining.
        */
-      public Builder setEndpointUuid(context.ContextOuterClass.Uuid value) {
-        if (endpointUuidBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          endpointUuid_ = value;
-          onChanged();
-        } else {
-          endpointUuidBuilder_.setMessage(value);
-        }
-
+      public Builder setEndpointNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        endpointName_ = value;
+        onChanged();
         return this;
       }
+
+      private java.lang.Object endpointType_ = "";
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * <code>string endpoint_type = 4;</code>
+       * @return The endpointType.
        */
-      public Builder setEndpointUuid(
-          context.ContextOuterClass.Uuid.Builder builderForValue) {
-        if (endpointUuidBuilder_ == null) {
-          endpointUuid_ = builderForValue.build();
-          onChanged();
+      public java.lang.String getEndpointType() {
+        java.lang.Object ref = endpointType_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          endpointType_ = s;
+          return s;
         } else {
-          endpointUuidBuilder_.setMessage(builderForValue.build());
+          return (java.lang.String) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * <code>string endpoint_type = 4;</code>
+       * @return The bytes for endpointType.
        */
-      public Builder mergeEndpointUuid(context.ContextOuterClass.Uuid value) {
-        if (endpointUuidBuilder_ == null) {
-          if (endpointUuid_ != null) {
-            endpointUuid_ =
-              context.ContextOuterClass.Uuid.newBuilder(endpointUuid_).mergeFrom(value).buildPartial();
-          } else {
-            endpointUuid_ = value;
-          }
-          onChanged();
+      public com.google.protobuf.ByteString
+          getEndpointTypeBytes() {
+        java.lang.Object ref = endpointType_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          endpointType_ = b;
+          return b;
         } else {
-          endpointUuidBuilder_.mergeFrom(value);
+          return (com.google.protobuf.ByteString) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * <code>string endpoint_type = 4;</code>
+       * @param value The endpointType to set.
+       * @return This builder for chaining.
        */
-      public Builder clearEndpointUuid() {
-        if (endpointUuidBuilder_ == null) {
-          endpointUuid_ = null;
-          onChanged();
-        } else {
-          endpointUuid_ = null;
-          endpointUuidBuilder_ = null;
-        }
-
+      public Builder setEndpointType(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        endpointType_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * <code>string endpoint_type = 4;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Uuid.Builder getEndpointUuidBuilder() {
+      public Builder clearEndpointType() {
         
+        endpointType_ = getDefaultInstance().getEndpointType();
         onChanged();
-        return getEndpointUuidFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
-       */
-      public context.ContextOuterClass.UuidOrBuilder getEndpointUuidOrBuilder() {
-        if (endpointUuidBuilder_ != null) {
-          return endpointUuidBuilder_.getMessageOrBuilder();
-        } else {
-          return endpointUuid_ == null ?
-              context.ContextOuterClass.Uuid.getDefaultInstance() : endpointUuid_;
-        }
+        return this;
       }
       /**
-       * <code>.context.Uuid endpoint_uuid = 3;</code>
+       * <code>string endpoint_type = 4;</code>
+       * @param value The bytes for endpointType to set.
+       * @return This builder for chaining.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> 
-          getEndpointUuidFieldBuilder() {
-        if (endpointUuidBuilder_ == null) {
-          endpointUuidBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder>(
-                  getEndpointUuid(),
-                  getParentForChildren(),
-                  isClean());
-          endpointUuid_ = null;
-        }
-        return endpointUuidBuilder_;
+      public Builder setEndpointTypeBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        endpointType_ = value;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -51419,156 +56959,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.EndPointId)
+      // @@protoc_insertion_point(builder_scope:context.EndPointName)
     }
 
-    // @@protoc_insertion_point(class_scope:context.EndPointId)
-    private static final context.ContextOuterClass.EndPointId DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.EndPointName)
+    private static final context.ContextOuterClass.EndPointName DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointId();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointName();
     }
 
-    public static context.ContextOuterClass.EndPointId getDefaultInstance() {
+    public static context.ContextOuterClass.EndPointName getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<EndPointId>
-        PARSER = new com.google.protobuf.AbstractParser<EndPointId>() {
+    private static final com.google.protobuf.Parser<EndPointName>
+        PARSER = new com.google.protobuf.AbstractParser<EndPointName>() {
       @java.lang.Override
-      public EndPointId parsePartialFrom(
+      public EndPointName parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new EndPointId(input, extensionRegistry);
+        return new EndPointName(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<EndPointId> parser() {
+    public static com.google.protobuf.Parser<EndPointName> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<EndPointId> getParserForType() {
+    public com.google.protobuf.Parser<EndPointName> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.EndPointId getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface EndPointOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.EndPoint)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    boolean hasEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    context.ContextOuterClass.EndPointId getEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
-
-    /**
-     * <code>string name = 2;</code>
-     * @return The name.
-     */
-    java.lang.String getName();
-    /**
-     * <code>string name = 2;</code>
-     * @return The bytes for name.
-     */
-    com.google.protobuf.ByteString
-        getNameBytes();
+    public context.ContextOuterClass.EndPointName getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
 
-    /**
-     * <code>string endpoint_type = 3;</code>
-     * @return The endpointType.
-     */
-    java.lang.String getEndpointType();
-    /**
-     * <code>string endpoint_type = 3;</code>
-     * @return The bytes for endpointType.
-     */
-    com.google.protobuf.ByteString
-        getEndpointTypeBytes();
+  }
+
+  public interface EndPointIdListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
+      com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @return A list containing the kpiSampleTypes.
-     */
-    java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList();
-    /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @return The count of kpiSampleTypes.
-     */
-    int getKpiSampleTypesCount();
-    /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @param index The index of the element to return.
-     * @return The kpiSampleTypes at the given index.
-     */
-    kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index);
-    /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
-    java.util.List<java.lang.Integer>
-    getKpiSampleTypesValueList();
+    java.util.List<context.ContextOuterClass.EndPointId> 
+        getEndpointIdsList();
     /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @param index The index of the value to return.
-     * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
-    int getKpiSampleTypesValue(int index);
-
+    context.ContextOuterClass.EndPointId getEndpointIds(int index);
     /**
-     * <code>.context.Location endpoint_location = 5;</code>
-     * @return Whether the endpointLocation field is set.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
-    boolean hasEndpointLocation();
+    int getEndpointIdsCount();
     /**
-     * <code>.context.Location endpoint_location = 5;</code>
-     * @return The endpointLocation.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
-    context.ContextOuterClass.Location getEndpointLocation();
+    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getEndpointIdsOrBuilderList();
     /**
-     * <code>.context.Location endpoint_location = 5;</code>
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
-    context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder();
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.EndPoint}
+   * Protobuf type {@code context.EndPointIdList}
    */
-  public static final class EndPoint extends
+  public static final class EndPointIdList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.EndPoint)
-      EndPointOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.EndPointIdList)
+      EndPointIdListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use EndPoint.newBuilder() to construct.
-    private EndPoint(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use EndPointIdList.newBuilder() to construct.
+    private EndPointIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private EndPoint() {
-      name_ = "";
-      endpointType_ = "";
-      kpiSampleTypes_ = java.util.Collections.emptyList();
+    private EndPointIdList() {
+      endpointIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new EndPoint();
+      return new EndPointIdList();
     }
 
     @java.lang.Override
@@ -51576,7 +57055,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private EndPoint(
+    private EndPointIdList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -51596,64 +57075,12 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
-              if (endpointId_ != null) {
-                subBuilder = endpointId_.toBuilder();
-              }
-              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointId_);
-                endpointId_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              name_ = s;
-              break;
-            }
-            case 26: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              endpointType_ = s;
-              break;
-            }
-            case 32: {
-              int rawValue = input.readEnum();
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>();
+                endpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              kpiSampleTypes_.add(rawValue);
-              break;
-            }
-            case 34: {
-              int length = input.readRawVarint32();
-              int oldLimit = input.pushLimit(length);
-              while(input.getBytesUntilLimit() > 0) {
-                int rawValue = input.readEnum();
-                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                  kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>();
-                  mutable_bitField0_ |= 0x00000001;
-                }
-                kpiSampleTypes_.add(rawValue);
-              }
-              input.popLimit(oldLimit);
-              break;
-            }
-            case 42: {
-              context.ContextOuterClass.Location.Builder subBuilder = null;
-              if (endpointLocation_ != null) {
-                subBuilder = endpointLocation_.toBuilder();
-              }
-              endpointLocation_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointLocation_);
-                endpointLocation_ = subBuilder.buildPartial();
-              }
-
+              endpointIds_.add(
+                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -51672,7 +57099,7 @@ public final class ContextOuterClass {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
+          endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -51680,201 +57107,55 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
+      return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_EndPoint_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_EndPointIdList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.EndPoint.class, context.ContextOuterClass.EndPoint.Builder.class);
-    }
-
-    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.EndPointId endpointId_;
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    @java.lang.Override
-    public boolean hasEndpointId() {
-      return endpointId_ != null;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointId getEndpointId() {
-      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-      return getEndpointId();
-    }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object name_;
-    /**
-     * <code>string name = 2;</code>
-     * @return The name.
-     */
-    @java.lang.Override
-    public java.lang.String getName() {
-      java.lang.Object ref = name_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        name_ = s;
-        return s;
-      }
-    }
-    /**
-     * <code>string name = 2;</code>
-     * @return The bytes for name.
-     */
-    @java.lang.Override
-    public com.google.protobuf.ByteString
-        getNameBytes() {
-      java.lang.Object ref = name_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        name_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
-    }
-
-    public static final int ENDPOINT_TYPE_FIELD_NUMBER = 3;
-    private volatile java.lang.Object endpointType_;
-    /**
-     * <code>string endpoint_type = 3;</code>
-     * @return The endpointType.
-     */
-    @java.lang.Override
-    public java.lang.String getEndpointType() {
-      java.lang.Object ref = endpointType_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        endpointType_ = s;
-        return s;
-      }
-    }
-    /**
-     * <code>string endpoint_type = 3;</code>
-     * @return The bytes for endpointType.
-     */
-    @java.lang.Override
-    public com.google.protobuf.ByteString
-        getEndpointTypeBytes() {
-      java.lang.Object ref = endpointType_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        endpointType_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+              context.ContextOuterClass.EndPointIdList.class, context.ContextOuterClass.EndPointIdList.Builder.class);
     }
 
-    public static final int KPI_SAMPLE_TYPES_FIELD_NUMBER = 4;
-    private java.util.List<java.lang.Integer> kpiSampleTypes_;
-    private static final com.google.protobuf.Internal.ListAdapter.Converter<
-        java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType> kpiSampleTypes_converter_ =
-            new com.google.protobuf.Internal.ListAdapter.Converter<
-                java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>() {
-              public kpi_sample_types.KpiSampleTypes.KpiSampleType convert(java.lang.Integer from) {
-                @SuppressWarnings("deprecation")
-                kpi_sample_types.KpiSampleTypes.KpiSampleType result = kpi_sample_types.KpiSampleTypes.KpiSampleType.valueOf(from);
-                return result == null ? kpi_sample_types.KpiSampleTypes.KpiSampleType.UNRECOGNIZED : result;
-              }
-            };
-    /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @return A list containing the kpiSampleTypes.
-     */
-    @java.lang.Override
-    public java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList() {
-      return new com.google.protobuf.Internal.ListAdapter<
-          java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>(kpiSampleTypes_, kpiSampleTypes_converter_);
-    }
-    /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @return The count of kpiSampleTypes.
-     */
-    @java.lang.Override
-    public int getKpiSampleTypesCount() {
-      return kpiSampleTypes_.size();
-    }
-    /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @param index The index of the element to return.
-     * @return The kpiSampleTypes at the given index.
-     */
-    @java.lang.Override
-    public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
-      return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
-    }
+    public static final int ENDPOINT_IDS_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.EndPointId> endpointIds_;
     /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<java.lang.Integer>
-    getKpiSampleTypesValueList() {
-      return kpiSampleTypes_;
+    public java.util.List<context.ContextOuterClass.EndPointId> getEndpointIdsList() {
+      return endpointIds_;
     }
     /**
-     * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-     * @param index The index of the value to return.
-     * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
     @java.lang.Override
-    public int getKpiSampleTypesValue(int index) {
-      return kpiSampleTypes_.get(index);
+    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getEndpointIdsOrBuilderList() {
+      return endpointIds_;
     }
-    private int kpiSampleTypesMemoizedSerializedSize;
-
-    public static final int ENDPOINT_LOCATION_FIELD_NUMBER = 5;
-    private context.ContextOuterClass.Location endpointLocation_;
     /**
-     * <code>.context.Location endpoint_location = 5;</code>
-     * @return Whether the endpointLocation field is set.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
     @java.lang.Override
-    public boolean hasEndpointLocation() {
-      return endpointLocation_ != null;
+    public int getEndpointIdsCount() {
+      return endpointIds_.size();
     }
     /**
-     * <code>.context.Location endpoint_location = 5;</code>
-     * @return The endpointLocation.
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.Location getEndpointLocation() {
-      return endpointLocation_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
+    public context.ContextOuterClass.EndPointId getEndpointIds(int index) {
+      return endpointIds_.get(index);
     }
     /**
-     * <code>.context.Location endpoint_location = 5;</code>
+     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder() {
-      return getEndpointLocation();
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
+        int index) {
+      return endpointIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -51891,25 +57172,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      getSerializedSize();
-      if (endpointId_ != null) {
-        output.writeMessage(1, getEndpointId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
-      }
-      if (!getEndpointTypeBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointType_);
-      }
-      if (getKpiSampleTypesList().size() > 0) {
-        output.writeUInt32NoTag(34);
-        output.writeUInt32NoTag(kpiSampleTypesMemoizedSerializedSize);
-      }
-      for (int i = 0; i < kpiSampleTypes_.size(); i++) {
-        output.writeEnumNoTag(kpiSampleTypes_.get(i));
-      }
-      if (endpointLocation_ != null) {
-        output.writeMessage(5, getEndpointLocation());
+      for (int i = 0; i < endpointIds_.size(); i++) {
+        output.writeMessage(1, endpointIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -51920,31 +57184,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (endpointId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEndpointId());
-      }
-      if (!getNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
-      }
-      if (!getEndpointTypeBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointType_);
-      }
-      {
-        int dataSize = 0;
-        for (int i = 0; i < kpiSampleTypes_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeEnumSizeNoTag(kpiSampleTypes_.get(i));
-        }
-        size += dataSize;
-        if (!getKpiSampleTypesList().isEmpty()) {  size += 1;
-          size += com.google.protobuf.CodedOutputStream
-            .computeUInt32SizeNoTag(dataSize);
-        }kpiSampleTypesMemoizedSerializedSize = dataSize;
-      }
-      if (endpointLocation_ != null) {
+      for (int i = 0; i < endpointIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, getEndpointLocation());
+          .computeMessageSize(1, endpointIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -51956,26 +57198,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.EndPoint)) {
+      if (!(obj instanceof context.ContextOuterClass.EndPointIdList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.EndPoint other = (context.ContextOuterClass.EndPoint) obj;
+      context.ContextOuterClass.EndPointIdList other = (context.ContextOuterClass.EndPointIdList) obj;
 
-      if (hasEndpointId() != other.hasEndpointId()) return false;
-      if (hasEndpointId()) {
-        if (!getEndpointId()
-            .equals(other.getEndpointId())) return false;
-      }
-      if (!getName()
-          .equals(other.getName())) return false;
-      if (!getEndpointType()
-          .equals(other.getEndpointType())) return false;
-      if (!kpiSampleTypes_.equals(other.kpiSampleTypes_)) return false;
-      if (hasEndpointLocation() != other.hasEndpointLocation()) return false;
-      if (hasEndpointLocation()) {
-        if (!getEndpointLocation()
-            .equals(other.getEndpointLocation())) return false;
-      }
+      if (!getEndpointIdsList()
+          .equals(other.getEndpointIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -51987,90 +57216,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEndpointId()) {
-        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointId().hashCode();
-      }
-      hash = (37 * hash) + NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getName().hashCode();
-      hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
-      hash = (53 * hash) + getEndpointType().hashCode();
-      if (getKpiSampleTypesCount() > 0) {
-        hash = (37 * hash) + KPI_SAMPLE_TYPES_FIELD_NUMBER;
-        hash = (53 * hash) + kpiSampleTypes_.hashCode();
-      }
-      if (hasEndpointLocation()) {
-        hash = (37 * hash) + ENDPOINT_LOCATION_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointLocation().hashCode();
+      if (getEndpointIdsCount() > 0) {
+        hash = (37 * hash) + ENDPOINT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointIdsList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(byte[] data)
+    public static context.ContextOuterClass.EndPointIdList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointIdList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPoint parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointIdList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPoint parseDelimitedFrom(
+    public static context.ContextOuterClass.EndPointIdList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPoint parseFrom(
+    public static context.ContextOuterClass.EndPointIdList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -52083,7 +57300,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.EndPoint prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.EndPointIdList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -52099,26 +57316,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.EndPoint}
+     * Protobuf type {@code context.EndPointIdList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.EndPoint)
-        context.ContextOuterClass.EndPointOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
+        context.ContextOuterClass.EndPointIdListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_EndPoint_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_EndPointIdList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.EndPoint.class, context.ContextOuterClass.EndPoint.Builder.class);
+                context.ContextOuterClass.EndPointIdList.class, context.ContextOuterClass.EndPointIdList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.EndPoint.newBuilder()
+      // Construct using context.ContextOuterClass.EndPointIdList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -52131,28 +57348,17 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getEndpointIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-        name_ = "";
-
-        endpointType_ = "";
-
-        kpiSampleTypes_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000001);
-        if (endpointLocationBuilder_ == null) {
-          endpointLocation_ = null;
+        if (endpointIdsBuilder_ == null) {
+          endpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          endpointLocation_ = null;
-          endpointLocationBuilder_ = null;
+          endpointIdsBuilder_.clear();
         }
         return this;
       }
@@ -52160,17 +57366,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_EndPoint_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPoint getDefaultInstanceForType() {
-        return context.ContextOuterClass.EndPoint.getDefaultInstance();
+      public context.ContextOuterClass.EndPointIdList getDefaultInstanceForType() {
+        return context.ContextOuterClass.EndPointIdList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPoint build() {
-        context.ContextOuterClass.EndPoint result = buildPartial();
+      public context.ContextOuterClass.EndPointIdList build() {
+        context.ContextOuterClass.EndPointIdList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -52178,25 +57384,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPoint buildPartial() {
-        context.ContextOuterClass.EndPoint result = new context.ContextOuterClass.EndPoint(this);
+      public context.ContextOuterClass.EndPointIdList buildPartial() {
+        context.ContextOuterClass.EndPointIdList result = new context.ContextOuterClass.EndPointIdList(this);
         int from_bitField0_ = bitField0_;
-        if (endpointIdBuilder_ == null) {
-          result.endpointId_ = endpointId_;
-        } else {
-          result.endpointId_ = endpointIdBuilder_.build();
-        }
-        result.name_ = name_;
-        result.endpointType_ = endpointType_;
-        if (((bitField0_ & 0x00000001) != 0)) {
-          kpiSampleTypes_ = java.util.Collections.unmodifiableList(kpiSampleTypes_);
-          bitField0_ = (bitField0_ & ~0x00000001);
-        }
-        result.kpiSampleTypes_ = kpiSampleTypes_;
-        if (endpointLocationBuilder_ == null) {
-          result.endpointLocation_ = endpointLocation_;
+        if (endpointIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.endpointIds_ = endpointIds_;
         } else {
-          result.endpointLocation_ = endpointLocationBuilder_.build();
+          result.endpointIds_ = endpointIdsBuilder_.build();
         }
         onBuilt();
         return result;
@@ -52236,39 +57434,41 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.EndPoint) {
-          return mergeFrom((context.ContextOuterClass.EndPoint)other);
+        if (other instanceof context.ContextOuterClass.EndPointIdList) {
+          return mergeFrom((context.ContextOuterClass.EndPointIdList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.EndPoint other) {
-        if (other == context.ContextOuterClass.EndPoint.getDefaultInstance()) return this;
-        if (other.hasEndpointId()) {
-          mergeEndpointId(other.getEndpointId());
-        }
-        if (!other.getName().isEmpty()) {
-          name_ = other.name_;
-          onChanged();
-        }
-        if (!other.getEndpointType().isEmpty()) {
-          endpointType_ = other.endpointType_;
-          onChanged();
-        }
-        if (!other.kpiSampleTypes_.isEmpty()) {
-          if (kpiSampleTypes_.isEmpty()) {
-            kpiSampleTypes_ = other.kpiSampleTypes_;
-            bitField0_ = (bitField0_ & ~0x00000001);
-          } else {
-            ensureKpiSampleTypesIsMutable();
-            kpiSampleTypes_.addAll(other.kpiSampleTypes_);
+      public Builder mergeFrom(context.ContextOuterClass.EndPointIdList other) {
+        if (other == context.ContextOuterClass.EndPointIdList.getDefaultInstance()) return this;
+        if (endpointIdsBuilder_ == null) {
+          if (!other.endpointIds_.isEmpty()) {
+            if (endpointIds_.isEmpty()) {
+              endpointIds_ = other.endpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureEndpointIdsIsMutable();
+              endpointIds_.addAll(other.endpointIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.endpointIds_.isEmpty()) {
+            if (endpointIdsBuilder_.isEmpty()) {
+              endpointIdsBuilder_.dispose();
+              endpointIdsBuilder_ = null;
+              endpointIds_ = other.endpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              endpointIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getEndpointIdsFieldBuilder() : null;
+            } else {
+              endpointIdsBuilder_.addAllMessages(other.endpointIds_);
+            }
           }
-          onChanged();
-        }
-        if (other.hasEndpointLocation()) {
-          mergeEndpointLocation(other.getEndpointLocation());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -52285,11 +57485,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.EndPoint parsedMessage = null;
+        context.ContextOuterClass.EndPointIdList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.EndPoint) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.EndPointIdList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -52300,534 +57500,244 @@ public final class ContextOuterClass {
       }
       private int bitField0_;
 
-      private context.ContextOuterClass.EndPointId endpointId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return Whether the endpointId field is set.
-       */
-      public boolean hasEndpointId() {
-        return endpointIdBuilder_ != null || endpointId_ != null;
+      private java.util.List<context.ContextOuterClass.EndPointId> endpointIds_ =
+        java.util.Collections.emptyList();
+      private void ensureEndpointIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          endpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(endpointIds_);
+          bitField0_ |= 0x00000001;
+         }
       }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdsBuilder_;
+
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return The endpointId.
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public context.ContextOuterClass.EndPointId getEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+      public java.util.List<context.ContextOuterClass.EndPointId> getEndpointIdsList() {
+        if (endpointIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(endpointIds_);
         } else {
-          return endpointIdBuilder_.getMessage();
+          return endpointIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          endpointId_ = value;
-          onChanged();
+      public int getEndpointIdsCount() {
+        if (endpointIdsBuilder_ == null) {
+          return endpointIds_.size();
         } else {
-          endpointIdBuilder_.setMessage(value);
+          return endpointIdsBuilder_.getCount();
         }
-
-        return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder setEndpointId(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = builderForValue.build();
-          onChanged();
+      public context.ContextOuterClass.EndPointId getEndpointIds(int index) {
+        if (endpointIdsBuilder_ == null) {
+          return endpointIds_.get(index);
         } else {
-          endpointIdBuilder_.setMessage(builderForValue.build());
+          return endpointIdsBuilder_.getMessage(index);
         }
-
-        return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (endpointId_ != null) {
-            endpointId_ =
-              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
-          } else {
-            endpointId_ = value;
+      public Builder setEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (endpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureEndpointIdsIsMutable();
+          endpointIds_.set(index, value);
           onChanged();
         } else {
-          endpointIdBuilder_.mergeFrom(value);
+          endpointIdsBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder clearEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
+      public Builder setEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
+          endpointIdsBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-        
-        onChanged();
-        return getEndpointIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-        if (endpointIdBuilder_ != null) {
-          return endpointIdBuilder_.getMessageOrBuilder();
-        } else {
-          return endpointId_ == null ?
-              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getEndpointIdFieldBuilder() {
-        if (endpointIdBuilder_ == null) {
-          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  getEndpointId(),
-                  getParentForChildren(),
-                  isClean());
-          endpointId_ = null;
-        }
-        return endpointIdBuilder_;
-      }
-
-      private java.lang.Object name_ = "";
-      /**
-       * <code>string name = 2;</code>
-       * @return The name.
-       */
-      public java.lang.String getName() {
-        java.lang.Object ref = name_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          name_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return The bytes for name.
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public com.google.protobuf.ByteString
-          getNameBytes() {
-        java.lang.Object ref = name_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          name_ = b;
-          return b;
+      public Builder addEndpointIds(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(value);
+          onChanged();
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          endpointIdsBuilder_.addMessage(value);
         }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearName() {
-        
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The bytes for name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        name_ = value;
-        onChanged();
         return this;
       }
-
-      private java.lang.Object endpointType_ = "";
-      /**
-       * <code>string endpoint_type = 3;</code>
-       * @return The endpointType.
-       */
-      public java.lang.String getEndpointType() {
-        java.lang.Object ref = endpointType_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          endpointType_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
       /**
-       * <code>string endpoint_type = 3;</code>
-       * @return The bytes for endpointType.
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public com.google.protobuf.ByteString
-          getEndpointTypeBytes() {
-        java.lang.Object ref = endpointType_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          endpointType_ = b;
-          return b;
+      public Builder addEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (endpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(index, value);
+          onChanged();
         } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>string endpoint_type = 3;</code>
-       * @param value The endpointType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setEndpointType(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        endpointType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string endpoint_type = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearEndpointType() {
-        
-        endpointType_ = getDefaultInstance().getEndpointType();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string endpoint_type = 3;</code>
-       * @param value The bytes for endpointType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setEndpointTypeBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        endpointType_ = value;
-        onChanged();
-        return this;
-      }
-
-      private java.util.List<java.lang.Integer> kpiSampleTypes_ =
-        java.util.Collections.emptyList();
-      private void ensureKpiSampleTypesIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          kpiSampleTypes_ = new java.util.ArrayList<java.lang.Integer>(kpiSampleTypes_);
-          bitField0_ |= 0x00000001;
-        }
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @return A list containing the kpiSampleTypes.
-       */
-      public java.util.List<kpi_sample_types.KpiSampleTypes.KpiSampleType> getKpiSampleTypesList() {
-        return new com.google.protobuf.Internal.ListAdapter<
-            java.lang.Integer, kpi_sample_types.KpiSampleTypes.KpiSampleType>(kpiSampleTypes_, kpiSampleTypes_converter_);
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @return The count of kpiSampleTypes.
-       */
-      public int getKpiSampleTypesCount() {
-        return kpiSampleTypes_.size();
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param index The index of the element to return.
-       * @return The kpiSampleTypes at the given index.
-       */
-      public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
-        return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param index The index to set the value at.
-       * @param value The kpiSampleTypes to set.
-       * @return This builder for chaining.
-       */
-      public Builder setKpiSampleTypes(
-          int index, kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        ensureKpiSampleTypesIsMutable();
-        kpiSampleTypes_.set(index, value.getNumber());
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param value The kpiSampleTypes to add.
-       * @return This builder for chaining.
-       */
-      public Builder addKpiSampleTypes(kpi_sample_types.KpiSampleTypes.KpiSampleType value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        ensureKpiSampleTypesIsMutable();
-        kpiSampleTypes_.add(value.getNumber());
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param values The kpiSampleTypes to add.
-       * @return This builder for chaining.
-       */
-      public Builder addAllKpiSampleTypes(
-          java.lang.Iterable<? extends kpi_sample_types.KpiSampleTypes.KpiSampleType> values) {
-        ensureKpiSampleTypesIsMutable();
-        for (kpi_sample_types.KpiSampleTypes.KpiSampleType value : values) {
-          kpiSampleTypes_.add(value.getNumber());
-        }
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearKpiSampleTypes() {
-        kpiSampleTypes_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000001);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
-       */
-      public java.util.List<java.lang.Integer>
-      getKpiSampleTypesValueList() {
-        return java.util.Collections.unmodifiableList(kpiSampleTypes_);
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param index The index of the value to return.
-       * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
-       */
-      public int getKpiSampleTypesValue(int index) {
-        return kpiSampleTypes_.get(index);
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param index The index of the value to return.
-       * @return The enum numeric value on the wire of kpiSampleTypes at the given index.
-       * @return This builder for chaining.
-       */
-      public Builder setKpiSampleTypesValue(
-          int index, int value) {
-        ensureKpiSampleTypesIsMutable();
-        kpiSampleTypes_.set(index, value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param value The enum numeric value on the wire for kpiSampleTypes to add.
-       * @return This builder for chaining.
-       */
-      public Builder addKpiSampleTypesValue(int value) {
-        ensureKpiSampleTypesIsMutable();
-        kpiSampleTypes_.add(value);
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
-       * @param values The enum numeric values on the wire for kpiSampleTypes to add.
-       * @return This builder for chaining.
-       */
-      public Builder addAllKpiSampleTypesValue(
-          java.lang.Iterable<java.lang.Integer> values) {
-        ensureKpiSampleTypesIsMutable();
-        for (int value : values) {
-          kpiSampleTypes_.add(value);
+          endpointIdsBuilder_.addMessage(index, value);
         }
-        onChanged();
         return this;
       }
-
-      private context.ContextOuterClass.Location endpointLocation_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> endpointLocationBuilder_;
-      /**
-       * <code>.context.Location endpoint_location = 5;</code>
-       * @return Whether the endpointLocation field is set.
-       */
-      public boolean hasEndpointLocation() {
-        return endpointLocationBuilder_ != null || endpointLocation_ != null;
-      }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
-       * @return The endpointLocation.
-       */
-      public context.ContextOuterClass.Location getEndpointLocation() {
-        if (endpointLocationBuilder_ == null) {
-          return endpointLocation_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       */
+      public Builder addEndpointIds(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(builderForValue.build());
+          onChanged();
         } else {
-          return endpointLocationBuilder_.getMessage();
+          endpointIdsBuilder_.addMessage(builderForValue.build());
         }
+        return this;
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder setEndpointLocation(context.ContextOuterClass.Location value) {
-        if (endpointLocationBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          endpointLocation_ = value;
+      public Builder addEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(index, builderForValue.build());
           onChanged();
         } else {
-          endpointLocationBuilder_.setMessage(value);
+          endpointIdsBuilder_.addMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder setEndpointLocation(
-          context.ContextOuterClass.Location.Builder builderForValue) {
-        if (endpointLocationBuilder_ == null) {
-          endpointLocation_ = builderForValue.build();
+      public Builder addAllEndpointIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, endpointIds_);
           onChanged();
         } else {
-          endpointLocationBuilder_.setMessage(builderForValue.build());
+          endpointIdsBuilder_.addAllMessages(values);
         }
-
         return this;
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder mergeEndpointLocation(context.ContextOuterClass.Location value) {
-        if (endpointLocationBuilder_ == null) {
-          if (endpointLocation_ != null) {
-            endpointLocation_ =
-              context.ContextOuterClass.Location.newBuilder(endpointLocation_).mergeFrom(value).buildPartial();
-          } else {
-            endpointLocation_ = value;
-          }
+      public Builder clearEndpointIds() {
+        if (endpointIdsBuilder_ == null) {
+          endpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          endpointLocationBuilder_.mergeFrom(value);
+          endpointIdsBuilder_.clear();
         }
-
         return this;
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public Builder clearEndpointLocation() {
-        if (endpointLocationBuilder_ == null) {
-          endpointLocation_ = null;
+      public Builder removeEndpointIds(int index) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.remove(index);
           onChanged();
         } else {
-          endpointLocation_ = null;
-          endpointLocationBuilder_ = null;
+          endpointIdsBuilder_.remove(index);
         }
-
         return this;
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public context.ContextOuterClass.Location.Builder getEndpointLocationBuilder() {
-        
-        onChanged();
-        return getEndpointLocationFieldBuilder().getBuilder();
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdsBuilder(
+          int index) {
+        return getEndpointIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      public context.ContextOuterClass.LocationOrBuilder getEndpointLocationOrBuilder() {
-        if (endpointLocationBuilder_ != null) {
-          return endpointLocationBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
+          int index) {
+        if (endpointIdsBuilder_ == null) {
+          return endpointIds_.get(index);  } else {
+          return endpointIdsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+           getEndpointIdsOrBuilderList() {
+        if (endpointIdsBuilder_ != null) {
+          return endpointIdsBuilder_.getMessageOrBuilderList();
         } else {
-          return endpointLocation_ == null ?
-              context.ContextOuterClass.Location.getDefaultInstance() : endpointLocation_;
+          return java.util.Collections.unmodifiableList(endpointIds_);
         }
       }
       /**
-       * <code>.context.Location endpoint_location = 5;</code>
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> 
-          getEndpointLocationFieldBuilder() {
-        if (endpointLocationBuilder_ == null) {
-          endpointLocationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder>(
-                  getEndpointLocation(),
+      public context.ContextOuterClass.EndPointId.Builder addEndpointIdsBuilder() {
+        return getEndpointIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addEndpointIdsBuilder(
+          int index) {
+        return getEndpointIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
+           getEndpointIdsBuilderList() {
+        return getEndpointIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdsFieldBuilder() {
+        if (endpointIdsBuilder_ == null) {
+          endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  endpointIds_,
+                  ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          endpointLocation_ = null;
+          endpointIds_ = null;
         }
-        return endpointLocationBuilder_;
+        return endpointIdsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -52842,124 +57752,95 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.EndPoint)
+      // @@protoc_insertion_point(builder_scope:context.EndPointIdList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.EndPoint)
-    private static final context.ContextOuterClass.EndPoint DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.EndPointIdList)
+    private static final context.ContextOuterClass.EndPointIdList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPoint();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointIdList();
     }
 
-    public static context.ContextOuterClass.EndPoint getDefaultInstance() {
+    public static context.ContextOuterClass.EndPointIdList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<EndPoint>
-        PARSER = new com.google.protobuf.AbstractParser<EndPoint>() {
+    private static final com.google.protobuf.Parser<EndPointIdList>
+        PARSER = new com.google.protobuf.AbstractParser<EndPointIdList>() {
       @java.lang.Override
-      public EndPoint parsePartialFrom(
+      public EndPointIdList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new EndPoint(input, extensionRegistry);
+        return new EndPointIdList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<EndPoint> parser() {
+    public static com.google.protobuf.Parser<EndPointIdList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<EndPoint> getParserForType() {
+    public com.google.protobuf.Parser<EndPointIdList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.EndPoint getDefaultInstanceForType() {
+    public context.ContextOuterClass.EndPointIdList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface EndPointNameOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.EndPointName)
+  public interface EndPointNameListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    boolean hasEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    context.ContextOuterClass.EndPointId getEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
-
-    /**
-     * <code>string device_name = 2;</code>
-     * @return The deviceName.
-     */
-    java.lang.String getDeviceName();
-    /**
-     * <code>string device_name = 2;</code>
-     * @return The bytes for deviceName.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
-    com.google.protobuf.ByteString
-        getDeviceNameBytes();
-
+    java.util.List<context.ContextOuterClass.EndPointName> 
+        getEndpointNamesList();
     /**
-     * <code>string endpoint_name = 3;</code>
-     * @return The endpointName.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
-    java.lang.String getEndpointName();
+    context.ContextOuterClass.EndPointName getEndpointNames(int index);
     /**
-     * <code>string endpoint_name = 3;</code>
-     * @return The bytes for endpointName.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
-    com.google.protobuf.ByteString
-        getEndpointNameBytes();
-
+    int getEndpointNamesCount();
     /**
-     * <code>string endpoint_type = 4;</code>
-     * @return The endpointType.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
-    java.lang.String getEndpointType();
+    java.util.List<? extends context.ContextOuterClass.EndPointNameOrBuilder> 
+        getEndpointNamesOrBuilderList();
     /**
-     * <code>string endpoint_type = 4;</code>
-     * @return The bytes for endpointType.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
-    com.google.protobuf.ByteString
-        getEndpointTypeBytes();
+    context.ContextOuterClass.EndPointNameOrBuilder getEndpointNamesOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.EndPointName}
+   * Protobuf type {@code context.EndPointNameList}
    */
-  public static final class EndPointName extends
+  public static final class EndPointNameList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.EndPointName)
-      EndPointNameOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.EndPointNameList)
+      EndPointNameListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use EndPointName.newBuilder() to construct.
-    private EndPointName(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use EndPointNameList.newBuilder() to construct.
+    private EndPointNameList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private EndPointName() {
-      deviceName_ = "";
-      endpointName_ = "";
-      endpointType_ = "";
+    private EndPointNameList() {
+      endpointNames_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new EndPointName();
+      return new EndPointNameList();
     }
 
     @java.lang.Override
@@ -52967,7 +57848,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private EndPointName(
+    private EndPointNameList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -52975,6 +57856,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -52986,34 +57868,12 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
-              if (endpointId_ != null) {
-                subBuilder = endpointId_.toBuilder();
-              }
-              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointId_);
-                endpointId_ = subBuilder.buildPartial();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                endpointNames_ = new java.util.ArrayList<context.ContextOuterClass.EndPointName>();
+                mutable_bitField0_ |= 0x00000001;
               }
-
-              break;
-            }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              deviceName_ = s;
-              break;
-            }
-            case 26: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              endpointName_ = s;
-              break;
-            }
-            case 34: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              endpointType_ = s;
+              endpointNames_.add(
+                  input.readMessage(context.ContextOuterClass.EndPointName.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -53031,161 +57891,64 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
+      return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_EndPointName_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_EndPointNameList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.EndPointName.class, context.ContextOuterClass.EndPointName.Builder.class);
-    }
-
-    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.EndPointId endpointId_;
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    @java.lang.Override
-    public boolean hasEndpointId() {
-      return endpointId_ != null;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointId getEndpointId() {
-      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-      return getEndpointId();
+              context.ContextOuterClass.EndPointNameList.class, context.ContextOuterClass.EndPointNameList.Builder.class);
     }
 
-    public static final int DEVICE_NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object deviceName_;
-    /**
-     * <code>string device_name = 2;</code>
-     * @return The deviceName.
-     */
-    @java.lang.Override
-    public java.lang.String getDeviceName() {
-      java.lang.Object ref = deviceName_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        deviceName_ = s;
-        return s;
-      }
-    }
+    public static final int ENDPOINT_NAMES_FIELD_NUMBER = 1;
+    private java.util.List<context.ContextOuterClass.EndPointName> endpointNames_;
     /**
-     * <code>string device_name = 2;</code>
-     * @return The bytes for deviceName.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getDeviceNameBytes() {
-      java.lang.Object ref = deviceName_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        deviceName_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public java.util.List<context.ContextOuterClass.EndPointName> getEndpointNamesList() {
+      return endpointNames_;
     }
-
-    public static final int ENDPOINT_NAME_FIELD_NUMBER = 3;
-    private volatile java.lang.Object endpointName_;
     /**
-     * <code>string endpoint_name = 3;</code>
-     * @return The endpointName.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
     @java.lang.Override
-    public java.lang.String getEndpointName() {
-      java.lang.Object ref = endpointName_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        endpointName_ = s;
-        return s;
-      }
+    public java.util.List<? extends context.ContextOuterClass.EndPointNameOrBuilder> 
+        getEndpointNamesOrBuilderList() {
+      return endpointNames_;
     }
     /**
-     * <code>string endpoint_name = 3;</code>
-     * @return The bytes for endpointName.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getEndpointNameBytes() {
-      java.lang.Object ref = endpointName_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        endpointName_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public int getEndpointNamesCount() {
+      return endpointNames_.size();
     }
-
-    public static final int ENDPOINT_TYPE_FIELD_NUMBER = 4;
-    private volatile java.lang.Object endpointType_;
     /**
-     * <code>string endpoint_type = 4;</code>
-     * @return The endpointType.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
     @java.lang.Override
-    public java.lang.String getEndpointType() {
-      java.lang.Object ref = endpointType_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        endpointType_ = s;
-        return s;
-      }
+    public context.ContextOuterClass.EndPointName getEndpointNames(int index) {
+      return endpointNames_.get(index);
     }
     /**
-     * <code>string endpoint_type = 4;</code>
-     * @return The bytes for endpointType.
+     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getEndpointTypeBytes() {
-      java.lang.Object ref = endpointType_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        endpointType_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public context.ContextOuterClass.EndPointNameOrBuilder getEndpointNamesOrBuilder(
+        int index) {
+      return endpointNames_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -53202,17 +57965,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (endpointId_ != null) {
-        output.writeMessage(1, getEndpointId());
-      }
-      if (!getDeviceNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, deviceName_);
-      }
-      if (!getEndpointNameBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, endpointName_);
-      }
-      if (!getEndpointTypeBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, endpointType_);
+      for (int i = 0; i < endpointNames_.size(); i++) {
+        output.writeMessage(1, endpointNames_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -53223,18 +57977,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (endpointId_ != null) {
+      for (int i = 0; i < endpointNames_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEndpointId());
-      }
-      if (!getDeviceNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, deviceName_);
-      }
-      if (!getEndpointNameBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, endpointName_);
-      }
-      if (!getEndpointTypeBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, endpointType_);
+          .computeMessageSize(1, endpointNames_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -53246,22 +57991,13 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.EndPointName)) {
+      if (!(obj instanceof context.ContextOuterClass.EndPointNameList)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.EndPointName other = (context.ContextOuterClass.EndPointName) obj;
+      context.ContextOuterClass.EndPointNameList other = (context.ContextOuterClass.EndPointNameList) obj;
 
-      if (hasEndpointId() != other.hasEndpointId()) return false;
-      if (hasEndpointId()) {
-        if (!getEndpointId()
-            .equals(other.getEndpointId())) return false;
-      }
-      if (!getDeviceName()
-          .equals(other.getDeviceName())) return false;
-      if (!getEndpointName()
-          .equals(other.getEndpointName())) return false;
-      if (!getEndpointType()
-          .equals(other.getEndpointType())) return false;
+      if (!getEndpointNamesList()
+          .equals(other.getEndpointNamesList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -53273,84 +58009,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEndpointId()) {
-        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointId().hashCode();
+      if (getEndpointNamesCount() > 0) {
+        hash = (37 * hash) + ENDPOINT_NAMES_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointNamesList().hashCode();
       }
-      hash = (37 * hash) + DEVICE_NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getDeviceName().hashCode();
-      hash = (37 * hash) + ENDPOINT_NAME_FIELD_NUMBER;
-      hash = (53 * hash) + getEndpointName().hashCode();
-      hash = (37 * hash) + ENDPOINT_TYPE_FIELD_NUMBER;
-      hash = (53 * hash) + getEndpointType().hashCode();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(byte[] data)
+    public static context.ContextOuterClass.EndPointNameList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointNameList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointName parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.EndPointNameList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointName parseDelimitedFrom(
+    public static context.ContextOuterClass.EndPointNameList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointName parseFrom(
+    public static context.ContextOuterClass.EndPointNameList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -53363,7 +58093,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.EndPointName prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.EndPointNameList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -53379,26 +58109,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.EndPointName}
+     * Protobuf type {@code context.EndPointNameList}
      */
     public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.EndPointName)
-        context.ContextOuterClass.EndPointNameOrBuilder {
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
+        context.ContextOuterClass.EndPointNameListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_EndPointName_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_EndPointNameList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.EndPointName.class, context.ContextOuterClass.EndPointName.Builder.class);
+                context.ContextOuterClass.EndPointNameList.class, context.ContextOuterClass.EndPointNameList.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.EndPointName.newBuilder()
+      // Construct using context.ContextOuterClass.EndPointNameList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -53411,40 +58141,35 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getEndpointNamesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
+        if (endpointNamesBuilder_ == null) {
+          endpointNames_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
+          endpointNamesBuilder_.clear();
         }
-        deviceName_ = "";
-
-        endpointName_ = "";
-
-        endpointType_ = "";
-
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_EndPointName_descriptor;
+        return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointName getDefaultInstanceForType() {
-        return context.ContextOuterClass.EndPointName.getDefaultInstance();
+      public context.ContextOuterClass.EndPointNameList getDefaultInstanceForType() {
+        return context.ContextOuterClass.EndPointNameList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointName build() {
-        context.ContextOuterClass.EndPointName result = buildPartial();
+      public context.ContextOuterClass.EndPointNameList build() {
+        context.ContextOuterClass.EndPointNameList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -53452,16 +58177,18 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointName buildPartial() {
-        context.ContextOuterClass.EndPointName result = new context.ContextOuterClass.EndPointName(this);
-        if (endpointIdBuilder_ == null) {
-          result.endpointId_ = endpointId_;
+      public context.ContextOuterClass.EndPointNameList buildPartial() {
+        context.ContextOuterClass.EndPointNameList result = new context.ContextOuterClass.EndPointNameList(this);
+        int from_bitField0_ = bitField0_;
+        if (endpointNamesBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.endpointNames_ = endpointNames_;
         } else {
-          result.endpointId_ = endpointIdBuilder_.build();
+          result.endpointNames_ = endpointNamesBuilder_.build();
         }
-        result.deviceName_ = deviceName_;
-        result.endpointName_ = endpointName_;
-        result.endpointType_ = endpointType_;
         onBuilt();
         return result;
       }
@@ -53500,30 +58227,41 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.EndPointName) {
-          return mergeFrom((context.ContextOuterClass.EndPointName)other);
+        if (other instanceof context.ContextOuterClass.EndPointNameList) {
+          return mergeFrom((context.ContextOuterClass.EndPointNameList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.EndPointName other) {
-        if (other == context.ContextOuterClass.EndPointName.getDefaultInstance()) return this;
-        if (other.hasEndpointId()) {
-          mergeEndpointId(other.getEndpointId());
-        }
-        if (!other.getDeviceName().isEmpty()) {
-          deviceName_ = other.deviceName_;
-          onChanged();
-        }
-        if (!other.getEndpointName().isEmpty()) {
-          endpointName_ = other.endpointName_;
-          onChanged();
-        }
-        if (!other.getEndpointType().isEmpty()) {
-          endpointType_ = other.endpointType_;
-          onChanged();
+      public Builder mergeFrom(context.ContextOuterClass.EndPointNameList other) {
+        if (other == context.ContextOuterClass.EndPointNameList.getDefaultInstance()) return this;
+        if (endpointNamesBuilder_ == null) {
+          if (!other.endpointNames_.isEmpty()) {
+            if (endpointNames_.isEmpty()) {
+              endpointNames_ = other.endpointNames_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureEndpointNamesIsMutable();
+              endpointNames_.addAll(other.endpointNames_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.endpointNames_.isEmpty()) {
+            if (endpointNamesBuilder_.isEmpty()) {
+              endpointNamesBuilder_.dispose();
+              endpointNamesBuilder_ = null;
+              endpointNames_ = other.endpointNames_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              endpointNamesBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getEndpointNamesFieldBuilder() : null;
+            } else {
+              endpointNamesBuilder_.addAllMessages(other.endpointNames_);
+            }
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -53540,11 +58278,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.EndPointName parsedMessage = null;
+        context.ContextOuterClass.EndPointNameList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.EndPointName) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.EndPointNameList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -53553,352 +58291,246 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
+
+      private java.util.List<context.ContextOuterClass.EndPointName> endpointNames_ =
+        java.util.Collections.emptyList();
+      private void ensureEndpointNamesIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          endpointNames_ = new java.util.ArrayList<context.ContextOuterClass.EndPointName>(endpointNames_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointName, context.ContextOuterClass.EndPointName.Builder, context.ContextOuterClass.EndPointNameOrBuilder> endpointNamesBuilder_;
 
-      private context.ContextOuterClass.EndPointId endpointId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return Whether the endpointId field is set.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public boolean hasEndpointId() {
-        return endpointIdBuilder_ != null || endpointId_ != null;
+      public java.util.List<context.ContextOuterClass.EndPointName> getEndpointNamesList() {
+        if (endpointNamesBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(endpointNames_);
+        } else {
+          return endpointNamesBuilder_.getMessageList();
+        }
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return The endpointId.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public context.ContextOuterClass.EndPointId getEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+      public int getEndpointNamesCount() {
+        if (endpointNamesBuilder_ == null) {
+          return endpointNames_.size();
         } else {
-          return endpointIdBuilder_.getMessage();
+          return endpointNamesBuilder_.getCount();
         }
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
+      public context.ContextOuterClass.EndPointName getEndpointNames(int index) {
+        if (endpointNamesBuilder_ == null) {
+          return endpointNames_.get(index);
+        } else {
+          return endpointNamesBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       */
+      public Builder setEndpointNames(
+          int index, context.ContextOuterClass.EndPointName value) {
+        if (endpointNamesBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          endpointId_ = value;
+          ensureEndpointNamesIsMutable();
+          endpointNames_.set(index, value);
           onChanged();
         } else {
-          endpointIdBuilder_.setMessage(value);
+          endpointNamesBuilder_.setMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder setEndpointId(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = builderForValue.build();
+      public Builder setEndpointNames(
+          int index, context.ContextOuterClass.EndPointName.Builder builderForValue) {
+        if (endpointNamesBuilder_ == null) {
+          ensureEndpointNamesIsMutable();
+          endpointNames_.set(index, builderForValue.build());
           onChanged();
         } else {
-          endpointIdBuilder_.setMessage(builderForValue.build());
+          endpointNamesBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (endpointId_ != null) {
-            endpointId_ =
-              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
-          } else {
-            endpointId_ = value;
+      public Builder addEndpointNames(context.ContextOuterClass.EndPointName value) {
+        if (endpointNamesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureEndpointNamesIsMutable();
+          endpointNames_.add(value);
           onChanged();
         } else {
-          endpointIdBuilder_.mergeFrom(value);
+          endpointNamesBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder clearEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
+      public Builder addEndpointNames(
+          int index, context.ContextOuterClass.EndPointName value) {
+        if (endpointNamesBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEndpointNamesIsMutable();
+          endpointNames_.add(index, value);
           onChanged();
         } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
+          endpointNamesBuilder_.addMessage(index, value);
         }
-
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-        
-        onChanged();
-        return getEndpointIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-        if (endpointIdBuilder_ != null) {
-          return endpointIdBuilder_.getMessageOrBuilder();
+      public Builder addEndpointNames(
+          context.ContextOuterClass.EndPointName.Builder builderForValue) {
+        if (endpointNamesBuilder_ == null) {
+          ensureEndpointNamesIsMutable();
+          endpointNames_.add(builderForValue.build());
+          onChanged();
         } else {
-          return endpointId_ == null ?
-              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getEndpointIdFieldBuilder() {
-        if (endpointIdBuilder_ == null) {
-          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  getEndpointId(),
-                  getParentForChildren(),
-                  isClean());
-          endpointId_ = null;
+          endpointNamesBuilder_.addMessage(builderForValue.build());
         }
-        return endpointIdBuilder_;
+        return this;
       }
-
-      private java.lang.Object deviceName_ = "";
       /**
-       * <code>string device_name = 2;</code>
-       * @return The deviceName.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public java.lang.String getDeviceName() {
-        java.lang.Object ref = deviceName_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          deviceName_ = s;
-          return s;
+      public Builder addEndpointNames(
+          int index, context.ContextOuterClass.EndPointName.Builder builderForValue) {
+        if (endpointNamesBuilder_ == null) {
+          ensureEndpointNamesIsMutable();
+          endpointNames_.add(index, builderForValue.build());
+          onChanged();
         } else {
-          return (java.lang.String) ref;
+          endpointNamesBuilder_.addMessage(index, builderForValue.build());
         }
+        return this;
       }
       /**
-       * <code>string device_name = 2;</code>
-       * @return The bytes for deviceName.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public com.google.protobuf.ByteString
-          getDeviceNameBytes() {
-        java.lang.Object ref = deviceName_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          deviceName_ = b;
-          return b;
+      public Builder addAllEndpointNames(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointName> values) {
+        if (endpointNamesBuilder_ == null) {
+          ensureEndpointNamesIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, endpointNames_);
+          onChanged();
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          endpointNamesBuilder_.addAllMessages(values);
         }
-      }
-      /**
-       * <code>string device_name = 2;</code>
-       * @param value The deviceName to set.
-       * @return This builder for chaining.
-       */
-      public Builder setDeviceName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        deviceName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string device_name = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearDeviceName() {
-        
-        deviceName_ = getDefaultInstance().getDeviceName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string device_name = 2;</code>
-       * @param value The bytes for deviceName to set.
-       * @return This builder for chaining.
-       */
-      public Builder setDeviceNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        deviceName_ = value;
-        onChanged();
         return this;
       }
-
-      private java.lang.Object endpointName_ = "";
       /**
-       * <code>string endpoint_name = 3;</code>
-       * @return The endpointName.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public java.lang.String getEndpointName() {
-        java.lang.Object ref = endpointName_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          endpointName_ = s;
-          return s;
+      public Builder clearEndpointNames() {
+        if (endpointNamesBuilder_ == null) {
+          endpointNames_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
         } else {
-          return (java.lang.String) ref;
+          endpointNamesBuilder_.clear();
         }
+        return this;
       }
       /**
-       * <code>string endpoint_name = 3;</code>
-       * @return The bytes for endpointName.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public com.google.protobuf.ByteString
-          getEndpointNameBytes() {
-        java.lang.Object ref = endpointName_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          endpointName_ = b;
-          return b;
+      public Builder removeEndpointNames(int index) {
+        if (endpointNamesBuilder_ == null) {
+          ensureEndpointNamesIsMutable();
+          endpointNames_.remove(index);
+          onChanged();
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          endpointNamesBuilder_.remove(index);
         }
-      }
-      /**
-       * <code>string endpoint_name = 3;</code>
-       * @param value The endpointName to set.
-       * @return This builder for chaining.
-       */
-      public Builder setEndpointName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        endpointName_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string endpoint_name = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearEndpointName() {
-        
-        endpointName_ = getDefaultInstance().getEndpointName();
-        onChanged();
         return this;
       }
       /**
-       * <code>string endpoint_name = 3;</code>
-       * @param value The bytes for endpointName to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder setEndpointNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        endpointName_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.EndPointName.Builder getEndpointNamesBuilder(
+          int index) {
+        return getEndpointNamesFieldBuilder().getBuilder(index);
       }
-
-      private java.lang.Object endpointType_ = "";
       /**
-       * <code>string endpoint_type = 4;</code>
-       * @return The endpointType.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public java.lang.String getEndpointType() {
-        java.lang.Object ref = endpointType_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          endpointType_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
+      public context.ContextOuterClass.EndPointNameOrBuilder getEndpointNamesOrBuilder(
+          int index) {
+        if (endpointNamesBuilder_ == null) {
+          return endpointNames_.get(index);  } else {
+          return endpointNamesBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>string endpoint_type = 4;</code>
-       * @return The bytes for endpointType.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public com.google.protobuf.ByteString
-          getEndpointTypeBytes() {
-        java.lang.Object ref = endpointType_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          endpointType_ = b;
-          return b;
+      public java.util.List<? extends context.ContextOuterClass.EndPointNameOrBuilder> 
+           getEndpointNamesOrBuilderList() {
+        if (endpointNamesBuilder_ != null) {
+          return endpointNamesBuilder_.getMessageOrBuilderList();
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          return java.util.Collections.unmodifiableList(endpointNames_);
         }
       }
       /**
-       * <code>string endpoint_type = 4;</code>
-       * @param value The endpointType to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder setEndpointType(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        endpointType_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.EndPointName.Builder addEndpointNamesBuilder() {
+        return getEndpointNamesFieldBuilder().addBuilder(
+            context.ContextOuterClass.EndPointName.getDefaultInstance());
       }
       /**
-       * <code>string endpoint_type = 4;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder clearEndpointType() {
-        
-        endpointType_ = getDefaultInstance().getEndpointType();
-        onChanged();
-        return this;
+      public context.ContextOuterClass.EndPointName.Builder addEndpointNamesBuilder(
+          int index) {
+        return getEndpointNamesFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.EndPointName.getDefaultInstance());
       }
       /**
-       * <code>string endpoint_type = 4;</code>
-       * @param value The bytes for endpointType to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
        */
-      public Builder setEndpointTypeBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        endpointType_ = value;
-        onChanged();
-        return this;
+      public java.util.List<context.ContextOuterClass.EndPointName.Builder> 
+           getEndpointNamesBuilderList() {
+        return getEndpointNamesFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointName, context.ContextOuterClass.EndPointName.Builder, context.ContextOuterClass.EndPointNameOrBuilder> 
+          getEndpointNamesFieldBuilder() {
+        if (endpointNamesBuilder_ == null) {
+          endpointNamesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.EndPointName, context.ContextOuterClass.EndPointName.Builder, context.ContextOuterClass.EndPointNameOrBuilder>(
+                  endpointNames_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          endpointNames_ = null;
+        }
+        return endpointNamesBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -53913,95 +58545,96 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.EndPointName)
+      // @@protoc_insertion_point(builder_scope:context.EndPointNameList)
     }
 
-    // @@protoc_insertion_point(class_scope:context.EndPointName)
-    private static final context.ContextOuterClass.EndPointName DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.EndPointNameList)
+    private static final context.ContextOuterClass.EndPointNameList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointName();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointNameList();
     }
 
-    public static context.ContextOuterClass.EndPointName getDefaultInstance() {
+    public static context.ContextOuterClass.EndPointNameList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<EndPointName>
-        PARSER = new com.google.protobuf.AbstractParser<EndPointName>() {
+    private static final com.google.protobuf.Parser<EndPointNameList>
+        PARSER = new com.google.protobuf.AbstractParser<EndPointNameList>() {
       @java.lang.Override
-      public EndPointName parsePartialFrom(
+      public EndPointNameList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new EndPointName(input, extensionRegistry);
+        return new EndPointNameList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<EndPointName> parser() {
+    public static com.google.protobuf.Parser<EndPointNameList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<EndPointName> getParserForType() {
+    public com.google.protobuf.Parser<EndPointNameList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.EndPointName getDefaultInstanceForType() {
+    public context.ContextOuterClass.EndPointNameList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface EndPointIdListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.EndPointIdList)
+  public interface ConfigRule_CustomOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-     */
-    java.util.List<context.ContextOuterClass.EndPointId> 
-        getEndpointIdsList();
-    /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_key = 1;</code>
+     * @return The resourceKey.
      */
-    context.ContextOuterClass.EndPointId getEndpointIds(int index);
+    java.lang.String getResourceKey();
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_key = 1;</code>
+     * @return The bytes for resourceKey.
      */
-    int getEndpointIdsCount();
+    com.google.protobuf.ByteString
+        getResourceKeyBytes();
+
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_value = 2;</code>
+     * @return The resourceValue.
      */
-    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getEndpointIdsOrBuilderList();
+    java.lang.String getResourceValue();
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_value = 2;</code>
+     * @return The bytes for resourceValue.
      */
-    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
-        int index);
+    com.google.protobuf.ByteString
+        getResourceValueBytes();
   }
   /**
-   * Protobuf type {@code context.EndPointIdList}
+   * Protobuf type {@code context.ConfigRule_Custom}
    */
-  public static final class EndPointIdList extends
+  public static final class ConfigRule_Custom extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.EndPointIdList)
-      EndPointIdListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
+      ConfigRule_CustomOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use EndPointIdList.newBuilder() to construct.
-    private EndPointIdList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConfigRule_Custom.newBuilder() to construct.
+    private ConfigRule_Custom(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private EndPointIdList() {
-      endpointIds_ = java.util.Collections.emptyList();
+    private ConfigRule_Custom() {
+      resourceKey_ = "";
+      resourceValue_ = "";
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new EndPointIdList();
+      return new ConfigRule_Custom();
     }
 
     @java.lang.Override
@@ -54009,7 +58642,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private EndPointIdList(
+    private ConfigRule_Custom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -54017,7 +58650,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -54029,12 +58661,15 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                endpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              endpointIds_.add(
-                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+              java.lang.String s = input.readStringRequireUtf8();
+
+              resourceKey_ = s;
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              resourceValue_ = s;
               break;
             }
             default: {
@@ -54052,64 +58687,97 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_EndPointIdList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.EndPointIdList.class, context.ContextOuterClass.EndPointIdList.Builder.class);
+              context.ContextOuterClass.ConfigRule_Custom.class, context.ContextOuterClass.ConfigRule_Custom.Builder.class);
     }
 
-    public static final int ENDPOINT_IDS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.EndPointId> endpointIds_;
-    /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-     */
-    @java.lang.Override
-    public java.util.List<context.ContextOuterClass.EndPointId> getEndpointIdsList() {
-      return endpointIds_;
-    }
+    public static final int RESOURCE_KEY_FIELD_NUMBER = 1;
+    private volatile java.lang.Object resourceKey_;
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_key = 1;</code>
+     * @return The resourceKey.
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-        getEndpointIdsOrBuilderList() {
-      return endpointIds_;
+    public java.lang.String getResourceKey() {
+      java.lang.Object ref = resourceKey_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        resourceKey_ = s;
+        return s;
+      }
     }
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_key = 1;</code>
+     * @return The bytes for resourceKey.
      */
     @java.lang.Override
-    public int getEndpointIdsCount() {
-      return endpointIds_.size();
+    public com.google.protobuf.ByteString
+        getResourceKeyBytes() {
+      java.lang.Object ref = resourceKey_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        resourceKey_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
+
+    public static final int RESOURCE_VALUE_FIELD_NUMBER = 2;
+    private volatile java.lang.Object resourceValue_;
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_value = 2;</code>
+     * @return The resourceValue.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointId getEndpointIds(int index) {
-      return endpointIds_.get(index);
+    public java.lang.String getResourceValue() {
+      java.lang.Object ref = resourceValue_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        resourceValue_ = s;
+        return s;
+      }
     }
     /**
-     * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+     * <code>string resource_value = 2;</code>
+     * @return The bytes for resourceValue.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
-        int index) {
-      return endpointIds_.get(index);
+    public com.google.protobuf.ByteString
+        getResourceValueBytes() {
+      java.lang.Object ref = resourceValue_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        resourceValue_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
     private byte memoizedIsInitialized = -1;
@@ -54126,8 +58794,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < endpointIds_.size(); i++) {
-        output.writeMessage(1, endpointIds_.get(i));
+      if (!getResourceKeyBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, resourceKey_);
+      }
+      if (!getResourceValueBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, resourceValue_);
       }
       unknownFields.writeTo(output);
     }
@@ -54138,9 +58809,11 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < endpointIds_.size(); i++) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, endpointIds_.get(i));
+      if (!getResourceKeyBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, resourceKey_);
+      }
+      if (!getResourceValueBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, resourceValue_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -54152,13 +58825,15 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.EndPointIdList)) {
+      if (!(obj instanceof context.ContextOuterClass.ConfigRule_Custom)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.EndPointIdList other = (context.ContextOuterClass.EndPointIdList) obj;
+      context.ContextOuterClass.ConfigRule_Custom other = (context.ContextOuterClass.ConfigRule_Custom) obj;
 
-      if (!getEndpointIdsList()
-          .equals(other.getEndpointIdsList())) return false;
+      if (!getResourceKey()
+          .equals(other.getResourceKey())) return false;
+      if (!getResourceValue()
+          .equals(other.getResourceValue())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -54170,78 +58845,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getEndpointIdsCount() > 0) {
-        hash = (37 * hash) + ENDPOINT_IDS_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointIdsList().hashCode();
-      }
+      hash = (37 * hash) + RESOURCE_KEY_FIELD_NUMBER;
+      hash = (53 * hash) + getResourceKey().hashCode();
+      hash = (37 * hash) + RESOURCE_VALUE_FIELD_NUMBER;
+      hash = (53 * hash) + getResourceValue().hashCode();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointIdList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConfigRule_Custom parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointIdList parseDelimitedFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointIdList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -54254,7 +58929,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.EndPointIdList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConfigRule_Custom prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -54270,26 +58945,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.EndPointIdList}
+     * Protobuf type {@code context.ConfigRule_Custom}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.EndPointIdList)
-        context.ContextOuterClass.EndPointIdListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
+        context.ContextOuterClass.ConfigRule_CustomOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_EndPointIdList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.EndPointIdList.class, context.ContextOuterClass.EndPointIdList.Builder.class);
+                context.ContextOuterClass.ConfigRule_Custom.class, context.ContextOuterClass.ConfigRule_Custom.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.EndPointIdList.newBuilder()
+      // Construct using context.ContextOuterClass.ConfigRule_Custom.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -54302,35 +58977,32 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getEndpointIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointIdsBuilder_ == null) {
-          endpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-        } else {
-          endpointIdsBuilder_.clear();
-        }
+        resourceKey_ = "";
+
+        resourceValue_ = "";
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_EndPointIdList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointIdList getDefaultInstanceForType() {
-        return context.ContextOuterClass.EndPointIdList.getDefaultInstance();
+      public context.ContextOuterClass.ConfigRule_Custom getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointIdList build() {
-        context.ContextOuterClass.EndPointIdList result = buildPartial();
+      public context.ContextOuterClass.ConfigRule_Custom build() {
+        context.ContextOuterClass.ConfigRule_Custom result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -54338,18 +59010,10 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointIdList buildPartial() {
-        context.ContextOuterClass.EndPointIdList result = new context.ContextOuterClass.EndPointIdList(this);
-        int from_bitField0_ = bitField0_;
-        if (endpointIdsBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.endpointIds_ = endpointIds_;
-        } else {
-          result.endpointIds_ = endpointIdsBuilder_.build();
-        }
+      public context.ContextOuterClass.ConfigRule_Custom buildPartial() {
+        context.ContextOuterClass.ConfigRule_Custom result = new context.ContextOuterClass.ConfigRule_Custom(this);
+        result.resourceKey_ = resourceKey_;
+        result.resourceValue_ = resourceValue_;
         onBuilt();
         return result;
       }
@@ -54388,41 +59052,23 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.EndPointIdList) {
-          return mergeFrom((context.ContextOuterClass.EndPointIdList)other);
+        if (other instanceof context.ContextOuterClass.ConfigRule_Custom) {
+          return mergeFrom((context.ContextOuterClass.ConfigRule_Custom)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.EndPointIdList other) {
-        if (other == context.ContextOuterClass.EndPointIdList.getDefaultInstance()) return this;
-        if (endpointIdsBuilder_ == null) {
-          if (!other.endpointIds_.isEmpty()) {
-            if (endpointIds_.isEmpty()) {
-              endpointIds_ = other.endpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureEndpointIdsIsMutable();
-              endpointIds_.addAll(other.endpointIds_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.endpointIds_.isEmpty()) {
-            if (endpointIdsBuilder_.isEmpty()) {
-              endpointIdsBuilder_.dispose();
-              endpointIdsBuilder_ = null;
-              endpointIds_ = other.endpointIds_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              endpointIdsBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getEndpointIdsFieldBuilder() : null;
-            } else {
-              endpointIdsBuilder_.addAllMessages(other.endpointIds_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.ConfigRule_Custom other) {
+        if (other == context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance()) return this;
+        if (!other.getResourceKey().isEmpty()) {
+          resourceKey_ = other.resourceKey_;
+          onChanged();
+        }
+        if (!other.getResourceValue().isEmpty()) {
+          resourceValue_ = other.resourceValue_;
+          onChanged();
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -54439,11 +59085,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.EndPointIdList parsedMessage = null;
+        context.ContextOuterClass.ConfigRule_Custom parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.EndPointIdList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConfigRule_Custom) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -54452,246 +59098,157 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<context.ContextOuterClass.EndPointId> endpointIds_ =
-        java.util.Collections.emptyList();
-      private void ensureEndpointIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          endpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(endpointIds_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdsBuilder_;
 
+      private java.lang.Object resourceKey_ = "";
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointId> getEndpointIdsList() {
-        if (endpointIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(endpointIds_);
-        } else {
-          return endpointIdsBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public int getEndpointIdsCount() {
-        if (endpointIdsBuilder_ == null) {
-          return endpointIds_.size();
-        } else {
-          return endpointIdsBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointId getEndpointIds(int index) {
-        if (endpointIdsBuilder_ == null) {
-          return endpointIds_.get(index);
-        } else {
-          return endpointIdsBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public Builder setEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (endpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureEndpointIdsIsMutable();
-          endpointIds_.set(index, value);
-          onChanged();
-        } else {
-          endpointIdsBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public Builder setEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdsBuilder_ == null) {
-          ensureEndpointIdsIsMutable();
-          endpointIds_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          endpointIdsBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public Builder addEndpointIds(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureEndpointIdsIsMutable();
-          endpointIds_.add(value);
-          onChanged();
-        } else {
-          endpointIdsBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public Builder addEndpointIds(
-          int index, context.ContextOuterClass.EndPointId value) {
-        if (endpointIdsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureEndpointIdsIsMutable();
-          endpointIds_.add(index, value);
-          onChanged();
-        } else {
-          endpointIdsBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_key = 1;</code>
+       * @return The resourceKey.
        */
-      public Builder addEndpointIds(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdsBuilder_ == null) {
-          ensureEndpointIdsIsMutable();
-          endpointIds_.add(builderForValue.build());
-          onChanged();
+      public java.lang.String getResourceKey() {
+        java.lang.Object ref = resourceKey_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          resourceKey_ = s;
+          return s;
         } else {
-          endpointIdsBuilder_.addMessage(builderForValue.build());
+          return (java.lang.String) ref;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_key = 1;</code>
+       * @return The bytes for resourceKey.
        */
-      public Builder addEndpointIds(
-          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdsBuilder_ == null) {
-          ensureEndpointIdsIsMutable();
-          endpointIds_.add(index, builderForValue.build());
-          onChanged();
+      public com.google.protobuf.ByteString
+          getResourceKeyBytes() {
+        java.lang.Object ref = resourceKey_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          resourceKey_ = b;
+          return b;
         } else {
-          endpointIdsBuilder_.addMessage(index, builderForValue.build());
+          return (com.google.protobuf.ByteString) ref;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_key = 1;</code>
+       * @param value The resourceKey to set.
+       * @return This builder for chaining.
        */
-      public Builder addAllEndpointIds(
-          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
-        if (endpointIdsBuilder_ == null) {
-          ensureEndpointIdsIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, endpointIds_);
-          onChanged();
-        } else {
-          endpointIdsBuilder_.addAllMessages(values);
-        }
+      public Builder setResourceKey(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        resourceKey_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_key = 1;</code>
+       * @return This builder for chaining.
        */
-      public Builder clearEndpointIds() {
-        if (endpointIdsBuilder_ == null) {
-          endpointIds_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          endpointIdsBuilder_.clear();
-        }
+      public Builder clearResourceKey() {
+        
+        resourceKey_ = getDefaultInstance().getResourceKey();
+        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_key = 1;</code>
+       * @param value The bytes for resourceKey to set.
+       * @return This builder for chaining.
        */
-      public Builder removeEndpointIds(int index) {
-        if (endpointIdsBuilder_ == null) {
-          ensureEndpointIdsIsMutable();
-          endpointIds_.remove(index);
-          onChanged();
-        } else {
-          endpointIdsBuilder_.remove(index);
-        }
+      public Builder setResourceKeyBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        resourceKey_ = value;
+        onChanged();
         return this;
       }
+
+      private java.lang.Object resourceValue_ = "";
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getEndpointIdsBuilder(
-          int index) {
-        return getEndpointIdsFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_value = 2;</code>
+       * @return The resourceValue.
        */
-      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
-          int index) {
-        if (endpointIdsBuilder_ == null) {
-          return endpointIds_.get(index);  } else {
-          return endpointIdsBuilder_.getMessageOrBuilder(index);
+      public java.lang.String getResourceValue() {
+        java.lang.Object ref = resourceValue_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          resourceValue_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
         }
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_value = 2;</code>
+       * @return The bytes for resourceValue.
        */
-      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
-           getEndpointIdsOrBuilderList() {
-        if (endpointIdsBuilder_ != null) {
-          return endpointIdsBuilder_.getMessageOrBuilderList();
+      public com.google.protobuf.ByteString
+          getResourceValueBytes() {
+        java.lang.Object ref = resourceValue_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          resourceValue_ = b;
+          return b;
         } else {
-          return java.util.Collections.unmodifiableList(endpointIds_);
+          return (com.google.protobuf.ByteString) ref;
         }
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_value = 2;</code>
+       * @param value The resourceValue to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.EndPointId.Builder addEndpointIdsBuilder() {
-        return getEndpointIdsFieldBuilder().addBuilder(
-            context.ContextOuterClass.EndPointId.getDefaultInstance());
+      public Builder setResourceValue(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        resourceValue_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_value = 2;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.EndPointId.Builder addEndpointIdsBuilder(
-          int index) {
-        return getEndpointIdsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+      public Builder clearResourceValue() {
+        
+        resourceValue_ = getDefaultInstance().getResourceValue();
+        onChanged();
+        return this;
       }
       /**
-       * <code>repeated .context.EndPointId endpoint_ids = 1;</code>
+       * <code>string resource_value = 2;</code>
+       * @param value The bytes for resourceValue to set.
+       * @return This builder for chaining.
        */
-      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
-           getEndpointIdsBuilderList() {
-        return getEndpointIdsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getEndpointIdsFieldBuilder() {
-        if (endpointIdsBuilder_ == null) {
-          endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  endpointIds_,
-                  ((bitField0_ & 0x00000001) != 0),
-                  getParentForChildren(),
-                  isClean());
-          endpointIds_ = null;
-        }
-        return endpointIdsBuilder_;
+      public Builder setResourceValueBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        resourceValue_ = value;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -54706,95 +59263,100 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.EndPointIdList)
+      // @@protoc_insertion_point(builder_scope:context.ConfigRule_Custom)
     }
 
-    // @@protoc_insertion_point(class_scope:context.EndPointIdList)
-    private static final context.ContextOuterClass.EndPointIdList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConfigRule_Custom)
+    private static final context.ContextOuterClass.ConfigRule_Custom DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointIdList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_Custom();
     }
 
-    public static context.ContextOuterClass.EndPointIdList getDefaultInstance() {
+    public static context.ContextOuterClass.ConfigRule_Custom getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<EndPointIdList>
-        PARSER = new com.google.protobuf.AbstractParser<EndPointIdList>() {
+    private static final com.google.protobuf.Parser<ConfigRule_Custom>
+        PARSER = new com.google.protobuf.AbstractParser<ConfigRule_Custom>() {
       @java.lang.Override
-      public EndPointIdList parsePartialFrom(
+      public ConfigRule_Custom parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new EndPointIdList(input, extensionRegistry);
+        return new ConfigRule_Custom(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<EndPointIdList> parser() {
+    public static com.google.protobuf.Parser<ConfigRule_Custom> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<EndPointIdList> getParserForType() {
+    public com.google.protobuf.Parser<ConfigRule_Custom> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.EndPointIdList getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConfigRule_Custom getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface EndPointNameListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.EndPointNameList)
+  public interface ConfigRule_ACLOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
-    java.util.List<context.ContextOuterClass.EndPointName> 
-        getEndpointNamesList();
+    boolean hasEndpointId();
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
-    context.ContextOuterClass.EndPointName getEndpointNames(int index);
+    context.ContextOuterClass.EndPointId getEndpointId();
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
-    int getEndpointNamesCount();
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     * @return Whether the ruleSet field is set.
      */
-    java.util.List<? extends context.ContextOuterClass.EndPointNameOrBuilder> 
-        getEndpointNamesOrBuilderList();
+    boolean hasRuleSet();
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     * @return The ruleSet.
      */
-    context.ContextOuterClass.EndPointNameOrBuilder getEndpointNamesOrBuilder(
-        int index);
+    acl.Acl.AclRuleSet getRuleSet();
+    /**
+     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     */
+    acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder();
   }
   /**
-   * Protobuf type {@code context.EndPointNameList}
+   * Protobuf type {@code context.ConfigRule_ACL}
    */
-  public static final class EndPointNameList extends
+  public static final class ConfigRule_ACL extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.EndPointNameList)
-      EndPointNameListOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
+      ConfigRule_ACLOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use EndPointNameList.newBuilder() to construct.
-    private EndPointNameList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConfigRule_ACL.newBuilder() to construct.
+    private ConfigRule_ACL(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private EndPointNameList() {
-      endpointNames_ = java.util.Collections.emptyList();
+    private ConfigRule_ACL() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new EndPointNameList();
+      return new ConfigRule_ACL();
     }
 
     @java.lang.Override
@@ -54802,7 +59364,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private EndPointNameList(
+    private ConfigRule_ACL(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -54810,7 +59372,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -54822,12 +59383,29 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                endpointNames_ = new java.util.ArrayList<context.ContextOuterClass.EndPointName>();
-                mutable_bitField0_ |= 0x00000001;
+              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+              if (endpointId_ != null) {
+                subBuilder = endpointId_.toBuilder();
               }
-              endpointNames_.add(
-                  input.readMessage(context.ContextOuterClass.EndPointName.parser(), extensionRegistry));
+              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(endpointId_);
+                endpointId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              acl.Acl.AclRuleSet.Builder subBuilder = null;
+              if (ruleSet_ != null) {
+                subBuilder = ruleSet_.toBuilder();
+              }
+              ruleSet_ = input.readMessage(acl.Acl.AclRuleSet.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(ruleSet_);
+                ruleSet_ = subBuilder.buildPartial();
+              }
+
               break;
             }
             default: {
@@ -54845,64 +59423,73 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_EndPointNameList_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.EndPointNameList.class, context.ContextOuterClass.EndPointNameList.Builder.class);
+              context.ContextOuterClass.ConfigRule_ACL.class, context.ContextOuterClass.ConfigRule_ACL.Builder.class);
     }
 
-    public static final int ENDPOINT_NAMES_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.EndPointName> endpointNames_;
+    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.EndPointId endpointId_;
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.EndPointName> getEndpointNamesList() {
-      return endpointNames_;
+    public boolean hasEndpointId() {
+      return endpointId_ != null;
     }
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
     @java.lang.Override
-    public java.util.List<? extends context.ContextOuterClass.EndPointNameOrBuilder> 
-        getEndpointNamesOrBuilderList() {
-      return endpointNames_;
+    public context.ContextOuterClass.EndPointId getEndpointId() {
+      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
     }
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
     @java.lang.Override
-    public int getEndpointNamesCount() {
-      return endpointNames_.size();
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+      return getEndpointId();
     }
+
+    public static final int RULE_SET_FIELD_NUMBER = 2;
+    private acl.Acl.AclRuleSet ruleSet_;
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     * @return Whether the ruleSet field is set.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointName getEndpointNames(int index) {
-      return endpointNames_.get(index);
+    public boolean hasRuleSet() {
+      return ruleSet_ != null;
     }
     /**
-     * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     * @return The ruleSet.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointNameOrBuilder getEndpointNamesOrBuilder(
-        int index) {
-      return endpointNames_.get(index);
+    public acl.Acl.AclRuleSet getRuleSet() {
+      return ruleSet_ == null ? acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
+    }
+    /**
+     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     */
+    @java.lang.Override
+    public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
+      return getRuleSet();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -54919,8 +59506,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < endpointNames_.size(); i++) {
-        output.writeMessage(1, endpointNames_.get(i));
+      if (endpointId_ != null) {
+        output.writeMessage(1, getEndpointId());
+      }
+      if (ruleSet_ != null) {
+        output.writeMessage(2, getRuleSet());
       }
       unknownFields.writeTo(output);
     }
@@ -54931,9 +59521,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < endpointNames_.size(); i++) {
+      if (endpointId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, endpointNames_.get(i));
+          .computeMessageSize(1, getEndpointId());
+      }
+      if (ruleSet_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getRuleSet());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -54945,13 +59539,21 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.EndPointNameList)) {
+      if (!(obj instanceof context.ContextOuterClass.ConfigRule_ACL)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.EndPointNameList other = (context.ContextOuterClass.EndPointNameList) obj;
+      context.ContextOuterClass.ConfigRule_ACL other = (context.ContextOuterClass.ConfigRule_ACL) obj;
 
-      if (!getEndpointNamesList()
-          .equals(other.getEndpointNamesList())) return false;
+      if (hasEndpointId() != other.hasEndpointId()) return false;
+      if (hasEndpointId()) {
+        if (!getEndpointId()
+            .equals(other.getEndpointId())) return false;
+      }
+      if (hasRuleSet() != other.hasRuleSet()) return false;
+      if (hasRuleSet()) {
+        if (!getRuleSet()
+            .equals(other.getRuleSet())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -54963,78 +59565,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getEndpointNamesCount() > 0) {
-        hash = (37 * hash) + ENDPOINT_NAMES_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointNamesList().hashCode();
+      if (hasEndpointId()) {
+        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointId().hashCode();
+      }
+      if (hasRuleSet()) {
+        hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
+        hash = (53 * hash) + getRuleSet().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointNameList parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConfigRule_ACL parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointNameList parseDelimitedFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.EndPointNameList parseFrom(
+    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -55047,7 +59653,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.EndPointNameList prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConfigRule_ACL prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -55063,26 +59669,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.EndPointNameList}
+     * Protobuf type {@code context.ConfigRule_ACL}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.EndPointNameList)
-        context.ContextOuterClass.EndPointNameListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
+        context.ContextOuterClass.ConfigRule_ACLOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_EndPointNameList_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.EndPointNameList.class, context.ContextOuterClass.EndPointNameList.Builder.class);
+                context.ContextOuterClass.ConfigRule_ACL.class, context.ContextOuterClass.ConfigRule_ACL.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.EndPointNameList.newBuilder()
+      // Construct using context.ContextOuterClass.ConfigRule_ACL.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -55095,17 +59701,22 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getEndpointNamesFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointNamesBuilder_ == null) {
-          endpointNames_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
         } else {
-          endpointNamesBuilder_.clear();
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
+        }
+        if (ruleSetBuilder_ == null) {
+          ruleSet_ = null;
+        } else {
+          ruleSet_ = null;
+          ruleSetBuilder_ = null;
         }
         return this;
       }
@@ -55113,17 +59724,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_EndPointNameList_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointNameList getDefaultInstanceForType() {
-        return context.ContextOuterClass.EndPointNameList.getDefaultInstance();
+      public context.ContextOuterClass.ConfigRule_ACL getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointNameList build() {
-        context.ContextOuterClass.EndPointNameList result = buildPartial();
+      public context.ContextOuterClass.ConfigRule_ACL build() {
+        context.ContextOuterClass.ConfigRule_ACL result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -55131,17 +59742,17 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.EndPointNameList buildPartial() {
-        context.ContextOuterClass.EndPointNameList result = new context.ContextOuterClass.EndPointNameList(this);
-        int from_bitField0_ = bitField0_;
-        if (endpointNamesBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            endpointNames_ = java.util.Collections.unmodifiableList(endpointNames_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
-          result.endpointNames_ = endpointNames_;
+      public context.ContextOuterClass.ConfigRule_ACL buildPartial() {
+        context.ContextOuterClass.ConfigRule_ACL result = new context.ContextOuterClass.ConfigRule_ACL(this);
+        if (endpointIdBuilder_ == null) {
+          result.endpointId_ = endpointId_;
         } else {
-          result.endpointNames_ = endpointNamesBuilder_.build();
+          result.endpointId_ = endpointIdBuilder_.build();
+        }
+        if (ruleSetBuilder_ == null) {
+          result.ruleSet_ = ruleSet_;
+        } else {
+          result.ruleSet_ = ruleSetBuilder_.build();
         }
         onBuilt();
         return result;
@@ -55181,41 +59792,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.EndPointNameList) {
-          return mergeFrom((context.ContextOuterClass.EndPointNameList)other);
+        if (other instanceof context.ContextOuterClass.ConfigRule_ACL) {
+          return mergeFrom((context.ContextOuterClass.ConfigRule_ACL)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.EndPointNameList other) {
-        if (other == context.ContextOuterClass.EndPointNameList.getDefaultInstance()) return this;
-        if (endpointNamesBuilder_ == null) {
-          if (!other.endpointNames_.isEmpty()) {
-            if (endpointNames_.isEmpty()) {
-              endpointNames_ = other.endpointNames_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureEndpointNamesIsMutable();
-              endpointNames_.addAll(other.endpointNames_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.endpointNames_.isEmpty()) {
-            if (endpointNamesBuilder_.isEmpty()) {
-              endpointNamesBuilder_.dispose();
-              endpointNamesBuilder_ = null;
-              endpointNames_ = other.endpointNames_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              endpointNamesBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getEndpointNamesFieldBuilder() : null;
-            } else {
-              endpointNamesBuilder_.addAllMessages(other.endpointNames_);
-            }
-          }
+      public Builder mergeFrom(context.ContextOuterClass.ConfigRule_ACL other) {
+        if (other == context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance()) return this;
+        if (other.hasEndpointId()) {
+          mergeEndpointId(other.getEndpointId());
+        }
+        if (other.hasRuleSet()) {
+          mergeRuleSet(other.getRuleSet());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -55232,11 +59823,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.EndPointNameList parsedMessage = null;
+        context.ContextOuterClass.ConfigRule_ACL parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.EndPointNameList) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConfigRule_ACL) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -55245,246 +59836,243 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<context.ContextOuterClass.EndPointName> endpointNames_ =
-        java.util.Collections.emptyList();
-      private void ensureEndpointNamesIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          endpointNames_ = new java.util.ArrayList<context.ContextOuterClass.EndPointName>(endpointNames_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointName, context.ContextOuterClass.EndPointName.Builder, context.ContextOuterClass.EndPointNameOrBuilder> endpointNamesBuilder_;
 
+      private context.ContextOuterClass.EndPointId endpointId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
-       */
-      public java.util.List<context.ContextOuterClass.EndPointName> getEndpointNamesList() {
-        if (endpointNamesBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(endpointNames_);
-        } else {
-          return endpointNamesBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return Whether the endpointId field is set.
        */
-      public int getEndpointNamesCount() {
-        if (endpointNamesBuilder_ == null) {
-          return endpointNames_.size();
-        } else {
-          return endpointNamesBuilder_.getCount();
-        }
+      public boolean hasEndpointId() {
+        return endpointIdBuilder_ != null || endpointId_ != null;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return The endpointId.
        */
-      public context.ContextOuterClass.EndPointName getEndpointNames(int index) {
-        if (endpointNamesBuilder_ == null) {
-          return endpointNames_.get(index);
+      public context.ContextOuterClass.EndPointId getEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         } else {
-          return endpointNamesBuilder_.getMessage(index);
+          return endpointIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setEndpointNames(
-          int index, context.ContextOuterClass.EndPointName value) {
-        if (endpointNamesBuilder_ == null) {
+      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureEndpointNamesIsMutable();
-          endpointNames_.set(index, value);
+          endpointId_ = value;
           onChanged();
         } else {
-          endpointNamesBuilder_.setMessage(index, value);
+          endpointIdBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setEndpointNames(
-          int index, context.ContextOuterClass.EndPointName.Builder builderForValue) {
-        if (endpointNamesBuilder_ == null) {
-          ensureEndpointNamesIsMutable();
-          endpointNames_.set(index, builderForValue.build());
+      public Builder setEndpointId(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = builderForValue.build();
           onChanged();
         } else {
-          endpointNamesBuilder_.setMessage(index, builderForValue.build());
+          endpointIdBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder addEndpointNames(context.ContextOuterClass.EndPointName value) {
-        if (endpointNamesBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (endpointId_ != null) {
+            endpointId_ =
+              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
+          } else {
+            endpointId_ = value;
           }
-          ensureEndpointNamesIsMutable();
-          endpointNames_.add(value);
           onChanged();
         } else {
-          endpointNamesBuilder_.addMessage(value);
+          endpointIdBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder addEndpointNames(
-          int index, context.ContextOuterClass.EndPointName value) {
-        if (endpointNamesBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureEndpointNamesIsMutable();
-          endpointNames_.add(index, value);
+      public Builder clearEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
           onChanged();
         } else {
-          endpointNamesBuilder_.addMessage(index, value);
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder addEndpointNames(
-          context.ContextOuterClass.EndPointName.Builder builderForValue) {
-        if (endpointNamesBuilder_ == null) {
-          ensureEndpointNamesIsMutable();
-          endpointNames_.add(builderForValue.build());
-          onChanged();
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+        
+        onChanged();
+        return getEndpointIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       */
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+        if (endpointIdBuilder_ != null) {
+          return endpointIdBuilder_.getMessageOrBuilder();
         } else {
-          endpointNamesBuilder_.addMessage(builderForValue.build());
+          return endpointId_ == null ?
+              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         }
-        return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder addEndpointNames(
-          int index, context.ContextOuterClass.EndPointName.Builder builderForValue) {
-        if (endpointNamesBuilder_ == null) {
-          ensureEndpointNamesIsMutable();
-          endpointNames_.add(index, builderForValue.build());
-          onChanged();
-        } else {
-          endpointNamesBuilder_.addMessage(index, builderForValue.build());
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdFieldBuilder() {
+        if (endpointIdBuilder_ == null) {
+          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  getEndpointId(),
+                  getParentForChildren(),
+                  isClean());
+          endpointId_ = null;
         }
-        return this;
+        return endpointIdBuilder_;
       }
+
+      private acl.Acl.AclRuleSet ruleSet_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          acl.Acl.AclRuleSet, acl.Acl.AclRuleSet.Builder, acl.Acl.AclRuleSetOrBuilder> ruleSetBuilder_;
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * @return Whether the ruleSet field is set.
        */
-      public Builder addAllEndpointNames(
-          java.lang.Iterable<? extends context.ContextOuterClass.EndPointName> values) {
-        if (endpointNamesBuilder_ == null) {
-          ensureEndpointNamesIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, endpointNames_);
-          onChanged();
+      public boolean hasRuleSet() {
+        return ruleSetBuilder_ != null || ruleSet_ != null;
+      }
+      /**
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * @return The ruleSet.
+       */
+      public acl.Acl.AclRuleSet getRuleSet() {
+        if (ruleSetBuilder_ == null) {
+          return ruleSet_ == null ? acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
         } else {
-          endpointNamesBuilder_.addAllMessages(values);
+          return ruleSetBuilder_.getMessage();
         }
-        return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public Builder clearEndpointNames() {
-        if (endpointNamesBuilder_ == null) {
-          endpointNames_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+      public Builder setRuleSet(acl.Acl.AclRuleSet value) {
+        if (ruleSetBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ruleSet_ = value;
           onChanged();
         } else {
-          endpointNamesBuilder_.clear();
+          ruleSetBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public Builder removeEndpointNames(int index) {
-        if (endpointNamesBuilder_ == null) {
-          ensureEndpointNamesIsMutable();
-          endpointNames_.remove(index);
+      public Builder setRuleSet(
+          acl.Acl.AclRuleSet.Builder builderForValue) {
+        if (ruleSetBuilder_ == null) {
+          ruleSet_ = builderForValue.build();
           onChanged();
         } else {
-          endpointNamesBuilder_.remove(index);
+          ruleSetBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointName.Builder getEndpointNamesBuilder(
-          int index) {
-        return getEndpointNamesFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public context.ContextOuterClass.EndPointNameOrBuilder getEndpointNamesOrBuilder(
-          int index) {
-        if (endpointNamesBuilder_ == null) {
-          return endpointNames_.get(index);  } else {
-          return endpointNamesBuilder_.getMessageOrBuilder(index);
+      public Builder mergeRuleSet(acl.Acl.AclRuleSet value) {
+        if (ruleSetBuilder_ == null) {
+          if (ruleSet_ != null) {
+            ruleSet_ =
+              acl.Acl.AclRuleSet.newBuilder(ruleSet_).mergeFrom(value).buildPartial();
+          } else {
+            ruleSet_ = value;
+          }
+          onChanged();
+        } else {
+          ruleSetBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public java.util.List<? extends context.ContextOuterClass.EndPointNameOrBuilder> 
-           getEndpointNamesOrBuilderList() {
-        if (endpointNamesBuilder_ != null) {
-          return endpointNamesBuilder_.getMessageOrBuilderList();
+      public Builder clearRuleSet() {
+        if (ruleSetBuilder_ == null) {
+          ruleSet_ = null;
+          onChanged();
         } else {
-          return java.util.Collections.unmodifiableList(endpointNames_);
+          ruleSet_ = null;
+          ruleSetBuilder_ = null;
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public context.ContextOuterClass.EndPointName.Builder addEndpointNamesBuilder() {
-        return getEndpointNamesFieldBuilder().addBuilder(
-            context.ContextOuterClass.EndPointName.getDefaultInstance());
+      public acl.Acl.AclRuleSet.Builder getRuleSetBuilder() {
+        
+        onChanged();
+        return getRuleSetFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public context.ContextOuterClass.EndPointName.Builder addEndpointNamesBuilder(
-          int index) {
-        return getEndpointNamesFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.EndPointName.getDefaultInstance());
+      public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
+        if (ruleSetBuilder_ != null) {
+          return ruleSetBuilder_.getMessageOrBuilder();
+        } else {
+          return ruleSet_ == null ?
+              acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
+        }
       }
       /**
-       * <code>repeated .context.EndPointName endpoint_names = 1;</code>
+       * <code>.acl.AclRuleSet rule_set = 2;</code>
        */
-      public java.util.List<context.ContextOuterClass.EndPointName.Builder> 
-           getEndpointNamesBuilderList() {
-        return getEndpointNamesFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.EndPointName, context.ContextOuterClass.EndPointName.Builder, context.ContextOuterClass.EndPointNameOrBuilder> 
-          getEndpointNamesFieldBuilder() {
-        if (endpointNamesBuilder_ == null) {
-          endpointNamesBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.EndPointName, context.ContextOuterClass.EndPointName.Builder, context.ContextOuterClass.EndPointNameOrBuilder>(
-                  endpointNames_,
-                  ((bitField0_ & 0x00000001) != 0),
+      private com.google.protobuf.SingleFieldBuilderV3<
+          acl.Acl.AclRuleSet, acl.Acl.AclRuleSet.Builder, acl.Acl.AclRuleSetOrBuilder> 
+          getRuleSetFieldBuilder() {
+        if (ruleSetBuilder_ == null) {
+          ruleSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              acl.Acl.AclRuleSet, acl.Acl.AclRuleSet.Builder, acl.Acl.AclRuleSetOrBuilder>(
+                  getRuleSet(),
                   getParentForChildren(),
                   isClean());
-          endpointNames_ = null;
+          ruleSet_ = null;
         }
-        return endpointNamesBuilder_;
+        return ruleSetBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -55499,96 +60087,114 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.EndPointNameList)
+      // @@protoc_insertion_point(builder_scope:context.ConfigRule_ACL)
     }
 
-    // @@protoc_insertion_point(class_scope:context.EndPointNameList)
-    private static final context.ContextOuterClass.EndPointNameList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConfigRule_ACL)
+    private static final context.ContextOuterClass.ConfigRule_ACL DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.EndPointNameList();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_ACL();
     }
 
-    public static context.ContextOuterClass.EndPointNameList getDefaultInstance() {
+    public static context.ContextOuterClass.ConfigRule_ACL getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<EndPointNameList>
-        PARSER = new com.google.protobuf.AbstractParser<EndPointNameList>() {
+    private static final com.google.protobuf.Parser<ConfigRule_ACL>
+        PARSER = new com.google.protobuf.AbstractParser<ConfigRule_ACL>() {
       @java.lang.Override
-      public EndPointNameList parsePartialFrom(
+      public ConfigRule_ACL parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new EndPointNameList(input, extensionRegistry);
+        return new ConfigRule_ACL(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<EndPointNameList> parser() {
+    public static com.google.protobuf.Parser<ConfigRule_ACL> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<EndPointNameList> getParserForType() {
+    public com.google.protobuf.Parser<ConfigRule_ACL> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.EndPointNameList getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConfigRule_ACL getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConfigRule_CustomOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConfigRule_Custom)
+  public interface ConfigRuleOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.ConfigRule)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>string resource_key = 1;</code>
-     * @return The resourceKey.
+     * <code>.context.ConfigActionEnum action = 1;</code>
+     * @return The enum numeric value on the wire for action.
      */
-    java.lang.String getResourceKey();
+    int getActionValue();
     /**
-     * <code>string resource_key = 1;</code>
-     * @return The bytes for resourceKey.
+     * <code>.context.ConfigActionEnum action = 1;</code>
+     * @return The action.
      */
-    com.google.protobuf.ByteString
-        getResourceKeyBytes();
+    context.ContextOuterClass.ConfigActionEnum getAction();
 
     /**
-     * <code>string resource_value = 2;</code>
-     * @return The resourceValue.
+     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     * @return Whether the custom field is set.
      */
-    java.lang.String getResourceValue();
+    boolean hasCustom();
     /**
-     * <code>string resource_value = 2;</code>
-     * @return The bytes for resourceValue.
+     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     * @return The custom.
      */
-    com.google.protobuf.ByteString
-        getResourceValueBytes();
+    context.ContextOuterClass.ConfigRule_Custom getCustom();
+    /**
+     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     */
+    context.ContextOuterClass.ConfigRule_CustomOrBuilder getCustomOrBuilder();
+
+    /**
+     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     * @return Whether the acl field is set.
+     */
+    boolean hasAcl();
+    /**
+     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     * @return The acl.
+     */
+    context.ContextOuterClass.ConfigRule_ACL getAcl();
+    /**
+     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     */
+    context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder();
+
+    public context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
   }
   /**
-   * Protobuf type {@code context.ConfigRule_Custom}
+   * Protobuf type {@code context.ConfigRule}
    */
-  public static final class ConfigRule_Custom extends
+  public static final class ConfigRule extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConfigRule_Custom)
-      ConfigRule_CustomOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.ConfigRule)
+      ConfigRuleOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConfigRule_Custom.newBuilder() to construct.
-    private ConfigRule_Custom(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use ConfigRule.newBuilder() to construct.
+    private ConfigRule(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConfigRule_Custom() {
-      resourceKey_ = "";
-      resourceValue_ = "";
+    private ConfigRule() {
+      action_ = 0;
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConfigRule_Custom();
+      return new ConfigRule();
     }
 
     @java.lang.Override
@@ -55596,7 +60202,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConfigRule_Custom(
+    private ConfigRule(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -55614,16 +60220,38 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
-              java.lang.String s = input.readStringRequireUtf8();
+            case 8: {
+              int rawValue = input.readEnum();
 
-              resourceKey_ = s;
+              action_ = rawValue;
               break;
             }
             case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              resourceValue_ = s;
+              context.ContextOuterClass.ConfigRule_Custom.Builder subBuilder = null;
+              if (configRuleCase_ == 2) {
+                subBuilder = ((context.ContextOuterClass.ConfigRule_Custom) configRule_).toBuilder();
+              }
+              configRule_ =
+                  input.readMessage(context.ContextOuterClass.ConfigRule_Custom.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_Custom) configRule_);
+                configRule_ = subBuilder.buildPartial();
+              }
+              configRuleCase_ = 2;
+              break;
+            }
+            case 26: {
+              context.ContextOuterClass.ConfigRule_ACL.Builder subBuilder = null;
+              if (configRuleCase_ == 3) {
+                subBuilder = ((context.ContextOuterClass.ConfigRule_ACL) configRule_).toBuilder();
+              }
+              configRule_ =
+                  input.readMessage(context.ContextOuterClass.ConfigRule_ACL.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_ACL) configRule_);
+                configRule_ = subBuilder.buildPartial();
+              }
+              configRuleCase_ = 3;
               break;
             }
             default: {
@@ -55647,91 +60275,137 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
+      return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_ConfigRule_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConfigRule_Custom.class, context.ContextOuterClass.ConfigRule_Custom.Builder.class);
+              context.ContextOuterClass.ConfigRule.class, context.ContextOuterClass.ConfigRule.Builder.class);
     }
 
-    public static final int RESOURCE_KEY_FIELD_NUMBER = 1;
-    private volatile java.lang.Object resourceKey_;
+    private int configRuleCase_ = 0;
+    private java.lang.Object configRule_;
+    public enum ConfigRuleCase
+        implements com.google.protobuf.Internal.EnumLite,
+            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      CUSTOM(2),
+      ACL(3),
+      CONFIGRULE_NOT_SET(0);
+      private final int value;
+      private ConfigRuleCase(int value) {
+        this.value = value;
+      }
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static ConfigRuleCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static ConfigRuleCase forNumber(int value) {
+        switch (value) {
+          case 2: return CUSTOM;
+          case 3: return ACL;
+          case 0: return CONFIGRULE_NOT_SET;
+          default: return null;
+        }
+      }
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public ConfigRuleCase
+    getConfigRuleCase() {
+      return ConfigRuleCase.forNumber(
+          configRuleCase_);
+    }
+
+    public static final int ACTION_FIELD_NUMBER = 1;
+    private int action_;
     /**
-     * <code>string resource_key = 1;</code>
-     * @return The resourceKey.
+     * <code>.context.ConfigActionEnum action = 1;</code>
+     * @return The enum numeric value on the wire for action.
+     */
+    @java.lang.Override public int getActionValue() {
+      return action_;
+    }
+    /**
+     * <code>.context.ConfigActionEnum action = 1;</code>
+     * @return The action.
+     */
+    @java.lang.Override public context.ContextOuterClass.ConfigActionEnum getAction() {
+      @SuppressWarnings("deprecation")
+      context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
+      return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
+    }
+
+    public static final int CUSTOM_FIELD_NUMBER = 2;
+    /**
+     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     * @return Whether the custom field is set.
      */
     @java.lang.Override
-    public java.lang.String getResourceKey() {
-      java.lang.Object ref = resourceKey_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        resourceKey_ = s;
-        return s;
+    public boolean hasCustom() {
+      return configRuleCase_ == 2;
+    }
+    /**
+     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     * @return The custom.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConfigRule_Custom getCustom() {
+      if (configRuleCase_ == 2) {
+         return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
       }
+      return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
     }
     /**
-     * <code>string resource_key = 1;</code>
-     * @return The bytes for resourceKey.
+     * <code>.context.ConfigRule_Custom custom = 2;</code>
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getResourceKeyBytes() {
-      java.lang.Object ref = resourceKey_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        resourceKey_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
+    public context.ContextOuterClass.ConfigRule_CustomOrBuilder getCustomOrBuilder() {
+      if (configRuleCase_ == 2) {
+         return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
       }
+      return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+    }
+
+    public static final int ACL_FIELD_NUMBER = 3;
+    /**
+     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     * @return Whether the acl field is set.
+     */
+    @java.lang.Override
+    public boolean hasAcl() {
+      return configRuleCase_ == 3;
     }
-
-    public static final int RESOURCE_VALUE_FIELD_NUMBER = 2;
-    private volatile java.lang.Object resourceValue_;
     /**
-     * <code>string resource_value = 2;</code>
-     * @return The resourceValue.
+     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     * @return The acl.
      */
     @java.lang.Override
-    public java.lang.String getResourceValue() {
-      java.lang.Object ref = resourceValue_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        resourceValue_ = s;
-        return s;
+    public context.ContextOuterClass.ConfigRule_ACL getAcl() {
+      if (configRuleCase_ == 3) {
+         return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
       }
+      return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
     }
     /**
-     * <code>string resource_value = 2;</code>
-     * @return The bytes for resourceValue.
+     * <code>.context.ConfigRule_ACL acl = 3;</code>
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getResourceValueBytes() {
-      java.lang.Object ref = resourceValue_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        resourceValue_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
+    public context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder() {
+      if (configRuleCase_ == 3) {
+         return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
       }
+      return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -55748,11 +60422,14 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (!getResourceKeyBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, resourceKey_);
+      if (action_ != context.ContextOuterClass.ConfigActionEnum.CONFIGACTION_UNDEFINED.getNumber()) {
+        output.writeEnum(1, action_);
       }
-      if (!getResourceValueBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, resourceValue_);
+      if (configRuleCase_ == 2) {
+        output.writeMessage(2, (context.ContextOuterClass.ConfigRule_Custom) configRule_);
+      }
+      if (configRuleCase_ == 3) {
+        output.writeMessage(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
       }
       unknownFields.writeTo(output);
     }
@@ -55763,11 +60440,17 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (!getResourceKeyBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, resourceKey_);
+      if (action_ != context.ContextOuterClass.ConfigActionEnum.CONFIGACTION_UNDEFINED.getNumber()) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeEnumSize(1, action_);
       }
-      if (!getResourceValueBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, resourceValue_);
+      if (configRuleCase_ == 2) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, (context.ContextOuterClass.ConfigRule_Custom) configRule_);
+      }
+      if (configRuleCase_ == 3) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -55779,15 +60462,25 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConfigRule_Custom)) {
+      if (!(obj instanceof context.ContextOuterClass.ConfigRule)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConfigRule_Custom other = (context.ContextOuterClass.ConfigRule_Custom) obj;
+      context.ContextOuterClass.ConfigRule other = (context.ContextOuterClass.ConfigRule) obj;
 
-      if (!getResourceKey()
-          .equals(other.getResourceKey())) return false;
-      if (!getResourceValue()
-          .equals(other.getResourceValue())) return false;
+      if (action_ != other.action_) return false;
+      if (!getConfigRuleCase().equals(other.getConfigRuleCase())) return false;
+      switch (configRuleCase_) {
+        case 2:
+          if (!getCustom()
+              .equals(other.getCustom())) return false;
+          break;
+        case 3:
+          if (!getAcl()
+              .equals(other.getAcl())) return false;
+          break;
+        case 0:
+        default:
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -55799,78 +60492,88 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + RESOURCE_KEY_FIELD_NUMBER;
-      hash = (53 * hash) + getResourceKey().hashCode();
-      hash = (37 * hash) + RESOURCE_VALUE_FIELD_NUMBER;
-      hash = (53 * hash) + getResourceValue().hashCode();
+      hash = (37 * hash) + ACTION_FIELD_NUMBER;
+      hash = (53 * hash) + action_;
+      switch (configRuleCase_) {
+        case 2:
+          hash = (37 * hash) + CUSTOM_FIELD_NUMBER;
+          hash = (53 * hash) + getCustom().hashCode();
+          break;
+        case 3:
+          hash = (37 * hash) + ACL_FIELD_NUMBER;
+          hash = (53 * hash) + getAcl().hashCode();
+          break;
+        case 0:
+        default:
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(byte[] data)
+    public static context.ContextOuterClass.ConfigRule parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConfigRule parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.ConfigRule parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseDelimitedFrom(
+    public static context.ContextOuterClass.ConfigRule parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule_Custom parseFrom(
+    public static context.ContextOuterClass.ConfigRule parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -55883,7 +60586,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConfigRule_Custom prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.ConfigRule prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -55899,26 +60602,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConfigRule_Custom}
+     * Protobuf type {@code context.ConfigRule}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule_Custom)
-        context.ContextOuterClass.ConfigRule_CustomOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.ConfigRule)
+        context.ContextOuterClass.ConfigRuleOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_ConfigRule_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConfigRule_Custom.class, context.ContextOuterClass.ConfigRule_Custom.Builder.class);
+                context.ContextOuterClass.ConfigRule.class, context.ContextOuterClass.ConfigRule.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConfigRule_Custom.newBuilder()
+      // Construct using context.ContextOuterClass.ConfigRule.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -55936,27 +60639,27 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        resourceKey_ = "";
-
-        resourceValue_ = "";
+        action_ = 0;
 
+        configRuleCase_ = 0;
+        configRule_ = null;
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_Custom_descriptor;
+        return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_Custom getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+      public context.ContextOuterClass.ConfigRule getDefaultInstanceForType() {
+        return context.ContextOuterClass.ConfigRule.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_Custom build() {
-        context.ContextOuterClass.ConfigRule_Custom result = buildPartial();
+      public context.ContextOuterClass.ConfigRule build() {
+        context.ContextOuterClass.ConfigRule result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -55964,10 +60667,24 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_Custom buildPartial() {
-        context.ContextOuterClass.ConfigRule_Custom result = new context.ContextOuterClass.ConfigRule_Custom(this);
-        result.resourceKey_ = resourceKey_;
-        result.resourceValue_ = resourceValue_;
+      public context.ContextOuterClass.ConfigRule buildPartial() {
+        context.ContextOuterClass.ConfigRule result = new context.ContextOuterClass.ConfigRule(this);
+        result.action_ = action_;
+        if (configRuleCase_ == 2) {
+          if (customBuilder_ == null) {
+            result.configRule_ = configRule_;
+          } else {
+            result.configRule_ = customBuilder_.build();
+          }
+        }
+        if (configRuleCase_ == 3) {
+          if (aclBuilder_ == null) {
+            result.configRule_ = configRule_;
+          } else {
+            result.configRule_ = aclBuilder_.build();
+          }
+        }
+        result.configRuleCase_ = configRuleCase_;
         onBuilt();
         return result;
       }
@@ -56006,23 +60723,31 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConfigRule_Custom) {
-          return mergeFrom((context.ContextOuterClass.ConfigRule_Custom)other);
+        if (other instanceof context.ContextOuterClass.ConfigRule) {
+          return mergeFrom((context.ContextOuterClass.ConfigRule)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConfigRule_Custom other) {
-        if (other == context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance()) return this;
-        if (!other.getResourceKey().isEmpty()) {
-          resourceKey_ = other.resourceKey_;
-          onChanged();
+      public Builder mergeFrom(context.ContextOuterClass.ConfigRule other) {
+        if (other == context.ContextOuterClass.ConfigRule.getDefaultInstance()) return this;
+        if (other.action_ != 0) {
+          setActionValue(other.getActionValue());
         }
-        if (!other.getResourceValue().isEmpty()) {
-          resourceValue_ = other.resourceValue_;
-          onChanged();
+        switch (other.getConfigRuleCase()) {
+          case CUSTOM: {
+            mergeCustom(other.getCustom());
+            break;
+          }
+          case ACL: {
+            mergeAcl(other.getAcl());
+            break;
+          }
+          case CONFIGRULE_NOT_SET: {
+            break;
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -56039,11 +60764,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConfigRule_Custom parsedMessage = null;
+        context.ContextOuterClass.ConfigRule parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConfigRule_Custom) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.ConfigRule) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -56052,157 +60777,356 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int configRuleCase_ = 0;
+      private java.lang.Object configRule_;
+      public ConfigRuleCase
+          getConfigRuleCase() {
+        return ConfigRuleCase.forNumber(
+            configRuleCase_);
+      }
 
-      private java.lang.Object resourceKey_ = "";
-      /**
-       * <code>string resource_key = 1;</code>
-       * @return The resourceKey.
-       */
-      public java.lang.String getResourceKey() {
-        java.lang.Object ref = resourceKey_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          resourceKey_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
+      public Builder clearConfigRule() {
+        configRuleCase_ = 0;
+        configRule_ = null;
+        onChanged();
+        return this;
       }
+
+
+      private int action_ = 0;
       /**
-       * <code>string resource_key = 1;</code>
-       * @return The bytes for resourceKey.
+       * <code>.context.ConfigActionEnum action = 1;</code>
+       * @return The enum numeric value on the wire for action.
        */
-      public com.google.protobuf.ByteString
-          getResourceKeyBytes() {
-        java.lang.Object ref = resourceKey_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          resourceKey_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
+      @java.lang.Override public int getActionValue() {
+        return action_;
       }
       /**
-       * <code>string resource_key = 1;</code>
-       * @param value The resourceKey to set.
+       * <code>.context.ConfigActionEnum action = 1;</code>
+       * @param value The enum numeric value on the wire for action to set.
        * @return This builder for chaining.
        */
-      public Builder setResourceKey(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        resourceKey_ = value;
+      public Builder setActionValue(int value) {
+        
+        action_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string resource_key = 1;</code>
+       * <code>.context.ConfigActionEnum action = 1;</code>
+       * @return The action.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ConfigActionEnum getAction() {
+        @SuppressWarnings("deprecation")
+        context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
+        return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
+      }
+      /**
+       * <code>.context.ConfigActionEnum action = 1;</code>
+       * @param value The action to set.
        * @return This builder for chaining.
        */
-      public Builder clearResourceKey() {
+      public Builder setAction(context.ContextOuterClass.ConfigActionEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
         
-        resourceKey_ = getDefaultInstance().getResourceKey();
+        action_ = value.getNumber();
         onChanged();
         return this;
       }
       /**
-       * <code>string resource_key = 1;</code>
-       * @param value The bytes for resourceKey to set.
+       * <code>.context.ConfigActionEnum action = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder setResourceKeyBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+      public Builder clearAction() {
         
-        resourceKey_ = value;
+        action_ = 0;
         onChanged();
         return this;
       }
-
-      private java.lang.Object resourceValue_ = "";
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule_Custom, context.ContextOuterClass.ConfigRule_Custom.Builder, context.ContextOuterClass.ConfigRule_CustomOrBuilder> customBuilder_;
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       * @return Whether the custom field is set.
+       */
+      @java.lang.Override
+      public boolean hasCustom() {
+        return configRuleCase_ == 2;
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       * @return The custom.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ConfigRule_Custom getCustom() {
+        if (customBuilder_ == null) {
+          if (configRuleCase_ == 2) {
+            return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
+          }
+          return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+        } else {
+          if (configRuleCase_ == 2) {
+            return customBuilder_.getMessage();
+          }
+          return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      public Builder setCustom(context.ContextOuterClass.ConfigRule_Custom value) {
+        if (customBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          configRule_ = value;
+          onChanged();
+        } else {
+          customBuilder_.setMessage(value);
+        }
+        configRuleCase_ = 2;
+        return this;
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      public Builder setCustom(
+          context.ContextOuterClass.ConfigRule_Custom.Builder builderForValue) {
+        if (customBuilder_ == null) {
+          configRule_ = builderForValue.build();
+          onChanged();
+        } else {
+          customBuilder_.setMessage(builderForValue.build());
+        }
+        configRuleCase_ = 2;
+        return this;
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      public Builder mergeCustom(context.ContextOuterClass.ConfigRule_Custom value) {
+        if (customBuilder_ == null) {
+          if (configRuleCase_ == 2 &&
+              configRule_ != context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance()) {
+            configRule_ = context.ContextOuterClass.ConfigRule_Custom.newBuilder((context.ContextOuterClass.ConfigRule_Custom) configRule_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            configRule_ = value;
+          }
+          onChanged();
+        } else {
+          if (configRuleCase_ == 2) {
+            customBuilder_.mergeFrom(value);
+          }
+          customBuilder_.setMessage(value);
+        }
+        configRuleCase_ = 2;
+        return this;
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      public Builder clearCustom() {
+        if (customBuilder_ == null) {
+          if (configRuleCase_ == 2) {
+            configRuleCase_ = 0;
+            configRule_ = null;
+            onChanged();
+          }
+        } else {
+          if (configRuleCase_ == 2) {
+            configRuleCase_ = 0;
+            configRule_ = null;
+          }
+          customBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      public context.ContextOuterClass.ConfigRule_Custom.Builder getCustomBuilder() {
+        return getCustomFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ConfigRule_CustomOrBuilder getCustomOrBuilder() {
+        if ((configRuleCase_ == 2) && (customBuilder_ != null)) {
+          return customBuilder_.getMessageOrBuilder();
+        } else {
+          if (configRuleCase_ == 2) {
+            return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
+          }
+          return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.context.ConfigRule_Custom custom = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule_Custom, context.ContextOuterClass.ConfigRule_Custom.Builder, context.ContextOuterClass.ConfigRule_CustomOrBuilder> 
+          getCustomFieldBuilder() {
+        if (customBuilder_ == null) {
+          if (!(configRuleCase_ == 2)) {
+            configRule_ = context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+          }
+          customBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConfigRule_Custom, context.ContextOuterClass.ConfigRule_Custom.Builder, context.ContextOuterClass.ConfigRule_CustomOrBuilder>(
+                  (context.ContextOuterClass.ConfigRule_Custom) configRule_,
+                  getParentForChildren(),
+                  isClean());
+          configRule_ = null;
+        }
+        configRuleCase_ = 2;
+        onChanged();;
+        return customBuilder_;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule_ACL, context.ContextOuterClass.ConfigRule_ACL.Builder, context.ContextOuterClass.ConfigRule_ACLOrBuilder> aclBuilder_;
+      /**
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
+       * @return Whether the acl field is set.
+       */
+      @java.lang.Override
+      public boolean hasAcl() {
+        return configRuleCase_ == 3;
+      }
+      /**
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
+       * @return The acl.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ConfigRule_ACL getAcl() {
+        if (aclBuilder_ == null) {
+          if (configRuleCase_ == 3) {
+            return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
+          }
+          return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
+        } else {
+          if (configRuleCase_ == 3) {
+            return aclBuilder_.getMessage();
+          }
+          return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
+       */
+      public Builder setAcl(context.ContextOuterClass.ConfigRule_ACL value) {
+        if (aclBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          configRule_ = value;
+          onChanged();
+        } else {
+          aclBuilder_.setMessage(value);
+        }
+        configRuleCase_ = 3;
+        return this;
+      }
+      /**
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
+       */
+      public Builder setAcl(
+          context.ContextOuterClass.ConfigRule_ACL.Builder builderForValue) {
+        if (aclBuilder_ == null) {
+          configRule_ = builderForValue.build();
+          onChanged();
+        } else {
+          aclBuilder_.setMessage(builderForValue.build());
+        }
+        configRuleCase_ = 3;
+        return this;
+      }
       /**
-       * <code>string resource_value = 2;</code>
-       * @return The resourceValue.
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
        */
-      public java.lang.String getResourceValue() {
-        java.lang.Object ref = resourceValue_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          resourceValue_ = s;
-          return s;
+      public Builder mergeAcl(context.ContextOuterClass.ConfigRule_ACL value) {
+        if (aclBuilder_ == null) {
+          if (configRuleCase_ == 3 &&
+              configRule_ != context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance()) {
+            configRule_ = context.ContextOuterClass.ConfigRule_ACL.newBuilder((context.ContextOuterClass.ConfigRule_ACL) configRule_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            configRule_ = value;
+          }
+          onChanged();
         } else {
-          return (java.lang.String) ref;
+          if (configRuleCase_ == 3) {
+            aclBuilder_.mergeFrom(value);
+          }
+          aclBuilder_.setMessage(value);
         }
+        configRuleCase_ = 3;
+        return this;
       }
       /**
-       * <code>string resource_value = 2;</code>
-       * @return The bytes for resourceValue.
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
        */
-      public com.google.protobuf.ByteString
-          getResourceValueBytes() {
-        java.lang.Object ref = resourceValue_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          resourceValue_ = b;
-          return b;
+      public Builder clearAcl() {
+        if (aclBuilder_ == null) {
+          if (configRuleCase_ == 3) {
+            configRuleCase_ = 0;
+            configRule_ = null;
+            onChanged();
+          }
         } else {
-          return (com.google.protobuf.ByteString) ref;
+          if (configRuleCase_ == 3) {
+            configRuleCase_ = 0;
+            configRule_ = null;
+          }
+          aclBuilder_.clear();
         }
+        return this;
       }
       /**
-       * <code>string resource_value = 2;</code>
-       * @param value The resourceValue to set.
-       * @return This builder for chaining.
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
        */
-      public Builder setResourceValue(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        resourceValue_ = value;
-        onChanged();
-        return this;
+      public context.ContextOuterClass.ConfigRule_ACL.Builder getAclBuilder() {
+        return getAclFieldBuilder().getBuilder();
       }
       /**
-       * <code>string resource_value = 2;</code>
-       * @return This builder for chaining.
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
        */
-      public Builder clearResourceValue() {
-        
-        resourceValue_ = getDefaultInstance().getResourceValue();
-        onChanged();
-        return this;
+      @java.lang.Override
+      public context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder() {
+        if ((configRuleCase_ == 3) && (aclBuilder_ != null)) {
+          return aclBuilder_.getMessageOrBuilder();
+        } else {
+          if (configRuleCase_ == 3) {
+            return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
+          }
+          return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
+        }
       }
       /**
-       * <code>string resource_value = 2;</code>
-       * @param value The bytes for resourceValue to set.
-       * @return This builder for chaining.
+       * <code>.context.ConfigRule_ACL acl = 3;</code>
        */
-      public Builder setResourceValueBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        resourceValue_ = value;
-        onChanged();
-        return this;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConfigRule_ACL, context.ContextOuterClass.ConfigRule_ACL.Builder, context.ContextOuterClass.ConfigRule_ACLOrBuilder> 
+          getAclFieldBuilder() {
+        if (aclBuilder_ == null) {
+          if (!(configRuleCase_ == 3)) {
+            configRule_ = context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
+          }
+          aclBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConfigRule_ACL, context.ContextOuterClass.ConfigRule_ACL.Builder, context.ContextOuterClass.ConfigRule_ACLOrBuilder>(
+                  (context.ContextOuterClass.ConfigRule_ACL) configRule_,
+                  getParentForChildren(),
+                  isClean());
+          configRule_ = null;
+        }
+        configRuleCase_ = 3;
+        onChanged();;
+        return aclBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -56217,100 +61141,96 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConfigRule_Custom)
+      // @@protoc_insertion_point(builder_scope:context.ConfigRule)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConfigRule_Custom)
-    private static final context.ContextOuterClass.ConfigRule_Custom DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.ConfigRule)
+    private static final context.ContextOuterClass.ConfigRule DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_Custom();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule();
     }
 
-    public static context.ContextOuterClass.ConfigRule_Custom getDefaultInstance() {
+    public static context.ContextOuterClass.ConfigRule getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConfigRule_Custom>
-        PARSER = new com.google.protobuf.AbstractParser<ConfigRule_Custom>() {
+    private static final com.google.protobuf.Parser<ConfigRule>
+        PARSER = new com.google.protobuf.AbstractParser<ConfigRule>() {
       @java.lang.Override
-      public ConfigRule_Custom parsePartialFrom(
+      public ConfigRule parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConfigRule_Custom(input, extensionRegistry);
+        return new ConfigRule(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConfigRule_Custom> parser() {
+    public static com.google.protobuf.Parser<ConfigRule> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConfigRule_Custom> getParserForType() {
+    public com.google.protobuf.Parser<ConfigRule> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule_Custom getDefaultInstanceForType() {
+    public context.ContextOuterClass.ConfigRule getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConfigRule_ACLOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConfigRule_ACL)
+  public interface Constraint_CustomOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    boolean hasEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
+     * <code>string constraint_type = 1;</code>
+     * @return The constraintType.
      */
-    context.ContextOuterClass.EndPointId getEndpointId();
+    java.lang.String getConstraintType();
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * <code>string constraint_type = 1;</code>
+     * @return The bytes for constraintType.
      */
-    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
+    com.google.protobuf.ByteString
+        getConstraintTypeBytes();
 
     /**
-     * <code>.acl.AclRuleSet rule_set = 2;</code>
-     * @return Whether the ruleSet field is set.
-     */
-    boolean hasRuleSet();
-    /**
-     * <code>.acl.AclRuleSet rule_set = 2;</code>
-     * @return The ruleSet.
+     * <code>string constraint_value = 2;</code>
+     * @return The constraintValue.
      */
-    acl.Acl.AclRuleSet getRuleSet();
+    java.lang.String getConstraintValue();
     /**
-     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     * <code>string constraint_value = 2;</code>
+     * @return The bytes for constraintValue.
      */
-    acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder();
+    com.google.protobuf.ByteString
+        getConstraintValueBytes();
   }
   /**
-   * Protobuf type {@code context.ConfigRule_ACL}
+   * Protobuf type {@code context.Constraint_Custom}
    */
-  public static final class ConfigRule_ACL extends
+  public static final class Constraint_Custom extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConfigRule_ACL)
-      ConfigRule_ACLOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
+      Constraint_CustomOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConfigRule_ACL.newBuilder() to construct.
-    private ConfigRule_ACL(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_Custom.newBuilder() to construct.
+    private Constraint_Custom(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConfigRule_ACL() {
+    private Constraint_Custom() {
+      constraintType_ = "";
+      constraintValue_ = "";
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConfigRule_ACL();
+      return new Constraint_Custom();
     }
 
     @java.lang.Override
@@ -56318,7 +61238,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConfigRule_ACL(
+    private Constraint_Custom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -56337,29 +61257,15 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
-              if (endpointId_ != null) {
-                subBuilder = endpointId_.toBuilder();
-              }
-              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointId_);
-                endpointId_ = subBuilder.buildPartial();
-              }
+              java.lang.String s = input.readStringRequireUtf8();
 
+              constraintType_ = s;
               break;
             }
             case 18: {
-              acl.Acl.AclRuleSet.Builder subBuilder = null;
-              if (ruleSet_ != null) {
-                subBuilder = ruleSet_.toBuilder();
-              }
-              ruleSet_ = input.readMessage(acl.Acl.AclRuleSet.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(ruleSet_);
-                ruleSet_ = subBuilder.buildPartial();
-              }
+              java.lang.String s = input.readStringRequireUtf8();
 
+              constraintValue_ = s;
               break;
             }
             default: {
@@ -56383,67 +61289,91 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_Custom_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConfigRule_ACL.class, context.ContextOuterClass.ConfigRule_ACL.Builder.class);
+              context.ContextOuterClass.Constraint_Custom.class, context.ContextOuterClass.Constraint_Custom.Builder.class);
     }
 
-    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.EndPointId endpointId_;
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    @java.lang.Override
-    public boolean hasEndpointId() {
-      return endpointId_ != null;
-    }
+    public static final int CONSTRAINT_TYPE_FIELD_NUMBER = 1;
+    private volatile java.lang.Object constraintType_;
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
+     * <code>string constraint_type = 1;</code>
+     * @return The constraintType.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointId getEndpointId() {
-      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+    public java.lang.String getConstraintType() {
+      java.lang.Object ref = constraintType_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        constraintType_ = s;
+        return s;
+      }
     }
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * <code>string constraint_type = 1;</code>
+     * @return The bytes for constraintType.
      */
     @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-      return getEndpointId();
+    public com.google.protobuf.ByteString
+        getConstraintTypeBytes() {
+      java.lang.Object ref = constraintType_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        constraintType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
-    public static final int RULE_SET_FIELD_NUMBER = 2;
-    private acl.Acl.AclRuleSet ruleSet_;
-    /**
-     * <code>.acl.AclRuleSet rule_set = 2;</code>
-     * @return Whether the ruleSet field is set.
-     */
-    @java.lang.Override
-    public boolean hasRuleSet() {
-      return ruleSet_ != null;
-    }
+    public static final int CONSTRAINT_VALUE_FIELD_NUMBER = 2;
+    private volatile java.lang.Object constraintValue_;
     /**
-     * <code>.acl.AclRuleSet rule_set = 2;</code>
-     * @return The ruleSet.
+     * <code>string constraint_value = 2;</code>
+     * @return The constraintValue.
      */
     @java.lang.Override
-    public acl.Acl.AclRuleSet getRuleSet() {
-      return ruleSet_ == null ? acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
+    public java.lang.String getConstraintValue() {
+      java.lang.Object ref = constraintValue_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        constraintValue_ = s;
+        return s;
+      }
     }
     /**
-     * <code>.acl.AclRuleSet rule_set = 2;</code>
+     * <code>string constraint_value = 2;</code>
+     * @return The bytes for constraintValue.
      */
     @java.lang.Override
-    public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
-      return getRuleSet();
+    public com.google.protobuf.ByteString
+        getConstraintValueBytes() {
+      java.lang.Object ref = constraintValue_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        constraintValue_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
     private byte memoizedIsInitialized = -1;
@@ -56460,11 +61390,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (endpointId_ != null) {
-        output.writeMessage(1, getEndpointId());
+      if (!getConstraintTypeBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, constraintType_);
       }
-      if (ruleSet_ != null) {
-        output.writeMessage(2, getRuleSet());
+      if (!getConstraintValueBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, constraintValue_);
       }
       unknownFields.writeTo(output);
     }
@@ -56475,13 +61405,11 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (endpointId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEndpointId());
+      if (!getConstraintTypeBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, constraintType_);
       }
-      if (ruleSet_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getRuleSet());
+      if (!getConstraintValueBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, constraintValue_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -56493,21 +61421,15 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConfigRule_ACL)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_Custom)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConfigRule_ACL other = (context.ContextOuterClass.ConfigRule_ACL) obj;
+      context.ContextOuterClass.Constraint_Custom other = (context.ContextOuterClass.Constraint_Custom) obj;
 
-      if (hasEndpointId() != other.hasEndpointId()) return false;
-      if (hasEndpointId()) {
-        if (!getEndpointId()
-            .equals(other.getEndpointId())) return false;
-      }
-      if (hasRuleSet() != other.hasRuleSet()) return false;
-      if (hasRuleSet()) {
-        if (!getRuleSet()
-            .equals(other.getRuleSet())) return false;
-      }
+      if (!getConstraintType()
+          .equals(other.getConstraintType())) return false;
+      if (!getConstraintValue()
+          .equals(other.getConstraintValue())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -56519,82 +61441,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEndpointId()) {
-        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointId().hashCode();
-      }
-      if (hasRuleSet()) {
-        hash = (37 * hash) + RULE_SET_FIELD_NUMBER;
-        hash = (53 * hash) + getRuleSet().hashCode();
-      }
+      hash = (37 * hash) + CONSTRAINT_TYPE_FIELD_NUMBER;
+      hash = (53 * hash) + getConstraintType().hashCode();
+      hash = (37 * hash) + CONSTRAINT_VALUE_FIELD_NUMBER;
+      hash = (53 * hash) + getConstraintValue().hashCode();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_Custom parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule_ACL parseFrom(
+    public static context.ContextOuterClass.Constraint_Custom parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -56607,7 +61525,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConfigRule_ACL prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_Custom prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -56623,26 +61541,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConfigRule_ACL}
+     * Protobuf type {@code context.Constraint_Custom}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule_ACL)
-        context.ContextOuterClass.ConfigRule_ACLOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
+        context.ContextOuterClass.Constraint_CustomOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_Custom_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConfigRule_ACL.class, context.ContextOuterClass.ConfigRule_ACL.Builder.class);
+                context.ContextOuterClass.Constraint_Custom.class, context.ContextOuterClass.Constraint_Custom.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConfigRule_ACL.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_Custom.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -56660,35 +61578,27 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-        if (ruleSetBuilder_ == null) {
-          ruleSet_ = null;
-        } else {
-          ruleSet_ = null;
-          ruleSetBuilder_ = null;
-        }
+        constraintType_ = "";
+
+        constraintValue_ = "";
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_ACL_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_ACL getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_Custom getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_ACL build() {
-        context.ContextOuterClass.ConfigRule_ACL result = buildPartial();
+      public context.ContextOuterClass.Constraint_Custom build() {
+        context.ContextOuterClass.Constraint_Custom result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -56696,18 +61606,10 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_ACL buildPartial() {
-        context.ContextOuterClass.ConfigRule_ACL result = new context.ContextOuterClass.ConfigRule_ACL(this);
-        if (endpointIdBuilder_ == null) {
-          result.endpointId_ = endpointId_;
-        } else {
-          result.endpointId_ = endpointIdBuilder_.build();
-        }
-        if (ruleSetBuilder_ == null) {
-          result.ruleSet_ = ruleSet_;
-        } else {
-          result.ruleSet_ = ruleSetBuilder_.build();
-        }
+      public context.ContextOuterClass.Constraint_Custom buildPartial() {
+        context.ContextOuterClass.Constraint_Custom result = new context.ContextOuterClass.Constraint_Custom(this);
+        result.constraintType_ = constraintType_;
+        result.constraintValue_ = constraintValue_;
         onBuilt();
         return result;
       }
@@ -56746,21 +61648,23 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConfigRule_ACL) {
-          return mergeFrom((context.ContextOuterClass.ConfigRule_ACL)other);
+        if (other instanceof context.ContextOuterClass.Constraint_Custom) {
+          return mergeFrom((context.ContextOuterClass.Constraint_Custom)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConfigRule_ACL other) {
-        if (other == context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance()) return this;
-        if (other.hasEndpointId()) {
-          mergeEndpointId(other.getEndpointId());
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_Custom other) {
+        if (other == context.ContextOuterClass.Constraint_Custom.getDefaultInstance()) return this;
+        if (!other.getConstraintType().isEmpty()) {
+          constraintType_ = other.constraintType_;
+          onChanged();
         }
-        if (other.hasRuleSet()) {
-          mergeRuleSet(other.getRuleSet());
+        if (!other.getConstraintValue().isEmpty()) {
+          constraintValue_ = other.constraintValue_;
+          onChanged();
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -56777,256 +61681,170 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConfigRule_ACL parsedMessage = null;
+        context.ContextOuterClass.Constraint_Custom parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConfigRule_ACL) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-
-      private context.ContextOuterClass.EndPointId endpointId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return Whether the endpointId field is set.
-       */
-      public boolean hasEndpointId() {
-        return endpointIdBuilder_ != null || endpointId_ != null;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return The endpointId.
-       */
-      public context.ContextOuterClass.EndPointId getEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        } else {
-          return endpointIdBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
+          parsedMessage = (context.ContextOuterClass.Constraint_Custom) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
           }
-          endpointId_ = value;
-          onChanged();
-        } else {
-          endpointIdBuilder_.setMessage(value);
         }
-
         return this;
       }
+
+      private java.lang.Object constraintType_ = "";
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>string constraint_type = 1;</code>
+       * @return The constraintType.
        */
-      public Builder setEndpointId(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = builderForValue.build();
-          onChanged();
+      public java.lang.String getConstraintType() {
+        java.lang.Object ref = constraintType_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          constraintType_ = s;
+          return s;
         } else {
-          endpointIdBuilder_.setMessage(builderForValue.build());
+          return (java.lang.String) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>string constraint_type = 1;</code>
+       * @return The bytes for constraintType.
        */
-      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (endpointId_ != null) {
-            endpointId_ =
-              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
-          } else {
-            endpointId_ = value;
-          }
-          onChanged();
+      public com.google.protobuf.ByteString
+          getConstraintTypeBytes() {
+        java.lang.Object ref = constraintType_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          constraintType_ = b;
+          return b;
         } else {
-          endpointIdBuilder_.mergeFrom(value);
+          return (com.google.protobuf.ByteString) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>string constraint_type = 1;</code>
+       * @param value The constraintType to set.
+       * @return This builder for chaining.
        */
-      public Builder clearEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-          onChanged();
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-
+      public Builder setConstraintType(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        constraintType_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>string constraint_type = 1;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+      public Builder clearConstraintType() {
         
+        constraintType_ = getDefaultInstance().getConstraintType();
         onChanged();
-        return getEndpointIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-        if (endpointIdBuilder_ != null) {
-          return endpointIdBuilder_.getMessageOrBuilder();
-        } else {
-          return endpointId_ == null ?
-              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        }
+        return this;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>string constraint_type = 1;</code>
+       * @param value The bytes for constraintType to set.
+       * @return This builder for chaining.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getEndpointIdFieldBuilder() {
-        if (endpointIdBuilder_ == null) {
-          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  getEndpointId(),
-                  getParentForChildren(),
-                  isClean());
-          endpointId_ = null;
-        }
-        return endpointIdBuilder_;
+      public Builder setConstraintTypeBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        constraintType_ = value;
+        onChanged();
+        return this;
       }
 
-      private acl.Acl.AclRuleSet ruleSet_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          acl.Acl.AclRuleSet, acl.Acl.AclRuleSet.Builder, acl.Acl.AclRuleSetOrBuilder> ruleSetBuilder_;
-      /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
-       * @return Whether the ruleSet field is set.
-       */
-      public boolean hasRuleSet() {
-        return ruleSetBuilder_ != null || ruleSet_ != null;
-      }
-      /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
-       * @return The ruleSet.
-       */
-      public acl.Acl.AclRuleSet getRuleSet() {
-        if (ruleSetBuilder_ == null) {
-          return ruleSet_ == null ? acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
-        } else {
-          return ruleSetBuilder_.getMessage();
-        }
-      }
+      private java.lang.Object constraintValue_ = "";
       /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * <code>string constraint_value = 2;</code>
+       * @return The constraintValue.
        */
-      public Builder setRuleSet(acl.Acl.AclRuleSet value) {
-        if (ruleSetBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ruleSet_ = value;
-          onChanged();
+      public java.lang.String getConstraintValue() {
+        java.lang.Object ref = constraintValue_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          constraintValue_ = s;
+          return s;
         } else {
-          ruleSetBuilder_.setMessage(value);
+          return (java.lang.String) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * <code>string constraint_value = 2;</code>
+       * @return The bytes for constraintValue.
        */
-      public Builder setRuleSet(
-          acl.Acl.AclRuleSet.Builder builderForValue) {
-        if (ruleSetBuilder_ == null) {
-          ruleSet_ = builderForValue.build();
-          onChanged();
+      public com.google.protobuf.ByteString
+          getConstraintValueBytes() {
+        java.lang.Object ref = constraintValue_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          constraintValue_ = b;
+          return b;
         } else {
-          ruleSetBuilder_.setMessage(builderForValue.build());
+          return (com.google.protobuf.ByteString) ref;
         }
-
-        return this;
       }
       /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * <code>string constraint_value = 2;</code>
+       * @param value The constraintValue to set.
+       * @return This builder for chaining.
        */
-      public Builder mergeRuleSet(acl.Acl.AclRuleSet value) {
-        if (ruleSetBuilder_ == null) {
-          if (ruleSet_ != null) {
-            ruleSet_ =
-              acl.Acl.AclRuleSet.newBuilder(ruleSet_).mergeFrom(value).buildPartial();
-          } else {
-            ruleSet_ = value;
-          }
-          onChanged();
-        } else {
-          ruleSetBuilder_.mergeFrom(value);
-        }
-
+      public Builder setConstraintValue(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        constraintValue_ = value;
+        onChanged();
         return this;
       }
       /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * <code>string constraint_value = 2;</code>
+       * @return This builder for chaining.
        */
-      public Builder clearRuleSet() {
-        if (ruleSetBuilder_ == null) {
-          ruleSet_ = null;
-          onChanged();
-        } else {
-          ruleSet_ = null;
-          ruleSetBuilder_ = null;
-        }
-
+      public Builder clearConstraintValue() {
+        
+        constraintValue_ = getDefaultInstance().getConstraintValue();
+        onChanged();
         return this;
       }
       /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
+       * <code>string constraint_value = 2;</code>
+       * @param value The bytes for constraintValue to set.
+       * @return This builder for chaining.
        */
-      public acl.Acl.AclRuleSet.Builder getRuleSetBuilder() {
+      public Builder setConstraintValueBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
         
+        constraintValue_ = value;
         onChanged();
-        return getRuleSetFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
-       */
-      public acl.Acl.AclRuleSetOrBuilder getRuleSetOrBuilder() {
-        if (ruleSetBuilder_ != null) {
-          return ruleSetBuilder_.getMessageOrBuilder();
-        } else {
-          return ruleSet_ == null ?
-              acl.Acl.AclRuleSet.getDefaultInstance() : ruleSet_;
-        }
-      }
-      /**
-       * <code>.acl.AclRuleSet rule_set = 2;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          acl.Acl.AclRuleSet, acl.Acl.AclRuleSet.Builder, acl.Acl.AclRuleSetOrBuilder> 
-          getRuleSetFieldBuilder() {
-        if (ruleSetBuilder_ == null) {
-          ruleSetBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              acl.Acl.AclRuleSet, acl.Acl.AclRuleSet.Builder, acl.Acl.AclRuleSetOrBuilder>(
-                  getRuleSet(),
-                  getParentForChildren(),
-                  isClean());
-          ruleSet_ = null;
-        }
-        return ruleSetBuilder_;
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -57041,114 +61859,82 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConfigRule_ACL)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_Custom)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConfigRule_ACL)
-    private static final context.ContextOuterClass.ConfigRule_ACL DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_Custom)
+    private static final context.ContextOuterClass.Constraint_Custom DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule_ACL();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_Custom();
     }
 
-    public static context.ContextOuterClass.ConfigRule_ACL getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_Custom getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConfigRule_ACL>
-        PARSER = new com.google.protobuf.AbstractParser<ConfigRule_ACL>() {
+    private static final com.google.protobuf.Parser<Constraint_Custom>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_Custom>() {
       @java.lang.Override
-      public ConfigRule_ACL parsePartialFrom(
+      public Constraint_Custom parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConfigRule_ACL(input, extensionRegistry);
+        return new Constraint_Custom(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConfigRule_ACL> parser() {
+    public static com.google.protobuf.Parser<Constraint_Custom> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConfigRule_ACL> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_Custom> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule_ACL getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_Custom getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface ConfigRuleOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.ConfigRule)
+  public interface Constraint_ScheduleOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.ConfigActionEnum action = 1;</code>
-     * @return The enum numeric value on the wire for action.
-     */
-    int getActionValue();
-    /**
-     * <code>.context.ConfigActionEnum action = 1;</code>
-     * @return The action.
-     */
-    context.ContextOuterClass.ConfigActionEnum getAction();
-
-    /**
-     * <code>.context.ConfigRule_Custom custom = 2;</code>
-     * @return Whether the custom field is set.
-     */
-    boolean hasCustom();
-    /**
-     * <code>.context.ConfigRule_Custom custom = 2;</code>
-     * @return The custom.
-     */
-    context.ContextOuterClass.ConfigRule_Custom getCustom();
-    /**
-     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     * <code>float start_timestamp = 1;</code>
+     * @return The startTimestamp.
      */
-    context.ContextOuterClass.ConfigRule_CustomOrBuilder getCustomOrBuilder();
+    float getStartTimestamp();
 
     /**
-     * <code>.context.ConfigRule_ACL acl = 3;</code>
-     * @return Whether the acl field is set.
-     */
-    boolean hasAcl();
-    /**
-     * <code>.context.ConfigRule_ACL acl = 3;</code>
-     * @return The acl.
-     */
-    context.ContextOuterClass.ConfigRule_ACL getAcl();
-    /**
-     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     * <code>float duration_days = 2;</code>
+     * @return The durationDays.
      */
-    context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder();
-
-    public context.ContextOuterClass.ConfigRule.ConfigRuleCase getConfigRuleCase();
+    float getDurationDays();
   }
   /**
-   * Protobuf type {@code context.ConfigRule}
+   * Protobuf type {@code context.Constraint_Schedule}
    */
-  public static final class ConfigRule extends
+  public static final class Constraint_Schedule extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.ConfigRule)
-      ConfigRuleOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
+      Constraint_ScheduleOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use ConfigRule.newBuilder() to construct.
-    private ConfigRule(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_Schedule.newBuilder() to construct.
+    private Constraint_Schedule(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private ConfigRule() {
-      action_ = 0;
+    private Constraint_Schedule() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new ConfigRule();
+      return new Constraint_Schedule();
     }
 
     @java.lang.Override
@@ -57156,7 +61942,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private ConfigRule(
+    private Constraint_Schedule(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -57174,38 +61960,14 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 8: {
-              int rawValue = input.readEnum();
+            case 13: {
 
-              action_ = rawValue;
-              break;
-            }
-            case 18: {
-              context.ContextOuterClass.ConfigRule_Custom.Builder subBuilder = null;
-              if (configRuleCase_ == 2) {
-                subBuilder = ((context.ContextOuterClass.ConfigRule_Custom) configRule_).toBuilder();
-              }
-              configRule_ =
-                  input.readMessage(context.ContextOuterClass.ConfigRule_Custom.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_Custom) configRule_);
-                configRule_ = subBuilder.buildPartial();
-              }
-              configRuleCase_ = 2;
+              startTimestamp_ = input.readFloat();
               break;
             }
-            case 26: {
-              context.ContextOuterClass.ConfigRule_ACL.Builder subBuilder = null;
-              if (configRuleCase_ == 3) {
-                subBuilder = ((context.ContextOuterClass.ConfigRule_ACL) configRule_).toBuilder();
-              }
-              configRule_ =
-                  input.readMessage(context.ContextOuterClass.ConfigRule_ACL.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom((context.ContextOuterClass.ConfigRule_ACL) configRule_);
-                configRule_ = subBuilder.buildPartial();
-              }
-              configRuleCase_ = 3;
+            case 21: {
+
+              durationDays_ = input.readFloat();
               break;
             }
             default: {
@@ -57229,137 +61991,37 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_ConfigRule_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_Schedule_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.ConfigRule.class, context.ContextOuterClass.ConfigRule.Builder.class);
-    }
-
-    private int configRuleCase_ = 0;
-    private java.lang.Object configRule_;
-    public enum ConfigRuleCase
-        implements com.google.protobuf.Internal.EnumLite,
-            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
-      CUSTOM(2),
-      ACL(3),
-      CONFIGRULE_NOT_SET(0);
-      private final int value;
-      private ConfigRuleCase(int value) {
-        this.value = value;
-      }
-      /**
-       * @param value The number of the enum to look for.
-       * @return The enum associated with the given number.
-       * @deprecated Use {@link #forNumber(int)} instead.
-       */
-      @java.lang.Deprecated
-      public static ConfigRuleCase valueOf(int value) {
-        return forNumber(value);
-      }
-
-      public static ConfigRuleCase forNumber(int value) {
-        switch (value) {
-          case 2: return CUSTOM;
-          case 3: return ACL;
-          case 0: return CONFIGRULE_NOT_SET;
-          default: return null;
-        }
-      }
-      public int getNumber() {
-        return this.value;
-      }
-    };
-
-    public ConfigRuleCase
-    getConfigRuleCase() {
-      return ConfigRuleCase.forNumber(
-          configRuleCase_);
-    }
-
-    public static final int ACTION_FIELD_NUMBER = 1;
-    private int action_;
-    /**
-     * <code>.context.ConfigActionEnum action = 1;</code>
-     * @return The enum numeric value on the wire for action.
-     */
-    @java.lang.Override public int getActionValue() {
-      return action_;
-    }
-    /**
-     * <code>.context.ConfigActionEnum action = 1;</code>
-     * @return The action.
-     */
-    @java.lang.Override public context.ContextOuterClass.ConfigActionEnum getAction() {
-      @SuppressWarnings("deprecation")
-      context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
-      return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
+              context.ContextOuterClass.Constraint_Schedule.class, context.ContextOuterClass.Constraint_Schedule.Builder.class);
     }
 
-    public static final int CUSTOM_FIELD_NUMBER = 2;
-    /**
-     * <code>.context.ConfigRule_Custom custom = 2;</code>
-     * @return Whether the custom field is set.
-     */
-    @java.lang.Override
-    public boolean hasCustom() {
-      return configRuleCase_ == 2;
-    }
-    /**
-     * <code>.context.ConfigRule_Custom custom = 2;</code>
-     * @return The custom.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConfigRule_Custom getCustom() {
-      if (configRuleCase_ == 2) {
-         return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
-      }
-      return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
-    }
+    public static final int START_TIMESTAMP_FIELD_NUMBER = 1;
+    private float startTimestamp_;
     /**
-     * <code>.context.ConfigRule_Custom custom = 2;</code>
+     * <code>float start_timestamp = 1;</code>
+     * @return The startTimestamp.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule_CustomOrBuilder getCustomOrBuilder() {
-      if (configRuleCase_ == 2) {
-         return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
-      }
-      return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
+    public float getStartTimestamp() {
+      return startTimestamp_;
     }
 
-    public static final int ACL_FIELD_NUMBER = 3;
-    /**
-     * <code>.context.ConfigRule_ACL acl = 3;</code>
-     * @return Whether the acl field is set.
-     */
-    @java.lang.Override
-    public boolean hasAcl() {
-      return configRuleCase_ == 3;
-    }
-    /**
-     * <code>.context.ConfigRule_ACL acl = 3;</code>
-     * @return The acl.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.ConfigRule_ACL getAcl() {
-      if (configRuleCase_ == 3) {
-         return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
-      }
-      return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
-    }
+    public static final int DURATION_DAYS_FIELD_NUMBER = 2;
+    private float durationDays_;
     /**
-     * <code>.context.ConfigRule_ACL acl = 3;</code>
+     * <code>float duration_days = 2;</code>
+     * @return The durationDays.
      */
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder() {
-      if (configRuleCase_ == 3) {
-         return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
-      }
-      return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
+    public float getDurationDays() {
+      return durationDays_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -57376,14 +62038,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (action_ != context.ContextOuterClass.ConfigActionEnum.CONFIGACTION_UNDEFINED.getNumber()) {
-        output.writeEnum(1, action_);
-      }
-      if (configRuleCase_ == 2) {
-        output.writeMessage(2, (context.ContextOuterClass.ConfigRule_Custom) configRule_);
+      if (startTimestamp_ != 0F) {
+        output.writeFloat(1, startTimestamp_);
       }
-      if (configRuleCase_ == 3) {
-        output.writeMessage(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
+      if (durationDays_ != 0F) {
+        output.writeFloat(2, durationDays_);
       }
       unknownFields.writeTo(output);
     }
@@ -57394,17 +62053,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (action_ != context.ContextOuterClass.ConfigActionEnum.CONFIGACTION_UNDEFINED.getNumber()) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeEnumSize(1, action_);
-      }
-      if (configRuleCase_ == 2) {
+      if (startTimestamp_ != 0F) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, (context.ContextOuterClass.ConfigRule_Custom) configRule_);
+          .computeFloatSize(1, startTimestamp_);
       }
-      if (configRuleCase_ == 3) {
+      if (durationDays_ != 0F) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, (context.ContextOuterClass.ConfigRule_ACL) configRule_);
+          .computeFloatSize(2, durationDays_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -57416,25 +62071,17 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.ConfigRule)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_Schedule)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.ConfigRule other = (context.ContextOuterClass.ConfigRule) obj;
+      context.ContextOuterClass.Constraint_Schedule other = (context.ContextOuterClass.Constraint_Schedule) obj;
 
-      if (action_ != other.action_) return false;
-      if (!getConfigRuleCase().equals(other.getConfigRuleCase())) return false;
-      switch (configRuleCase_) {
-        case 2:
-          if (!getCustom()
-              .equals(other.getCustom())) return false;
-          break;
-        case 3:
-          if (!getAcl()
-              .equals(other.getAcl())) return false;
-          break;
-        case 0:
-        default:
-      }
+      if (java.lang.Float.floatToIntBits(getStartTimestamp())
+          != java.lang.Float.floatToIntBits(
+              other.getStartTimestamp())) return false;
+      if (java.lang.Float.floatToIntBits(getDurationDays())
+          != java.lang.Float.floatToIntBits(
+              other.getDurationDays())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -57446,88 +62093,80 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + ACTION_FIELD_NUMBER;
-      hash = (53 * hash) + action_;
-      switch (configRuleCase_) {
-        case 2:
-          hash = (37 * hash) + CUSTOM_FIELD_NUMBER;
-          hash = (53 * hash) + getCustom().hashCode();
-          break;
-        case 3:
-          hash = (37 * hash) + ACL_FIELD_NUMBER;
-          hash = (53 * hash) + getAcl().hashCode();
-          break;
-        case 0:
-        default:
-      }
+      hash = (37 * hash) + START_TIMESTAMP_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getStartTimestamp());
+      hash = (37 * hash) + DURATION_DAYS_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getDurationDays());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_Schedule parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.ConfigRule parseFrom(
+    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -57540,7 +62179,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.ConfigRule prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_Schedule prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -57556,26 +62195,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.ConfigRule}
+     * Protobuf type {@code context.Constraint_Schedule}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.ConfigRule)
-        context.ContextOuterClass.ConfigRuleOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
+        context.ContextOuterClass.Constraint_ScheduleOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_Schedule_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.ConfigRule.class, context.ContextOuterClass.ConfigRule.Builder.class);
+                context.ContextOuterClass.Constraint_Schedule.class, context.ContextOuterClass.Constraint_Schedule.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.ConfigRule.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_Schedule.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -57593,27 +62232,27 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        action_ = 0;
+        startTimestamp_ = 0F;
+
+        durationDays_ = 0F;
 
-        configRuleCase_ = 0;
-        configRule_ = null;
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_ConfigRule_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule getDefaultInstanceForType() {
-        return context.ContextOuterClass.ConfigRule.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_Schedule getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule build() {
-        context.ContextOuterClass.ConfigRule result = buildPartial();
+      public context.ContextOuterClass.Constraint_Schedule build() {
+        context.ContextOuterClass.Constraint_Schedule result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -57621,24 +62260,10 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule buildPartial() {
-        context.ContextOuterClass.ConfigRule result = new context.ContextOuterClass.ConfigRule(this);
-        result.action_ = action_;
-        if (configRuleCase_ == 2) {
-          if (customBuilder_ == null) {
-            result.configRule_ = configRule_;
-          } else {
-            result.configRule_ = customBuilder_.build();
-          }
-        }
-        if (configRuleCase_ == 3) {
-          if (aclBuilder_ == null) {
-            result.configRule_ = configRule_;
-          } else {
-            result.configRule_ = aclBuilder_.build();
-          }
-        }
-        result.configRuleCase_ = configRuleCase_;
+      public context.ContextOuterClass.Constraint_Schedule buildPartial() {
+        context.ContextOuterClass.Constraint_Schedule result = new context.ContextOuterClass.Constraint_Schedule(this);
+        result.startTimestamp_ = startTimestamp_;
+        result.durationDays_ = durationDays_;
         onBuilt();
         return result;
       }
@@ -57677,31 +62302,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConfigRule) {
-          return mergeFrom((context.ContextOuterClass.ConfigRule)other);
+        if (other instanceof context.ContextOuterClass.Constraint_Schedule) {
+          return mergeFrom((context.ContextOuterClass.Constraint_Schedule)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.ConfigRule other) {
-        if (other == context.ContextOuterClass.ConfigRule.getDefaultInstance()) return this;
-        if (other.action_ != 0) {
-          setActionValue(other.getActionValue());
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_Schedule other) {
+        if (other == context.ContextOuterClass.Constraint_Schedule.getDefaultInstance()) return this;
+        if (other.getStartTimestamp() != 0F) {
+          setStartTimestamp(other.getStartTimestamp());
         }
-        switch (other.getConfigRuleCase()) {
-          case CUSTOM: {
-            mergeCustom(other.getCustom());
-            break;
-          }
-          case ACL: {
-            mergeAcl(other.getAcl());
-            break;
-          }
-          case CONFIGRULE_NOT_SET: {
-            break;
-          }
+        if (other.getDurationDays() != 0F) {
+          setDurationDays(other.getDurationDays());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -57718,11 +62333,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.ConfigRule parsedMessage = null;
+        context.ContextOuterClass.Constraint_Schedule parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConfigRule) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Constraint_Schedule) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -57731,356 +62346,67 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int configRuleCase_ = 0;
-      private java.lang.Object configRule_;
-      public ConfigRuleCase
-          getConfigRuleCase() {
-        return ConfigRuleCase.forNumber(
-            configRuleCase_);
-      }
-
-      public Builder clearConfigRule() {
-        configRuleCase_ = 0;
-        configRule_ = null;
-        onChanged();
-        return this;
-      }
 
-
-      private int action_ = 0;
-      /**
-       * <code>.context.ConfigActionEnum action = 1;</code>
-       * @return The enum numeric value on the wire for action.
-       */
-      @java.lang.Override public int getActionValue() {
-        return action_;
-      }
-      /**
-       * <code>.context.ConfigActionEnum action = 1;</code>
-       * @param value The enum numeric value on the wire for action to set.
-       * @return This builder for chaining.
-       */
-      public Builder setActionValue(int value) {
-        
-        action_ = value;
-        onChanged();
-        return this;
-      }
+      private float startTimestamp_ ;
       /**
-       * <code>.context.ConfigActionEnum action = 1;</code>
-       * @return The action.
+       * <code>float start_timestamp = 1;</code>
+       * @return The startTimestamp.
        */
       @java.lang.Override
-      public context.ContextOuterClass.ConfigActionEnum getAction() {
-        @SuppressWarnings("deprecation")
-        context.ContextOuterClass.ConfigActionEnum result = context.ContextOuterClass.ConfigActionEnum.valueOf(action_);
-        return result == null ? context.ContextOuterClass.ConfigActionEnum.UNRECOGNIZED : result;
+      public float getStartTimestamp() {
+        return startTimestamp_;
       }
       /**
-       * <code>.context.ConfigActionEnum action = 1;</code>
-       * @param value The action to set.
+       * <code>float start_timestamp = 1;</code>
+       * @param value The startTimestamp to set.
        * @return This builder for chaining.
        */
-      public Builder setAction(context.ContextOuterClass.ConfigActionEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
+      public Builder setStartTimestamp(float value) {
         
-        action_ = value.getNumber();
+        startTimestamp_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>.context.ConfigActionEnum action = 1;</code>
+       * <code>float start_timestamp = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder clearAction() {
+      public Builder clearStartTimestamp() {
         
-        action_ = 0;
+        startTimestamp_ = 0F;
         onChanged();
         return this;
       }
 
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule_Custom, context.ContextOuterClass.ConfigRule_Custom.Builder, context.ContextOuterClass.ConfigRule_CustomOrBuilder> customBuilder_;
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       * @return Whether the custom field is set.
-       */
-      @java.lang.Override
-      public boolean hasCustom() {
-        return configRuleCase_ == 2;
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       * @return The custom.
-       */
-      @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_Custom getCustom() {
-        if (customBuilder_ == null) {
-          if (configRuleCase_ == 2) {
-            return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
-          }
-          return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
-        } else {
-          if (configRuleCase_ == 2) {
-            return customBuilder_.getMessage();
-          }
-          return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
-        }
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      public Builder setCustom(context.ContextOuterClass.ConfigRule_Custom value) {
-        if (customBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          configRule_ = value;
-          onChanged();
-        } else {
-          customBuilder_.setMessage(value);
-        }
-        configRuleCase_ = 2;
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      public Builder setCustom(
-          context.ContextOuterClass.ConfigRule_Custom.Builder builderForValue) {
-        if (customBuilder_ == null) {
-          configRule_ = builderForValue.build();
-          onChanged();
-        } else {
-          customBuilder_.setMessage(builderForValue.build());
-        }
-        configRuleCase_ = 2;
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      public Builder mergeCustom(context.ContextOuterClass.ConfigRule_Custom value) {
-        if (customBuilder_ == null) {
-          if (configRuleCase_ == 2 &&
-              configRule_ != context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance()) {
-            configRule_ = context.ContextOuterClass.ConfigRule_Custom.newBuilder((context.ContextOuterClass.ConfigRule_Custom) configRule_)
-                .mergeFrom(value).buildPartial();
-          } else {
-            configRule_ = value;
-          }
-          onChanged();
-        } else {
-          if (configRuleCase_ == 2) {
-            customBuilder_.mergeFrom(value);
-          }
-          customBuilder_.setMessage(value);
-        }
-        configRuleCase_ = 2;
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      public Builder clearCustom() {
-        if (customBuilder_ == null) {
-          if (configRuleCase_ == 2) {
-            configRuleCase_ = 0;
-            configRule_ = null;
-            onChanged();
-          }
-        } else {
-          if (configRuleCase_ == 2) {
-            configRuleCase_ = 0;
-            configRule_ = null;
-          }
-          customBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      public context.ContextOuterClass.ConfigRule_Custom.Builder getCustomBuilder() {
-        return getCustomFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_CustomOrBuilder getCustomOrBuilder() {
-        if ((configRuleCase_ == 2) && (customBuilder_ != null)) {
-          return customBuilder_.getMessageOrBuilder();
-        } else {
-          if (configRuleCase_ == 2) {
-            return (context.ContextOuterClass.ConfigRule_Custom) configRule_;
-          }
-          return context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
-        }
-      }
-      /**
-       * <code>.context.ConfigRule_Custom custom = 2;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule_Custom, context.ContextOuterClass.ConfigRule_Custom.Builder, context.ContextOuterClass.ConfigRule_CustomOrBuilder> 
-          getCustomFieldBuilder() {
-        if (customBuilder_ == null) {
-          if (!(configRuleCase_ == 2)) {
-            configRule_ = context.ContextOuterClass.ConfigRule_Custom.getDefaultInstance();
-          }
-          customBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConfigRule_Custom, context.ContextOuterClass.ConfigRule_Custom.Builder, context.ContextOuterClass.ConfigRule_CustomOrBuilder>(
-                  (context.ContextOuterClass.ConfigRule_Custom) configRule_,
-                  getParentForChildren(),
-                  isClean());
-          configRule_ = null;
-        }
-        configRuleCase_ = 2;
-        onChanged();;
-        return customBuilder_;
-      }
-
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule_ACL, context.ContextOuterClass.ConfigRule_ACL.Builder, context.ContextOuterClass.ConfigRule_ACLOrBuilder> aclBuilder_;
-      /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       * @return Whether the acl field is set.
-       */
-      @java.lang.Override
-      public boolean hasAcl() {
-        return configRuleCase_ == 3;
-      }
+      private float durationDays_ ;
       /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       * @return The acl.
+       * <code>float duration_days = 2;</code>
+       * @return The durationDays.
        */
       @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_ACL getAcl() {
-        if (aclBuilder_ == null) {
-          if (configRuleCase_ == 3) {
-            return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
-          }
-          return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
-        } else {
-          if (configRuleCase_ == 3) {
-            return aclBuilder_.getMessage();
-          }
-          return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
-        }
-      }
-      /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       */
-      public Builder setAcl(context.ContextOuterClass.ConfigRule_ACL value) {
-        if (aclBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          configRule_ = value;
-          onChanged();
-        } else {
-          aclBuilder_.setMessage(value);
-        }
-        configRuleCase_ = 3;
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       */
-      public Builder setAcl(
-          context.ContextOuterClass.ConfigRule_ACL.Builder builderForValue) {
-        if (aclBuilder_ == null) {
-          configRule_ = builderForValue.build();
-          onChanged();
-        } else {
-          aclBuilder_.setMessage(builderForValue.build());
-        }
-        configRuleCase_ = 3;
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       */
-      public Builder mergeAcl(context.ContextOuterClass.ConfigRule_ACL value) {
-        if (aclBuilder_ == null) {
-          if (configRuleCase_ == 3 &&
-              configRule_ != context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance()) {
-            configRule_ = context.ContextOuterClass.ConfigRule_ACL.newBuilder((context.ContextOuterClass.ConfigRule_ACL) configRule_)
-                .mergeFrom(value).buildPartial();
-          } else {
-            configRule_ = value;
-          }
-          onChanged();
-        } else {
-          if (configRuleCase_ == 3) {
-            aclBuilder_.mergeFrom(value);
-          }
-          aclBuilder_.setMessage(value);
-        }
-        configRuleCase_ = 3;
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       */
-      public Builder clearAcl() {
-        if (aclBuilder_ == null) {
-          if (configRuleCase_ == 3) {
-            configRuleCase_ = 0;
-            configRule_ = null;
-            onChanged();
-          }
-        } else {
-          if (configRuleCase_ == 3) {
-            configRuleCase_ = 0;
-            configRule_ = null;
-          }
-          aclBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
-       */
-      public context.ContextOuterClass.ConfigRule_ACL.Builder getAclBuilder() {
-        return getAclFieldBuilder().getBuilder();
+      public float getDurationDays() {
+        return durationDays_;
       }
       /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
+       * <code>float duration_days = 2;</code>
+       * @param value The durationDays to set.
+       * @return This builder for chaining.
        */
-      @java.lang.Override
-      public context.ContextOuterClass.ConfigRule_ACLOrBuilder getAclOrBuilder() {
-        if ((configRuleCase_ == 3) && (aclBuilder_ != null)) {
-          return aclBuilder_.getMessageOrBuilder();
-        } else {
-          if (configRuleCase_ == 3) {
-            return (context.ContextOuterClass.ConfigRule_ACL) configRule_;
-          }
-          return context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
-        }
+      public Builder setDurationDays(float value) {
+        
+        durationDays_ = value;
+        onChanged();
+        return this;
       }
       /**
-       * <code>.context.ConfigRule_ACL acl = 3;</code>
+       * <code>float duration_days = 2;</code>
+       * @return This builder for chaining.
        */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConfigRule_ACL, context.ContextOuterClass.ConfigRule_ACL.Builder, context.ContextOuterClass.ConfigRule_ACLOrBuilder> 
-          getAclFieldBuilder() {
-        if (aclBuilder_ == null) {
-          if (!(configRuleCase_ == 3)) {
-            configRule_ = context.ContextOuterClass.ConfigRule_ACL.getDefaultInstance();
-          }
-          aclBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConfigRule_ACL, context.ContextOuterClass.ConfigRule_ACL.Builder, context.ContextOuterClass.ConfigRule_ACLOrBuilder>(
-                  (context.ContextOuterClass.ConfigRule_ACL) configRule_,
-                  getParentForChildren(),
-                  isClean());
-          configRule_ = null;
-        }
-        configRuleCase_ = 3;
-        onChanged();;
-        return aclBuilder_;
+      public Builder clearDurationDays() {
+        
+        durationDays_ = 0F;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -58095,100 +62421,82 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.ConfigRule)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_Schedule)
     }
 
-    // @@protoc_insertion_point(class_scope:context.ConfigRule)
-    private static final context.ContextOuterClass.ConfigRule DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_Schedule)
+    private static final context.ContextOuterClass.Constraint_Schedule DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.ConfigRule();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_Schedule();
     }
 
-    public static context.ContextOuterClass.ConfigRule getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_Schedule getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<ConfigRule>
-        PARSER = new com.google.protobuf.AbstractParser<ConfigRule>() {
+    private static final com.google.protobuf.Parser<Constraint_Schedule>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_Schedule>() {
       @java.lang.Override
-      public ConfigRule parsePartialFrom(
+      public Constraint_Schedule parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new ConfigRule(input, extensionRegistry);
+        return new Constraint_Schedule(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<ConfigRule> parser() {
+    public static com.google.protobuf.Parser<Constraint_Schedule> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<ConfigRule> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_Schedule> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.ConfigRule getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_Schedule getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_CustomOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_Custom)
+  public interface GPS_PositionOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.GPS_Position)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>string constraint_type = 1;</code>
-     * @return The constraintType.
-     */
-    java.lang.String getConstraintType();
-    /**
-     * <code>string constraint_type = 1;</code>
-     * @return The bytes for constraintType.
+     * <code>float latitude = 1;</code>
+     * @return The latitude.
      */
-    com.google.protobuf.ByteString
-        getConstraintTypeBytes();
+    float getLatitude();
 
     /**
-     * <code>string constraint_value = 2;</code>
-     * @return The constraintValue.
-     */
-    java.lang.String getConstraintValue();
-    /**
-     * <code>string constraint_value = 2;</code>
-     * @return The bytes for constraintValue.
+     * <code>float longitude = 2;</code>
+     * @return The longitude.
      */
-    com.google.protobuf.ByteString
-        getConstraintValueBytes();
+    float getLongitude();
   }
   /**
-   * <pre>
-   * ----- Constraint ----------------------------------------------------------------------------------------------------
-   * </pre>
-   *
-   * Protobuf type {@code context.Constraint_Custom}
+   * Protobuf type {@code context.GPS_Position}
    */
-  public static final class Constraint_Custom extends
+  public static final class GPS_Position extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_Custom)
-      Constraint_CustomOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.GPS_Position)
+      GPS_PositionOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_Custom.newBuilder() to construct.
-    private Constraint_Custom(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use GPS_Position.newBuilder() to construct.
+    private GPS_Position(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_Custom() {
-      constraintType_ = "";
-      constraintValue_ = "";
+    private GPS_Position() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_Custom();
+      return new GPS_Position();
     }
 
     @java.lang.Override
@@ -58196,7 +62504,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_Custom(
+    private GPS_Position(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -58214,16 +62522,14 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
-              java.lang.String s = input.readStringRequireUtf8();
+            case 13: {
 
-              constraintType_ = s;
+              latitude_ = input.readFloat();
               break;
             }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
+            case 21: {
 
-              constraintValue_ = s;
+              longitude_ = input.readFloat();
               break;
             }
             default: {
@@ -58247,91 +62553,37 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
+      return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_Custom_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_GPS_Position_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_Custom.class, context.ContextOuterClass.Constraint_Custom.Builder.class);
+              context.ContextOuterClass.GPS_Position.class, context.ContextOuterClass.GPS_Position.Builder.class);
     }
 
-    public static final int CONSTRAINT_TYPE_FIELD_NUMBER = 1;
-    private volatile java.lang.Object constraintType_;
-    /**
-     * <code>string constraint_type = 1;</code>
-     * @return The constraintType.
-     */
-    @java.lang.Override
-    public java.lang.String getConstraintType() {
-      java.lang.Object ref = constraintType_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        constraintType_ = s;
-        return s;
-      }
-    }
+    public static final int LATITUDE_FIELD_NUMBER = 1;
+    private float latitude_;
     /**
-     * <code>string constraint_type = 1;</code>
-     * @return The bytes for constraintType.
+     * <code>float latitude = 1;</code>
+     * @return The latitude.
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getConstraintTypeBytes() {
-      java.lang.Object ref = constraintType_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        constraintType_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public float getLatitude() {
+      return latitude_;
     }
 
-    public static final int CONSTRAINT_VALUE_FIELD_NUMBER = 2;
-    private volatile java.lang.Object constraintValue_;
-    /**
-     * <code>string constraint_value = 2;</code>
-     * @return The constraintValue.
-     */
-    @java.lang.Override
-    public java.lang.String getConstraintValue() {
-      java.lang.Object ref = constraintValue_;
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        constraintValue_ = s;
-        return s;
-      }
-    }
+    public static final int LONGITUDE_FIELD_NUMBER = 2;
+    private float longitude_;
     /**
-     * <code>string constraint_value = 2;</code>
-     * @return The bytes for constraintValue.
+     * <code>float longitude = 2;</code>
+     * @return The longitude.
      */
     @java.lang.Override
-    public com.google.protobuf.ByteString
-        getConstraintValueBytes() {
-      java.lang.Object ref = constraintValue_;
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        constraintValue_ = b;
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    public float getLongitude() {
+      return longitude_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -58348,11 +62600,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (!getConstraintTypeBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, constraintType_);
+      if (latitude_ != 0F) {
+        output.writeFloat(1, latitude_);
       }
-      if (!getConstraintValueBytes().isEmpty()) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, constraintValue_);
+      if (longitude_ != 0F) {
+        output.writeFloat(2, longitude_);
       }
       unknownFields.writeTo(output);
     }
@@ -58363,11 +62615,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (!getConstraintTypeBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, constraintType_);
+      if (latitude_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(1, latitude_);
       }
-      if (!getConstraintValueBytes().isEmpty()) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, constraintValue_);
+      if (longitude_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(2, longitude_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -58379,15 +62633,17 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_Custom)) {
+      if (!(obj instanceof context.ContextOuterClass.GPS_Position)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_Custom other = (context.ContextOuterClass.Constraint_Custom) obj;
+      context.ContextOuterClass.GPS_Position other = (context.ContextOuterClass.GPS_Position) obj;
 
-      if (!getConstraintType()
-          .equals(other.getConstraintType())) return false;
-      if (!getConstraintValue()
-          .equals(other.getConstraintValue())) return false;
+      if (java.lang.Float.floatToIntBits(getLatitude())
+          != java.lang.Float.floatToIntBits(
+              other.getLatitude())) return false;
+      if (java.lang.Float.floatToIntBits(getLongitude())
+          != java.lang.Float.floatToIntBits(
+              other.getLongitude())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -58399,78 +62655,80 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + CONSTRAINT_TYPE_FIELD_NUMBER;
-      hash = (53 * hash) + getConstraintType().hashCode();
-      hash = (37 * hash) + CONSTRAINT_VALUE_FIELD_NUMBER;
-      hash = (53 * hash) + getConstraintValue().hashCode();
+      hash = (37 * hash) + LATITUDE_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getLatitude());
+      hash = (37 * hash) + LONGITUDE_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getLongitude());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(byte[] data)
+    public static context.ContextOuterClass.GPS_Position parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.GPS_Position parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.GPS_Position parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseDelimitedFrom(
+    public static context.ContextOuterClass.GPS_Position parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_Custom parseFrom(
+    public static context.ContextOuterClass.GPS_Position parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -58483,7 +62741,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_Custom prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.GPS_Position prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -58499,30 +62757,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * <pre>
-     * ----- Constraint ----------------------------------------------------------------------------------------------------
-     * </pre>
-     *
-     * Protobuf type {@code context.Constraint_Custom}
+     * Protobuf type {@code context.GPS_Position}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_Custom)
-        context.ContextOuterClass.Constraint_CustomOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.GPS_Position)
+        context.ContextOuterClass.GPS_PositionOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
+        return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_Custom_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_GPS_Position_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_Custom.class, context.ContextOuterClass.Constraint_Custom.Builder.class);
+                context.ContextOuterClass.GPS_Position.class, context.ContextOuterClass.GPS_Position.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_Custom.newBuilder()
+      // Construct using context.ContextOuterClass.GPS_Position.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -58540,9 +62794,9 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        constraintType_ = "";
+        latitude_ = 0F;
 
-        constraintValue_ = "";
+        longitude_ = 0F;
 
         return this;
       }
@@ -58550,17 +62804,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_Custom_descriptor;
+        return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_Custom getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
+      public context.ContextOuterClass.GPS_Position getDefaultInstanceForType() {
+        return context.ContextOuterClass.GPS_Position.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_Custom build() {
-        context.ContextOuterClass.Constraint_Custom result = buildPartial();
+      public context.ContextOuterClass.GPS_Position build() {
+        context.ContextOuterClass.GPS_Position result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -58568,10 +62822,10 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_Custom buildPartial() {
-        context.ContextOuterClass.Constraint_Custom result = new context.ContextOuterClass.Constraint_Custom(this);
-        result.constraintType_ = constraintType_;
-        result.constraintValue_ = constraintValue_;
+      public context.ContextOuterClass.GPS_Position buildPartial() {
+        context.ContextOuterClass.GPS_Position result = new context.ContextOuterClass.GPS_Position(this);
+        result.latitude_ = latitude_;
+        result.longitude_ = longitude_;
         onBuilt();
         return result;
       }
@@ -58610,23 +62864,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_Custom) {
-          return mergeFrom((context.ContextOuterClass.Constraint_Custom)other);
+        if (other instanceof context.ContextOuterClass.GPS_Position) {
+          return mergeFrom((context.ContextOuterClass.GPS_Position)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_Custom other) {
-        if (other == context.ContextOuterClass.Constraint_Custom.getDefaultInstance()) return this;
-        if (!other.getConstraintType().isEmpty()) {
-          constraintType_ = other.constraintType_;
-          onChanged();
+      public Builder mergeFrom(context.ContextOuterClass.GPS_Position other) {
+        if (other == context.ContextOuterClass.GPS_Position.getDefaultInstance()) return this;
+        if (other.getLatitude() != 0F) {
+          setLatitude(other.getLatitude());
         }
-        if (!other.getConstraintValue().isEmpty()) {
-          constraintValue_ = other.constraintValue_;
-          onChanged();
+        if (other.getLongitude() != 0F) {
+          setLongitude(other.getLongitude());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -58643,11 +62895,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Constraint_Custom parsedMessage = null;
+        context.ContextOuterClass.GPS_Position parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_Custom) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.GPS_Position) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -58657,154 +62909,64 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private java.lang.Object constraintType_ = "";
-      /**
-       * <code>string constraint_type = 1;</code>
-       * @return The constraintType.
-       */
-      public java.lang.String getConstraintType() {
-        java.lang.Object ref = constraintType_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          constraintType_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string constraint_type = 1;</code>
-       * @return The bytes for constraintType.
-       */
-      public com.google.protobuf.ByteString
-          getConstraintTypeBytes() {
-        java.lang.Object ref = constraintType_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          constraintType_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
+      private float latitude_ ;
       /**
-       * <code>string constraint_type = 1;</code>
-       * @param value The constraintType to set.
-       * @return This builder for chaining.
+       * <code>float latitude = 1;</code>
+       * @return The latitude.
        */
-      public Builder setConstraintType(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        constraintType_ = value;
-        onChanged();
-        return this;
+      @java.lang.Override
+      public float getLatitude() {
+        return latitude_;
       }
       /**
-       * <code>string constraint_type = 1;</code>
+       * <code>float latitude = 1;</code>
+       * @param value The latitude to set.
        * @return This builder for chaining.
        */
-      public Builder clearConstraintType() {
+      public Builder setLatitude(float value) {
         
-        constraintType_ = getDefaultInstance().getConstraintType();
+        latitude_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string constraint_type = 1;</code>
-       * @param value The bytes for constraintType to set.
+       * <code>float latitude = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder setConstraintTypeBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+      public Builder clearLatitude() {
         
-        constraintType_ = value;
+        latitude_ = 0F;
         onChanged();
         return this;
       }
 
-      private java.lang.Object constraintValue_ = "";
-      /**
-       * <code>string constraint_value = 2;</code>
-       * @return The constraintValue.
-       */
-      public java.lang.String getConstraintValue() {
-        java.lang.Object ref = constraintValue_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          constraintValue_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string constraint_value = 2;</code>
-       * @return The bytes for constraintValue.
-       */
-      public com.google.protobuf.ByteString
-          getConstraintValueBytes() {
-        java.lang.Object ref = constraintValue_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          constraintValue_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
+      private float longitude_ ;
       /**
-       * <code>string constraint_value = 2;</code>
-       * @param value The constraintValue to set.
-       * @return This builder for chaining.
+       * <code>float longitude = 2;</code>
+       * @return The longitude.
        */
-      public Builder setConstraintValue(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        constraintValue_ = value;
-        onChanged();
-        return this;
+      @java.lang.Override
+      public float getLongitude() {
+        return longitude_;
       }
       /**
-       * <code>string constraint_value = 2;</code>
+       * <code>float longitude = 2;</code>
+       * @param value The longitude to set.
        * @return This builder for chaining.
        */
-      public Builder clearConstraintValue() {
+      public Builder setLongitude(float value) {
         
-        constraintValue_ = getDefaultInstance().getConstraintValue();
+        longitude_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>string constraint_value = 2;</code>
-       * @param value The bytes for constraintValue to set.
+       * <code>float longitude = 2;</code>
        * @return This builder for chaining.
        */
-      public Builder setConstraintValueBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
+      public Builder clearLongitude() {
         
-        constraintValue_ = value;
+        longitude_ = 0F;
         onChanged();
         return this;
       }
@@ -58821,82 +62983,104 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_Custom)
+      // @@protoc_insertion_point(builder_scope:context.GPS_Position)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_Custom)
-    private static final context.ContextOuterClass.Constraint_Custom DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.GPS_Position)
+    private static final context.ContextOuterClass.GPS_Position DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_Custom();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.GPS_Position();
     }
 
-    public static context.ContextOuterClass.Constraint_Custom getDefaultInstance() {
+    public static context.ContextOuterClass.GPS_Position getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_Custom>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_Custom>() {
+    private static final com.google.protobuf.Parser<GPS_Position>
+        PARSER = new com.google.protobuf.AbstractParser<GPS_Position>() {
       @java.lang.Override
-      public Constraint_Custom parsePartialFrom(
+      public GPS_Position parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_Custom(input, extensionRegistry);
+        return new GPS_Position(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_Custom> parser() {
+    public static com.google.protobuf.Parser<GPS_Position> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_Custom> getParserForType() {
+    public com.google.protobuf.Parser<GPS_Position> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_Custom getDefaultInstanceForType() {
+    public context.ContextOuterClass.GPS_Position getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_ScheduleOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_Schedule)
+  public interface LocationOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Location)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>float start_timestamp = 1;</code>
-     * @return The startTimestamp.
+     * <code>string region = 1;</code>
+     * @return Whether the region field is set.
+     */
+    boolean hasRegion();
+    /**
+     * <code>string region = 1;</code>
+     * @return The region.
+     */
+    java.lang.String getRegion();
+    /**
+     * <code>string region = 1;</code>
+     * @return The bytes for region.
+     */
+    com.google.protobuf.ByteString
+        getRegionBytes();
+
+    /**
+     * <code>.context.GPS_Position gps_position = 2;</code>
+     * @return Whether the gpsPosition field is set.
      */
-    float getStartTimestamp();
-
+    boolean hasGpsPosition();
     /**
-     * <code>float duration_days = 2;</code>
-     * @return The durationDays.
+     * <code>.context.GPS_Position gps_position = 2;</code>
+     * @return The gpsPosition.
      */
-    float getDurationDays();
+    context.ContextOuterClass.GPS_Position getGpsPosition();
+    /**
+     * <code>.context.GPS_Position gps_position = 2;</code>
+     */
+    context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder();
+
+    public context.ContextOuterClass.Location.LocationCase getLocationCase();
   }
   /**
-   * Protobuf type {@code context.Constraint_Schedule}
+   * Protobuf type {@code context.Location}
    */
-  public static final class Constraint_Schedule extends
+  public static final class Location extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_Schedule)
-      Constraint_ScheduleOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Location)
+      LocationOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_Schedule.newBuilder() to construct.
-    private Constraint_Schedule(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Location.newBuilder() to construct.
+    private Location(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_Schedule() {
+    private Location() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_Schedule();
+      return new Location();
     }
 
     @java.lang.Override
@@ -58904,7 +63088,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_Schedule(
+    private Location(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -58922,14 +63106,24 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 13: {
-
-              startTimestamp_ = input.readFloat();
+            case 10: {
+              java.lang.String s = input.readStringRequireUtf8();
+              locationCase_ = 1;
+              location_ = s;
               break;
             }
-            case 21: {
-
-              durationDays_ = input.readFloat();
+            case 18: {
+              context.ContextOuterClass.GPS_Position.Builder subBuilder = null;
+              if (locationCase_ == 2) {
+                subBuilder = ((context.ContextOuterClass.GPS_Position) location_).toBuilder();
+              }
+              location_ =
+                  input.readMessage(context.ContextOuterClass.GPS_Position.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom((context.ContextOuterClass.GPS_Position) location_);
+                location_ = subBuilder.buildPartial();
+              }
+              locationCase_ = 2;
               break;
             }
             default: {
@@ -58953,37 +63147,139 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
+      return context.ContextOuterClass.internal_static_context_Location_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_Schedule_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Location_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_Schedule.class, context.ContextOuterClass.Constraint_Schedule.Builder.class);
+              context.ContextOuterClass.Location.class, context.ContextOuterClass.Location.Builder.class);
     }
 
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 1;
-    private float startTimestamp_;
+    private int locationCase_ = 0;
+    private java.lang.Object location_;
+    public enum LocationCase
+        implements com.google.protobuf.Internal.EnumLite,
+            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
+      REGION(1),
+      GPS_POSITION(2),
+      LOCATION_NOT_SET(0);
+      private final int value;
+      private LocationCase(int value) {
+        this.value = value;
+      }
+      /**
+       * @param value The number of the enum to look for.
+       * @return The enum associated with the given number.
+       * @deprecated Use {@link #forNumber(int)} instead.
+       */
+      @java.lang.Deprecated
+      public static LocationCase valueOf(int value) {
+        return forNumber(value);
+      }
+
+      public static LocationCase forNumber(int value) {
+        switch (value) {
+          case 1: return REGION;
+          case 2: return GPS_POSITION;
+          case 0: return LOCATION_NOT_SET;
+          default: return null;
+        }
+      }
+      public int getNumber() {
+        return this.value;
+      }
+    };
+
+    public LocationCase
+    getLocationCase() {
+      return LocationCase.forNumber(
+          locationCase_);
+    }
+
+    public static final int REGION_FIELD_NUMBER = 1;
     /**
-     * <code>float start_timestamp = 1;</code>
-     * @return The startTimestamp.
+     * <code>string region = 1;</code>
+     * @return Whether the region field is set.
      */
-    @java.lang.Override
-    public float getStartTimestamp() {
-      return startTimestamp_;
+    public boolean hasRegion() {
+      return locationCase_ == 1;
+    }
+    /**
+     * <code>string region = 1;</code>
+     * @return The region.
+     */
+    public java.lang.String getRegion() {
+      java.lang.Object ref = "";
+      if (locationCase_ == 1) {
+        ref = location_;
+      }
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        if (locationCase_ == 1) {
+          location_ = s;
+        }
+        return s;
+      }
+    }
+    /**
+     * <code>string region = 1;</code>
+     * @return The bytes for region.
+     */
+    public com.google.protobuf.ByteString
+        getRegionBytes() {
+      java.lang.Object ref = "";
+      if (locationCase_ == 1) {
+        ref = location_;
+      }
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        if (locationCase_ == 1) {
+          location_ = b;
+        }
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
     }
 
-    public static final int DURATION_DAYS_FIELD_NUMBER = 2;
-    private float durationDays_;
+    public static final int GPS_POSITION_FIELD_NUMBER = 2;
     /**
-     * <code>float duration_days = 2;</code>
-     * @return The durationDays.
+     * <code>.context.GPS_Position gps_position = 2;</code>
+     * @return Whether the gpsPosition field is set.
      */
     @java.lang.Override
-    public float getDurationDays() {
-      return durationDays_;
+    public boolean hasGpsPosition() {
+      return locationCase_ == 2;
+    }
+    /**
+     * <code>.context.GPS_Position gps_position = 2;</code>
+     * @return The gpsPosition.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.GPS_Position getGpsPosition() {
+      if (locationCase_ == 2) {
+         return (context.ContextOuterClass.GPS_Position) location_;
+      }
+      return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+    }
+    /**
+     * <code>.context.GPS_Position gps_position = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder() {
+      if (locationCase_ == 2) {
+         return (context.ContextOuterClass.GPS_Position) location_;
+      }
+      return context.ContextOuterClass.GPS_Position.getDefaultInstance();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -59000,11 +63296,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (startTimestamp_ != 0F) {
-        output.writeFloat(1, startTimestamp_);
+      if (locationCase_ == 1) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, location_);
       }
-      if (durationDays_ != 0F) {
-        output.writeFloat(2, durationDays_);
+      if (locationCase_ == 2) {
+        output.writeMessage(2, (context.ContextOuterClass.GPS_Position) location_);
       }
       unknownFields.writeTo(output);
     }
@@ -59015,13 +63311,12 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (startTimestamp_ != 0F) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(1, startTimestamp_);
+      if (locationCase_ == 1) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, location_);
       }
-      if (durationDays_ != 0F) {
+      if (locationCase_ == 2) {
         size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(2, durationDays_);
+          .computeMessageSize(2, (context.ContextOuterClass.GPS_Position) location_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -59033,17 +63328,24 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_Schedule)) {
+      if (!(obj instanceof context.ContextOuterClass.Location)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_Schedule other = (context.ContextOuterClass.Constraint_Schedule) obj;
+      context.ContextOuterClass.Location other = (context.ContextOuterClass.Location) obj;
 
-      if (java.lang.Float.floatToIntBits(getStartTimestamp())
-          != java.lang.Float.floatToIntBits(
-              other.getStartTimestamp())) return false;
-      if (java.lang.Float.floatToIntBits(getDurationDays())
-          != java.lang.Float.floatToIntBits(
-              other.getDurationDays())) return false;
+      if (!getLocationCase().equals(other.getLocationCase())) return false;
+      switch (locationCase_) {
+        case 1:
+          if (!getRegion()
+              .equals(other.getRegion())) return false;
+          break;
+        case 2:
+          if (!getGpsPosition()
+              .equals(other.getGpsPosition())) return false;
+          break;
+        case 0:
+        default:
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -59055,80 +63357,86 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + START_TIMESTAMP_FIELD_NUMBER;
-      hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getStartTimestamp());
-      hash = (37 * hash) + DURATION_DAYS_FIELD_NUMBER;
-      hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getDurationDays());
+      switch (locationCase_) {
+        case 1:
+          hash = (37 * hash) + REGION_FIELD_NUMBER;
+          hash = (53 * hash) + getRegion().hashCode();
+          break;
+        case 2:
+          hash = (37 * hash) + GPS_POSITION_FIELD_NUMBER;
+          hash = (53 * hash) + getGpsPosition().hashCode();
+          break;
+        case 0:
+        default:
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(byte[] data)
+    public static context.ContextOuterClass.Location parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Location parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Location parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseDelimitedFrom(
+    public static context.ContextOuterClass.Location parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_Schedule parseFrom(
+    public static context.ContextOuterClass.Location parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -59141,7 +63449,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_Schedule prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Location prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -59157,26 +63465,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Constraint_Schedule}
+     * Protobuf type {@code context.Location}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_Schedule)
-        context.ContextOuterClass.Constraint_ScheduleOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Location)
+        context.ContextOuterClass.LocationOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
+        return context.ContextOuterClass.internal_static_context_Location_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_Schedule_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Location_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_Schedule.class, context.ContextOuterClass.Constraint_Schedule.Builder.class);
+                context.ContextOuterClass.Location.class, context.ContextOuterClass.Location.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_Schedule.newBuilder()
+      // Construct using context.ContextOuterClass.Location.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -59194,27 +63502,25 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        startTimestamp_ = 0F;
-
-        durationDays_ = 0F;
-
+        locationCase_ = 0;
+        location_ = null;
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_Schedule_descriptor;
+        return context.ContextOuterClass.internal_static_context_Location_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_Schedule getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
+      public context.ContextOuterClass.Location getDefaultInstanceForType() {
+        return context.ContextOuterClass.Location.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_Schedule build() {
-        context.ContextOuterClass.Constraint_Schedule result = buildPartial();
+      public context.ContextOuterClass.Location build() {
+        context.ContextOuterClass.Location result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -59222,10 +63528,19 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_Schedule buildPartial() {
-        context.ContextOuterClass.Constraint_Schedule result = new context.ContextOuterClass.Constraint_Schedule(this);
-        result.startTimestamp_ = startTimestamp_;
-        result.durationDays_ = durationDays_;
+      public context.ContextOuterClass.Location buildPartial() {
+        context.ContextOuterClass.Location result = new context.ContextOuterClass.Location(this);
+        if (locationCase_ == 1) {
+          result.location_ = location_;
+        }
+        if (locationCase_ == 2) {
+          if (gpsPositionBuilder_ == null) {
+            result.location_ = location_;
+          } else {
+            result.location_ = gpsPositionBuilder_.build();
+          }
+        }
+        result.locationCase_ = locationCase_;
         onBuilt();
         return result;
       }
@@ -59264,21 +63579,30 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_Schedule) {
-          return mergeFrom((context.ContextOuterClass.Constraint_Schedule)other);
+        if (other instanceof context.ContextOuterClass.Location) {
+          return mergeFrom((context.ContextOuterClass.Location)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_Schedule other) {
-        if (other == context.ContextOuterClass.Constraint_Schedule.getDefaultInstance()) return this;
-        if (other.getStartTimestamp() != 0F) {
-          setStartTimestamp(other.getStartTimestamp());
-        }
-        if (other.getDurationDays() != 0F) {
-          setDurationDays(other.getDurationDays());
+      public Builder mergeFrom(context.ContextOuterClass.Location other) {
+        if (other == context.ContextOuterClass.Location.getDefaultInstance()) return this;
+        switch (other.getLocationCase()) {
+          case REGION: {
+            locationCase_ = 1;
+            location_ = other.location_;
+            onChanged();
+            break;
+          }
+          case GPS_POSITION: {
+            mergeGpsPosition(other.getGpsPosition());
+            break;
+          }
+          case LOCATION_NOT_SET: {
+            break;
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -59289,86 +63613,277 @@ public final class ContextOuterClass {
       public final boolean isInitialized() {
         return true;
       }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.Constraint_Schedule parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_Schedule) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.Location parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.Location) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int locationCase_ = 0;
+      private java.lang.Object location_;
+      public LocationCase
+          getLocationCase() {
+        return LocationCase.forNumber(
+            locationCase_);
+      }
+
+      public Builder clearLocation() {
+        locationCase_ = 0;
+        location_ = null;
+        onChanged();
+        return this;
+      }
+
+
+      /**
+       * <code>string region = 1;</code>
+       * @return Whether the region field is set.
+       */
+      @java.lang.Override
+      public boolean hasRegion() {
+        return locationCase_ == 1;
+      }
+      /**
+       * <code>string region = 1;</code>
+       * @return The region.
+       */
+      @java.lang.Override
+      public java.lang.String getRegion() {
+        java.lang.Object ref = "";
+        if (locationCase_ == 1) {
+          ref = location_;
+        }
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          if (locationCase_ == 1) {
+            location_ = s;
+          }
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string region = 1;</code>
+       * @return The bytes for region.
+       */
+      @java.lang.Override
+      public com.google.protobuf.ByteString
+          getRegionBytes() {
+        java.lang.Object ref = "";
+        if (locationCase_ == 1) {
+          ref = location_;
+        }
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          if (locationCase_ == 1) {
+            location_ = b;
+          }
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string region = 1;</code>
+       * @param value The region to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRegion(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  locationCase_ = 1;
+        location_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string region = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearRegion() {
+        if (locationCase_ == 1) {
+          locationCase_ = 0;
+          location_ = null;
+          onChanged();
+        }
+        return this;
+      }
+      /**
+       * <code>string region = 1;</code>
+       * @param value The bytes for region to set.
+       * @return This builder for chaining.
+       */
+      public Builder setRegionBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        locationCase_ = 1;
+        location_ = value;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.GPS_Position, context.ContextOuterClass.GPS_Position.Builder, context.ContextOuterClass.GPS_PositionOrBuilder> gpsPositionBuilder_;
+      /**
+       * <code>.context.GPS_Position gps_position = 2;</code>
+       * @return Whether the gpsPosition field is set.
+       */
+      @java.lang.Override
+      public boolean hasGpsPosition() {
+        return locationCase_ == 2;
+      }
+      /**
+       * <code>.context.GPS_Position gps_position = 2;</code>
+       * @return The gpsPosition.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.GPS_Position getGpsPosition() {
+        if (gpsPositionBuilder_ == null) {
+          if (locationCase_ == 2) {
+            return (context.ContextOuterClass.GPS_Position) location_;
+          }
+          return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+        } else {
+          if (locationCase_ == 2) {
+            return gpsPositionBuilder_.getMessage();
+          }
+          return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.context.GPS_Position gps_position = 2;</code>
+       */
+      public Builder setGpsPosition(context.ContextOuterClass.GPS_Position value) {
+        if (gpsPositionBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          location_ = value;
+          onChanged();
+        } else {
+          gpsPositionBuilder_.setMessage(value);
         }
+        locationCase_ = 2;
         return this;
       }
-
-      private float startTimestamp_ ;
       /**
-       * <code>float start_timestamp = 1;</code>
-       * @return The startTimestamp.
+       * <code>.context.GPS_Position gps_position = 2;</code>
        */
-      @java.lang.Override
-      public float getStartTimestamp() {
-        return startTimestamp_;
+      public Builder setGpsPosition(
+          context.ContextOuterClass.GPS_Position.Builder builderForValue) {
+        if (gpsPositionBuilder_ == null) {
+          location_ = builderForValue.build();
+          onChanged();
+        } else {
+          gpsPositionBuilder_.setMessage(builderForValue.build());
+        }
+        locationCase_ = 2;
+        return this;
       }
       /**
-       * <code>float start_timestamp = 1;</code>
-       * @param value The startTimestamp to set.
-       * @return This builder for chaining.
+       * <code>.context.GPS_Position gps_position = 2;</code>
        */
-      public Builder setStartTimestamp(float value) {
-        
-        startTimestamp_ = value;
-        onChanged();
+      public Builder mergeGpsPosition(context.ContextOuterClass.GPS_Position value) {
+        if (gpsPositionBuilder_ == null) {
+          if (locationCase_ == 2 &&
+              location_ != context.ContextOuterClass.GPS_Position.getDefaultInstance()) {
+            location_ = context.ContextOuterClass.GPS_Position.newBuilder((context.ContextOuterClass.GPS_Position) location_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            location_ = value;
+          }
+          onChanged();
+        } else {
+          if (locationCase_ == 2) {
+            gpsPositionBuilder_.mergeFrom(value);
+          }
+          gpsPositionBuilder_.setMessage(value);
+        }
+        locationCase_ = 2;
         return this;
       }
       /**
-       * <code>float start_timestamp = 1;</code>
-       * @return This builder for chaining.
+       * <code>.context.GPS_Position gps_position = 2;</code>
        */
-      public Builder clearStartTimestamp() {
-        
-        startTimestamp_ = 0F;
-        onChanged();
+      public Builder clearGpsPosition() {
+        if (gpsPositionBuilder_ == null) {
+          if (locationCase_ == 2) {
+            locationCase_ = 0;
+            location_ = null;
+            onChanged();
+          }
+        } else {
+          if (locationCase_ == 2) {
+            locationCase_ = 0;
+            location_ = null;
+          }
+          gpsPositionBuilder_.clear();
+        }
         return this;
       }
-
-      private float durationDays_ ;
       /**
-       * <code>float duration_days = 2;</code>
-       * @return The durationDays.
+       * <code>.context.GPS_Position gps_position = 2;</code>
        */
-      @java.lang.Override
-      public float getDurationDays() {
-        return durationDays_;
+      public context.ContextOuterClass.GPS_Position.Builder getGpsPositionBuilder() {
+        return getGpsPositionFieldBuilder().getBuilder();
       }
       /**
-       * <code>float duration_days = 2;</code>
-       * @param value The durationDays to set.
-       * @return This builder for chaining.
+       * <code>.context.GPS_Position gps_position = 2;</code>
        */
-      public Builder setDurationDays(float value) {
-        
-        durationDays_ = value;
-        onChanged();
-        return this;
+      @java.lang.Override
+      public context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder() {
+        if ((locationCase_ == 2) && (gpsPositionBuilder_ != null)) {
+          return gpsPositionBuilder_.getMessageOrBuilder();
+        } else {
+          if (locationCase_ == 2) {
+            return (context.ContextOuterClass.GPS_Position) location_;
+          }
+          return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+        }
       }
       /**
-       * <code>float duration_days = 2;</code>
-       * @return This builder for chaining.
+       * <code>.context.GPS_Position gps_position = 2;</code>
        */
-      public Builder clearDurationDays() {
-        
-        durationDays_ = 0F;
-        onChanged();
-        return this;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.GPS_Position, context.ContextOuterClass.GPS_Position.Builder, context.ContextOuterClass.GPS_PositionOrBuilder> 
+          getGpsPositionFieldBuilder() {
+        if (gpsPositionBuilder_ == null) {
+          if (!(locationCase_ == 2)) {
+            location_ = context.ContextOuterClass.GPS_Position.getDefaultInstance();
+          }
+          gpsPositionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.GPS_Position, context.ContextOuterClass.GPS_Position.Builder, context.ContextOuterClass.GPS_PositionOrBuilder>(
+                  (context.ContextOuterClass.GPS_Position) location_,
+                  getParentForChildren(),
+                  isClean());
+          location_ = null;
+        }
+        locationCase_ = 2;
+        onChanged();;
+        return gpsPositionBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -59383,82 +63898,100 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_Schedule)
+      // @@protoc_insertion_point(builder_scope:context.Location)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_Schedule)
-    private static final context.ContextOuterClass.Constraint_Schedule DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Location)
+    private static final context.ContextOuterClass.Location DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_Schedule();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Location();
     }
 
-    public static context.ContextOuterClass.Constraint_Schedule getDefaultInstance() {
+    public static context.ContextOuterClass.Location getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_Schedule>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_Schedule>() {
+    private static final com.google.protobuf.Parser<Location>
+        PARSER = new com.google.protobuf.AbstractParser<Location>() {
       @java.lang.Override
-      public Constraint_Schedule parsePartialFrom(
+      public Location parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_Schedule(input, extensionRegistry);
+        return new Location(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_Schedule> parser() {
+    public static com.google.protobuf.Parser<Location> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_Schedule> getParserForType() {
+    public com.google.protobuf.Parser<Location> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_Schedule getDefaultInstanceForType() {
+    public context.ContextOuterClass.Location getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface GPS_PositionOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.GPS_Position)
+  public interface Constraint_EndPointLocationOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>float latitude = 1;</code>
-     * @return The latitude.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
-    float getLatitude();
+    boolean hasEndpointId();
+    /**
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
+     */
+    context.ContextOuterClass.EndPointId getEndpointId();
+    /**
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     */
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
 
     /**
-     * <code>float longitude = 2;</code>
-     * @return The longitude.
+     * <code>.context.Location location = 2;</code>
+     * @return Whether the location field is set.
      */
-    float getLongitude();
+    boolean hasLocation();
+    /**
+     * <code>.context.Location location = 2;</code>
+     * @return The location.
+     */
+    context.ContextOuterClass.Location getLocation();
+    /**
+     * <code>.context.Location location = 2;</code>
+     */
+    context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder();
   }
   /**
-   * Protobuf type {@code context.GPS_Position}
+   * Protobuf type {@code context.Constraint_EndPointLocation}
    */
-  public static final class GPS_Position extends
+  public static final class Constraint_EndPointLocation extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.GPS_Position)
-      GPS_PositionOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
+      Constraint_EndPointLocationOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use GPS_Position.newBuilder() to construct.
-    private GPS_Position(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_EndPointLocation.newBuilder() to construct.
+    private Constraint_EndPointLocation(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private GPS_Position() {
+    private Constraint_EndPointLocation() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new GPS_Position();
+      return new Constraint_EndPointLocation();
     }
 
     @java.lang.Override
@@ -59466,7 +63999,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private GPS_Position(
+    private Constraint_EndPointLocation(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -59484,14 +64017,30 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 13: {
+            case 10: {
+              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+              if (endpointId_ != null) {
+                subBuilder = endpointId_.toBuilder();
+              }
+              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(endpointId_);
+                endpointId_ = subBuilder.buildPartial();
+              }
 
-              latitude_ = input.readFloat();
               break;
             }
-            case 21: {
+            case 18: {
+              context.ContextOuterClass.Location.Builder subBuilder = null;
+              if (location_ != null) {
+                subBuilder = location_.toBuilder();
+              }
+              location_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(location_);
+                location_ = subBuilder.buildPartial();
+              }
 
-              longitude_ = input.readFloat();
               break;
             }
             default: {
@@ -59515,37 +64064,67 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_GPS_Position_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.GPS_Position.class, context.ContextOuterClass.GPS_Position.Builder.class);
+              context.ContextOuterClass.Constraint_EndPointLocation.class, context.ContextOuterClass.Constraint_EndPointLocation.Builder.class);
     }
 
-    public static final int LATITUDE_FIELD_NUMBER = 1;
-    private float latitude_;
+    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.EndPointId endpointId_;
     /**
-     * <code>float latitude = 1;</code>
-     * @return The latitude.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
     @java.lang.Override
-    public float getLatitude() {
-      return latitude_;
+    public boolean hasEndpointId() {
+      return endpointId_ != null;
+    }
+    /**
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointId getEndpointId() {
+      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+    }
+    /**
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+      return getEndpointId();
     }
 
-    public static final int LONGITUDE_FIELD_NUMBER = 2;
-    private float longitude_;
+    public static final int LOCATION_FIELD_NUMBER = 2;
+    private context.ContextOuterClass.Location location_;
     /**
-     * <code>float longitude = 2;</code>
-     * @return The longitude.
+     * <code>.context.Location location = 2;</code>
+     * @return Whether the location field is set.
      */
     @java.lang.Override
-    public float getLongitude() {
-      return longitude_;
+    public boolean hasLocation() {
+      return location_ != null;
+    }
+    /**
+     * <code>.context.Location location = 2;</code>
+     * @return The location.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Location getLocation() {
+      return location_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : location_;
+    }
+    /**
+     * <code>.context.Location location = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder() {
+      return getLocation();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -59562,11 +64141,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (latitude_ != 0F) {
-        output.writeFloat(1, latitude_);
+      if (endpointId_ != null) {
+        output.writeMessage(1, getEndpointId());
       }
-      if (longitude_ != 0F) {
-        output.writeFloat(2, longitude_);
+      if (location_ != null) {
+        output.writeMessage(2, getLocation());
       }
       unknownFields.writeTo(output);
     }
@@ -59577,13 +64156,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (latitude_ != 0F) {
+      if (endpointId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(1, latitude_);
+          .computeMessageSize(1, getEndpointId());
       }
-      if (longitude_ != 0F) {
+      if (location_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(2, longitude_);
+          .computeMessageSize(2, getLocation());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -59595,17 +64174,21 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.GPS_Position)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_EndPointLocation)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.GPS_Position other = (context.ContextOuterClass.GPS_Position) obj;
+      context.ContextOuterClass.Constraint_EndPointLocation other = (context.ContextOuterClass.Constraint_EndPointLocation) obj;
 
-      if (java.lang.Float.floatToIntBits(getLatitude())
-          != java.lang.Float.floatToIntBits(
-              other.getLatitude())) return false;
-      if (java.lang.Float.floatToIntBits(getLongitude())
-          != java.lang.Float.floatToIntBits(
-              other.getLongitude())) return false;
+      if (hasEndpointId() != other.hasEndpointId()) return false;
+      if (hasEndpointId()) {
+        if (!getEndpointId()
+            .equals(other.getEndpointId())) return false;
+      }
+      if (hasLocation() != other.hasLocation()) return false;
+      if (hasLocation()) {
+        if (!getLocation()
+            .equals(other.getLocation())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -59617,80 +64200,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + LATITUDE_FIELD_NUMBER;
-      hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getLatitude());
-      hash = (37 * hash) + LONGITUDE_FIELD_NUMBER;
-      hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getLongitude());
+      if (hasEndpointId()) {
+        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointId().hashCode();
+      }
+      if (hasLocation()) {
+        hash = (37 * hash) + LOCATION_FIELD_NUMBER;
+        hash = (53 * hash) + getLocation().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.GPS_Position parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.GPS_Position parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.GPS_Position parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -59703,7 +64288,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.GPS_Position prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_EndPointLocation prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -59719,26 +64304,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.GPS_Position}
+     * Protobuf type {@code context.Constraint_EndPointLocation}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.GPS_Position)
-        context.ContextOuterClass.GPS_PositionOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
+        context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_GPS_Position_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.GPS_Position.class, context.ContextOuterClass.GPS_Position.Builder.class);
+                context.ContextOuterClass.Constraint_EndPointLocation.class, context.ContextOuterClass.Constraint_EndPointLocation.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.GPS_Position.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_EndPointLocation.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -59756,27 +64341,35 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        latitude_ = 0F;
-
-        longitude_ = 0F;
-
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
+        } else {
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
+        }
+        if (locationBuilder_ == null) {
+          location_ = null;
+        } else {
+          location_ = null;
+          locationBuilder_ = null;
+        }
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_GPS_Position_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.GPS_Position getDefaultInstanceForType() {
-        return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_EndPointLocation getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.GPS_Position build() {
-        context.ContextOuterClass.GPS_Position result = buildPartial();
+      public context.ContextOuterClass.Constraint_EndPointLocation build() {
+        context.ContextOuterClass.Constraint_EndPointLocation result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -59784,10 +64377,18 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.GPS_Position buildPartial() {
-        context.ContextOuterClass.GPS_Position result = new context.ContextOuterClass.GPS_Position(this);
-        result.latitude_ = latitude_;
-        result.longitude_ = longitude_;
+      public context.ContextOuterClass.Constraint_EndPointLocation buildPartial() {
+        context.ContextOuterClass.Constraint_EndPointLocation result = new context.ContextOuterClass.Constraint_EndPointLocation(this);
+        if (endpointIdBuilder_ == null) {
+          result.endpointId_ = endpointId_;
+        } else {
+          result.endpointId_ = endpointIdBuilder_.build();
+        }
+        if (locationBuilder_ == null) {
+          result.location_ = location_;
+        } else {
+          result.location_ = locationBuilder_.build();
+        }
         onBuilt();
         return result;
       }
@@ -59826,111 +64427,287 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.GPS_Position) {
-          return mergeFrom((context.ContextOuterClass.GPS_Position)other);
+        if (other instanceof context.ContextOuterClass.Constraint_EndPointLocation) {
+          return mergeFrom((context.ContextOuterClass.Constraint_EndPointLocation)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
-      }
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_EndPointLocation other) {
+        if (other == context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance()) return this;
+        if (other.hasEndpointId()) {
+          mergeEndpointId(other.getEndpointId());
+        }
+        if (other.hasLocation()) {
+          mergeLocation(other.getLocation());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.Constraint_EndPointLocation parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.Constraint_EndPointLocation) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private context.ContextOuterClass.EndPointId endpointId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return Whether the endpointId field is set.
+       */
+      public boolean hasEndpointId() {
+        return endpointIdBuilder_ != null || endpointId_ != null;
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return The endpointId.
+       */
+      public context.ContextOuterClass.EndPointId getEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        } else {
+          return endpointIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       */
+      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          endpointId_ = value;
+          onChanged();
+        } else {
+          endpointIdBuilder_.setMessage(value);
+        }
 
-      public Builder mergeFrom(context.ContextOuterClass.GPS_Position other) {
-        if (other == context.ContextOuterClass.GPS_Position.getDefaultInstance()) return this;
-        if (other.getLatitude() != 0F) {
-          setLatitude(other.getLatitude());
-        }
-        if (other.getLongitude() != 0F) {
-          setLongitude(other.getLongitude());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
         return this;
       }
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       */
+      public Builder setEndpointId(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = builderForValue.build();
+          onChanged();
+        } else {
+          endpointIdBuilder_.setMessage(builderForValue.build());
+        }
 
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
+        return this;
       }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.GPS_Position parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.GPS_Position) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       */
+      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (endpointId_ != null) {
+            endpointId_ =
+              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
+          } else {
+            endpointId_ = value;
           }
+          onChanged();
+        } else {
+          endpointIdBuilder_.mergeFrom(value);
         }
+
         return this;
       }
-
-      private float latitude_ ;
       /**
-       * <code>float latitude = 1;</code>
-       * @return The latitude.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      @java.lang.Override
-      public float getLatitude() {
-        return latitude_;
+      public Builder clearEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
+          onChanged();
+        } else {
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
+        }
+
+        return this;
       }
       /**
-       * <code>float latitude = 1;</code>
-       * @param value The latitude to set.
-       * @return This builder for chaining.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setLatitude(float value) {
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
         
-        latitude_ = value;
         onChanged();
-        return this;
+        return getEndpointIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>float latitude = 1;</code>
-       * @return This builder for chaining.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder clearLatitude() {
-        
-        latitude_ = 0F;
-        onChanged();
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+        if (endpointIdBuilder_ != null) {
+          return endpointIdBuilder_.getMessageOrBuilder();
+        } else {
+          return endpointId_ == null ?
+              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
+        }
+      }
+      /**
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdFieldBuilder() {
+        if (endpointIdBuilder_ == null) {
+          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  getEndpointId(),
+                  getParentForChildren(),
+                  isClean());
+          endpointId_ = null;
+        }
+        return endpointIdBuilder_;
+      }
+
+      private context.ContextOuterClass.Location location_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> locationBuilder_;
+      /**
+       * <code>.context.Location location = 2;</code>
+       * @return Whether the location field is set.
+       */
+      public boolean hasLocation() {
+        return locationBuilder_ != null || location_ != null;
+      }
+      /**
+       * <code>.context.Location location = 2;</code>
+       * @return The location.
+       */
+      public context.ContextOuterClass.Location getLocation() {
+        if (locationBuilder_ == null) {
+          return location_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : location_;
+        } else {
+          return locationBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.Location location = 2;</code>
+       */
+      public Builder setLocation(context.ContextOuterClass.Location value) {
+        if (locationBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          location_ = value;
+          onChanged();
+        } else {
+          locationBuilder_.setMessage(value);
+        }
+
         return this;
       }
+      /**
+       * <code>.context.Location location = 2;</code>
+       */
+      public Builder setLocation(
+          context.ContextOuterClass.Location.Builder builderForValue) {
+        if (locationBuilder_ == null) {
+          location_ = builderForValue.build();
+          onChanged();
+        } else {
+          locationBuilder_.setMessage(builderForValue.build());
+        }
 
-      private float longitude_ ;
+        return this;
+      }
       /**
-       * <code>float longitude = 2;</code>
-       * @return The longitude.
+       * <code>.context.Location location = 2;</code>
        */
-      @java.lang.Override
-      public float getLongitude() {
-        return longitude_;
+      public Builder mergeLocation(context.ContextOuterClass.Location value) {
+        if (locationBuilder_ == null) {
+          if (location_ != null) {
+            location_ =
+              context.ContextOuterClass.Location.newBuilder(location_).mergeFrom(value).buildPartial();
+          } else {
+            location_ = value;
+          }
+          onChanged();
+        } else {
+          locationBuilder_.mergeFrom(value);
+        }
+
+        return this;
       }
       /**
-       * <code>float longitude = 2;</code>
-       * @param value The longitude to set.
-       * @return This builder for chaining.
+       * <code>.context.Location location = 2;</code>
        */
-      public Builder setLongitude(float value) {
-        
-        longitude_ = value;
-        onChanged();
+      public Builder clearLocation() {
+        if (locationBuilder_ == null) {
+          location_ = null;
+          onChanged();
+        } else {
+          location_ = null;
+          locationBuilder_ = null;
+        }
+
         return this;
       }
       /**
-       * <code>float longitude = 2;</code>
-       * @return This builder for chaining.
+       * <code>.context.Location location = 2;</code>
        */
-      public Builder clearLongitude() {
+      public context.ContextOuterClass.Location.Builder getLocationBuilder() {
         
-        longitude_ = 0F;
         onChanged();
-        return this;
+        return getLocationFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Location location = 2;</code>
+       */
+      public context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder() {
+        if (locationBuilder_ != null) {
+          return locationBuilder_.getMessageOrBuilder();
+        } else {
+          return location_ == null ?
+              context.ContextOuterClass.Location.getDefaultInstance() : location_;
+        }
+      }
+      /**
+       * <code>.context.Location location = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> 
+          getLocationFieldBuilder() {
+        if (locationBuilder_ == null) {
+          locationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder>(
+                  getLocation(),
+                  getParentForChildren(),
+                  isClean());
+          location_ = null;
+        }
+        return locationBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -59945,104 +64722,91 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.GPS_Position)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_EndPointLocation)
     }
 
-    // @@protoc_insertion_point(class_scope:context.GPS_Position)
-    private static final context.ContextOuterClass.GPS_Position DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_EndPointLocation)
+    private static final context.ContextOuterClass.Constraint_EndPointLocation DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.GPS_Position();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_EndPointLocation();
     }
 
-    public static context.ContextOuterClass.GPS_Position getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_EndPointLocation getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<GPS_Position>
-        PARSER = new com.google.protobuf.AbstractParser<GPS_Position>() {
+    private static final com.google.protobuf.Parser<Constraint_EndPointLocation>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_EndPointLocation>() {
       @java.lang.Override
-      public GPS_Position parsePartialFrom(
+      public Constraint_EndPointLocation parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new GPS_Position(input, extensionRegistry);
+        return new Constraint_EndPointLocation(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<GPS_Position> parser() {
+    public static com.google.protobuf.Parser<Constraint_EndPointLocation> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<GPS_Position> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_EndPointLocation> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.GPS_Position getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_EndPointLocation getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface LocationOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Location)
+  public interface Constraint_EndPointPriorityOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>string region = 1;</code>
-     * @return Whether the region field is set.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
-    boolean hasRegion();
+    boolean hasEndpointId();
     /**
-     * <code>string region = 1;</code>
-     * @return The region.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
-    java.lang.String getRegion();
+    context.ContextOuterClass.EndPointId getEndpointId();
     /**
-     * <code>string region = 1;</code>
-     * @return The bytes for region.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
-    com.google.protobuf.ByteString
-        getRegionBytes();
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
 
     /**
-     * <code>.context.GPS_Position gps_position = 2;</code>
-     * @return Whether the gpsPosition field is set.
-     */
-    boolean hasGpsPosition();
-    /**
-     * <code>.context.GPS_Position gps_position = 2;</code>
-     * @return The gpsPosition.
-     */
-    context.ContextOuterClass.GPS_Position getGpsPosition();
-    /**
-     * <code>.context.GPS_Position gps_position = 2;</code>
+     * <code>uint32 priority = 2;</code>
+     * @return The priority.
      */
-    context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder();
-
-    public context.ContextOuterClass.Location.LocationCase getLocationCase();
+    int getPriority();
   }
   /**
-   * Protobuf type {@code context.Location}
+   * Protobuf type {@code context.Constraint_EndPointPriority}
    */
-  public static final class Location extends
+  public static final class Constraint_EndPointPriority extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Location)
-      LocationOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
+      Constraint_EndPointPriorityOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Location.newBuilder() to construct.
-    private Location(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_EndPointPriority.newBuilder() to construct.
+    private Constraint_EndPointPriority(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Location() {
+    private Constraint_EndPointPriority() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Location();
+      return new Constraint_EndPointPriority();
     }
 
     @java.lang.Override
@@ -60050,7 +64814,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Location(
+    private Constraint_EndPointPriority(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -60069,23 +64833,21 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              java.lang.String s = input.readStringRequireUtf8();
-              locationCase_ = 1;
-              location_ = s;
-              break;
-            }
-            case 18: {
-              context.ContextOuterClass.GPS_Position.Builder subBuilder = null;
-              if (locationCase_ == 2) {
-                subBuilder = ((context.ContextOuterClass.GPS_Position) location_).toBuilder();
+              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
+              if (endpointId_ != null) {
+                subBuilder = endpointId_.toBuilder();
               }
-              location_ =
-                  input.readMessage(context.ContextOuterClass.GPS_Position.parser(), extensionRegistry);
+              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom((context.ContextOuterClass.GPS_Position) location_);
-                location_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(endpointId_);
+                endpointId_ = subBuilder.buildPartial();
               }
-              locationCase_ = 2;
+
+              break;
+            }
+            case 16: {
+
+              priority_ = input.readUInt32();
               break;
             }
             default: {
@@ -60109,139 +64871,52 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Location_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Location_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Location.class, context.ContextOuterClass.Location.Builder.class);
-    }
-
-    private int locationCase_ = 0;
-    private java.lang.Object location_;
-    public enum LocationCase
-        implements com.google.protobuf.Internal.EnumLite,
-            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
-      REGION(1),
-      GPS_POSITION(2),
-      LOCATION_NOT_SET(0);
-      private final int value;
-      private LocationCase(int value) {
-        this.value = value;
-      }
-      /**
-       * @param value The number of the enum to look for.
-       * @return The enum associated with the given number.
-       * @deprecated Use {@link #forNumber(int)} instead.
-       */
-      @java.lang.Deprecated
-      public static LocationCase valueOf(int value) {
-        return forNumber(value);
-      }
-
-      public static LocationCase forNumber(int value) {
-        switch (value) {
-          case 1: return REGION;
-          case 2: return GPS_POSITION;
-          case 0: return LOCATION_NOT_SET;
-          default: return null;
-        }
-      }
-      public int getNumber() {
-        return this.value;
-      }
-    };
-
-    public LocationCase
-    getLocationCase() {
-      return LocationCase.forNumber(
-          locationCase_);
+              context.ContextOuterClass.Constraint_EndPointPriority.class, context.ContextOuterClass.Constraint_EndPointPriority.Builder.class);
     }
 
-    public static final int REGION_FIELD_NUMBER = 1;
-    /**
-     * <code>string region = 1;</code>
-     * @return Whether the region field is set.
-     */
-    public boolean hasRegion() {
-      return locationCase_ == 1;
-    }
-    /**
-     * <code>string region = 1;</code>
-     * @return The region.
-     */
-    public java.lang.String getRegion() {
-      java.lang.Object ref = "";
-      if (locationCase_ == 1) {
-        ref = location_;
-      }
-      if (ref instanceof java.lang.String) {
-        return (java.lang.String) ref;
-      } else {
-        com.google.protobuf.ByteString bs = 
-            (com.google.protobuf.ByteString) ref;
-        java.lang.String s = bs.toStringUtf8();
-        if (locationCase_ == 1) {
-          location_ = s;
-        }
-        return s;
-      }
-    }
+    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.EndPointId endpointId_;
     /**
-     * <code>string region = 1;</code>
-     * @return The bytes for region.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return Whether the endpointId field is set.
      */
-    public com.google.protobuf.ByteString
-        getRegionBytes() {
-      java.lang.Object ref = "";
-      if (locationCase_ == 1) {
-        ref = location_;
-      }
-      if (ref instanceof java.lang.String) {
-        com.google.protobuf.ByteString b = 
-            com.google.protobuf.ByteString.copyFromUtf8(
-                (java.lang.String) ref);
-        if (locationCase_ == 1) {
-          location_ = b;
-        }
-        return b;
-      } else {
-        return (com.google.protobuf.ByteString) ref;
-      }
+    @java.lang.Override
+    public boolean hasEndpointId() {
+      return endpointId_ != null;
     }
-
-    public static final int GPS_POSITION_FIELD_NUMBER = 2;
     /**
-     * <code>.context.GPS_Position gps_position = 2;</code>
-     * @return Whether the gpsPosition field is set.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
+     * @return The endpointId.
      */
     @java.lang.Override
-    public boolean hasGpsPosition() {
-      return locationCase_ == 2;
+    public context.ContextOuterClass.EndPointId getEndpointId() {
+      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
     }
     /**
-     * <code>.context.GPS_Position gps_position = 2;</code>
-     * @return The gpsPosition.
+     * <code>.context.EndPointId endpoint_id = 1;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.GPS_Position getGpsPosition() {
-      if (locationCase_ == 2) {
-         return (context.ContextOuterClass.GPS_Position) location_;
-      }
-      return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+      return getEndpointId();
     }
+
+    public static final int PRIORITY_FIELD_NUMBER = 2;
+    private int priority_;
     /**
-     * <code>.context.GPS_Position gps_position = 2;</code>
+     * <code>uint32 priority = 2;</code>
+     * @return The priority.
      */
     @java.lang.Override
-    public context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder() {
-      if (locationCase_ == 2) {
-         return (context.ContextOuterClass.GPS_Position) location_;
-      }
-      return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+    public int getPriority() {
+      return priority_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -60258,11 +64933,11 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (locationCase_ == 1) {
-        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, location_);
+      if (endpointId_ != null) {
+        output.writeMessage(1, getEndpointId());
       }
-      if (locationCase_ == 2) {
-        output.writeMessage(2, (context.ContextOuterClass.GPS_Position) location_);
+      if (priority_ != 0) {
+        output.writeUInt32(2, priority_);
       }
       unknownFields.writeTo(output);
     }
@@ -60273,12 +64948,13 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (locationCase_ == 1) {
-        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, location_);
+      if (endpointId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getEndpointId());
       }
-      if (locationCase_ == 2) {
+      if (priority_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, (context.ContextOuterClass.GPS_Position) location_);
+          .computeUInt32Size(2, priority_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -60290,24 +64966,18 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Location)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_EndPointPriority)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Location other = (context.ContextOuterClass.Location) obj;
-
-      if (!getLocationCase().equals(other.getLocationCase())) return false;
-      switch (locationCase_) {
-        case 1:
-          if (!getRegion()
-              .equals(other.getRegion())) return false;
-          break;
-        case 2:
-          if (!getGpsPosition()
-              .equals(other.getGpsPosition())) return false;
-          break;
-        case 0:
-        default:
+      context.ContextOuterClass.Constraint_EndPointPriority other = (context.ContextOuterClass.Constraint_EndPointPriority) obj;
+
+      if (hasEndpointId() != other.hasEndpointId()) return false;
+      if (hasEndpointId()) {
+        if (!getEndpointId()
+            .equals(other.getEndpointId())) return false;
       }
+      if (getPriority()
+          != other.getPriority()) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -60319,86 +64989,80 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      switch (locationCase_) {
-        case 1:
-          hash = (37 * hash) + REGION_FIELD_NUMBER;
-          hash = (53 * hash) + getRegion().hashCode();
-          break;
-        case 2:
-          hash = (37 * hash) + GPS_POSITION_FIELD_NUMBER;
-          hash = (53 * hash) + getGpsPosition().hashCode();
-          break;
-        case 0:
-        default:
+      if (hasEndpointId()) {
+        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointId().hashCode();
       }
+      hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
+      hash = (53 * hash) + getPriority();
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Location parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Location parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Location parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Location parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Location parseFrom(
+    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -60411,7 +65075,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Location prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_EndPointPriority prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -60427,26 +65091,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Location}
+     * Protobuf type {@code context.Constraint_EndPointPriority}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Location)
-        context.ContextOuterClass.LocationOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
+        context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Location_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Location_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Location.class, context.ContextOuterClass.Location.Builder.class);
+                context.ContextOuterClass.Constraint_EndPointPriority.class, context.ContextOuterClass.Constraint_EndPointPriority.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Location.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_EndPointPriority.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -60464,25 +65128,31 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        locationCase_ = 0;
-        location_ = null;
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
+        } else {
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
+        }
+        priority_ = 0;
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Location_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Location getDefaultInstanceForType() {
-        return context.ContextOuterClass.Location.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_EndPointPriority getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Location build() {
-        context.ContextOuterClass.Location result = buildPartial();
+      public context.ContextOuterClass.Constraint_EndPointPriority build() {
+        context.ContextOuterClass.Constraint_EndPointPriority result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -60490,19 +65160,14 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Location buildPartial() {
-        context.ContextOuterClass.Location result = new context.ContextOuterClass.Location(this);
-        if (locationCase_ == 1) {
-          result.location_ = location_;
-        }
-        if (locationCase_ == 2) {
-          if (gpsPositionBuilder_ == null) {
-            result.location_ = location_;
-          } else {
-            result.location_ = gpsPositionBuilder_.build();
-          }
+      public context.ContextOuterClass.Constraint_EndPointPriority buildPartial() {
+        context.ContextOuterClass.Constraint_EndPointPriority result = new context.ContextOuterClass.Constraint_EndPointPriority(this);
+        if (endpointIdBuilder_ == null) {
+          result.endpointId_ = endpointId_;
+        } else {
+          result.endpointId_ = endpointIdBuilder_.build();
         }
-        result.locationCase_ = locationCase_;
+        result.priority_ = priority_;
         onBuilt();
         return result;
       }
@@ -60541,30 +65206,21 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Location) {
-          return mergeFrom((context.ContextOuterClass.Location)other);
+        if (other instanceof context.ContextOuterClass.Constraint_EndPointPriority) {
+          return mergeFrom((context.ContextOuterClass.Constraint_EndPointPriority)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Location other) {
-        if (other == context.ContextOuterClass.Location.getDefaultInstance()) return this;
-        switch (other.getLocationCase()) {
-          case REGION: {
-            locationCase_ = 1;
-            location_ = other.location_;
-            onChanged();
-            break;
-          }
-          case GPS_POSITION: {
-            mergeGpsPosition(other.getGpsPosition());
-            break;
-          }
-          case LOCATION_NOT_SET: {
-            break;
-          }
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_EndPointPriority other) {
+        if (other == context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance()) return this;
+        if (other.hasEndpointId()) {
+          mergeEndpointId(other.getEndpointId());
+        }
+        if (other.getPriority() != 0) {
+          setPriority(other.getPriority());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -60581,11 +65237,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Location parsedMessage = null;
+        context.ContextOuterClass.Constraint_EndPointPriority parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Location) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Constraint_EndPointPriority) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -60594,258 +65250,155 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int locationCase_ = 0;
-      private java.lang.Object location_;
-      public LocationCase
-          getLocationCase() {
-        return LocationCase.forNumber(
-            locationCase_);
-      }
-
-      public Builder clearLocation() {
-        locationCase_ = 0;
-        location_ = null;
-        onChanged();
-        return this;
-      }
-
-
-      /**
-       * <code>string region = 1;</code>
-       * @return Whether the region field is set.
-       */
-      @java.lang.Override
-      public boolean hasRegion() {
-        return locationCase_ == 1;
-      }
-      /**
-       * <code>string region = 1;</code>
-       * @return The region.
-       */
-      @java.lang.Override
-      public java.lang.String getRegion() {
-        java.lang.Object ref = "";
-        if (locationCase_ == 1) {
-          ref = location_;
-        }
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          if (locationCase_ == 1) {
-            location_ = s;
-          }
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string region = 1;</code>
-       * @return The bytes for region.
-       */
-      @java.lang.Override
-      public com.google.protobuf.ByteString
-          getRegionBytes() {
-        java.lang.Object ref = "";
-        if (locationCase_ == 1) {
-          ref = location_;
-        }
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          if (locationCase_ == 1) {
-            location_ = b;
-          }
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>string region = 1;</code>
-       * @param value The region to set.
-       * @return This builder for chaining.
-       */
-      public Builder setRegion(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  locationCase_ = 1;
-        location_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string region = 1;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearRegion() {
-        if (locationCase_ == 1) {
-          locationCase_ = 0;
-          location_ = null;
-          onChanged();
-        }
-        return this;
-      }
-      /**
-       * <code>string region = 1;</code>
-       * @param value The bytes for region to set.
-       * @return This builder for chaining.
-       */
-      public Builder setRegionBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        locationCase_ = 1;
-        location_ = value;
-        onChanged();
-        return this;
-      }
 
+      private context.ContextOuterClass.EndPointId endpointId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.GPS_Position, context.ContextOuterClass.GPS_Position.Builder, context.ContextOuterClass.GPS_PositionOrBuilder> gpsPositionBuilder_;
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
-       * @return Whether the gpsPosition field is set.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return Whether the endpointId field is set.
        */
-      @java.lang.Override
-      public boolean hasGpsPosition() {
-        return locationCase_ == 2;
+      public boolean hasEndpointId() {
+        return endpointIdBuilder_ != null || endpointId_ != null;
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
-       * @return The gpsPosition.
+       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * @return The endpointId.
        */
-      @java.lang.Override
-      public context.ContextOuterClass.GPS_Position getGpsPosition() {
-        if (gpsPositionBuilder_ == null) {
-          if (locationCase_ == 2) {
-            return (context.ContextOuterClass.GPS_Position) location_;
-          }
-          return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+      public context.ContextOuterClass.EndPointId getEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         } else {
-          if (locationCase_ == 2) {
-            return gpsPositionBuilder_.getMessage();
-          }
-          return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+          return endpointIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setGpsPosition(context.ContextOuterClass.GPS_Position value) {
-        if (gpsPositionBuilder_ == null) {
+      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          location_ = value;
+          endpointId_ = value;
           onChanged();
         } else {
-          gpsPositionBuilder_.setMessage(value);
+          endpointIdBuilder_.setMessage(value);
         }
-        locationCase_ = 2;
+
         return this;
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder setGpsPosition(
-          context.ContextOuterClass.GPS_Position.Builder builderForValue) {
-        if (gpsPositionBuilder_ == null) {
-          location_ = builderForValue.build();
+      public Builder setEndpointId(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = builderForValue.build();
           onChanged();
         } else {
-          gpsPositionBuilder_.setMessage(builderForValue.build());
+          endpointIdBuilder_.setMessage(builderForValue.build());
         }
-        locationCase_ = 2;
+
         return this;
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder mergeGpsPosition(context.ContextOuterClass.GPS_Position value) {
-        if (gpsPositionBuilder_ == null) {
-          if (locationCase_ == 2 &&
-              location_ != context.ContextOuterClass.GPS_Position.getDefaultInstance()) {
-            location_ = context.ContextOuterClass.GPS_Position.newBuilder((context.ContextOuterClass.GPS_Position) location_)
-                .mergeFrom(value).buildPartial();
+      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdBuilder_ == null) {
+          if (endpointId_ != null) {
+            endpointId_ =
+              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
           } else {
-            location_ = value;
+            endpointId_ = value;
           }
           onChanged();
         } else {
-          if (locationCase_ == 2) {
-            gpsPositionBuilder_.mergeFrom(value);
-          }
-          gpsPositionBuilder_.setMessage(value);
+          endpointIdBuilder_.mergeFrom(value);
         }
-        locationCase_ = 2;
+
         return this;
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public Builder clearGpsPosition() {
-        if (gpsPositionBuilder_ == null) {
-          if (locationCase_ == 2) {
-            locationCase_ = 0;
-            location_ = null;
-            onChanged();
-          }
+      public Builder clearEndpointId() {
+        if (endpointIdBuilder_ == null) {
+          endpointId_ = null;
+          onChanged();
         } else {
-          if (locationCase_ == 2) {
-            locationCase_ = 0;
-            location_ = null;
-          }
-          gpsPositionBuilder_.clear();
+          endpointId_ = null;
+          endpointIdBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      public context.ContextOuterClass.GPS_Position.Builder getGpsPositionBuilder() {
-        return getGpsPositionFieldBuilder().getBuilder();
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+        
+        onChanged();
+        return getEndpointIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
-      @java.lang.Override
-      public context.ContextOuterClass.GPS_PositionOrBuilder getGpsPositionOrBuilder() {
-        if ((locationCase_ == 2) && (gpsPositionBuilder_ != null)) {
-          return gpsPositionBuilder_.getMessageOrBuilder();
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
+        if (endpointIdBuilder_ != null) {
+          return endpointIdBuilder_.getMessageOrBuilder();
         } else {
-          if (locationCase_ == 2) {
-            return (context.ContextOuterClass.GPS_Position) location_;
-          }
-          return context.ContextOuterClass.GPS_Position.getDefaultInstance();
+          return endpointId_ == null ?
+              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
         }
       }
       /**
-       * <code>.context.GPS_Position gps_position = 2;</code>
+       * <code>.context.EndPointId endpoint_id = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.GPS_Position, context.ContextOuterClass.GPS_Position.Builder, context.ContextOuterClass.GPS_PositionOrBuilder> 
-          getGpsPositionFieldBuilder() {
-        if (gpsPositionBuilder_ == null) {
-          if (!(locationCase_ == 2)) {
-            location_ = context.ContextOuterClass.GPS_Position.getDefaultInstance();
-          }
-          gpsPositionBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.GPS_Position, context.ContextOuterClass.GPS_Position.Builder, context.ContextOuterClass.GPS_PositionOrBuilder>(
-                  (context.ContextOuterClass.GPS_Position) location_,
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdFieldBuilder() {
+        if (endpointIdBuilder_ == null) {
+          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  getEndpointId(),
                   getParentForChildren(),
                   isClean());
-          location_ = null;
+          endpointId_ = null;
         }
-        locationCase_ = 2;
-        onChanged();;
-        return gpsPositionBuilder_;
+        return endpointIdBuilder_;
+      }
+
+      private int priority_ ;
+      /**
+       * <code>uint32 priority = 2;</code>
+       * @return The priority.
+       */
+      @java.lang.Override
+      public int getPriority() {
+        return priority_;
+      }
+      /**
+       * <code>uint32 priority = 2;</code>
+       * @param value The priority to set.
+       * @return This builder for chaining.
+       */
+      public Builder setPriority(int value) {
+        
+        priority_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>uint32 priority = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearPriority() {
+        
+        priority_ = 0;
+        onChanged();
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -60860,100 +65413,76 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Location)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_EndPointPriority)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Location)
-    private static final context.ContextOuterClass.Location DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_EndPointPriority)
+    private static final context.ContextOuterClass.Constraint_EndPointPriority DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Location();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_EndPointPriority();
     }
 
-    public static context.ContextOuterClass.Location getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_EndPointPriority getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Location>
-        PARSER = new com.google.protobuf.AbstractParser<Location>() {
+    private static final com.google.protobuf.Parser<Constraint_EndPointPriority>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_EndPointPriority>() {
       @java.lang.Override
-      public Location parsePartialFrom(
+      public Constraint_EndPointPriority parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Location(input, extensionRegistry);
+        return new Constraint_EndPointPriority(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Location> parser() {
+    public static com.google.protobuf.Parser<Constraint_EndPointPriority> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Location> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_EndPointPriority> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Location getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_EndPointPriority getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_EndPointLocationOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointLocation)
+  public interface Constraint_SLA_LatencyOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    boolean hasEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    context.ContextOuterClass.EndPointId getEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
-
-    /**
-     * <code>.context.Location location = 2;</code>
-     * @return Whether the location field is set.
-     */
-    boolean hasLocation();
-    /**
-     * <code>.context.Location location = 2;</code>
-     * @return The location.
-     */
-    context.ContextOuterClass.Location getLocation();
-    /**
-     * <code>.context.Location location = 2;</code>
+     * <code>float e2e_latency_ms = 1;</code>
+     * @return The e2eLatencyMs.
      */
-    context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder();
+    float getE2ELatencyMs();
   }
   /**
-   * Protobuf type {@code context.Constraint_EndPointLocation}
+   * Protobuf type {@code context.Constraint_SLA_Latency}
    */
-  public static final class Constraint_EndPointLocation extends
+  public static final class Constraint_SLA_Latency extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_EndPointLocation)
-      Constraint_EndPointLocationOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
+      Constraint_SLA_LatencyOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_EndPointLocation.newBuilder() to construct.
-    private Constraint_EndPointLocation(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_SLA_Latency.newBuilder() to construct.
+    private Constraint_SLA_Latency(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_EndPointLocation() {
+    private Constraint_SLA_Latency() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_EndPointLocation();
+      return new Constraint_SLA_Latency();
     }
 
     @java.lang.Override
@@ -60961,7 +65490,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_EndPointLocation(
+    private Constraint_SLA_Latency(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -60977,32 +65506,11 @@ public final class ContextOuterClass {
           int tag = input.readTag();
           switch (tag) {
             case 0:
-              done = true;
-              break;
-            case 10: {
-              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
-              if (endpointId_ != null) {
-                subBuilder = endpointId_.toBuilder();
-              }
-              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointId_);
-                endpointId_ = subBuilder.buildPartial();
-              }
-
+              done = true;
               break;
-            }
-            case 18: {
-              context.ContextOuterClass.Location.Builder subBuilder = null;
-              if (location_ != null) {
-                subBuilder = location_.toBuilder();
-              }
-              location_ = input.readMessage(context.ContextOuterClass.Location.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(location_);
-                location_ = subBuilder.buildPartial();
-              }
+            case 13: {
 
+              e2ELatencyMs_ = input.readFloat();
               break;
             }
             default: {
@@ -61026,67 +65534,26 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_EndPointLocation.class, context.ContextOuterClass.Constraint_EndPointLocation.Builder.class);
-    }
-
-    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.EndPointId endpointId_;
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    @java.lang.Override
-    public boolean hasEndpointId() {
-      return endpointId_ != null;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointId getEndpointId() {
-      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-      return getEndpointId();
+              context.ContextOuterClass.Constraint_SLA_Latency.class, context.ContextOuterClass.Constraint_SLA_Latency.Builder.class);
     }
 
-    public static final int LOCATION_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.Location location_;
-    /**
-     * <code>.context.Location location = 2;</code>
-     * @return Whether the location field is set.
-     */
-    @java.lang.Override
-    public boolean hasLocation() {
-      return location_ != null;
-    }
-    /**
-     * <code>.context.Location location = 2;</code>
-     * @return The location.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.Location getLocation() {
-      return location_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : location_;
-    }
+    public static final int E2E_LATENCY_MS_FIELD_NUMBER = 1;
+    private float e2ELatencyMs_;
     /**
-     * <code>.context.Location location = 2;</code>
+     * <code>float e2e_latency_ms = 1;</code>
+     * @return The e2eLatencyMs.
      */
     @java.lang.Override
-    public context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder() {
-      return getLocation();
+    public float getE2ELatencyMs() {
+      return e2ELatencyMs_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -61103,11 +65570,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (endpointId_ != null) {
-        output.writeMessage(1, getEndpointId());
-      }
-      if (location_ != null) {
-        output.writeMessage(2, getLocation());
+      if (e2ELatencyMs_ != 0F) {
+        output.writeFloat(1, e2ELatencyMs_);
       }
       unknownFields.writeTo(output);
     }
@@ -61118,13 +65582,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (endpointId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEndpointId());
-      }
-      if (location_ != null) {
+      if (e2ELatencyMs_ != 0F) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, getLocation());
+          .computeFloatSize(1, e2ELatencyMs_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -61136,21 +65596,14 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_EndPointLocation)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Latency)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_EndPointLocation other = (context.ContextOuterClass.Constraint_EndPointLocation) obj;
+      context.ContextOuterClass.Constraint_SLA_Latency other = (context.ContextOuterClass.Constraint_SLA_Latency) obj;
 
-      if (hasEndpointId() != other.hasEndpointId()) return false;
-      if (hasEndpointId()) {
-        if (!getEndpointId()
-            .equals(other.getEndpointId())) return false;
-      }
-      if (hasLocation() != other.hasLocation()) return false;
-      if (hasLocation()) {
-        if (!getLocation()
-            .equals(other.getLocation())) return false;
-      }
+      if (java.lang.Float.floatToIntBits(getE2ELatencyMs())
+          != java.lang.Float.floatToIntBits(
+              other.getE2ELatencyMs())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -61162,82 +65615,77 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEndpointId()) {
-        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointId().hashCode();
-      }
-      if (hasLocation()) {
-        hash = (37 * hash) + LOCATION_FIELD_NUMBER;
-        hash = (53 * hash) + getLocation().hashCode();
-      }
+      hash = (37 * hash) + E2E_LATENCY_MS_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getE2ELatencyMs());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_EndPointLocation parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -61250,7 +65698,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_EndPointLocation prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Latency prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -61266,26 +65714,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Constraint_EndPointLocation}
+     * Protobuf type {@code context.Constraint_SLA_Latency}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointLocation)
-        context.ContextOuterClass.Constraint_EndPointLocationOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
+        context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_EndPointLocation.class, context.ContextOuterClass.Constraint_EndPointLocation.Builder.class);
+                context.ContextOuterClass.Constraint_SLA_Latency.class, context.ContextOuterClass.Constraint_SLA_Latency.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_EndPointLocation.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_SLA_Latency.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -61303,35 +65751,25 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-        if (locationBuilder_ == null) {
-          location_ = null;
-        } else {
-          location_ = null;
-          locationBuilder_ = null;
-        }
+        e2ELatencyMs_ = 0F;
+
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_EndPointLocation_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_EndPointLocation getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_SLA_Latency getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_EndPointLocation build() {
-        context.ContextOuterClass.Constraint_EndPointLocation result = buildPartial();
+      public context.ContextOuterClass.Constraint_SLA_Latency build() {
+        context.ContextOuterClass.Constraint_SLA_Latency result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -61339,18 +65777,9 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_EndPointLocation buildPartial() {
-        context.ContextOuterClass.Constraint_EndPointLocation result = new context.ContextOuterClass.Constraint_EndPointLocation(this);
-        if (endpointIdBuilder_ == null) {
-          result.endpointId_ = endpointId_;
-        } else {
-          result.endpointId_ = endpointIdBuilder_.build();
-        }
-        if (locationBuilder_ == null) {
-          result.location_ = location_;
-        } else {
-          result.location_ = locationBuilder_.build();
-        }
+      public context.ContextOuterClass.Constraint_SLA_Latency buildPartial() {
+        context.ContextOuterClass.Constraint_SLA_Latency result = new context.ContextOuterClass.Constraint_SLA_Latency(this);
+        result.e2ELatencyMs_ = e2ELatencyMs_;
         onBuilt();
         return result;
       }
@@ -61389,21 +65818,18 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_EndPointLocation) {
-          return mergeFrom((context.ContextOuterClass.Constraint_EndPointLocation)other);
+        if (other instanceof context.ContextOuterClass.Constraint_SLA_Latency) {
+          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Latency)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_EndPointLocation other) {
-        if (other == context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance()) return this;
-        if (other.hasEndpointId()) {
-          mergeEndpointId(other.getEndpointId());
-        }
-        if (other.hasLocation()) {
-          mergeLocation(other.getLocation());
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Latency other) {
+        if (other == context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance()) return this;
+        if (other.getE2ELatencyMs() != 0F) {
+          setE2ELatencyMs(other.getE2ELatencyMs());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -61420,11 +65846,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Constraint_EndPointLocation parsedMessage = null;
+        context.ContextOuterClass.Constraint_SLA_Latency parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_EndPointLocation) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Latency) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -61434,242 +65860,35 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.EndPointId endpointId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return Whether the endpointId field is set.
-       */
-      public boolean hasEndpointId() {
-        return endpointIdBuilder_ != null || endpointId_ != null;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return The endpointId.
-       */
-      public context.ContextOuterClass.EndPointId getEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        } else {
-          return endpointIdBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          endpointId_ = value;
-          onChanged();
-        } else {
-          endpointIdBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder setEndpointId(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = builderForValue.build();
-          onChanged();
-        } else {
-          endpointIdBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (endpointId_ != null) {
-            endpointId_ =
-              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
-          } else {
-            endpointId_ = value;
-          }
-          onChanged();
-        } else {
-          endpointIdBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
+      private float e2ELatencyMs_ ;
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>float e2e_latency_ms = 1;</code>
+       * @return The e2eLatencyMs.
        */
-      public Builder clearEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-          onChanged();
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-
-        return this;
+      @java.lang.Override
+      public float getE2ELatencyMs() {
+        return e2ELatencyMs_;
       }
       /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
+       * <code>float e2e_latency_ms = 1;</code>
+       * @param value The e2eLatencyMs to set.
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
+      public Builder setE2ELatencyMs(float value) {
         
+        e2ELatencyMs_ = value;
         onChanged();
-        return getEndpointIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-        if (endpointIdBuilder_ != null) {
-          return endpointIdBuilder_.getMessageOrBuilder();
-        } else {
-          return endpointId_ == null ?
-              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getEndpointIdFieldBuilder() {
-        if (endpointIdBuilder_ == null) {
-          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  getEndpointId(),
-                  getParentForChildren(),
-                  isClean());
-          endpointId_ = null;
-        }
-        return endpointIdBuilder_;
-      }
-
-      private context.ContextOuterClass.Location location_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> locationBuilder_;
-      /**
-       * <code>.context.Location location = 2;</code>
-       * @return Whether the location field is set.
-       */
-      public boolean hasLocation() {
-        return locationBuilder_ != null || location_ != null;
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       * @return The location.
-       */
-      public context.ContextOuterClass.Location getLocation() {
-        if (locationBuilder_ == null) {
-          return location_ == null ? context.ContextOuterClass.Location.getDefaultInstance() : location_;
-        } else {
-          return locationBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       */
-      public Builder setLocation(context.ContextOuterClass.Location value) {
-        if (locationBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          location_ = value;
-          onChanged();
-        } else {
-          locationBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       */
-      public Builder setLocation(
-          context.ContextOuterClass.Location.Builder builderForValue) {
-        if (locationBuilder_ == null) {
-          location_ = builderForValue.build();
-          onChanged();
-        } else {
-          locationBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       */
-      public Builder mergeLocation(context.ContextOuterClass.Location value) {
-        if (locationBuilder_ == null) {
-          if (location_ != null) {
-            location_ =
-              context.ContextOuterClass.Location.newBuilder(location_).mergeFrom(value).buildPartial();
-          } else {
-            location_ = value;
-          }
-          onChanged();
-        } else {
-          locationBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       */
-      public Builder clearLocation() {
-        if (locationBuilder_ == null) {
-          location_ = null;
-          onChanged();
-        } else {
-          location_ = null;
-          locationBuilder_ = null;
-        }
-
         return this;
       }
       /**
-       * <code>.context.Location location = 2;</code>
+       * <code>float e2e_latency_ms = 1;</code>
+       * @return This builder for chaining.
        */
-      public context.ContextOuterClass.Location.Builder getLocationBuilder() {
+      public Builder clearE2ELatencyMs() {
         
+        e2ELatencyMs_ = 0F;
         onChanged();
-        return getLocationFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       */
-      public context.ContextOuterClass.LocationOrBuilder getLocationOrBuilder() {
-        if (locationBuilder_ != null) {
-          return locationBuilder_.getMessageOrBuilder();
-        } else {
-          return location_ == null ?
-              context.ContextOuterClass.Location.getDefaultInstance() : location_;
-        }
-      }
-      /**
-       * <code>.context.Location location = 2;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> 
-          getLocationFieldBuilder() {
-        if (locationBuilder_ == null) {
-          locationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder>(
-                  getLocation(),
-                  getParentForChildren(),
-                  isClean());
-          location_ = null;
-        }
-        return locationBuilder_;
+        return this;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -61684,91 +65903,76 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_EndPointLocation)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Latency)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_EndPointLocation)
-    private static final context.ContextOuterClass.Constraint_EndPointLocation DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Latency)
+    private static final context.ContextOuterClass.Constraint_SLA_Latency DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_EndPointLocation();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Latency();
     }
 
-    public static context.ContextOuterClass.Constraint_EndPointLocation getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_SLA_Latency getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_EndPointLocation>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_EndPointLocation>() {
+    private static final com.google.protobuf.Parser<Constraint_SLA_Latency>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Latency>() {
       @java.lang.Override
-      public Constraint_EndPointLocation parsePartialFrom(
+      public Constraint_SLA_Latency parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_EndPointLocation(input, extensionRegistry);
+        return new Constraint_SLA_Latency(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_EndPointLocation> parser() {
+    public static com.google.protobuf.Parser<Constraint_SLA_Latency> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_EndPointLocation> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_SLA_Latency> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_EndPointLocation getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_SLA_Latency getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_EndPointPriorityOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_EndPointPriority)
+  public interface Constraint_SLA_CapacityOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    boolean hasEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    context.ContextOuterClass.EndPointId getEndpointId();
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder();
-
-    /**
-     * <code>uint32 priority = 2;</code>
-     * @return The priority.
+     * <code>float capacity_gbps = 1;</code>
+     * @return The capacityGbps.
      */
-    int getPriority();
+    float getCapacityGbps();
   }
   /**
-   * Protobuf type {@code context.Constraint_EndPointPriority}
+   * Protobuf type {@code context.Constraint_SLA_Capacity}
    */
-  public static final class Constraint_EndPointPriority extends
+  public static final class Constraint_SLA_Capacity extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_EndPointPriority)
-      Constraint_EndPointPriorityOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
+      Constraint_SLA_CapacityOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_EndPointPriority.newBuilder() to construct.
-    private Constraint_EndPointPriority(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_SLA_Capacity.newBuilder() to construct.
+    private Constraint_SLA_Capacity(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_EndPointPriority() {
+    private Constraint_SLA_Capacity() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_EndPointPriority();
+      return new Constraint_SLA_Capacity();
     }
 
     @java.lang.Override
@@ -61776,7 +65980,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_EndPointPriority(
+    private Constraint_SLA_Capacity(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -61794,22 +65998,9 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
-              context.ContextOuterClass.EndPointId.Builder subBuilder = null;
-              if (endpointId_ != null) {
-                subBuilder = endpointId_.toBuilder();
-              }
-              endpointId_ = input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(endpointId_);
-                endpointId_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 16: {
+            case 13: {
 
-              priority_ = input.readUInt32();
+              capacityGbps_ = input.readFloat();
               break;
             }
             default: {
@@ -61833,52 +66024,26 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_EndPointPriority.class, context.ContextOuterClass.Constraint_EndPointPriority.Builder.class);
-    }
-
-    public static final int ENDPOINT_ID_FIELD_NUMBER = 1;
-    private context.ContextOuterClass.EndPointId endpointId_;
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return Whether the endpointId field is set.
-     */
-    @java.lang.Override
-    public boolean hasEndpointId() {
-      return endpointId_ != null;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     * @return The endpointId.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointId getEndpointId() {
-      return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-    }
-    /**
-     * <code>.context.EndPointId endpoint_id = 1;</code>
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-      return getEndpointId();
+              context.ContextOuterClass.Constraint_SLA_Capacity.class, context.ContextOuterClass.Constraint_SLA_Capacity.Builder.class);
     }
 
-    public static final int PRIORITY_FIELD_NUMBER = 2;
-    private int priority_;
+    public static final int CAPACITY_GBPS_FIELD_NUMBER = 1;
+    private float capacityGbps_;
     /**
-     * <code>uint32 priority = 2;</code>
-     * @return The priority.
+     * <code>float capacity_gbps = 1;</code>
+     * @return The capacityGbps.
      */
     @java.lang.Override
-    public int getPriority() {
-      return priority_;
+    public float getCapacityGbps() {
+      return capacityGbps_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -61895,11 +66060,8 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (endpointId_ != null) {
-        output.writeMessage(1, getEndpointId());
-      }
-      if (priority_ != 0) {
-        output.writeUInt32(2, priority_);
+      if (capacityGbps_ != 0F) {
+        output.writeFloat(1, capacityGbps_);
       }
       unknownFields.writeTo(output);
     }
@@ -61910,13 +66072,9 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (endpointId_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getEndpointId());
-      }
-      if (priority_ != 0) {
+      if (capacityGbps_ != 0F) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(2, priority_);
+          .computeFloatSize(1, capacityGbps_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -61928,18 +66086,14 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_EndPointPriority)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Capacity)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_EndPointPriority other = (context.ContextOuterClass.Constraint_EndPointPriority) obj;
+      context.ContextOuterClass.Constraint_SLA_Capacity other = (context.ContextOuterClass.Constraint_SLA_Capacity) obj;
 
-      if (hasEndpointId() != other.hasEndpointId()) return false;
-      if (hasEndpointId()) {
-        if (!getEndpointId()
-            .equals(other.getEndpointId())) return false;
-      }
-      if (getPriority()
-          != other.getPriority()) return false;
+      if (java.lang.Float.floatToIntBits(getCapacityGbps())
+          != java.lang.Float.floatToIntBits(
+              other.getCapacityGbps())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -61951,80 +66105,77 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasEndpointId()) {
-        hash = (37 * hash) + ENDPOINT_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getEndpointId().hashCode();
-      }
-      hash = (37 * hash) + PRIORITY_FIELD_NUMBER;
-      hash = (53 * hash) + getPriority();
+      hash = (37 * hash) + CAPACITY_GBPS_FIELD_NUMBER;
+      hash = (53 * hash) + java.lang.Float.floatToIntBits(
+          getCapacityGbps());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_EndPointPriority parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -62037,7 +66188,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_EndPointPriority prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Capacity prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -62053,26 +66204,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Constraint_EndPointPriority}
+     * Protobuf type {@code context.Constraint_SLA_Capacity}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_EndPointPriority)
-        context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
+        context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_EndPointPriority.class, context.ContextOuterClass.Constraint_EndPointPriority.Builder.class);
+                context.ContextOuterClass.Constraint_SLA_Capacity.class, context.ContextOuterClass.Constraint_SLA_Capacity.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_EndPointPriority.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_SLA_Capacity.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -62090,13 +66241,7 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-        priority_ = 0;
+        capacityGbps_ = 0F;
 
         return this;
       }
@@ -62104,17 +66249,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_EndPointPriority_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_EndPointPriority getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_SLA_Capacity getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_EndPointPriority build() {
-        context.ContextOuterClass.Constraint_EndPointPriority result = buildPartial();
+      public context.ContextOuterClass.Constraint_SLA_Capacity build() {
+        context.ContextOuterClass.Constraint_SLA_Capacity result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -62122,14 +66267,9 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_EndPointPriority buildPartial() {
-        context.ContextOuterClass.Constraint_EndPointPriority result = new context.ContextOuterClass.Constraint_EndPointPriority(this);
-        if (endpointIdBuilder_ == null) {
-          result.endpointId_ = endpointId_;
-        } else {
-          result.endpointId_ = endpointIdBuilder_.build();
-        }
-        result.priority_ = priority_;
+      public context.ContextOuterClass.Constraint_SLA_Capacity buildPartial() {
+        context.ContextOuterClass.Constraint_SLA_Capacity result = new context.ContextOuterClass.Constraint_SLA_Capacity(this);
+        result.capacityGbps_ = capacityGbps_;
         onBuilt();
         return result;
       }
@@ -62168,21 +66308,18 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_EndPointPriority) {
-          return mergeFrom((context.ContextOuterClass.Constraint_EndPointPriority)other);
+        if (other instanceof context.ContextOuterClass.Constraint_SLA_Capacity) {
+          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Capacity)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_EndPointPriority other) {
-        if (other == context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance()) return this;
-        if (other.hasEndpointId()) {
-          mergeEndpointId(other.getEndpointId());
-        }
-        if (other.getPriority() != 0) {
-          setPriority(other.getPriority());
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Capacity other) {
+        if (other == context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance()) return this;
+        if (other.getCapacityGbps() != 0F) {
+          setCapacityGbps(other.getCapacityGbps());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -62199,11 +66336,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Constraint_EndPointPriority parsedMessage = null;
+        context.ContextOuterClass.Constraint_SLA_Capacity parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_EndPointPriority) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Capacity) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -62213,152 +66350,33 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private context.ContextOuterClass.EndPointId endpointId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdBuilder_;
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return Whether the endpointId field is set.
-       */
-      public boolean hasEndpointId() {
-        return endpointIdBuilder_ != null || endpointId_ != null;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       * @return The endpointId.
-       */
-      public context.ContextOuterClass.EndPointId getEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          return endpointId_ == null ? context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        } else {
-          return endpointIdBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder setEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          endpointId_ = value;
-          onChanged();
-        } else {
-          endpointIdBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder setEndpointId(
-          context.ContextOuterClass.EndPointId.Builder builderForValue) {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = builderForValue.build();
-          onChanged();
-        } else {
-          endpointIdBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder mergeEndpointId(context.ContextOuterClass.EndPointId value) {
-        if (endpointIdBuilder_ == null) {
-          if (endpointId_ != null) {
-            endpointId_ =
-              context.ContextOuterClass.EndPointId.newBuilder(endpointId_).mergeFrom(value).buildPartial();
-          } else {
-            endpointId_ = value;
-          }
-          onChanged();
-        } else {
-          endpointIdBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public Builder clearEndpointId() {
-        if (endpointIdBuilder_ == null) {
-          endpointId_ = null;
-          onChanged();
-        } else {
-          endpointId_ = null;
-          endpointIdBuilder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getEndpointIdBuilder() {
-        
-        onChanged();
-        return getEndpointIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdOrBuilder() {
-        if (endpointIdBuilder_ != null) {
-          return endpointIdBuilder_.getMessageOrBuilder();
-        } else {
-          return endpointId_ == null ?
-              context.ContextOuterClass.EndPointId.getDefaultInstance() : endpointId_;
-        }
-      }
-      /**
-       * <code>.context.EndPointId endpoint_id = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
-          getEndpointIdFieldBuilder() {
-        if (endpointIdBuilder_ == null) {
-          endpointIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
-                  getEndpointId(),
-                  getParentForChildren(),
-                  isClean());
-          endpointId_ = null;
-        }
-        return endpointIdBuilder_;
-      }
-
-      private int priority_ ;
+      private float capacityGbps_ ;
       /**
-       * <code>uint32 priority = 2;</code>
-       * @return The priority.
+       * <code>float capacity_gbps = 1;</code>
+       * @return The capacityGbps.
        */
       @java.lang.Override
-      public int getPriority() {
-        return priority_;
+      public float getCapacityGbps() {
+        return capacityGbps_;
       }
       /**
-       * <code>uint32 priority = 2;</code>
-       * @param value The priority to set.
+       * <code>float capacity_gbps = 1;</code>
+       * @param value The capacityGbps to set.
        * @return This builder for chaining.
        */
-      public Builder setPriority(int value) {
+      public Builder setCapacityGbps(float value) {
         
-        priority_ = value;
+        capacityGbps_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 priority = 2;</code>
+       * <code>float capacity_gbps = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder clearPriority() {
+      public Builder clearCapacityGbps() {
         
-        priority_ = 0;
+        capacityGbps_ = 0F;
         onChanged();
         return this;
       }
@@ -62375,76 +66393,92 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_EndPointPriority)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Capacity)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_EndPointPriority)
-    private static final context.ContextOuterClass.Constraint_EndPointPriority DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Capacity)
+    private static final context.ContextOuterClass.Constraint_SLA_Capacity DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_EndPointPriority();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Capacity();
     }
 
-    public static context.ContextOuterClass.Constraint_EndPointPriority getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_SLA_Capacity getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_EndPointPriority>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_EndPointPriority>() {
+    private static final com.google.protobuf.Parser<Constraint_SLA_Capacity>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Capacity>() {
       @java.lang.Override
-      public Constraint_EndPointPriority parsePartialFrom(
+      public Constraint_SLA_Capacity parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_EndPointPriority(input, extensionRegistry);
+        return new Constraint_SLA_Capacity(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_EndPointPriority> parser() {
+    public static com.google.protobuf.Parser<Constraint_SLA_Capacity> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_EndPointPriority> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_SLA_Capacity> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_EndPointPriority getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_SLA_Capacity getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_SLA_LatencyOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Latency)
+  public interface Constraint_SLA_AvailabilityOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>float e2e_latency_ms = 1;</code>
-     * @return The e2eLatencyMs.
+     * <code>uint32 num_disjoint_paths = 1;</code>
+     * @return The numDisjointPaths.
      */
-    float getE2ELatencyMs();
+    int getNumDisjointPaths();
+
+    /**
+     * <code>bool all_active = 2;</code>
+     * @return The allActive.
+     */
+    boolean getAllActive();
+
+    /**
+     * <pre>
+     * 0.0 .. 100.0 percentage of availability
+     * </pre>
+     *
+     * <code>float availability = 3;</code>
+     * @return The availability.
+     */
+    float getAvailability();
   }
   /**
-   * Protobuf type {@code context.Constraint_SLA_Latency}
+   * Protobuf type {@code context.Constraint_SLA_Availability}
    */
-  public static final class Constraint_SLA_Latency extends
+  public static final class Constraint_SLA_Availability extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Latency)
-      Constraint_SLA_LatencyOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
+      Constraint_SLA_AvailabilityOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_SLA_Latency.newBuilder() to construct.
-    private Constraint_SLA_Latency(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_SLA_Availability.newBuilder() to construct.
+    private Constraint_SLA_Availability(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_SLA_Latency() {
+    private Constraint_SLA_Availability() {
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_SLA_Latency();
+      return new Constraint_SLA_Availability();
     }
 
     @java.lang.Override
@@ -62452,7 +66486,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_SLA_Latency(
+    private Constraint_SLA_Availability(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -62470,9 +66504,19 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 13: {
+            case 8: {
 
-              e2ELatencyMs_ = input.readFloat();
+              numDisjointPaths_ = input.readUInt32();
+              break;
+            }
+            case 16: {
+
+              allActive_ = input.readBool();
+              break;
+            }
+            case 29: {
+
+              availability_ = input.readFloat();
               break;
             }
             default: {
@@ -62496,26 +66540,52 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_SLA_Latency.class, context.ContextOuterClass.Constraint_SLA_Latency.Builder.class);
+              context.ContextOuterClass.Constraint_SLA_Availability.class, context.ContextOuterClass.Constraint_SLA_Availability.Builder.class);
     }
 
-    public static final int E2E_LATENCY_MS_FIELD_NUMBER = 1;
-    private float e2ELatencyMs_;
+    public static final int NUM_DISJOINT_PATHS_FIELD_NUMBER = 1;
+    private int numDisjointPaths_;
     /**
-     * <code>float e2e_latency_ms = 1;</code>
-     * @return The e2eLatencyMs.
+     * <code>uint32 num_disjoint_paths = 1;</code>
+     * @return The numDisjointPaths.
      */
     @java.lang.Override
-    public float getE2ELatencyMs() {
-      return e2ELatencyMs_;
+    public int getNumDisjointPaths() {
+      return numDisjointPaths_;
+    }
+
+    public static final int ALL_ACTIVE_FIELD_NUMBER = 2;
+    private boolean allActive_;
+    /**
+     * <code>bool all_active = 2;</code>
+     * @return The allActive.
+     */
+    @java.lang.Override
+    public boolean getAllActive() {
+      return allActive_;
+    }
+
+    public static final int AVAILABILITY_FIELD_NUMBER = 3;
+    private float availability_;
+    /**
+     * <pre>
+     * 0.0 .. 100.0 percentage of availability
+     * </pre>
+     *
+     * <code>float availability = 3;</code>
+     * @return The availability.
+     */
+    @java.lang.Override
+    public float getAvailability() {
+      return availability_;
     }
 
     private byte memoizedIsInitialized = -1;
@@ -62532,8 +66602,14 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (e2ELatencyMs_ != 0F) {
-        output.writeFloat(1, e2ELatencyMs_);
+      if (numDisjointPaths_ != 0) {
+        output.writeUInt32(1, numDisjointPaths_);
+      }
+      if (allActive_ != false) {
+        output.writeBool(2, allActive_);
+      }
+      if (availability_ != 0F) {
+        output.writeFloat(3, availability_);
       }
       unknownFields.writeTo(output);
     }
@@ -62544,9 +66620,17 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (e2ELatencyMs_ != 0F) {
+      if (numDisjointPaths_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(1, e2ELatencyMs_);
+          .computeUInt32Size(1, numDisjointPaths_);
+      }
+      if (allActive_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(2, allActive_);
+      }
+      if (availability_ != 0F) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeFloatSize(3, availability_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -62558,14 +66642,18 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Latency)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Availability)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_SLA_Latency other = (context.ContextOuterClass.Constraint_SLA_Latency) obj;
+      context.ContextOuterClass.Constraint_SLA_Availability other = (context.ContextOuterClass.Constraint_SLA_Availability) obj;
 
-      if (java.lang.Float.floatToIntBits(getE2ELatencyMs())
+      if (getNumDisjointPaths()
+          != other.getNumDisjointPaths()) return false;
+      if (getAllActive()
+          != other.getAllActive()) return false;
+      if (java.lang.Float.floatToIntBits(getAvailability())
           != java.lang.Float.floatToIntBits(
-              other.getE2ELatencyMs())) return false;
+              other.getAvailability())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -62577,77 +66665,82 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + E2E_LATENCY_MS_FIELD_NUMBER;
+      hash = (37 * hash) + NUM_DISJOINT_PATHS_FIELD_NUMBER;
+      hash = (53 * hash) + getNumDisjointPaths();
+      hash = (37 * hash) + ALL_ACTIVE_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getAllActive());
+      hash = (37 * hash) + AVAILABILITY_FIELD_NUMBER;
       hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getE2ELatencyMs());
+          getAvailability());
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Latency parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -62660,7 +66753,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Latency prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Availability prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -62676,26 +66769,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Constraint_SLA_Latency}
+     * Protobuf type {@code context.Constraint_SLA_Availability}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Latency)
-        context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
+        context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_SLA_Latency.class, context.ContextOuterClass.Constraint_SLA_Latency.Builder.class);
+                context.ContextOuterClass.Constraint_SLA_Availability.class, context.ContextOuterClass.Constraint_SLA_Availability.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_SLA_Latency.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_SLA_Availability.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -62713,7 +66806,11 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        e2ELatencyMs_ = 0F;
+        numDisjointPaths_ = 0;
+
+        allActive_ = false;
+
+        availability_ = 0F;
 
         return this;
       }
@@ -62721,17 +66818,17 @@ public final class ContextOuterClass {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Latency_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Latency getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_SLA_Availability getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Latency build() {
-        context.ContextOuterClass.Constraint_SLA_Latency result = buildPartial();
+      public context.ContextOuterClass.Constraint_SLA_Availability build() {
+        context.ContextOuterClass.Constraint_SLA_Availability result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -62739,9 +66836,11 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Latency buildPartial() {
-        context.ContextOuterClass.Constraint_SLA_Latency result = new context.ContextOuterClass.Constraint_SLA_Latency(this);
-        result.e2ELatencyMs_ = e2ELatencyMs_;
+      public context.ContextOuterClass.Constraint_SLA_Availability buildPartial() {
+        context.ContextOuterClass.Constraint_SLA_Availability result = new context.ContextOuterClass.Constraint_SLA_Availability(this);
+        result.numDisjointPaths_ = numDisjointPaths_;
+        result.allActive_ = allActive_;
+        result.availability_ = availability_;
         onBuilt();
         return result;
       }
@@ -62780,18 +66879,24 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_SLA_Latency) {
-          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Latency)other);
+        if (other instanceof context.ContextOuterClass.Constraint_SLA_Availability) {
+          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Availability)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Latency other) {
-        if (other == context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance()) return this;
-        if (other.getE2ELatencyMs() != 0F) {
-          setE2ELatencyMs(other.getE2ELatencyMs());
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Availability other) {
+        if (other == context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance()) return this;
+        if (other.getNumDisjointPaths() != 0) {
+          setNumDisjointPaths(other.getNumDisjointPaths());
+        }
+        if (other.getAllActive() != false) {
+          setAllActive(other.getAllActive());
+        }
+        if (other.getAvailability() != 0F) {
+          setAvailability(other.getAvailability());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -62808,11 +66913,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Constraint_SLA_Latency parsedMessage = null;
+        context.ContextOuterClass.Constraint_SLA_Availability parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Latency) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Availability) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -62822,33 +66927,107 @@ public final class ContextOuterClass {
         return this;
       }
 
-      private float e2ELatencyMs_ ;
+      private int numDisjointPaths_ ;
       /**
-       * <code>float e2e_latency_ms = 1;</code>
-       * @return The e2eLatencyMs.
+       * <code>uint32 num_disjoint_paths = 1;</code>
+       * @return The numDisjointPaths.
        */
       @java.lang.Override
-      public float getE2ELatencyMs() {
-        return e2ELatencyMs_;
+      public int getNumDisjointPaths() {
+        return numDisjointPaths_;
       }
       /**
-       * <code>float e2e_latency_ms = 1;</code>
-       * @param value The e2eLatencyMs to set.
+       * <code>uint32 num_disjoint_paths = 1;</code>
+       * @param value The numDisjointPaths to set.
        * @return This builder for chaining.
        */
-      public Builder setE2ELatencyMs(float value) {
+      public Builder setNumDisjointPaths(int value) {
         
-        e2ELatencyMs_ = value;
+        numDisjointPaths_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>float e2e_latency_ms = 1;</code>
+       * <code>uint32 num_disjoint_paths = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder clearE2ELatencyMs() {
+      public Builder clearNumDisjointPaths() {
         
-        e2ELatencyMs_ = 0F;
+        numDisjointPaths_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private boolean allActive_ ;
+      /**
+       * <code>bool all_active = 2;</code>
+       * @return The allActive.
+       */
+      @java.lang.Override
+      public boolean getAllActive() {
+        return allActive_;
+      }
+      /**
+       * <code>bool all_active = 2;</code>
+       * @param value The allActive to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAllActive(boolean value) {
+        
+        allActive_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>bool all_active = 2;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearAllActive() {
+        
+        allActive_ = false;
+        onChanged();
+        return this;
+      }
+
+      private float availability_ ;
+      /**
+       * <pre>
+       * 0.0 .. 100.0 percentage of availability
+       * </pre>
+       *
+       * <code>float availability = 3;</code>
+       * @return The availability.
+       */
+      @java.lang.Override
+      public float getAvailability() {
+        return availability_;
+      }
+      /**
+       * <pre>
+       * 0.0 .. 100.0 percentage of availability
+       * </pre>
+       *
+       * <code>float availability = 3;</code>
+       * @param value The availability to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAvailability(float value) {
+        
+        availability_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <pre>
+       * 0.0 .. 100.0 percentage of availability
+       * </pre>
+       *
+       * <code>float availability = 3;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearAvailability() {
+        
+        availability_ = 0F;
         onChanged();
         return this;
       }
@@ -62865,76 +67044,100 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Latency)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Availability)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Latency)
-    private static final context.ContextOuterClass.Constraint_SLA_Latency DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Availability)
+    private static final context.ContextOuterClass.Constraint_SLA_Availability DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Latency();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Availability();
     }
 
-    public static context.ContextOuterClass.Constraint_SLA_Latency getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_SLA_Availability getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_SLA_Latency>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Latency>() {
+    private static final com.google.protobuf.Parser<Constraint_SLA_Availability>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Availability>() {
       @java.lang.Override
-      public Constraint_SLA_Latency parsePartialFrom(
+      public Constraint_SLA_Availability parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_SLA_Latency(input, extensionRegistry);
+        return new Constraint_SLA_Availability(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_SLA_Latency> parser() {
+    public static com.google.protobuf.Parser<Constraint_SLA_Availability> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_SLA_Latency> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_SLA_Availability> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_SLA_Latency getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_SLA_Availability getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_SLA_CapacityOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Capacity)
+  public interface Constraint_SLA_Isolation_levelOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>float capacity_gbps = 1;</code>
-     * @return The capacityGbps.
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @return A list containing the isolationLevel.
      */
-    float getCapacityGbps();
+    java.util.List<context.ContextOuterClass.IsolationLevelEnum> getIsolationLevelList();
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @return The count of isolationLevel.
+     */
+    int getIsolationLevelCount();
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @param index The index of the element to return.
+     * @return The isolationLevel at the given index.
+     */
+    context.ContextOuterClass.IsolationLevelEnum getIsolationLevel(int index);
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @return A list containing the enum numeric values on the wire for isolationLevel.
+     */
+    java.util.List<java.lang.Integer>
+    getIsolationLevelValueList();
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of isolationLevel at the given index.
+     */
+    int getIsolationLevelValue(int index);
   }
   /**
-   * Protobuf type {@code context.Constraint_SLA_Capacity}
+   * Protobuf type {@code context.Constraint_SLA_Isolation_level}
    */
-  public static final class Constraint_SLA_Capacity extends
+  public static final class Constraint_SLA_Isolation_level extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Capacity)
-      Constraint_SLA_CapacityOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
+      Constraint_SLA_Isolation_levelOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_SLA_Capacity.newBuilder() to construct.
-    private Constraint_SLA_Capacity(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_SLA_Isolation_level.newBuilder() to construct.
+    private Constraint_SLA_Isolation_level(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_SLA_Capacity() {
+    private Constraint_SLA_Isolation_level() {
+      isolationLevel_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_SLA_Capacity();
+      return new Constraint_SLA_Isolation_level();
     }
 
     @java.lang.Override
@@ -62942,7 +67145,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_SLA_Capacity(
+    private Constraint_SLA_Isolation_level(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -62950,6 +67153,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -62960,9 +67164,27 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 13: {
-
-              capacityGbps_ = input.readFloat();
+            case 8: {
+              int rawValue = input.readEnum();
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                isolationLevel_ = new java.util.ArrayList<java.lang.Integer>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              isolationLevel_.add(rawValue);
+              break;
+            }
+            case 10: {
+              int length = input.readRawVarint32();
+              int oldLimit = input.pushLimit(length);
+              while(input.getBytesUntilLimit() > 0) {
+                int rawValue = input.readEnum();
+                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                  isolationLevel_ = new java.util.ArrayList<java.lang.Integer>();
+                  mutable_bitField0_ |= 0x00000001;
+                }
+                isolationLevel_.add(rawValue);
+              }
+              input.popLimit(oldLimit);
               break;
             }
             default: {
@@ -62980,33 +67202,83 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_SLA_Capacity.class, context.ContextOuterClass.Constraint_SLA_Capacity.Builder.class);
+              context.ContextOuterClass.Constraint_SLA_Isolation_level.class, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder.class);
     }
 
-    public static final int CAPACITY_GBPS_FIELD_NUMBER = 1;
-    private float capacityGbps_;
+    public static final int ISOLATION_LEVEL_FIELD_NUMBER = 1;
+    private java.util.List<java.lang.Integer> isolationLevel_;
+    private static final com.google.protobuf.Internal.ListAdapter.Converter<
+        java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum> isolationLevel_converter_ =
+            new com.google.protobuf.Internal.ListAdapter.Converter<
+                java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum>() {
+              public context.ContextOuterClass.IsolationLevelEnum convert(java.lang.Integer from) {
+                @SuppressWarnings("deprecation")
+                context.ContextOuterClass.IsolationLevelEnum result = context.ContextOuterClass.IsolationLevelEnum.valueOf(from);
+                return result == null ? context.ContextOuterClass.IsolationLevelEnum.UNRECOGNIZED : result;
+              }
+            };
     /**
-     * <code>float capacity_gbps = 1;</code>
-     * @return The capacityGbps.
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @return A list containing the isolationLevel.
      */
     @java.lang.Override
-    public float getCapacityGbps() {
-      return capacityGbps_;
+    public java.util.List<context.ContextOuterClass.IsolationLevelEnum> getIsolationLevelList() {
+      return new com.google.protobuf.Internal.ListAdapter<
+          java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum>(isolationLevel_, isolationLevel_converter_);
+    }
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @return The count of isolationLevel.
+     */
+    @java.lang.Override
+    public int getIsolationLevelCount() {
+      return isolationLevel_.size();
+    }
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @param index The index of the element to return.
+     * @return The isolationLevel at the given index.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.IsolationLevelEnum getIsolationLevel(int index) {
+      return isolationLevel_converter_.convert(isolationLevel_.get(index));
+    }
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @return A list containing the enum numeric values on the wire for isolationLevel.
+     */
+    @java.lang.Override
+    public java.util.List<java.lang.Integer>
+    getIsolationLevelValueList() {
+      return isolationLevel_;
+    }
+    /**
+     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+     * @param index The index of the value to return.
+     * @return The enum numeric value on the wire of isolationLevel at the given index.
+     */
+    @java.lang.Override
+    public int getIsolationLevelValue(int index) {
+      return isolationLevel_.get(index);
     }
+    private int isolationLevelMemoizedSerializedSize;
 
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
@@ -63022,8 +67294,13 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (capacityGbps_ != 0F) {
-        output.writeFloat(1, capacityGbps_);
+      getSerializedSize();
+      if (getIsolationLevelList().size() > 0) {
+        output.writeUInt32NoTag(10);
+        output.writeUInt32NoTag(isolationLevelMemoizedSerializedSize);
+      }
+      for (int i = 0; i < isolationLevel_.size(); i++) {
+        output.writeEnumNoTag(isolationLevel_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -63034,9 +67311,17 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (capacityGbps_ != 0F) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(1, capacityGbps_);
+      {
+        int dataSize = 0;
+        for (int i = 0; i < isolationLevel_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeEnumSizeNoTag(isolationLevel_.get(i));
+        }
+        size += dataSize;
+        if (!getIsolationLevelList().isEmpty()) {  size += 1;
+          size += com.google.protobuf.CodedOutputStream
+            .computeUInt32SizeNoTag(dataSize);
+        }isolationLevelMemoizedSerializedSize = dataSize;
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -63048,14 +67333,12 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Capacity)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Isolation_level)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_SLA_Capacity other = (context.ContextOuterClass.Constraint_SLA_Capacity) obj;
+      context.ContextOuterClass.Constraint_SLA_Isolation_level other = (context.ContextOuterClass.Constraint_SLA_Isolation_level) obj;
 
-      if (java.lang.Float.floatToIntBits(getCapacityGbps())
-          != java.lang.Float.floatToIntBits(
-              other.getCapacityGbps())) return false;
+      if (!isolationLevel_.equals(other.isolationLevel_)) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -63067,77 +67350,78 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + CAPACITY_GBPS_FIELD_NUMBER;
-      hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getCapacityGbps());
+      if (getIsolationLevelCount() > 0) {
+        hash = (37 * hash) + ISOLATION_LEVEL_FIELD_NUMBER;
+        hash = (53 * hash) + isolationLevel_.hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Capacity parseFrom(
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -63150,7 +67434,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Capacity prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Isolation_level prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -63166,26 +67450,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Constraint_SLA_Capacity}
+     * Protobuf type {@code context.Constraint_SLA_Isolation_level}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Capacity)
-        context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
+        context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_SLA_Capacity.class, context.ContextOuterClass.Constraint_SLA_Capacity.Builder.class);
+                context.ContextOuterClass.Constraint_SLA_Isolation_level.class, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_SLA_Capacity.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_SLA_Isolation_level.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -63203,25 +67487,25 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        capacityGbps_ = 0F;
-
+        isolationLevel_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Capacity_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Capacity getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_SLA_Isolation_level getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Capacity build() {
-        context.ContextOuterClass.Constraint_SLA_Capacity result = buildPartial();
+      public context.ContextOuterClass.Constraint_SLA_Isolation_level build() {
+        context.ContextOuterClass.Constraint_SLA_Isolation_level result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -63229,9 +67513,14 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Capacity buildPartial() {
-        context.ContextOuterClass.Constraint_SLA_Capacity result = new context.ContextOuterClass.Constraint_SLA_Capacity(this);
-        result.capacityGbps_ = capacityGbps_;
+      public context.ContextOuterClass.Constraint_SLA_Isolation_level buildPartial() {
+        context.ContextOuterClass.Constraint_SLA_Isolation_level result = new context.ContextOuterClass.Constraint_SLA_Isolation_level(this);
+        int from_bitField0_ = bitField0_;
+        if (((bitField0_ & 0x00000001) != 0)) {
+          isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
+          bitField0_ = (bitField0_ & ~0x00000001);
+        }
+        result.isolationLevel_ = isolationLevel_;
         onBuilt();
         return result;
       }
@@ -63270,75 +67559,192 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_SLA_Capacity) {
-          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Capacity)other);
+        if (other instanceof context.ContextOuterClass.Constraint_SLA_Isolation_level) {
+          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Isolation_level)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Capacity other) {
-        if (other == context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance()) return this;
-        if (other.getCapacityGbps() != 0F) {
-          setCapacityGbps(other.getCapacityGbps());
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Isolation_level other) {
+        if (other == context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance()) return this;
+        if (!other.isolationLevel_.isEmpty()) {
+          if (isolationLevel_.isEmpty()) {
+            isolationLevel_ = other.isolationLevel_;
+            bitField0_ = (bitField0_ & ~0x00000001);
+          } else {
+            ensureIsolationLevelIsMutable();
+            isolationLevel_.addAll(other.isolationLevel_);
+          }
+          onChanged();
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        context.ContextOuterClass.Constraint_SLA_Isolation_level parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Isolation_level) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<java.lang.Integer> isolationLevel_ =
+        java.util.Collections.emptyList();
+      private void ensureIsolationLevelIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          isolationLevel_ = new java.util.ArrayList<java.lang.Integer>(isolationLevel_);
+          bitField0_ |= 0x00000001;
+        }
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @return A list containing the isolationLevel.
+       */
+      public java.util.List<context.ContextOuterClass.IsolationLevelEnum> getIsolationLevelList() {
+        return new com.google.protobuf.Internal.ListAdapter<
+            java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum>(isolationLevel_, isolationLevel_converter_);
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @return The count of isolationLevel.
+       */
+      public int getIsolationLevelCount() {
+        return isolationLevel_.size();
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param index The index of the element to return.
+       * @return The isolationLevel at the given index.
+       */
+      public context.ContextOuterClass.IsolationLevelEnum getIsolationLevel(int index) {
+        return isolationLevel_converter_.convert(isolationLevel_.get(index));
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param index The index to set the value at.
+       * @param value The isolationLevel to set.
+       * @return This builder for chaining.
+       */
+      public Builder setIsolationLevel(
+          int index, context.ContextOuterClass.IsolationLevelEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ensureIsolationLevelIsMutable();
+        isolationLevel_.set(index, value.getNumber());
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param value The isolationLevel to add.
+       * @return This builder for chaining.
+       */
+      public Builder addIsolationLevel(context.ContextOuterClass.IsolationLevelEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
         }
-        this.mergeUnknownFields(other.unknownFields);
+        ensureIsolationLevelIsMutable();
+        isolationLevel_.add(value.getNumber());
         onChanged();
         return this;
       }
-
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.Constraint_SLA_Capacity parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Capacity) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param values The isolationLevel to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllIsolationLevel(
+          java.lang.Iterable<? extends context.ContextOuterClass.IsolationLevelEnum> values) {
+        ensureIsolationLevelIsMutable();
+        for (context.ContextOuterClass.IsolationLevelEnum value : values) {
+          isolationLevel_.add(value.getNumber());
         }
+        onChanged();
         return this;
       }
-
-      private float capacityGbps_ ;
       /**
-       * <code>float capacity_gbps = 1;</code>
-       * @return The capacityGbps.
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @return This builder for chaining.
        */
-      @java.lang.Override
-      public float getCapacityGbps() {
-        return capacityGbps_;
+      public Builder clearIsolationLevel() {
+        isolationLevel_ = java.util.Collections.emptyList();
+        bitField0_ = (bitField0_ & ~0x00000001);
+        onChanged();
+        return this;
       }
       /**
-       * <code>float capacity_gbps = 1;</code>
-       * @param value The capacityGbps to set.
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @return A list containing the enum numeric values on the wire for isolationLevel.
+       */
+      public java.util.List<java.lang.Integer>
+      getIsolationLevelValueList() {
+        return java.util.Collections.unmodifiableList(isolationLevel_);
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of isolationLevel at the given index.
+       */
+      public int getIsolationLevelValue(int index) {
+        return isolationLevel_.get(index);
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param index The index of the value to return.
+       * @return The enum numeric value on the wire of isolationLevel at the given index.
        * @return This builder for chaining.
        */
-      public Builder setCapacityGbps(float value) {
-        
-        capacityGbps_ = value;
+      public Builder setIsolationLevelValue(
+          int index, int value) {
+        ensureIsolationLevelIsMutable();
+        isolationLevel_.set(index, value);
         onChanged();
         return this;
       }
       /**
-       * <code>float capacity_gbps = 1;</code>
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param value The enum numeric value on the wire for isolationLevel to add.
        * @return This builder for chaining.
        */
-      public Builder clearCapacityGbps() {
-        
-        capacityGbps_ = 0F;
+      public Builder addIsolationLevelValue(int value) {
+        ensureIsolationLevelIsMutable();
+        isolationLevel_.add(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
+       * @param values The enum numeric values on the wire for isolationLevel to add.
+       * @return This builder for chaining.
+       */
+      public Builder addAllIsolationLevelValue(
+          java.lang.Iterable<java.lang.Integer> values) {
+        ensureIsolationLevelIsMutable();
+        for (int value : values) {
+          isolationLevel_.add(value);
+        }
         onChanged();
         return this;
       }
@@ -63355,82 +67761,151 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Capacity)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Isolation_level)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Capacity)
-    private static final context.ContextOuterClass.Constraint_SLA_Capacity DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Isolation_level)
+    private static final context.ContextOuterClass.Constraint_SLA_Isolation_level DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Capacity();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Isolation_level();
     }
 
-    public static context.ContextOuterClass.Constraint_SLA_Capacity getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_SLA_Isolation_level getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_SLA_Capacity>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Capacity>() {
+    private static final com.google.protobuf.Parser<Constraint_SLA_Isolation_level>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Isolation_level>() {
       @java.lang.Override
-      public Constraint_SLA_Capacity parsePartialFrom(
+      public Constraint_SLA_Isolation_level parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_SLA_Capacity(input, extensionRegistry);
+        return new Constraint_SLA_Isolation_level(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_SLA_Capacity> parser() {
+    public static com.google.protobuf.Parser<Constraint_SLA_Isolation_level> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_SLA_Capacity> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_SLA_Isolation_level> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_SLA_Capacity getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_SLA_Isolation_level getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
   }
 
-  public interface Constraint_SLA_AvailabilityOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Availability)
+  public interface Constraint_ExclusionsOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:context.Constraint_Exclusions)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>uint32 num_disjoint_paths = 1;</code>
-     * @return The numDisjointPaths.
+     * <code>bool is_permanent = 1;</code>
+     * @return The isPermanent.
      */
-    int getNumDisjointPaths();
+    boolean getIsPermanent();
 
     /**
-     * <code>bool all_active = 2;</code>
-     * @return The allActive.
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
      */
-    boolean getAllActive();
+    java.util.List<context.ContextOuterClass.DeviceId> 
+        getDeviceIdsList();
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    context.ContextOuterClass.DeviceId getDeviceIds(int index);
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    int getDeviceIdsCount();
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+        getDeviceIdsOrBuilderList();
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdsOrBuilder(
+        int index);
+
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    java.util.List<context.ContextOuterClass.EndPointId> 
+        getEndpointIdsList();
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    context.ContextOuterClass.EndPointId getEndpointIds(int index);
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    int getEndpointIdsCount();
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getEndpointIdsOrBuilderList();
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
+        int index);
+
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    java.util.List<context.ContextOuterClass.LinkId> 
+        getLinkIdsList();
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    context.ContextOuterClass.LinkId getLinkIds(int index);
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    int getLinkIdsCount();
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
+        getLinkIdsOrBuilderList();
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
+        int index);
   }
   /**
-   * Protobuf type {@code context.Constraint_SLA_Availability}
+   * Protobuf type {@code context.Constraint_Exclusions}
    */
-  public static final class Constraint_SLA_Availability extends
+  public static final class Constraint_Exclusions extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Availability)
-      Constraint_SLA_AvailabilityOrBuilder {
+      // @@protoc_insertion_point(message_implements:context.Constraint_Exclusions)
+      Constraint_ExclusionsOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use Constraint_SLA_Availability.newBuilder() to construct.
-    private Constraint_SLA_Availability(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use Constraint_Exclusions.newBuilder() to construct.
+    private Constraint_Exclusions(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private Constraint_SLA_Availability() {
+    private Constraint_Exclusions() {
+      deviceIds_ = java.util.Collections.emptyList();
+      endpointIds_ = java.util.Collections.emptyList();
+      linkIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new Constraint_SLA_Availability();
+      return new Constraint_Exclusions();
     }
 
     @java.lang.Override
@@ -63438,7 +67913,7 @@ public final class ContextOuterClass {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private Constraint_SLA_Availability(
+    private Constraint_Exclusions(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -63446,6 +67921,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -63458,12 +67934,34 @@ public final class ContextOuterClass {
               break;
             case 8: {
 
-              numDisjointPaths_ = input.readUInt32();
+              isPermanent_ = input.readBool();
               break;
             }
-            case 16: {
-
-              allActive_ = input.readBool();
+            case 18: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                deviceIds_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              deviceIds_.add(
+                  input.readMessage(context.ContextOuterClass.DeviceId.parser(), extensionRegistry));
+              break;
+            }
+            case 26: {
+              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
+                endpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>();
+                mutable_bitField0_ |= 0x00000002;
+              }
+              endpointIds_.add(
+                  input.readMessage(context.ContextOuterClass.EndPointId.parser(), extensionRegistry));
+              break;
+            }
+            case 34: {
+              if (!((mutable_bitField0_ & 0x00000004) != 0)) {
+                linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>();
+                mutable_bitField0_ |= 0x00000004;
+              }
+              linkIds_.add(
+                  input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -63481,43 +67979,161 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+        }
+        if (((mutable_bitField0_ & 0x00000002) != 0)) {
+          endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+        }
+        if (((mutable_bitField0_ & 0x00000004) != 0)) {
+          linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
+      return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_fieldAccessorTable
+      return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_SLA_Availability.class, context.ContextOuterClass.Constraint_SLA_Availability.Builder.class);
+              context.ContextOuterClass.Constraint_Exclusions.class, context.ContextOuterClass.Constraint_Exclusions.Builder.class);
     }
 
-    public static final int NUM_DISJOINT_PATHS_FIELD_NUMBER = 1;
-    private int numDisjointPaths_;
+    public static final int IS_PERMANENT_FIELD_NUMBER = 1;
+    private boolean isPermanent_;
     /**
-     * <code>uint32 num_disjoint_paths = 1;</code>
-     * @return The numDisjointPaths.
+     * <code>bool is_permanent = 1;</code>
+     * @return The isPermanent.
      */
     @java.lang.Override
-    public int getNumDisjointPaths() {
-      return numDisjointPaths_;
+    public boolean getIsPermanent() {
+      return isPermanent_;
     }
 
-    public static final int ALL_ACTIVE_FIELD_NUMBER = 2;
-    private boolean allActive_;
+    public static final int DEVICE_IDS_FIELD_NUMBER = 2;
+    private java.util.List<context.ContextOuterClass.DeviceId> deviceIds_;
     /**
-     * <code>bool all_active = 2;</code>
-     * @return The allActive.
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
      */
     @java.lang.Override
-    public boolean getAllActive() {
-      return allActive_;
+    public java.util.List<context.ContextOuterClass.DeviceId> getDeviceIdsList() {
+      return deviceIds_;
+    }
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+        getDeviceIdsOrBuilderList() {
+      return deviceIds_;
+    }
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    @java.lang.Override
+    public int getDeviceIdsCount() {
+      return deviceIds_.size();
+    }
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceId getDeviceIds(int index) {
+      return deviceIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.DeviceId device_ids = 2;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdsOrBuilder(
+        int index) {
+      return deviceIds_.get(index);
+    }
+
+    public static final int ENDPOINT_IDS_FIELD_NUMBER = 3;
+    private java.util.List<context.ContextOuterClass.EndPointId> endpointIds_;
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.EndPointId> getEndpointIdsList() {
+      return endpointIds_;
+    }
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+        getEndpointIdsOrBuilderList() {
+      return endpointIds_;
+    }
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public int getEndpointIdsCount() {
+      return endpointIds_.size();
+    }
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointId getEndpointIds(int index) {
+      return endpointIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
+        int index) {
+      return endpointIds_.get(index);
+    }
+
+    public static final int LINK_IDS_FIELD_NUMBER = 4;
+    private java.util.List<context.ContextOuterClass.LinkId> linkIds_;
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
+      return linkIds_;
+    }
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
+        getLinkIdsOrBuilderList() {
+      return linkIds_;
+    }
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    @java.lang.Override
+    public int getLinkIdsCount() {
+      return linkIds_.size();
+    }
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.LinkId getLinkIds(int index) {
+      return linkIds_.get(index);
+    }
+    /**
+     * <code>repeated .context.LinkId link_ids = 4;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
+        int index) {
+      return linkIds_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -63534,11 +68150,17 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (numDisjointPaths_ != 0) {
-        output.writeUInt32(1, numDisjointPaths_);
+      if (isPermanent_ != false) {
+        output.writeBool(1, isPermanent_);
       }
-      if (allActive_ != false) {
-        output.writeBool(2, allActive_);
+      for (int i = 0; i < deviceIds_.size(); i++) {
+        output.writeMessage(2, deviceIds_.get(i));
+      }
+      for (int i = 0; i < endpointIds_.size(); i++) {
+        output.writeMessage(3, endpointIds_.get(i));
+      }
+      for (int i = 0; i < linkIds_.size(); i++) {
+        output.writeMessage(4, linkIds_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -63549,13 +68171,21 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (numDisjointPaths_ != 0) {
+      if (isPermanent_ != false) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(1, numDisjointPaths_);
+          .computeBoolSize(1, isPermanent_);
       }
-      if (allActive_ != false) {
+      for (int i = 0; i < deviceIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeBoolSize(2, allActive_);
+          .computeMessageSize(2, deviceIds_.get(i));
+      }
+      for (int i = 0; i < endpointIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, endpointIds_.get(i));
+      }
+      for (int i = 0; i < linkIds_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, linkIds_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -63567,15 +68197,19 @@ public final class ContextOuterClass {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Availability)) {
+      if (!(obj instanceof context.ContextOuterClass.Constraint_Exclusions)) {
         return super.equals(obj);
       }
-      context.ContextOuterClass.Constraint_SLA_Availability other = (context.ContextOuterClass.Constraint_SLA_Availability) obj;
+      context.ContextOuterClass.Constraint_Exclusions other = (context.ContextOuterClass.Constraint_Exclusions) obj;
 
-      if (getNumDisjointPaths()
-          != other.getNumDisjointPaths()) return false;
-      if (getAllActive()
-          != other.getAllActive()) return false;
+      if (getIsPermanent()
+          != other.getIsPermanent()) return false;
+      if (!getDeviceIdsList()
+          .equals(other.getDeviceIdsList())) return false;
+      if (!getEndpointIdsList()
+          .equals(other.getEndpointIdsList())) return false;
+      if (!getLinkIdsList()
+          .equals(other.getLinkIdsList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -63587,79 +68221,89 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      hash = (37 * hash) + NUM_DISJOINT_PATHS_FIELD_NUMBER;
-      hash = (53 * hash) + getNumDisjointPaths();
-      hash = (37 * hash) + ALL_ACTIVE_FIELD_NUMBER;
+      hash = (37 * hash) + IS_PERMANENT_FIELD_NUMBER;
       hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
-          getAllActive());
+          getIsPermanent());
+      if (getDeviceIdsCount() > 0) {
+        hash = (37 * hash) + DEVICE_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getDeviceIdsList().hashCode();
+      }
+      if (getEndpointIdsCount() > 0) {
+        hash = (37 * hash) + ENDPOINT_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getEndpointIdsList().hashCode();
+      }
+      if (getLinkIdsCount() > 0) {
+        hash = (37 * hash) + LINK_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getLinkIdsList().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(byte[] data)
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseDelimitedFrom(java.io.InputStream input)
+    public static context.ContextOuterClass.Constraint_Exclusions parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseDelimitedFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static context.ContextOuterClass.Constraint_SLA_Availability parseFrom(
+    public static context.ContextOuterClass.Constraint_Exclusions parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -63672,7 +68316,7 @@ public final class ContextOuterClass {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Availability prototype) {
+    public static Builder newBuilder(context.ContextOuterClass.Constraint_Exclusions prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -63688,26 +68332,26 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * Protobuf type {@code context.Constraint_SLA_Availability}
+     * Protobuf type {@code context.Constraint_Exclusions}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Availability)
-        context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder {
+        // @@protoc_insertion_point(builder_implements:context.Constraint_Exclusions)
+        context.ContextOuterClass.Constraint_ExclusionsOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_fieldAccessorTable
+        return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_SLA_Availability.class, context.ContextOuterClass.Constraint_SLA_Availability.Builder.class);
+                context.ContextOuterClass.Constraint_Exclusions.class, context.ContextOuterClass.Constraint_Exclusions.Builder.class);
       }
 
-      // Construct using context.ContextOuterClass.Constraint_SLA_Availability.newBuilder()
+      // Construct using context.ContextOuterClass.Constraint_Exclusions.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -63720,32 +68364,51 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
+          getDeviceIdsFieldBuilder();
+          getEndpointIdsFieldBuilder();
+          getLinkIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        numDisjointPaths_ = 0;
-
-        allActive_ = false;
+        isPermanent_ = false;
 
+        if (deviceIdsBuilder_ == null) {
+          deviceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          deviceIdsBuilder_.clear();
+        }
+        if (endpointIdsBuilder_ == null) {
+          endpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+        } else {
+          endpointIdsBuilder_.clear();
+        }
+        if (linkIdsBuilder_ == null) {
+          linkIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+        } else {
+          linkIdsBuilder_.clear();
+        }
         return this;
       }
 
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Availability_descriptor;
+        return context.ContextOuterClass.internal_static_context_Constraint_Exclusions_descriptor;
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Availability getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
+      public context.ContextOuterClass.Constraint_Exclusions getDefaultInstanceForType() {
+        return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Availability build() {
-        context.ContextOuterClass.Constraint_SLA_Availability result = buildPartial();
+      public context.ContextOuterClass.Constraint_Exclusions build() {
+        context.ContextOuterClass.Constraint_Exclusions result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -63753,10 +68416,37 @@ public final class ContextOuterClass {
       }
 
       @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Availability buildPartial() {
-        context.ContextOuterClass.Constraint_SLA_Availability result = new context.ContextOuterClass.Constraint_SLA_Availability(this);
-        result.numDisjointPaths_ = numDisjointPaths_;
-        result.allActive_ = allActive_;
+      public context.ContextOuterClass.Constraint_Exclusions buildPartial() {
+        context.ContextOuterClass.Constraint_Exclusions result = new context.ContextOuterClass.Constraint_Exclusions(this);
+        int from_bitField0_ = bitField0_;
+        result.isPermanent_ = isPermanent_;
+        if (deviceIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            deviceIds_ = java.util.Collections.unmodifiableList(deviceIds_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.deviceIds_ = deviceIds_;
+        } else {
+          result.deviceIds_ = deviceIdsBuilder_.build();
+        }
+        if (endpointIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000002) != 0)) {
+            endpointIds_ = java.util.Collections.unmodifiableList(endpointIds_);
+            bitField0_ = (bitField0_ & ~0x00000002);
+          }
+          result.endpointIds_ = endpointIds_;
+        } else {
+          result.endpointIds_ = endpointIdsBuilder_.build();
+        }
+        if (linkIdsBuilder_ == null) {
+          if (((bitField0_ & 0x00000004) != 0)) {
+            linkIds_ = java.util.Collections.unmodifiableList(linkIds_);
+            bitField0_ = (bitField0_ & ~0x00000004);
+          }
+          result.linkIds_ = linkIds_;
+        } else {
+          result.linkIds_ = linkIdsBuilder_.build();
+        }
         onBuilt();
         return result;
       }
@@ -63795,21 +68485,96 @@ public final class ContextOuterClass {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_SLA_Availability) {
-          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Availability)other);
+        if (other instanceof context.ContextOuterClass.Constraint_Exclusions) {
+          return mergeFrom((context.ContextOuterClass.Constraint_Exclusions)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
-      }
-
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Availability other) {
-        if (other == context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance()) return this;
-        if (other.getNumDisjointPaths() != 0) {
-          setNumDisjointPaths(other.getNumDisjointPaths());
+      }
+
+      public Builder mergeFrom(context.ContextOuterClass.Constraint_Exclusions other) {
+        if (other == context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance()) return this;
+        if (other.getIsPermanent() != false) {
+          setIsPermanent(other.getIsPermanent());
+        }
+        if (deviceIdsBuilder_ == null) {
+          if (!other.deviceIds_.isEmpty()) {
+            if (deviceIds_.isEmpty()) {
+              deviceIds_ = other.deviceIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureDeviceIdsIsMutable();
+              deviceIds_.addAll(other.deviceIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.deviceIds_.isEmpty()) {
+            if (deviceIdsBuilder_.isEmpty()) {
+              deviceIdsBuilder_.dispose();
+              deviceIdsBuilder_ = null;
+              deviceIds_ = other.deviceIds_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              deviceIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getDeviceIdsFieldBuilder() : null;
+            } else {
+              deviceIdsBuilder_.addAllMessages(other.deviceIds_);
+            }
+          }
+        }
+        if (endpointIdsBuilder_ == null) {
+          if (!other.endpointIds_.isEmpty()) {
+            if (endpointIds_.isEmpty()) {
+              endpointIds_ = other.endpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+            } else {
+              ensureEndpointIdsIsMutable();
+              endpointIds_.addAll(other.endpointIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.endpointIds_.isEmpty()) {
+            if (endpointIdsBuilder_.isEmpty()) {
+              endpointIdsBuilder_.dispose();
+              endpointIdsBuilder_ = null;
+              endpointIds_ = other.endpointIds_;
+              bitField0_ = (bitField0_ & ~0x00000002);
+              endpointIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getEndpointIdsFieldBuilder() : null;
+            } else {
+              endpointIdsBuilder_.addAllMessages(other.endpointIds_);
+            }
+          }
         }
-        if (other.getAllActive() != false) {
-          setAllActive(other.getAllActive());
+        if (linkIdsBuilder_ == null) {
+          if (!other.linkIds_.isEmpty()) {
+            if (linkIds_.isEmpty()) {
+              linkIds_ = other.linkIds_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+            } else {
+              ensureLinkIdsIsMutable();
+              linkIds_.addAll(other.linkIds_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.linkIds_.isEmpty()) {
+            if (linkIdsBuilder_.isEmpty()) {
+              linkIdsBuilder_.dispose();
+              linkIdsBuilder_ = null;
+              linkIds_ = other.linkIds_;
+              bitField0_ = (bitField0_ & ~0x00000004);
+              linkIdsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getLinkIdsFieldBuilder() : null;
+            } else {
+              linkIdsBuilder_.addAllMessages(other.linkIds_);
+            }
+          }
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -63826,11 +68591,11 @@ public final class ContextOuterClass {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        context.ContextOuterClass.Constraint_SLA_Availability parsedMessage = null;
+        context.ContextOuterClass.Constraint_Exclusions parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Availability) e.getUnfinishedMessage();
+          parsedMessage = (context.ContextOuterClass.Constraint_Exclusions) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -63839,784 +68604,757 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
 
-      private int numDisjointPaths_ ;
+      private boolean isPermanent_ ;
       /**
-       * <code>uint32 num_disjoint_paths = 1;</code>
-       * @return The numDisjointPaths.
+       * <code>bool is_permanent = 1;</code>
+       * @return The isPermanent.
        */
       @java.lang.Override
-      public int getNumDisjointPaths() {
-        return numDisjointPaths_;
+      public boolean getIsPermanent() {
+        return isPermanent_;
       }
       /**
-       * <code>uint32 num_disjoint_paths = 1;</code>
-       * @param value The numDisjointPaths to set.
+       * <code>bool is_permanent = 1;</code>
+       * @param value The isPermanent to set.
        * @return This builder for chaining.
        */
-      public Builder setNumDisjointPaths(int value) {
+      public Builder setIsPermanent(boolean value) {
         
-        numDisjointPaths_ = value;
+        isPermanent_ = value;
         onChanged();
         return this;
       }
       /**
-       * <code>uint32 num_disjoint_paths = 1;</code>
+       * <code>bool is_permanent = 1;</code>
        * @return This builder for chaining.
        */
-      public Builder clearNumDisjointPaths() {
+      public Builder clearIsPermanent() {
         
-        numDisjointPaths_ = 0;
+        isPermanent_ = false;
         onChanged();
         return this;
       }
 
-      private boolean allActive_ ;
+      private java.util.List<context.ContextOuterClass.DeviceId> deviceIds_ =
+        java.util.Collections.emptyList();
+      private void ensureDeviceIdsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          deviceIds_ = new java.util.ArrayList<context.ContextOuterClass.DeviceId>(deviceIds_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> deviceIdsBuilder_;
+
       /**
-       * <code>bool all_active = 2;</code>
-       * @return The allActive.
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
        */
-      @java.lang.Override
-      public boolean getAllActive() {
-        return allActive_;
+      public java.util.List<context.ContextOuterClass.DeviceId> getDeviceIdsList() {
+        if (deviceIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(deviceIds_);
+        } else {
+          return deviceIdsBuilder_.getMessageList();
+        }
       }
       /**
-       * <code>bool all_active = 2;</code>
-       * @param value The allActive to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
        */
-      public Builder setAllActive(boolean value) {
-        
-        allActive_ = value;
-        onChanged();
+      public int getDeviceIdsCount() {
+        if (deviceIdsBuilder_ == null) {
+          return deviceIds_.size();
+        } else {
+          return deviceIdsBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceId getDeviceIds(int index) {
+        if (deviceIdsBuilder_ == null) {
+          return deviceIds_.get(index);
+        } else {
+          return deviceIdsBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder setDeviceIds(
+          int index, context.ContextOuterClass.DeviceId value) {
+        if (deviceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceIdsIsMutable();
+          deviceIds_.set(index, value);
+          onChanged();
+        } else {
+          deviceIdsBuilder_.setMessage(index, value);
+        }
         return this;
       }
       /**
-       * <code>bool all_active = 2;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
        */
-      public Builder clearAllActive() {
-        
-        allActive_ = false;
-        onChanged();
+      public Builder setDeviceIds(
+          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceIdsBuilder_ == null) {
+          ensureDeviceIdsIsMutable();
+          deviceIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          deviceIdsBuilder_.setMessage(index, builderForValue.build());
+        }
         return this;
       }
-      @java.lang.Override
-      public final Builder setUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.setUnknownFields(unknownFields);
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder addDeviceIds(context.ContextOuterClass.DeviceId value) {
+        if (deviceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceIdsIsMutable();
+          deviceIds_.add(value);
+          onChanged();
+        } else {
+          deviceIdsBuilder_.addMessage(value);
+        }
+        return this;
       }
-
-      @java.lang.Override
-      public final Builder mergeUnknownFields(
-          final com.google.protobuf.UnknownFieldSet unknownFields) {
-        return super.mergeUnknownFields(unknownFields);
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder addDeviceIds(
+          int index, context.ContextOuterClass.DeviceId value) {
+        if (deviceIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureDeviceIdsIsMutable();
+          deviceIds_.add(index, value);
+          onChanged();
+        } else {
+          deviceIdsBuilder_.addMessage(index, value);
+        }
+        return this;
       }
-
-
-      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Availability)
-    }
-
-    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Availability)
-    private static final context.ContextOuterClass.Constraint_SLA_Availability DEFAULT_INSTANCE;
-    static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Availability();
-    }
-
-    public static context.ContextOuterClass.Constraint_SLA_Availability getDefaultInstance() {
-      return DEFAULT_INSTANCE;
-    }
-
-    private static final com.google.protobuf.Parser<Constraint_SLA_Availability>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Availability>() {
-      @java.lang.Override
-      public Constraint_SLA_Availability parsePartialFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_SLA_Availability(input, extensionRegistry);
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder addDeviceIds(
+          context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceIdsBuilder_ == null) {
+          ensureDeviceIdsIsMutable();
+          deviceIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          deviceIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
-    };
-
-    public static com.google.protobuf.Parser<Constraint_SLA_Availability> parser() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_SLA_Availability> getParserForType() {
-      return PARSER;
-    }
-
-    @java.lang.Override
-    public context.ContextOuterClass.Constraint_SLA_Availability getDefaultInstanceForType() {
-      return DEFAULT_INSTANCE;
-    }
-
-  }
-
-  public interface Constraint_SLA_Isolation_levelOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:context.Constraint_SLA_Isolation_level)
-      com.google.protobuf.MessageOrBuilder {
-
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @return A list containing the isolationLevel.
-     */
-    java.util.List<context.ContextOuterClass.IsolationLevelEnum> getIsolationLevelList();
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @return The count of isolationLevel.
-     */
-    int getIsolationLevelCount();
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @param index The index of the element to return.
-     * @return The isolationLevel at the given index.
-     */
-    context.ContextOuterClass.IsolationLevelEnum getIsolationLevel(int index);
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @return A list containing the enum numeric values on the wire for isolationLevel.
-     */
-    java.util.List<java.lang.Integer>
-    getIsolationLevelValueList();
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @param index The index of the value to return.
-     * @return The enum numeric value on the wire of isolationLevel at the given index.
-     */
-    int getIsolationLevelValue(int index);
-  }
-  /**
-   * Protobuf type {@code context.Constraint_SLA_Isolation_level}
-   */
-  public static final class Constraint_SLA_Isolation_level extends
-      com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:context.Constraint_SLA_Isolation_level)
-      Constraint_SLA_Isolation_levelOrBuilder {
-  private static final long serialVersionUID = 0L;
-    // Use Constraint_SLA_Isolation_level.newBuilder() to construct.
-    private Constraint_SLA_Isolation_level(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
-      super(builder);
-    }
-    private Constraint_SLA_Isolation_level() {
-      isolationLevel_ = java.util.Collections.emptyList();
-    }
-
-    @java.lang.Override
-    @SuppressWarnings({"unused"})
-    protected java.lang.Object newInstance(
-        UnusedPrivateParameter unused) {
-      return new Constraint_SLA_Isolation_level();
-    }
-
-    @java.lang.Override
-    public final com.google.protobuf.UnknownFieldSet
-    getUnknownFields() {
-      return this.unknownFields;
-    }
-    private Constraint_SLA_Isolation_level(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      this();
-      if (extensionRegistry == null) {
-        throw new java.lang.NullPointerException();
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder addDeviceIds(
+          int index, context.ContextOuterClass.DeviceId.Builder builderForValue) {
+        if (deviceIdsBuilder_ == null) {
+          ensureDeviceIdsIsMutable();
+          deviceIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          deviceIdsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
       }
-      int mutable_bitField0_ = 0;
-      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
-          com.google.protobuf.UnknownFieldSet.newBuilder();
-      try {
-        boolean done = false;
-        while (!done) {
-          int tag = input.readTag();
-          switch (tag) {
-            case 0:
-              done = true;
-              break;
-            case 8: {
-              int rawValue = input.readEnum();
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                isolationLevel_ = new java.util.ArrayList<java.lang.Integer>();
-                mutable_bitField0_ |= 0x00000001;
-              }
-              isolationLevel_.add(rawValue);
-              break;
-            }
-            case 10: {
-              int length = input.readRawVarint32();
-              int oldLimit = input.pushLimit(length);
-              while(input.getBytesUntilLimit() > 0) {
-                int rawValue = input.readEnum();
-                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                  isolationLevel_ = new java.util.ArrayList<java.lang.Integer>();
-                  mutable_bitField0_ |= 0x00000001;
-                }
-                isolationLevel_.add(rawValue);
-              }
-              input.popLimit(oldLimit);
-              break;
-            }
-            default: {
-              if (!parseUnknownField(
-                  input, unknownFields, extensionRegistry, tag)) {
-                done = true;
-              }
-              break;
-            }
-          }
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder addAllDeviceIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.DeviceId> values) {
+        if (deviceIdsBuilder_ == null) {
+          ensureDeviceIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, deviceIds_);
+          onChanged();
+        } else {
+          deviceIdsBuilder_.addAllMessages(values);
         }
-      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(this);
-      } catch (java.io.IOException e) {
-        throw new com.google.protobuf.InvalidProtocolBufferException(
-            e).setUnfinishedMessage(this);
-      } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
+        return this;
+      }
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder clearDeviceIds() {
+        if (deviceIdsBuilder_ == null) {
+          deviceIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          deviceIdsBuilder_.clear();
         }
-        this.unknownFields = unknownFields.build();
-        makeExtensionsImmutable();
+        return this;
       }
-    }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
-    }
-
-    @java.lang.Override
-    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-        internalGetFieldAccessorTable() {
-      return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable
-          .ensureFieldAccessorsInitialized(
-              context.ContextOuterClass.Constraint_SLA_Isolation_level.class, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder.class);
-    }
-
-    public static final int ISOLATION_LEVEL_FIELD_NUMBER = 1;
-    private java.util.List<java.lang.Integer> isolationLevel_;
-    private static final com.google.protobuf.Internal.ListAdapter.Converter<
-        java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum> isolationLevel_converter_ =
-            new com.google.protobuf.Internal.ListAdapter.Converter<
-                java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum>() {
-              public context.ContextOuterClass.IsolationLevelEnum convert(java.lang.Integer from) {
-                @SuppressWarnings("deprecation")
-                context.ContextOuterClass.IsolationLevelEnum result = context.ContextOuterClass.IsolationLevelEnum.valueOf(from);
-                return result == null ? context.ContextOuterClass.IsolationLevelEnum.UNRECOGNIZED : result;
-              }
-            };
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @return A list containing the isolationLevel.
-     */
-    @java.lang.Override
-    public java.util.List<context.ContextOuterClass.IsolationLevelEnum> getIsolationLevelList() {
-      return new com.google.protobuf.Internal.ListAdapter<
-          java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum>(isolationLevel_, isolationLevel_converter_);
-    }
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @return The count of isolationLevel.
-     */
-    @java.lang.Override
-    public int getIsolationLevelCount() {
-      return isolationLevel_.size();
-    }
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @param index The index of the element to return.
-     * @return The isolationLevel at the given index.
-     */
-    @java.lang.Override
-    public context.ContextOuterClass.IsolationLevelEnum getIsolationLevel(int index) {
-      return isolationLevel_converter_.convert(isolationLevel_.get(index));
-    }
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @return A list containing the enum numeric values on the wire for isolationLevel.
-     */
-    @java.lang.Override
-    public java.util.List<java.lang.Integer>
-    getIsolationLevelValueList() {
-      return isolationLevel_;
-    }
-    /**
-     * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-     * @param index The index of the value to return.
-     * @return The enum numeric value on the wire of isolationLevel at the given index.
-     */
-    @java.lang.Override
-    public int getIsolationLevelValue(int index) {
-      return isolationLevel_.get(index);
-    }
-    private int isolationLevelMemoizedSerializedSize;
-
-    private byte memoizedIsInitialized = -1;
-    @java.lang.Override
-    public final boolean isInitialized() {
-      byte isInitialized = memoizedIsInitialized;
-      if (isInitialized == 1) return true;
-      if (isInitialized == 0) return false;
-
-      memoizedIsInitialized = 1;
-      return true;
-    }
-
-    @java.lang.Override
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      getSerializedSize();
-      if (getIsolationLevelList().size() > 0) {
-        output.writeUInt32NoTag(10);
-        output.writeUInt32NoTag(isolationLevelMemoizedSerializedSize);
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public Builder removeDeviceIds(int index) {
+        if (deviceIdsBuilder_ == null) {
+          ensureDeviceIdsIsMutable();
+          deviceIds_.remove(index);
+          onChanged();
+        } else {
+          deviceIdsBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder getDeviceIdsBuilder(
+          int index) {
+        return getDeviceIdsFieldBuilder().getBuilder(index);
       }
-      for (int i = 0; i < isolationLevel_.size(); i++) {
-        output.writeEnumNoTag(isolationLevel_.get(i));
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceIdOrBuilder getDeviceIdsOrBuilder(
+          int index) {
+        if (deviceIdsBuilder_ == null) {
+          return deviceIds_.get(index);  } else {
+          return deviceIdsBuilder_.getMessageOrBuilder(index);
+        }
       }
-      unknownFields.writeTo(output);
-    }
-
-    @java.lang.Override
-    public int getSerializedSize() {
-      int size = memoizedSize;
-      if (size != -1) return size;
-
-      size = 0;
-      {
-        int dataSize = 0;
-        for (int i = 0; i < isolationLevel_.size(); i++) {
-          dataSize += com.google.protobuf.CodedOutputStream
-            .computeEnumSizeNoTag(isolationLevel_.get(i));
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.DeviceIdOrBuilder> 
+           getDeviceIdsOrBuilderList() {
+        if (deviceIdsBuilder_ != null) {
+          return deviceIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(deviceIds_);
         }
-        size += dataSize;
-        if (!getIsolationLevelList().isEmpty()) {  size += 1;
-          size += com.google.protobuf.CodedOutputStream
-            .computeUInt32SizeNoTag(dataSize);
-        }isolationLevelMemoizedSerializedSize = dataSize;
       }
-      size += unknownFields.getSerializedSize();
-      memoizedSize = size;
-      return size;
-    }
-
-    @java.lang.Override
-    public boolean equals(final java.lang.Object obj) {
-      if (obj == this) {
-       return true;
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder addDeviceIdsBuilder() {
+        return getDeviceIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.DeviceId.getDefaultInstance());
       }
-      if (!(obj instanceof context.ContextOuterClass.Constraint_SLA_Isolation_level)) {
-        return super.equals(obj);
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public context.ContextOuterClass.DeviceId.Builder addDeviceIdsBuilder(
+          int index) {
+        return getDeviceIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.DeviceId.getDefaultInstance());
       }
-      context.ContextOuterClass.Constraint_SLA_Isolation_level other = (context.ContextOuterClass.Constraint_SLA_Isolation_level) obj;
-
-      if (!isolationLevel_.equals(other.isolationLevel_)) return false;
-      if (!unknownFields.equals(other.unknownFields)) return false;
-      return true;
-    }
-
-    @java.lang.Override
-    public int hashCode() {
-      if (memoizedHashCode != 0) {
-        return memoizedHashCode;
+      /**
+       * <code>repeated .context.DeviceId device_ids = 2;</code>
+       */
+      public java.util.List<context.ContextOuterClass.DeviceId.Builder> 
+           getDeviceIdsBuilderList() {
+        return getDeviceIdsFieldBuilder().getBuilderList();
       }
-      int hash = 41;
-      hash = (19 * hash) + getDescriptor().hashCode();
-      if (getIsolationLevelCount() > 0) {
-        hash = (37 * hash) + ISOLATION_LEVEL_FIELD_NUMBER;
-        hash = (53 * hash) + isolationLevel_.hashCode();
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder> 
+          getDeviceIdsFieldBuilder() {
+        if (deviceIdsBuilder_ == null) {
+          deviceIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.DeviceId, context.ContextOuterClass.DeviceId.Builder, context.ContextOuterClass.DeviceIdOrBuilder>(
+                  deviceIds_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          deviceIds_ = null;
+        }
+        return deviceIdsBuilder_;
       }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
 
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        java.nio.ByteBuffer data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        java.nio.ByteBuffer data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        com.google.protobuf.ByteString data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        com.google.protobuf.ByteString data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(byte[] data)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        byte[] data,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws com.google.protobuf.InvalidProtocolBufferException {
-      return PARSER.parseFrom(data, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseDelimitedFrom(java.io.InputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseDelimitedFrom(
-        java.io.InputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        com.google.protobuf.CodedInputStream input)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input);
-    }
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level parseFrom(
-        com.google.protobuf.CodedInputStream input,
-        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-        throws java.io.IOException {
-      return com.google.protobuf.GeneratedMessageV3
-          .parseWithIOException(PARSER, input, extensionRegistry);
-    }
+      private java.util.List<context.ContextOuterClass.EndPointId> endpointIds_ =
+        java.util.Collections.emptyList();
+      private void ensureEndpointIdsIsMutable() {
+        if (!((bitField0_ & 0x00000002) != 0)) {
+          endpointIds_ = new java.util.ArrayList<context.ContextOuterClass.EndPointId>(endpointIds_);
+          bitField0_ |= 0x00000002;
+         }
+      }
 
-    @java.lang.Override
-    public Builder newBuilderForType() { return newBuilder(); }
-    public static Builder newBuilder() {
-      return DEFAULT_INSTANCE.toBuilder();
-    }
-    public static Builder newBuilder(context.ContextOuterClass.Constraint_SLA_Isolation_level prototype) {
-      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
-    }
-    @java.lang.Override
-    public Builder toBuilder() {
-      return this == DEFAULT_INSTANCE
-          ? new Builder() : new Builder().mergeFrom(this);
-    }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> endpointIdsBuilder_;
 
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code context.Constraint_SLA_Isolation_level}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.Constraint_SLA_Isolation_level)
-        context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId> getEndpointIdsList() {
+        if (endpointIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(endpointIds_);
+        } else {
+          return endpointIdsBuilder_.getMessageList();
+        }
       }
-
-      @java.lang.Override
-      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-          internalGetFieldAccessorTable() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable
-            .ensureFieldAccessorsInitialized(
-                context.ContextOuterClass.Constraint_SLA_Isolation_level.class, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder.class);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public int getEndpointIdsCount() {
+        if (endpointIdsBuilder_ == null) {
+          return endpointIds_.size();
+        } else {
+          return endpointIdsBuilder_.getCount();
+        }
       }
-
-      // Construct using context.ContextOuterClass.Constraint_SLA_Isolation_level.newBuilder()
-      private Builder() {
-        maybeForceBuilderInitialization();
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId getEndpointIds(int index) {
+        if (endpointIdsBuilder_ == null) {
+          return endpointIds_.get(index);
+        } else {
+          return endpointIdsBuilder_.getMessage(index);
+        }
       }
-
-      private Builder(
-          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-        super(parent);
-        maybeForceBuilderInitialization();
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder setEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (endpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEndpointIdsIsMutable();
+          endpointIds_.set(index, value);
+          onChanged();
+        } else {
+          endpointIdsBuilder_.setMessage(index, value);
+        }
+        return this;
       }
-      private void maybeForceBuilderInitialization() {
-        if (com.google.protobuf.GeneratedMessageV3
-                .alwaysUseFieldBuilders) {
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder setEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          endpointIdsBuilder_.setMessage(index, builderForValue.build());
         }
+        return this;
       }
-      @java.lang.Override
-      public Builder clear() {
-        super.clear();
-        isolationLevel_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000001);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder addEndpointIds(context.ContextOuterClass.EndPointId value) {
+        if (endpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(value);
+          onChanged();
+        } else {
+          endpointIdsBuilder_.addMessage(value);
+        }
         return this;
       }
-
-      @java.lang.Override
-      public com.google.protobuf.Descriptors.Descriptor
-          getDescriptorForType() {
-        return context.ContextOuterClass.internal_static_context_Constraint_SLA_Isolation_level_descriptor;
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder addEndpointIds(
+          int index, context.ContextOuterClass.EndPointId value) {
+        if (endpointIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(index, value);
+          onChanged();
+        } else {
+          endpointIdsBuilder_.addMessage(index, value);
+        }
+        return this;
       }
-
-      @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Isolation_level getDefaultInstanceForType() {
-        return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder addEndpointIds(
+          context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          endpointIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
-
-      @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Isolation_level build() {
-        context.ContextOuterClass.Constraint_SLA_Isolation_level result = buildPartial();
-        if (!result.isInitialized()) {
-          throw newUninitializedMessageException(result);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder addEndpointIds(
+          int index, context.ContextOuterClass.EndPointId.Builder builderForValue) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          endpointIdsBuilder_.addMessage(index, builderForValue.build());
         }
-        return result;
+        return this;
       }
-
-      @java.lang.Override
-      public context.ContextOuterClass.Constraint_SLA_Isolation_level buildPartial() {
-        context.ContextOuterClass.Constraint_SLA_Isolation_level result = new context.ContextOuterClass.Constraint_SLA_Isolation_level(this);
-        int from_bitField0_ = bitField0_;
-        if (((bitField0_ & 0x00000001) != 0)) {
-          isolationLevel_ = java.util.Collections.unmodifiableList(isolationLevel_);
-          bitField0_ = (bitField0_ & ~0x00000001);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder addAllEndpointIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.EndPointId> values) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, endpointIds_);
+          onChanged();
+        } else {
+          endpointIdsBuilder_.addAllMessages(values);
         }
-        result.isolationLevel_ = isolationLevel_;
-        onBuilt();
-        return result;
+        return this;
       }
-
-      @java.lang.Override
-      public Builder clone() {
-        return super.clone();
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder clearEndpointIds() {
+        if (endpointIdsBuilder_ == null) {
+          endpointIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000002);
+          onChanged();
+        } else {
+          endpointIdsBuilder_.clear();
+        }
+        return this;
       }
-      @java.lang.Override
-      public Builder setField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          java.lang.Object value) {
-        return super.setField(field, value);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public Builder removeEndpointIds(int index) {
+        if (endpointIdsBuilder_ == null) {
+          ensureEndpointIdsIsMutable();
+          endpointIds_.remove(index);
+          onChanged();
+        } else {
+          endpointIdsBuilder_.remove(index);
+        }
+        return this;
       }
-      @java.lang.Override
-      public Builder clearField(
-          com.google.protobuf.Descriptors.FieldDescriptor field) {
-        return super.clearField(field);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder getEndpointIdsBuilder(
+          int index) {
+        return getEndpointIdsFieldBuilder().getBuilder(index);
       }
-      @java.lang.Override
-      public Builder clearOneof(
-          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
-        return super.clearOneof(oneof);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointIdOrBuilder getEndpointIdsOrBuilder(
+          int index) {
+        if (endpointIdsBuilder_ == null) {
+          return endpointIds_.get(index);  } else {
+          return endpointIdsBuilder_.getMessageOrBuilder(index);
+        }
       }
-      @java.lang.Override
-      public Builder setRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          int index, java.lang.Object value) {
-        return super.setRepeatedField(field, index, value);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public java.util.List<? extends context.ContextOuterClass.EndPointIdOrBuilder> 
+           getEndpointIdsOrBuilderList() {
+        if (endpointIdsBuilder_ != null) {
+          return endpointIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(endpointIds_);
+        }
       }
-      @java.lang.Override
-      public Builder addRepeatedField(
-          com.google.protobuf.Descriptors.FieldDescriptor field,
-          java.lang.Object value) {
-        return super.addRepeatedField(field, value);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addEndpointIdsBuilder() {
+        return getEndpointIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.EndPointId.getDefaultInstance());
       }
-      @java.lang.Override
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.Constraint_SLA_Isolation_level) {
-          return mergeFrom((context.ContextOuterClass.Constraint_SLA_Isolation_level)other);
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public context.ContextOuterClass.EndPointId.Builder addEndpointIdsBuilder(
+          int index) {
+        return getEndpointIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.EndPointId.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .context.EndPointId endpoint_ids = 3;</code>
+       */
+      public java.util.List<context.ContextOuterClass.EndPointId.Builder> 
+           getEndpointIdsBuilderList() {
+        return getEndpointIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder> 
+          getEndpointIdsFieldBuilder() {
+        if (endpointIdsBuilder_ == null) {
+          endpointIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.EndPointId, context.ContextOuterClass.EndPointId.Builder, context.ContextOuterClass.EndPointIdOrBuilder>(
+                  endpointIds_,
+                  ((bitField0_ & 0x00000002) != 0),
+                  getParentForChildren(),
+                  isClean());
+          endpointIds_ = null;
+        }
+        return endpointIdsBuilder_;
+      }
+
+      private java.util.List<context.ContextOuterClass.LinkId> linkIds_ =
+        java.util.Collections.emptyList();
+      private void ensureLinkIdsIsMutable() {
+        if (!((bitField0_ & 0x00000004) != 0)) {
+          linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>(linkIds_);
+          bitField0_ |= 0x00000004;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdsBuilder_;
+
+      /**
+       * <code>repeated .context.LinkId link_ids = 4;</code>
+       */
+      public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
+        if (linkIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(linkIds_);
+        } else {
+          return linkIdsBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .context.LinkId link_ids = 4;</code>
+       */
+      public int getLinkIdsCount() {
+        if (linkIdsBuilder_ == null) {
+          return linkIds_.size();
+        } else {
+          return linkIdsBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .context.LinkId link_ids = 4;</code>
+       */
+      public context.ContextOuterClass.LinkId getLinkIds(int index) {
+        if (linkIdsBuilder_ == null) {
+          return linkIds_.get(index);
         } else {
-          super.mergeFrom(other);
-          return this;
+          return linkIdsBuilder_.getMessage(index);
         }
       }
-
-      public Builder mergeFrom(context.ContextOuterClass.Constraint_SLA_Isolation_level other) {
-        if (other == context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance()) return this;
-        if (!other.isolationLevel_.isEmpty()) {
-          if (isolationLevel_.isEmpty()) {
-            isolationLevel_ = other.isolationLevel_;
-            bitField0_ = (bitField0_ & ~0x00000001);
-          } else {
-            ensureIsolationLevelIsMutable();
-            isolationLevel_.addAll(other.isolationLevel_);
+      /**
+       * <code>repeated .context.LinkId link_ids = 4;</code>
+       */
+      public Builder setLinkIds(
+          int index, context.ContextOuterClass.LinkId value) {
+        if (linkIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
           }
+          ensureLinkIdsIsMutable();
+          linkIds_.set(index, value);
           onChanged();
+        } else {
+          linkIdsBuilder_.setMessage(index, value);
         }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
         return this;
       }
-
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.Constraint_SLA_Isolation_level parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Constraint_SLA_Isolation_level) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
+      /**
+       * <code>repeated .context.LinkId link_ids = 4;</code>
+       */
+      public Builder setLinkIds(
+          int index, context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          linkIdsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
-      private int bitField0_;
-
-      private java.util.List<java.lang.Integer> isolationLevel_ =
-        java.util.Collections.emptyList();
-      private void ensureIsolationLevelIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          isolationLevel_ = new java.util.ArrayList<java.lang.Integer>(isolationLevel_);
-          bitField0_ |= 0x00000001;
+      /**
+       * <code>repeated .context.LinkId link_ids = 4;</code>
+       */
+      public Builder addLinkIds(context.ContextOuterClass.LinkId value) {
+        if (linkIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureLinkIdsIsMutable();
+          linkIds_.add(value);
+          onChanged();
+        } else {
+          linkIdsBuilder_.addMessage(value);
         }
+        return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @return A list containing the isolationLevel.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public java.util.List<context.ContextOuterClass.IsolationLevelEnum> getIsolationLevelList() {
-        return new com.google.protobuf.Internal.ListAdapter<
-            java.lang.Integer, context.ContextOuterClass.IsolationLevelEnum>(isolationLevel_, isolationLevel_converter_);
+      public Builder addLinkIds(
+          int index, context.ContextOuterClass.LinkId value) {
+        if (linkIdsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureLinkIdsIsMutable();
+          linkIds_.add(index, value);
+          onChanged();
+        } else {
+          linkIdsBuilder_.addMessage(index, value);
+        }
+        return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @return The count of isolationLevel.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public int getIsolationLevelCount() {
-        return isolationLevel_.size();
+      public Builder addLinkIds(
+          context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.add(builderForValue.build());
+          onChanged();
+        } else {
+          linkIdsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param index The index of the element to return.
-       * @return The isolationLevel at the given index.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public context.ContextOuterClass.IsolationLevelEnum getIsolationLevel(int index) {
-        return isolationLevel_converter_.convert(isolationLevel_.get(index));
+      public Builder addLinkIds(
+          int index, context.ContextOuterClass.LinkId.Builder builderForValue) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          linkIdsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param index The index to set the value at.
-       * @param value The isolationLevel to set.
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder setIsolationLevel(
-          int index, context.ContextOuterClass.IsolationLevelEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
+      public Builder addAllLinkIds(
+          java.lang.Iterable<? extends context.ContextOuterClass.LinkId> values) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, linkIds_);
+          onChanged();
+        } else {
+          linkIdsBuilder_.addAllMessages(values);
         }
-        ensureIsolationLevelIsMutable();
-        isolationLevel_.set(index, value.getNumber());
-        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param value The isolationLevel to add.
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder addIsolationLevel(context.ContextOuterClass.IsolationLevelEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
+      public Builder clearLinkIds() {
+        if (linkIdsBuilder_ == null) {
+          linkIds_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000004);
+          onChanged();
+        } else {
+          linkIdsBuilder_.clear();
         }
-        ensureIsolationLevelIsMutable();
-        isolationLevel_.add(value.getNumber());
-        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param values The isolationLevel to add.
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder addAllIsolationLevel(
-          java.lang.Iterable<? extends context.ContextOuterClass.IsolationLevelEnum> values) {
-        ensureIsolationLevelIsMutable();
-        for (context.ContextOuterClass.IsolationLevelEnum value : values) {
-          isolationLevel_.add(value.getNumber());
+      public Builder removeLinkIds(int index) {
+        if (linkIdsBuilder_ == null) {
+          ensureLinkIdsIsMutable();
+          linkIds_.remove(index);
+          onChanged();
+        } else {
+          linkIdsBuilder_.remove(index);
         }
-        onChanged();
         return this;
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder clearIsolationLevel() {
-        isolationLevel_ = java.util.Collections.emptyList();
-        bitField0_ = (bitField0_ & ~0x00000001);
-        onChanged();
-        return this;
+      public context.ContextOuterClass.LinkId.Builder getLinkIdsBuilder(
+          int index) {
+        return getLinkIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @return A list containing the enum numeric values on the wire for isolationLevel.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public java.util.List<java.lang.Integer>
-      getIsolationLevelValueList() {
-        return java.util.Collections.unmodifiableList(isolationLevel_);
+      public context.ContextOuterClass.LinkIdOrBuilder getLinkIdsOrBuilder(
+          int index) {
+        if (linkIdsBuilder_ == null) {
+          return linkIds_.get(index);  } else {
+          return linkIdsBuilder_.getMessageOrBuilder(index);
+        }
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param index The index of the value to return.
-       * @return The enum numeric value on the wire of isolationLevel at the given index.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public int getIsolationLevelValue(int index) {
-        return isolationLevel_.get(index);
+      public java.util.List<? extends context.ContextOuterClass.LinkIdOrBuilder> 
+           getLinkIdsOrBuilderList() {
+        if (linkIdsBuilder_ != null) {
+          return linkIdsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(linkIds_);
+        }
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param index The index of the value to return.
-       * @return The enum numeric value on the wire of isolationLevel at the given index.
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder setIsolationLevelValue(
-          int index, int value) {
-        ensureIsolationLevelIsMutable();
-        isolationLevel_.set(index, value);
-        onChanged();
-        return this;
+      public context.ContextOuterClass.LinkId.Builder addLinkIdsBuilder() {
+        return getLinkIdsFieldBuilder().addBuilder(
+            context.ContextOuterClass.LinkId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param value The enum numeric value on the wire for isolationLevel to add.
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder addIsolationLevelValue(int value) {
-        ensureIsolationLevelIsMutable();
-        isolationLevel_.add(value);
-        onChanged();
-        return this;
+      public context.ContextOuterClass.LinkId.Builder addLinkIdsBuilder(
+          int index) {
+        return getLinkIdsFieldBuilder().addBuilder(
+            index, context.ContextOuterClass.LinkId.getDefaultInstance());
       }
       /**
-       * <code>repeated .context.IsolationLevelEnum isolation_level = 1;</code>
-       * @param values The enum numeric values on the wire for isolationLevel to add.
-       * @return This builder for chaining.
+       * <code>repeated .context.LinkId link_ids = 4;</code>
        */
-      public Builder addAllIsolationLevelValue(
-          java.lang.Iterable<java.lang.Integer> values) {
-        ensureIsolationLevelIsMutable();
-        for (int value : values) {
-          isolationLevel_.add(value);
+      public java.util.List<context.ContextOuterClass.LinkId.Builder> 
+           getLinkIdsBuilderList() {
+        return getLinkIdsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> 
+          getLinkIdsFieldBuilder() {
+        if (linkIdsBuilder_ == null) {
+          linkIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder>(
+                  linkIds_,
+                  ((bitField0_ & 0x00000004) != 0),
+                  getParentForChildren(),
+                  isClean());
+          linkIds_ = null;
         }
-        onChanged();
-        return this;
+        return linkIdsBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -64631,41 +69369,41 @@ public final class ContextOuterClass {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:context.Constraint_SLA_Isolation_level)
+      // @@protoc_insertion_point(builder_scope:context.Constraint_Exclusions)
     }
 
-    // @@protoc_insertion_point(class_scope:context.Constraint_SLA_Isolation_level)
-    private static final context.ContextOuterClass.Constraint_SLA_Isolation_level DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:context.Constraint_Exclusions)
+    private static final context.ContextOuterClass.Constraint_Exclusions DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_SLA_Isolation_level();
+      DEFAULT_INSTANCE = new context.ContextOuterClass.Constraint_Exclusions();
     }
 
-    public static context.ContextOuterClass.Constraint_SLA_Isolation_level getDefaultInstance() {
+    public static context.ContextOuterClass.Constraint_Exclusions getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<Constraint_SLA_Isolation_level>
-        PARSER = new com.google.protobuf.AbstractParser<Constraint_SLA_Isolation_level>() {
+    private static final com.google.protobuf.Parser<Constraint_Exclusions>
+        PARSER = new com.google.protobuf.AbstractParser<Constraint_Exclusions>() {
       @java.lang.Override
-      public Constraint_SLA_Isolation_level parsePartialFrom(
+      public Constraint_Exclusions parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new Constraint_SLA_Isolation_level(input, extensionRegistry);
+        return new Constraint_Exclusions(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<Constraint_SLA_Isolation_level> parser() {
+    public static com.google.protobuf.Parser<Constraint_Exclusions> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<Constraint_SLA_Isolation_level> getParserForType() {
+    public com.google.protobuf.Parser<Constraint_Exclusions> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public context.ContextOuterClass.Constraint_SLA_Isolation_level getDefaultInstanceForType() {
+    public context.ContextOuterClass.Constraint_Exclusions getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -64676,125 +69414,151 @@ public final class ContextOuterClass {
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The enum numeric value on the wire for action.
+     */
+    int getActionValue();
+    /**
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The action.
+     */
+    context.ContextOuterClass.ConstraintActionEnum getAction();
+
+    /**
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return Whether the custom field is set.
      */
     boolean hasCustom();
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return The custom.
      */
     context.ContextOuterClass.Constraint_Custom getCustom();
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      */
     context.ContextOuterClass.Constraint_CustomOrBuilder getCustomOrBuilder();
 
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return Whether the schedule field is set.
      */
     boolean hasSchedule();
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return The schedule.
      */
     context.ContextOuterClass.Constraint_Schedule getSchedule();
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      */
     context.ContextOuterClass.Constraint_ScheduleOrBuilder getScheduleOrBuilder();
 
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return Whether the endpointLocation field is set.
      */
     boolean hasEndpointLocation();
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return The endpointLocation.
      */
     context.ContextOuterClass.Constraint_EndPointLocation getEndpointLocation();
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      */
     context.ContextOuterClass.Constraint_EndPointLocationOrBuilder getEndpointLocationOrBuilder();
 
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return Whether the endpointPriority field is set.
      */
     boolean hasEndpointPriority();
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return The endpointPriority.
      */
     context.ContextOuterClass.Constraint_EndPointPriority getEndpointPriority();
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      */
     context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder getEndpointPriorityOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return Whether the slaCapacity field is set.
      */
     boolean hasSlaCapacity();
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return The slaCapacity.
      */
     context.ContextOuterClass.Constraint_SLA_Capacity getSlaCapacity();
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      */
     context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder getSlaCapacityOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return Whether the slaLatency field is set.
      */
     boolean hasSlaLatency();
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return The slaLatency.
      */
     context.ContextOuterClass.Constraint_SLA_Latency getSlaLatency();
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      */
     context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder getSlaLatencyOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return Whether the slaAvailability field is set.
      */
     boolean hasSlaAvailability();
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return The slaAvailability.
      */
     context.ContextOuterClass.Constraint_SLA_Availability getSlaAvailability();
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      */
     context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder getSlaAvailabilityOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return Whether the slaIsolation field is set.
      */
     boolean hasSlaIsolation();
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return The slaIsolation.
      */
     context.ContextOuterClass.Constraint_SLA_Isolation_level getSlaIsolation();
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      */
     context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder getSlaIsolationOrBuilder();
 
+    /**
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+     * @return Whether the exclusions field is set.
+     */
+    boolean hasExclusions();
+    /**
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+     * @return The exclusions.
+     */
+    context.ContextOuterClass.Constraint_Exclusions getExclusions();
+    /**
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+     */
+    context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder();
+
     public context.ContextOuterClass.Constraint.ConstraintCase getConstraintCase();
   }
   /**
@@ -64810,6 +69574,7 @@ public final class ContextOuterClass {
       super(builder);
     }
     private Constraint() {
+      action_ = 0;
     }
 
     @java.lang.Override
@@ -64842,9 +69607,15 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
+            case 8: {
+              int rawValue = input.readEnum();
+
+              action_ = rawValue;
+              break;
+            }
+            case 18: {
               context.ContextOuterClass.Constraint_Custom.Builder subBuilder = null;
-              if (constraintCase_ == 1) {
+              if (constraintCase_ == 2) {
                 subBuilder = ((context.ContextOuterClass.Constraint_Custom) constraint_).toBuilder();
               }
               constraint_ =
@@ -64853,12 +69624,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Custom) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 1;
+              constraintCase_ = 2;
               break;
             }
-            case 18: {
+            case 26: {
               context.ContextOuterClass.Constraint_Schedule.Builder subBuilder = null;
-              if (constraintCase_ == 2) {
+              if (constraintCase_ == 3) {
                 subBuilder = ((context.ContextOuterClass.Constraint_Schedule) constraint_).toBuilder();
               }
               constraint_ =
@@ -64867,12 +69638,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Schedule) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 2;
+              constraintCase_ = 3;
               break;
             }
-            case 26: {
+            case 34: {
               context.ContextOuterClass.Constraint_EndPointLocation.Builder subBuilder = null;
-              if (constraintCase_ == 3) {
+              if (constraintCase_ == 4) {
                 subBuilder = ((context.ContextOuterClass.Constraint_EndPointLocation) constraint_).toBuilder();
               }
               constraint_ =
@@ -64881,12 +69652,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 3;
+              constraintCase_ = 4;
               break;
             }
-            case 34: {
+            case 42: {
               context.ContextOuterClass.Constraint_EndPointPriority.Builder subBuilder = null;
-              if (constraintCase_ == 4) {
+              if (constraintCase_ == 5) {
                 subBuilder = ((context.ContextOuterClass.Constraint_EndPointPriority) constraint_).toBuilder();
               }
               constraint_ =
@@ -64895,12 +69666,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 4;
+              constraintCase_ = 5;
               break;
             }
-            case 42: {
+            case 50: {
               context.ContextOuterClass.Constraint_SLA_Capacity.Builder subBuilder = null;
-              if (constraintCase_ == 5) {
+              if (constraintCase_ == 6) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_).toBuilder();
               }
               constraint_ =
@@ -64909,12 +69680,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 5;
+              constraintCase_ = 6;
               break;
             }
-            case 50: {
+            case 58: {
               context.ContextOuterClass.Constraint_SLA_Latency.Builder subBuilder = null;
-              if (constraintCase_ == 6) {
+              if (constraintCase_ == 7) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Latency) constraint_).toBuilder();
               }
               constraint_ =
@@ -64923,12 +69694,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 6;
+              constraintCase_ = 7;
               break;
             }
-            case 58: {
+            case 66: {
               context.ContextOuterClass.Constraint_SLA_Availability.Builder subBuilder = null;
-              if (constraintCase_ == 7) {
+              if (constraintCase_ == 8) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Availability) constraint_).toBuilder();
               }
               constraint_ =
@@ -64937,12 +69708,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 7;
+              constraintCase_ = 8;
               break;
             }
-            case 66: {
+            case 74: {
               context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder subBuilder = null;
-              if (constraintCase_ == 8) {
+              if (constraintCase_ == 9) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_).toBuilder();
               }
               constraint_ =
@@ -64951,7 +69722,21 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 8;
+              constraintCase_ = 9;
+              break;
+            }
+            case 82: {
+              context.ContextOuterClass.Constraint_Exclusions.Builder subBuilder = null;
+              if (constraintCase_ == 10) {
+                subBuilder = ((context.ContextOuterClass.Constraint_Exclusions) constraint_).toBuilder();
+              }
+              constraint_ =
+                  input.readMessage(context.ContextOuterClass.Constraint_Exclusions.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Exclusions) constraint_);
+                constraint_ = subBuilder.buildPartial();
+              }
+              constraintCase_ = 10;
               break;
             }
             default: {
@@ -64991,14 +69776,15 @@ public final class ContextOuterClass {
     public enum ConstraintCase
         implements com.google.protobuf.Internal.EnumLite,
             com.google.protobuf.AbstractMessage.InternalOneOfEnum {
-      CUSTOM(1),
-      SCHEDULE(2),
-      ENDPOINT_LOCATION(3),
-      ENDPOINT_PRIORITY(4),
-      SLA_CAPACITY(5),
-      SLA_LATENCY(6),
-      SLA_AVAILABILITY(7),
-      SLA_ISOLATION(8),
+      CUSTOM(2),
+      SCHEDULE(3),
+      ENDPOINT_LOCATION(4),
+      ENDPOINT_PRIORITY(5),
+      SLA_CAPACITY(6),
+      SLA_LATENCY(7),
+      SLA_AVAILABILITY(8),
+      SLA_ISOLATION(9),
+      EXCLUSIONS(10),
       CONSTRAINT_NOT_SET(0);
       private final int value;
       private ConstraintCase(int value) {
@@ -65016,14 +69802,15 @@ public final class ContextOuterClass {
 
       public static ConstraintCase forNumber(int value) {
         switch (value) {
-          case 1: return CUSTOM;
-          case 2: return SCHEDULE;
-          case 3: return ENDPOINT_LOCATION;
-          case 4: return ENDPOINT_PRIORITY;
-          case 5: return SLA_CAPACITY;
-          case 6: return SLA_LATENCY;
-          case 7: return SLA_AVAILABILITY;
-          case 8: return SLA_ISOLATION;
+          case 2: return CUSTOM;
+          case 3: return SCHEDULE;
+          case 4: return ENDPOINT_LOCATION;
+          case 5: return ENDPOINT_PRIORITY;
+          case 6: return SLA_CAPACITY;
+          case 7: return SLA_LATENCY;
+          case 8: return SLA_AVAILABILITY;
+          case 9: return SLA_ISOLATION;
+          case 10: return EXCLUSIONS;
           case 0: return CONSTRAINT_NOT_SET;
           default: return null;
         }
@@ -65039,254 +69826,304 @@ public final class ContextOuterClass {
           constraintCase_);
     }
 
-    public static final int CUSTOM_FIELD_NUMBER = 1;
+    public static final int ACTION_FIELD_NUMBER = 1;
+    private int action_;
+    /**
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The enum numeric value on the wire for action.
+     */
+    @java.lang.Override public int getActionValue() {
+      return action_;
+    }
+    /**
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The action.
+     */
+    @java.lang.Override public context.ContextOuterClass.ConstraintActionEnum getAction() {
+      @SuppressWarnings("deprecation")
+      context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
+      return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
+    }
+
+    public static final int CUSTOM_FIELD_NUMBER = 2;
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return Whether the custom field is set.
      */
     @java.lang.Override
     public boolean hasCustom() {
-      return constraintCase_ == 1;
+      return constraintCase_ == 2;
     }
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return The custom.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_Custom getCustom() {
-      if (constraintCase_ == 1) {
+      if (constraintCase_ == 2) {
          return (context.ContextOuterClass.Constraint_Custom) constraint_;
       }
       return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_CustomOrBuilder getCustomOrBuilder() {
-      if (constraintCase_ == 1) {
+      if (constraintCase_ == 2) {
          return (context.ContextOuterClass.Constraint_Custom) constraint_;
       }
       return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
     }
 
-    public static final int SCHEDULE_FIELD_NUMBER = 2;
+    public static final int SCHEDULE_FIELD_NUMBER = 3;
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return Whether the schedule field is set.
      */
     @java.lang.Override
     public boolean hasSchedule() {
-      return constraintCase_ == 2;
+      return constraintCase_ == 3;
     }
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return The schedule.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_Schedule getSchedule() {
-      if (constraintCase_ == 2) {
+      if (constraintCase_ == 3) {
          return (context.ContextOuterClass.Constraint_Schedule) constraint_;
       }
       return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_ScheduleOrBuilder getScheduleOrBuilder() {
-      if (constraintCase_ == 2) {
+      if (constraintCase_ == 3) {
          return (context.ContextOuterClass.Constraint_Schedule) constraint_;
       }
       return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
     }
 
-    public static final int ENDPOINT_LOCATION_FIELD_NUMBER = 3;
+    public static final int ENDPOINT_LOCATION_FIELD_NUMBER = 4;
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return Whether the endpointLocation field is set.
      */
     @java.lang.Override
     public boolean hasEndpointLocation() {
-      return constraintCase_ == 3;
+      return constraintCase_ == 4;
     }
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return The endpointLocation.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointLocation getEndpointLocation() {
-      if (constraintCase_ == 3) {
+      if (constraintCase_ == 4) {
          return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointLocationOrBuilder getEndpointLocationOrBuilder() {
-      if (constraintCase_ == 3) {
+      if (constraintCase_ == 4) {
          return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
     }
 
-    public static final int ENDPOINT_PRIORITY_FIELD_NUMBER = 4;
+    public static final int ENDPOINT_PRIORITY_FIELD_NUMBER = 5;
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return Whether the endpointPriority field is set.
      */
     @java.lang.Override
     public boolean hasEndpointPriority() {
-      return constraintCase_ == 4;
+      return constraintCase_ == 5;
     }
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return The endpointPriority.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointPriority getEndpointPriority() {
-      if (constraintCase_ == 4) {
+      if (constraintCase_ == 5) {
          return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder getEndpointPriorityOrBuilder() {
-      if (constraintCase_ == 4) {
+      if (constraintCase_ == 5) {
          return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
     }
 
-    public static final int SLA_CAPACITY_FIELD_NUMBER = 5;
+    public static final int SLA_CAPACITY_FIELD_NUMBER = 6;
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return Whether the slaCapacity field is set.
      */
     @java.lang.Override
     public boolean hasSlaCapacity() {
-      return constraintCase_ == 5;
+      return constraintCase_ == 6;
     }
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return The slaCapacity.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Capacity getSlaCapacity() {
-      if (constraintCase_ == 5) {
+      if (constraintCase_ == 6) {
          return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder getSlaCapacityOrBuilder() {
-      if (constraintCase_ == 5) {
+      if (constraintCase_ == 6) {
          return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
     }
 
-    public static final int SLA_LATENCY_FIELD_NUMBER = 6;
+    public static final int SLA_LATENCY_FIELD_NUMBER = 7;
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return Whether the slaLatency field is set.
      */
     @java.lang.Override
     public boolean hasSlaLatency() {
-      return constraintCase_ == 6;
+      return constraintCase_ == 7;
     }
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return The slaLatency.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Latency getSlaLatency() {
-      if (constraintCase_ == 6) {
+      if (constraintCase_ == 7) {
          return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder getSlaLatencyOrBuilder() {
-      if (constraintCase_ == 6) {
+      if (constraintCase_ == 7) {
          return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
     }
 
-    public static final int SLA_AVAILABILITY_FIELD_NUMBER = 7;
+    public static final int SLA_AVAILABILITY_FIELD_NUMBER = 8;
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return Whether the slaAvailability field is set.
      */
     @java.lang.Override
     public boolean hasSlaAvailability() {
-      return constraintCase_ == 7;
+      return constraintCase_ == 8;
     }
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return The slaAvailability.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Availability getSlaAvailability() {
-      if (constraintCase_ == 7) {
+      if (constraintCase_ == 8) {
          return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder getSlaAvailabilityOrBuilder() {
-      if (constraintCase_ == 7) {
+      if (constraintCase_ == 8) {
          return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
     }
 
-    public static final int SLA_ISOLATION_FIELD_NUMBER = 8;
+    public static final int SLA_ISOLATION_FIELD_NUMBER = 9;
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return Whether the slaIsolation field is set.
      */
     @java.lang.Override
     public boolean hasSlaIsolation() {
-      return constraintCase_ == 8;
+      return constraintCase_ == 9;
     }
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return The slaIsolation.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Isolation_level getSlaIsolation() {
-      if (constraintCase_ == 8) {
+      if (constraintCase_ == 9) {
          return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder getSlaIsolationOrBuilder() {
-      if (constraintCase_ == 8) {
+      if (constraintCase_ == 9) {
          return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
     }
 
+    public static final int EXCLUSIONS_FIELD_NUMBER = 10;
+    /**
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+     * @return Whether the exclusions field is set.
+     */
+    @java.lang.Override
+    public boolean hasExclusions() {
+      return constraintCase_ == 10;
+    }
+    /**
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+     * @return The exclusions.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Constraint_Exclusions getExclusions() {
+      if (constraintCase_ == 10) {
+         return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
+      }
+      return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
+    }
+    /**
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder() {
+      if (constraintCase_ == 10) {
+         return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
+      }
+      return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
+    }
+
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -65301,29 +70138,35 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (constraintCase_ == 1) {
-        output.writeMessage(1, (context.ContextOuterClass.Constraint_Custom) constraint_);
+      if (action_ != context.ContextOuterClass.ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED.getNumber()) {
+        output.writeEnum(1, action_);
       }
       if (constraintCase_ == 2) {
-        output.writeMessage(2, (context.ContextOuterClass.Constraint_Schedule) constraint_);
+        output.writeMessage(2, (context.ContextOuterClass.Constraint_Custom) constraint_);
       }
       if (constraintCase_ == 3) {
-        output.writeMessage(3, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
+        output.writeMessage(3, (context.ContextOuterClass.Constraint_Schedule) constraint_);
       }
       if (constraintCase_ == 4) {
-        output.writeMessage(4, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
+        output.writeMessage(4, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
       }
       if (constraintCase_ == 5) {
-        output.writeMessage(5, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
+        output.writeMessage(5, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
       }
       if (constraintCase_ == 6) {
-        output.writeMessage(6, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
+        output.writeMessage(6, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
       }
       if (constraintCase_ == 7) {
-        output.writeMessage(7, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+        output.writeMessage(7, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
       }
       if (constraintCase_ == 8) {
-        output.writeMessage(8, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+        output.writeMessage(8, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+      }
+      if (constraintCase_ == 9) {
+        output.writeMessage(9, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+      }
+      if (constraintCase_ == 10) {
+        output.writeMessage(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
       }
       unknownFields.writeTo(output);
     }
@@ -65334,37 +70177,45 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (constraintCase_ == 1) {
+      if (action_ != context.ContextOuterClass.ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED.getNumber()) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, (context.ContextOuterClass.Constraint_Custom) constraint_);
+          .computeEnumSize(1, action_);
       }
       if (constraintCase_ == 2) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, (context.ContextOuterClass.Constraint_Schedule) constraint_);
+          .computeMessageSize(2, (context.ContextOuterClass.Constraint_Custom) constraint_);
       }
       if (constraintCase_ == 3) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
+          .computeMessageSize(3, (context.ContextOuterClass.Constraint_Schedule) constraint_);
       }
       if (constraintCase_ == 4) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
+          .computeMessageSize(4, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
       }
       if (constraintCase_ == 5) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
+          .computeMessageSize(5, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
       }
       if (constraintCase_ == 6) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(6, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
+          .computeMessageSize(6, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
       }
       if (constraintCase_ == 7) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+          .computeMessageSize(7, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
       }
       if (constraintCase_ == 8) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(8, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+          .computeMessageSize(8, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+      }
+      if (constraintCase_ == 9) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(9, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+      }
+      if (constraintCase_ == 10) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -65381,40 +70232,45 @@ public final class ContextOuterClass {
       }
       context.ContextOuterClass.Constraint other = (context.ContextOuterClass.Constraint) obj;
 
+      if (action_ != other.action_) return false;
       if (!getConstraintCase().equals(other.getConstraintCase())) return false;
       switch (constraintCase_) {
-        case 1:
+        case 2:
           if (!getCustom()
               .equals(other.getCustom())) return false;
           break;
-        case 2:
+        case 3:
           if (!getSchedule()
               .equals(other.getSchedule())) return false;
           break;
-        case 3:
+        case 4:
           if (!getEndpointLocation()
               .equals(other.getEndpointLocation())) return false;
           break;
-        case 4:
+        case 5:
           if (!getEndpointPriority()
               .equals(other.getEndpointPriority())) return false;
           break;
-        case 5:
+        case 6:
           if (!getSlaCapacity()
               .equals(other.getSlaCapacity())) return false;
           break;
-        case 6:
+        case 7:
           if (!getSlaLatency()
               .equals(other.getSlaLatency())) return false;
           break;
-        case 7:
+        case 8:
           if (!getSlaAvailability()
               .equals(other.getSlaAvailability())) return false;
           break;
-        case 8:
+        case 9:
           if (!getSlaIsolation()
               .equals(other.getSlaIsolation())) return false;
           break;
+        case 10:
+          if (!getExclusions()
+              .equals(other.getExclusions())) return false;
+          break;
         case 0:
         default:
       }
@@ -65429,39 +70285,45 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ACTION_FIELD_NUMBER;
+      hash = (53 * hash) + action_;
       switch (constraintCase_) {
-        case 1:
+        case 2:
           hash = (37 * hash) + CUSTOM_FIELD_NUMBER;
           hash = (53 * hash) + getCustom().hashCode();
           break;
-        case 2:
+        case 3:
           hash = (37 * hash) + SCHEDULE_FIELD_NUMBER;
           hash = (53 * hash) + getSchedule().hashCode();
           break;
-        case 3:
+        case 4:
           hash = (37 * hash) + ENDPOINT_LOCATION_FIELD_NUMBER;
           hash = (53 * hash) + getEndpointLocation().hashCode();
           break;
-        case 4:
+        case 5:
           hash = (37 * hash) + ENDPOINT_PRIORITY_FIELD_NUMBER;
           hash = (53 * hash) + getEndpointPriority().hashCode();
           break;
-        case 5:
+        case 6:
           hash = (37 * hash) + SLA_CAPACITY_FIELD_NUMBER;
           hash = (53 * hash) + getSlaCapacity().hashCode();
           break;
-        case 6:
+        case 7:
           hash = (37 * hash) + SLA_LATENCY_FIELD_NUMBER;
           hash = (53 * hash) + getSlaLatency().hashCode();
           break;
-        case 7:
+        case 8:
           hash = (37 * hash) + SLA_AVAILABILITY_FIELD_NUMBER;
           hash = (53 * hash) + getSlaAvailability().hashCode();
           break;
-        case 8:
+        case 9:
           hash = (37 * hash) + SLA_ISOLATION_FIELD_NUMBER;
           hash = (53 * hash) + getSlaIsolation().hashCode();
           break;
+        case 10:
+          hash = (37 * hash) + EXCLUSIONS_FIELD_NUMBER;
+          hash = (53 * hash) + getExclusions().hashCode();
+          break;
         case 0:
         default:
       }
@@ -65598,6 +70460,8 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
+        action_ = 0;
+
         constraintCase_ = 0;
         constraint_ = null;
         return this;
@@ -65626,62 +70490,70 @@ public final class ContextOuterClass {
       @java.lang.Override
       public context.ContextOuterClass.Constraint buildPartial() {
         context.ContextOuterClass.Constraint result = new context.ContextOuterClass.Constraint(this);
-        if (constraintCase_ == 1) {
+        result.action_ = action_;
+        if (constraintCase_ == 2) {
           if (customBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = customBuilder_.build();
           }
         }
-        if (constraintCase_ == 2) {
+        if (constraintCase_ == 3) {
           if (scheduleBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = scheduleBuilder_.build();
           }
         }
-        if (constraintCase_ == 3) {
+        if (constraintCase_ == 4) {
           if (endpointLocationBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = endpointLocationBuilder_.build();
           }
         }
-        if (constraintCase_ == 4) {
+        if (constraintCase_ == 5) {
           if (endpointPriorityBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = endpointPriorityBuilder_.build();
           }
         }
-        if (constraintCase_ == 5) {
+        if (constraintCase_ == 6) {
           if (slaCapacityBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaCapacityBuilder_.build();
           }
         }
-        if (constraintCase_ == 6) {
+        if (constraintCase_ == 7) {
           if (slaLatencyBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaLatencyBuilder_.build();
           }
         }
-        if (constraintCase_ == 7) {
+        if (constraintCase_ == 8) {
           if (slaAvailabilityBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaAvailabilityBuilder_.build();
           }
         }
-        if (constraintCase_ == 8) {
+        if (constraintCase_ == 9) {
           if (slaIsolationBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaIsolationBuilder_.build();
           }
         }
+        if (constraintCase_ == 10) {
+          if (exclusionsBuilder_ == null) {
+            result.constraint_ = constraint_;
+          } else {
+            result.constraint_ = exclusionsBuilder_.build();
+          }
+        }
         result.constraintCase_ = constraintCase_;
         onBuilt();
         return result;
@@ -65731,6 +70603,9 @@ public final class ContextOuterClass {
 
       public Builder mergeFrom(context.ContextOuterClass.Constraint other) {
         if (other == context.ContextOuterClass.Constraint.getDefaultInstance()) return this;
+        if (other.action_ != 0) {
+          setActionValue(other.getActionValue());
+        }
         switch (other.getConstraintCase()) {
           case CUSTOM: {
             mergeCustom(other.getCustom());
@@ -65764,6 +70639,10 @@ public final class ContextOuterClass {
             mergeSlaIsolation(other.getSlaIsolation());
             break;
           }
+          case EXCLUSIONS: {
+            mergeExclusions(other.getExclusions());
+            break;
+          }
           case CONSTRAINT_NOT_SET: {
             break;
           }
@@ -65812,36 +70691,90 @@ public final class ContextOuterClass {
       }
 
 
+      private int action_ = 0;
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @return The enum numeric value on the wire for action.
+       */
+      @java.lang.Override public int getActionValue() {
+        return action_;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @param value The enum numeric value on the wire for action to set.
+       * @return This builder for chaining.
+       */
+      public Builder setActionValue(int value) {
+        
+        action_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @return The action.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ConstraintActionEnum getAction() {
+        @SuppressWarnings("deprecation")
+        context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
+        return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @param value The action to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAction(context.ContextOuterClass.ConstraintActionEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        action_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearAction() {
+        
+        action_ = 0;
+        onChanged();
+        return this;
+      }
+
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Custom, context.ContextOuterClass.Constraint_Custom.Builder, context.ContextOuterClass.Constraint_CustomOrBuilder> customBuilder_;
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        * @return Whether the custom field is set.
        */
       @java.lang.Override
       public boolean hasCustom() {
-        return constraintCase_ == 1;
+        return constraintCase_ == 2;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        * @return The custom.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_Custom getCustom() {
         if (customBuilder_ == null) {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             return (context.ContextOuterClass.Constraint_Custom) constraint_;
           }
           return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             return customBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder setCustom(context.ContextOuterClass.Constraint_Custom value) {
         if (customBuilder_ == null) {
@@ -65853,11 +70786,11 @@ public final class ContextOuterClass {
         } else {
           customBuilder_.setMessage(value);
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder setCustom(
           context.ContextOuterClass.Constraint_Custom.Builder builderForValue) {
@@ -65867,15 +70800,15 @@ public final class ContextOuterClass {
         } else {
           customBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder mergeCustom(context.ContextOuterClass.Constraint_Custom value) {
         if (customBuilder_ == null) {
-          if (constraintCase_ == 1 &&
+          if (constraintCase_ == 2 &&
               constraint_ != context.ContextOuterClass.Constraint_Custom.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_Custom.newBuilder((context.ContextOuterClass.Constraint_Custom) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -65884,26 +70817,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             customBuilder_.mergeFrom(value);
           }
           customBuilder_.setMessage(value);
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder clearCustom() {
         if (customBuilder_ == null) {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -65912,33 +70845,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public context.ContextOuterClass.Constraint_Custom.Builder getCustomBuilder() {
         return getCustomFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_CustomOrBuilder getCustomOrBuilder() {
-        if ((constraintCase_ == 1) && (customBuilder_ != null)) {
+        if ((constraintCase_ == 2) && (customBuilder_ != null)) {
           return customBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             return (context.ContextOuterClass.Constraint_Custom) constraint_;
           }
           return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Custom, context.ContextOuterClass.Constraint_Custom.Builder, context.ContextOuterClass.Constraint_CustomOrBuilder> 
           getCustomFieldBuilder() {
         if (customBuilder_ == null) {
-          if (!(constraintCase_ == 1)) {
+          if (!(constraintCase_ == 2)) {
             constraint_ = context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
           }
           customBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -65948,7 +70881,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         onChanged();;
         return customBuilder_;
       }
@@ -65956,33 +70889,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Schedule, context.ContextOuterClass.Constraint_Schedule.Builder, context.ContextOuterClass.Constraint_ScheduleOrBuilder> scheduleBuilder_;
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        * @return Whether the schedule field is set.
        */
       @java.lang.Override
       public boolean hasSchedule() {
-        return constraintCase_ == 2;
+        return constraintCase_ == 3;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        * @return The schedule.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_Schedule getSchedule() {
         if (scheduleBuilder_ == null) {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             return (context.ContextOuterClass.Constraint_Schedule) constraint_;
           }
           return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             return scheduleBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder setSchedule(context.ContextOuterClass.Constraint_Schedule value) {
         if (scheduleBuilder_ == null) {
@@ -65994,11 +70927,11 @@ public final class ContextOuterClass {
         } else {
           scheduleBuilder_.setMessage(value);
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder setSchedule(
           context.ContextOuterClass.Constraint_Schedule.Builder builderForValue) {
@@ -66008,15 +70941,15 @@ public final class ContextOuterClass {
         } else {
           scheduleBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder mergeSchedule(context.ContextOuterClass.Constraint_Schedule value) {
         if (scheduleBuilder_ == null) {
-          if (constraintCase_ == 2 &&
+          if (constraintCase_ == 3 &&
               constraint_ != context.ContextOuterClass.Constraint_Schedule.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_Schedule.newBuilder((context.ContextOuterClass.Constraint_Schedule) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66025,26 +70958,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             scheduleBuilder_.mergeFrom(value);
           }
           scheduleBuilder_.setMessage(value);
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder clearSchedule() {
         if (scheduleBuilder_ == null) {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66053,33 +70986,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public context.ContextOuterClass.Constraint_Schedule.Builder getScheduleBuilder() {
         return getScheduleFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_ScheduleOrBuilder getScheduleOrBuilder() {
-        if ((constraintCase_ == 2) && (scheduleBuilder_ != null)) {
+        if ((constraintCase_ == 3) && (scheduleBuilder_ != null)) {
           return scheduleBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             return (context.ContextOuterClass.Constraint_Schedule) constraint_;
           }
           return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Schedule, context.ContextOuterClass.Constraint_Schedule.Builder, context.ContextOuterClass.Constraint_ScheduleOrBuilder> 
           getScheduleFieldBuilder() {
         if (scheduleBuilder_ == null) {
-          if (!(constraintCase_ == 2)) {
+          if (!(constraintCase_ == 3)) {
             constraint_ = context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
           }
           scheduleBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66089,7 +71022,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         onChanged();;
         return scheduleBuilder_;
       }
@@ -66097,33 +71030,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointLocation, context.ContextOuterClass.Constraint_EndPointLocation.Builder, context.ContextOuterClass.Constraint_EndPointLocationOrBuilder> endpointLocationBuilder_;
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        * @return Whether the endpointLocation field is set.
        */
       @java.lang.Override
       public boolean hasEndpointLocation() {
-        return constraintCase_ == 3;
+        return constraintCase_ == 4;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        * @return The endpointLocation.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointLocation getEndpointLocation() {
         if (endpointLocationBuilder_ == null) {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             return endpointLocationBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder setEndpointLocation(context.ContextOuterClass.Constraint_EndPointLocation value) {
         if (endpointLocationBuilder_ == null) {
@@ -66135,11 +71068,11 @@ public final class ContextOuterClass {
         } else {
           endpointLocationBuilder_.setMessage(value);
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder setEndpointLocation(
           context.ContextOuterClass.Constraint_EndPointLocation.Builder builderForValue) {
@@ -66149,15 +71082,15 @@ public final class ContextOuterClass {
         } else {
           endpointLocationBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder mergeEndpointLocation(context.ContextOuterClass.Constraint_EndPointLocation value) {
         if (endpointLocationBuilder_ == null) {
-          if (constraintCase_ == 3 &&
+          if (constraintCase_ == 4 &&
               constraint_ != context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointLocation.newBuilder((context.ContextOuterClass.Constraint_EndPointLocation) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66166,26 +71099,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             endpointLocationBuilder_.mergeFrom(value);
           }
           endpointLocationBuilder_.setMessage(value);
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder clearEndpointLocation() {
         if (endpointLocationBuilder_ == null) {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66194,33 +71127,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public context.ContextOuterClass.Constraint_EndPointLocation.Builder getEndpointLocationBuilder() {
         return getEndpointLocationFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointLocationOrBuilder getEndpointLocationOrBuilder() {
-        if ((constraintCase_ == 3) && (endpointLocationBuilder_ != null)) {
+        if ((constraintCase_ == 4) && (endpointLocationBuilder_ != null)) {
           return endpointLocationBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointLocation, context.ContextOuterClass.Constraint_EndPointLocation.Builder, context.ContextOuterClass.Constraint_EndPointLocationOrBuilder> 
           getEndpointLocationFieldBuilder() {
         if (endpointLocationBuilder_ == null) {
-          if (!(constraintCase_ == 3)) {
+          if (!(constraintCase_ == 4)) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
           }
           endpointLocationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66230,7 +71163,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         onChanged();;
         return endpointLocationBuilder_;
       }
@@ -66238,33 +71171,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointPriority, context.ContextOuterClass.Constraint_EndPointPriority.Builder, context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder> endpointPriorityBuilder_;
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        * @return Whether the endpointPriority field is set.
        */
       @java.lang.Override
       public boolean hasEndpointPriority() {
-        return constraintCase_ == 4;
+        return constraintCase_ == 5;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        * @return The endpointPriority.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointPriority getEndpointPriority() {
         if (endpointPriorityBuilder_ == null) {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             return endpointPriorityBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder setEndpointPriority(context.ContextOuterClass.Constraint_EndPointPriority value) {
         if (endpointPriorityBuilder_ == null) {
@@ -66276,11 +71209,11 @@ public final class ContextOuterClass {
         } else {
           endpointPriorityBuilder_.setMessage(value);
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder setEndpointPriority(
           context.ContextOuterClass.Constraint_EndPointPriority.Builder builderForValue) {
@@ -66290,15 +71223,15 @@ public final class ContextOuterClass {
         } else {
           endpointPriorityBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder mergeEndpointPriority(context.ContextOuterClass.Constraint_EndPointPriority value) {
         if (endpointPriorityBuilder_ == null) {
-          if (constraintCase_ == 4 &&
+          if (constraintCase_ == 5 &&
               constraint_ != context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointPriority.newBuilder((context.ContextOuterClass.Constraint_EndPointPriority) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66307,26 +71240,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             endpointPriorityBuilder_.mergeFrom(value);
           }
           endpointPriorityBuilder_.setMessage(value);
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder clearEndpointPriority() {
         if (endpointPriorityBuilder_ == null) {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66335,33 +71268,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public context.ContextOuterClass.Constraint_EndPointPriority.Builder getEndpointPriorityBuilder() {
         return getEndpointPriorityFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder getEndpointPriorityOrBuilder() {
-        if ((constraintCase_ == 4) && (endpointPriorityBuilder_ != null)) {
+        if ((constraintCase_ == 5) && (endpointPriorityBuilder_ != null)) {
           return endpointPriorityBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointPriority, context.ContextOuterClass.Constraint_EndPointPriority.Builder, context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder> 
           getEndpointPriorityFieldBuilder() {
         if (endpointPriorityBuilder_ == null) {
-          if (!(constraintCase_ == 4)) {
+          if (!(constraintCase_ == 5)) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
           }
           endpointPriorityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66371,7 +71304,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         onChanged();;
         return endpointPriorityBuilder_;
       }
@@ -66379,33 +71312,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Capacity, context.ContextOuterClass.Constraint_SLA_Capacity.Builder, context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder> slaCapacityBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        * @return Whether the slaCapacity field is set.
        */
       @java.lang.Override
       public boolean hasSlaCapacity() {
-        return constraintCase_ == 5;
+        return constraintCase_ == 6;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        * @return The slaCapacity.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Capacity getSlaCapacity() {
         if (slaCapacityBuilder_ == null) {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             return slaCapacityBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder setSlaCapacity(context.ContextOuterClass.Constraint_SLA_Capacity value) {
         if (slaCapacityBuilder_ == null) {
@@ -66417,11 +71350,11 @@ public final class ContextOuterClass {
         } else {
           slaCapacityBuilder_.setMessage(value);
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder setSlaCapacity(
           context.ContextOuterClass.Constraint_SLA_Capacity.Builder builderForValue) {
@@ -66431,15 +71364,15 @@ public final class ContextOuterClass {
         } else {
           slaCapacityBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder mergeSlaCapacity(context.ContextOuterClass.Constraint_SLA_Capacity value) {
         if (slaCapacityBuilder_ == null) {
-          if (constraintCase_ == 5 &&
+          if (constraintCase_ == 6 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Capacity.newBuilder((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66448,26 +71381,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             slaCapacityBuilder_.mergeFrom(value);
           }
           slaCapacityBuilder_.setMessage(value);
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder clearSlaCapacity() {
         if (slaCapacityBuilder_ == null) {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66476,33 +71409,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Capacity.Builder getSlaCapacityBuilder() {
         return getSlaCapacityFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder getSlaCapacityOrBuilder() {
-        if ((constraintCase_ == 5) && (slaCapacityBuilder_ != null)) {
+        if ((constraintCase_ == 6) && (slaCapacityBuilder_ != null)) {
           return slaCapacityBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Capacity, context.ContextOuterClass.Constraint_SLA_Capacity.Builder, context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder> 
           getSlaCapacityFieldBuilder() {
         if (slaCapacityBuilder_ == null) {
-          if (!(constraintCase_ == 5)) {
+          if (!(constraintCase_ == 6)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
           }
           slaCapacityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66512,7 +71445,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         onChanged();;
         return slaCapacityBuilder_;
       }
@@ -66520,33 +71453,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Latency, context.ContextOuterClass.Constraint_SLA_Latency.Builder, context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder> slaLatencyBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        * @return Whether the slaLatency field is set.
        */
       @java.lang.Override
       public boolean hasSlaLatency() {
-        return constraintCase_ == 6;
+        return constraintCase_ == 7;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        * @return The slaLatency.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Latency getSlaLatency() {
         if (slaLatencyBuilder_ == null) {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             return slaLatencyBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder setSlaLatency(context.ContextOuterClass.Constraint_SLA_Latency value) {
         if (slaLatencyBuilder_ == null) {
@@ -66558,11 +71491,11 @@ public final class ContextOuterClass {
         } else {
           slaLatencyBuilder_.setMessage(value);
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder setSlaLatency(
           context.ContextOuterClass.Constraint_SLA_Latency.Builder builderForValue) {
@@ -66572,15 +71505,15 @@ public final class ContextOuterClass {
         } else {
           slaLatencyBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder mergeSlaLatency(context.ContextOuterClass.Constraint_SLA_Latency value) {
         if (slaLatencyBuilder_ == null) {
-          if (constraintCase_ == 6 &&
+          if (constraintCase_ == 7 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Latency.newBuilder((context.ContextOuterClass.Constraint_SLA_Latency) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66589,26 +71522,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             slaLatencyBuilder_.mergeFrom(value);
           }
           slaLatencyBuilder_.setMessage(value);
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder clearSlaLatency() {
         if (slaLatencyBuilder_ == null) {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66617,33 +71550,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Latency.Builder getSlaLatencyBuilder() {
         return getSlaLatencyFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder getSlaLatencyOrBuilder() {
-        if ((constraintCase_ == 6) && (slaLatencyBuilder_ != null)) {
+        if ((constraintCase_ == 7) && (slaLatencyBuilder_ != null)) {
           return slaLatencyBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Latency, context.ContextOuterClass.Constraint_SLA_Latency.Builder, context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder> 
           getSlaLatencyFieldBuilder() {
         if (slaLatencyBuilder_ == null) {
-          if (!(constraintCase_ == 6)) {
+          if (!(constraintCase_ == 7)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
           }
           slaLatencyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66653,7 +71586,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         onChanged();;
         return slaLatencyBuilder_;
       }
@@ -66661,33 +71594,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Availability, context.ContextOuterClass.Constraint_SLA_Availability.Builder, context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder> slaAvailabilityBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        * @return Whether the slaAvailability field is set.
        */
       @java.lang.Override
       public boolean hasSlaAvailability() {
-        return constraintCase_ == 7;
+        return constraintCase_ == 8;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        * @return The slaAvailability.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Availability getSlaAvailability() {
         if (slaAvailabilityBuilder_ == null) {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             return slaAvailabilityBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder setSlaAvailability(context.ContextOuterClass.Constraint_SLA_Availability value) {
         if (slaAvailabilityBuilder_ == null) {
@@ -66699,11 +71632,11 @@ public final class ContextOuterClass {
         } else {
           slaAvailabilityBuilder_.setMessage(value);
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder setSlaAvailability(
           context.ContextOuterClass.Constraint_SLA_Availability.Builder builderForValue) {
@@ -66713,15 +71646,15 @@ public final class ContextOuterClass {
         } else {
           slaAvailabilityBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder mergeSlaAvailability(context.ContextOuterClass.Constraint_SLA_Availability value) {
         if (slaAvailabilityBuilder_ == null) {
-          if (constraintCase_ == 7 &&
+          if (constraintCase_ == 8 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Availability.newBuilder((context.ContextOuterClass.Constraint_SLA_Availability) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66730,26 +71663,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             slaAvailabilityBuilder_.mergeFrom(value);
           }
           slaAvailabilityBuilder_.setMessage(value);
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder clearSlaAvailability() {
         if (slaAvailabilityBuilder_ == null) {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66758,33 +71691,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Availability.Builder getSlaAvailabilityBuilder() {
         return getSlaAvailabilityFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder getSlaAvailabilityOrBuilder() {
-        if ((constraintCase_ == 7) && (slaAvailabilityBuilder_ != null)) {
+        if ((constraintCase_ == 8) && (slaAvailabilityBuilder_ != null)) {
           return slaAvailabilityBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Availability, context.ContextOuterClass.Constraint_SLA_Availability.Builder, context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder> 
           getSlaAvailabilityFieldBuilder() {
         if (slaAvailabilityBuilder_ == null) {
-          if (!(constraintCase_ == 7)) {
+          if (!(constraintCase_ == 8)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
           }
           slaAvailabilityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66794,7 +71727,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         onChanged();;
         return slaAvailabilityBuilder_;
       }
@@ -66802,33 +71735,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Isolation_level, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder, context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder> slaIsolationBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        * @return Whether the slaIsolation field is set.
        */
       @java.lang.Override
       public boolean hasSlaIsolation() {
-        return constraintCase_ == 8;
+        return constraintCase_ == 9;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        * @return The slaIsolation.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Isolation_level getSlaIsolation() {
         if (slaIsolationBuilder_ == null) {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             return slaIsolationBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder setSlaIsolation(context.ContextOuterClass.Constraint_SLA_Isolation_level value) {
         if (slaIsolationBuilder_ == null) {
@@ -66840,11 +71773,11 @@ public final class ContextOuterClass {
         } else {
           slaIsolationBuilder_.setMessage(value);
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder setSlaIsolation(
           context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder builderForValue) {
@@ -66854,15 +71787,15 @@ public final class ContextOuterClass {
         } else {
           slaIsolationBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder mergeSlaIsolation(context.ContextOuterClass.Constraint_SLA_Isolation_level value) {
         if (slaIsolationBuilder_ == null) {
-          if (constraintCase_ == 8 &&
+          if (constraintCase_ == 9 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Isolation_level.newBuilder((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -66871,26 +71804,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             slaIsolationBuilder_.mergeFrom(value);
           }
           slaIsolationBuilder_.setMessage(value);
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder clearSlaIsolation() {
         if (slaIsolationBuilder_ == null) {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -66899,33 +71832,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder getSlaIsolationBuilder() {
         return getSlaIsolationFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder getSlaIsolationOrBuilder() {
-        if ((constraintCase_ == 8) && (slaIsolationBuilder_ != null)) {
+        if ((constraintCase_ == 9) && (slaIsolationBuilder_ != null)) {
           return slaIsolationBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Isolation_level, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder, context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder> 
           getSlaIsolationFieldBuilder() {
         if (slaIsolationBuilder_ == null) {
-          if (!(constraintCase_ == 8)) {
+          if (!(constraintCase_ == 9)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
           }
           slaIsolationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -66935,10 +71868,151 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         onChanged();;
         return slaIsolationBuilder_;
       }
+
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Constraint_Exclusions, context.ContextOuterClass.Constraint_Exclusions.Builder, context.ContextOuterClass.Constraint_ExclusionsOrBuilder> exclusionsBuilder_;
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       * @return Whether the exclusions field is set.
+       */
+      @java.lang.Override
+      public boolean hasExclusions() {
+        return constraintCase_ == 10;
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       * @return The exclusions.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.Constraint_Exclusions getExclusions() {
+        if (exclusionsBuilder_ == null) {
+          if (constraintCase_ == 10) {
+            return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
+          }
+          return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
+        } else {
+          if (constraintCase_ == 10) {
+            return exclusionsBuilder_.getMessage();
+          }
+          return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      public Builder setExclusions(context.ContextOuterClass.Constraint_Exclusions value) {
+        if (exclusionsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          constraint_ = value;
+          onChanged();
+        } else {
+          exclusionsBuilder_.setMessage(value);
+        }
+        constraintCase_ = 10;
+        return this;
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      public Builder setExclusions(
+          context.ContextOuterClass.Constraint_Exclusions.Builder builderForValue) {
+        if (exclusionsBuilder_ == null) {
+          constraint_ = builderForValue.build();
+          onChanged();
+        } else {
+          exclusionsBuilder_.setMessage(builderForValue.build());
+        }
+        constraintCase_ = 10;
+        return this;
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      public Builder mergeExclusions(context.ContextOuterClass.Constraint_Exclusions value) {
+        if (exclusionsBuilder_ == null) {
+          if (constraintCase_ == 10 &&
+              constraint_ != context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance()) {
+            constraint_ = context.ContextOuterClass.Constraint_Exclusions.newBuilder((context.ContextOuterClass.Constraint_Exclusions) constraint_)
+                .mergeFrom(value).buildPartial();
+          } else {
+            constraint_ = value;
+          }
+          onChanged();
+        } else {
+          if (constraintCase_ == 10) {
+            exclusionsBuilder_.mergeFrom(value);
+          }
+          exclusionsBuilder_.setMessage(value);
+        }
+        constraintCase_ = 10;
+        return this;
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      public Builder clearExclusions() {
+        if (exclusionsBuilder_ == null) {
+          if (constraintCase_ == 10) {
+            constraintCase_ = 0;
+            constraint_ = null;
+            onChanged();
+          }
+        } else {
+          if (constraintCase_ == 10) {
+            constraintCase_ = 0;
+            constraint_ = null;
+          }
+          exclusionsBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      public context.ContextOuterClass.Constraint_Exclusions.Builder getExclusionsBuilder() {
+        return getExclusionsFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder() {
+        if ((constraintCase_ == 10) && (exclusionsBuilder_ != null)) {
+          return exclusionsBuilder_.getMessageOrBuilder();
+        } else {
+          if (constraintCase_ == 10) {
+            return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
+          }
+          return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
+        }
+      }
+      /**
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Constraint_Exclusions, context.ContextOuterClass.Constraint_Exclusions.Builder, context.ContextOuterClass.Constraint_ExclusionsOrBuilder> 
+          getExclusionsFieldBuilder() {
+        if (exclusionsBuilder_ == null) {
+          if (!(constraintCase_ == 10)) {
+            constraint_ = context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
+          }
+          exclusionsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Constraint_Exclusions, context.ContextOuterClass.Constraint_Exclusions.Builder, context.ContextOuterClass.Constraint_ExclusionsOrBuilder>(
+                  (context.ContextOuterClass.Constraint_Exclusions) constraint_,
+                  getParentForChildren(),
+                  isClean());
+          constraint_ = null;
+        }
+        constraintCase_ = 10;
+        onChanged();;
+        return exclusionsBuilder_;
+      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -68638,6 +73712,11 @@ public final class ContextOuterClass {
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_context_DeviceList_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_context_DeviceFilter_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_context_DeviceFilter_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_context_DeviceEvent_descriptor;
   private static final 
@@ -68698,6 +73777,11 @@ public final class ContextOuterClass {
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_context_ServiceList_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_context_ServiceFilter_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_context_ServiceFilter_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_context_ServiceEvent_descriptor;
   private static final 
@@ -68738,6 +73822,11 @@ public final class ContextOuterClass {
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_context_SliceList_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_context_SliceFilter_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_context_SliceFilter_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_context_SliceEvent_descriptor;
   private static final 
@@ -68883,6 +73972,11 @@ public final class ContextOuterClass {
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_context_Constraint_Exclusions_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_context_Constraint_Exclusions_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_context_Constraint_descriptor;
   private static final 
@@ -68940,7 +74034,7 @@ public final class ContextOuterClass {
       "vent\022\035\n\005event\030\001 \001(\0132\016.context.Event\022(\n\013t" +
       "opology_id\030\002 \001(\0132\023.context.TopologyId\".\n" +
       "\010DeviceId\022\"\n\013device_uuid\030\001 \001(\0132\r.context" +
-      ".Uuid\"\317\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" +
+      ".Uuid\"\371\002\n\006Device\022$\n\tdevice_id\030\001 \001(\0132\021.co" +
       "ntext.DeviceId\022\014\n\004name\030\002 \001(\t\022\023\n\013device_t" +
       "ype\030\003 \001(\t\022,\n\rdevice_config\030\004 \001(\0132\025.conte" +
       "xt.DeviceConfig\022G\n\031device_operational_st" +
@@ -68948,251 +74042,282 @@ public final class ContextOuterClass {
       "atusEnum\0221\n\016device_drivers\030\006 \003(\0162\031.conte" +
       "xt.DeviceDriverEnum\022+\n\020device_endpoints\030" +
       "\007 \003(\0132\021.context.EndPoint\022%\n\tcomponent\030\010 " +
-      "\003(\0132\022.context.Component\" \n\tComponent\022\023\n\013" +
-      "comp_string\030\001 \003(\t\"9\n\014DeviceConfig\022)\n\014con" +
-      "fig_rules\030\001 \003(\0132\023.context.ConfigRule\"5\n\014" +
-      "DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021.conte" +
-      "xt.DeviceId\".\n\nDeviceList\022 \n\007devices\030\001 \003" +
-      "(\0132\017.context.Device\"\200\001\n\013DeviceEvent\022\035\n\005e" +
-      "vent\030\001 \001(\0132\016.context.Event\022$\n\tdevice_id\030" +
-      "\002 \001(\0132\021.context.DeviceId\022,\n\rdevice_confi" +
-      "g\030\003 \001(\0132\025.context.DeviceConfig\"*\n\006LinkId" +
-      "\022 \n\tlink_uuid\030\001 \001(\0132\r.context.Uuid\"f\n\004Li" +
-      "nk\022 \n\007link_id\030\001 \001(\0132\017.context.LinkId\022\014\n\004" +
-      "name\030\002 \001(\t\022.\n\021link_endpoint_ids\030\003 \003(\0132\023." +
-      "context.EndPointId\"/\n\nLinkIdList\022!\n\010link" +
-      "_ids\030\001 \003(\0132\017.context.LinkId\"(\n\010LinkList\022" +
-      "\034\n\005links\030\001 \003(\0132\r.context.Link\"L\n\tLinkEve" +
-      "nt\022\035\n\005event\030\001 \001(\0132\016.context.Event\022 \n\007lin" +
-      "k_id\030\002 \001(\0132\017.context.LinkId\"X\n\tServiceId" +
-      "\022&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId" +
-      "\022#\n\014service_uuid\030\002 \001(\0132\r.context.Uuid\"\333\002" +
-      "\n\007Service\022&\n\nservice_id\030\001 \001(\0132\022.context." +
-      "ServiceId\022\014\n\004name\030\002 \001(\t\022.\n\014service_type\030" +
-      "\003 \001(\0162\030.context.ServiceTypeEnum\0221\n\024servi" +
-      "ce_endpoint_ids\030\004 \003(\0132\023.context.EndPoint" +
-      "Id\0220\n\023service_constraints\030\005 \003(\0132\023.contex" +
-      "t.Constraint\022.\n\016service_status\030\006 \001(\0132\026.c" +
-      "ontext.ServiceStatus\022.\n\016service_config\030\007" +
-      " \001(\0132\026.context.ServiceConfig\022%\n\ttimestam" +
-      "p\030\010 \001(\0132\022.context.Timestamp\"C\n\rServiceSt" +
-      "atus\0222\n\016service_status\030\001 \001(\0162\032.context.S" +
-      "erviceStatusEnum\":\n\rServiceConfig\022)\n\014con" +
-      "fig_rules\030\001 \003(\0132\023.context.ConfigRule\"8\n\r" +
-      "ServiceIdList\022\'\n\013service_ids\030\001 \003(\0132\022.con" +
-      "text.ServiceId\"1\n\013ServiceList\022\"\n\010service" +
-      "s\030\001 \003(\0132\020.context.Service\"U\n\014ServiceEven" +
-      "t\022\035\n\005event\030\001 \001(\0132\016.context.Event\022&\n\nserv" +
-      "ice_id\030\002 \001(\0132\022.context.ServiceId\"T\n\007Slic" +
-      "eId\022&\n\ncontext_id\030\001 \001(\0132\022.context.Contex" +
-      "tId\022!\n\nslice_uuid\030\002 \001(\0132\r.context.Uuid\"\240" +
-      "\003\n\005Slice\022\"\n\010slice_id\030\001 \001(\0132\020.context.Sli" +
-      "ceId\022\014\n\004name\030\002 \001(\t\022/\n\022slice_endpoint_ids" +
-      "\030\003 \003(\0132\023.context.EndPointId\022.\n\021slice_con" +
-      "straints\030\004 \003(\0132\023.context.Constraint\022-\n\021s" +
-      "lice_service_ids\030\005 \003(\0132\022.context.Service" +
-      "Id\022,\n\022slice_subslice_ids\030\006 \003(\0132\020.context" +
-      ".SliceId\022*\n\014slice_status\030\007 \001(\0132\024.context" +
-      ".SliceStatus\022*\n\014slice_config\030\010 \001(\0132\024.con" +
-      "text.SliceConfig\022(\n\013slice_owner\030\t \001(\0132\023." +
-      "context.SliceOwner\022%\n\ttimestamp\030\n \001(\0132\022." +
-      "context.Timestamp\"E\n\nSliceOwner\022!\n\nowner" +
-      "_uuid\030\001 \001(\0132\r.context.Uuid\022\024\n\014owner_stri" +
-      "ng\030\002 \001(\t\"=\n\013SliceStatus\022.\n\014slice_status\030" +
-      "\001 \001(\0162\030.context.SliceStatusEnum\"8\n\013Slice" +
-      "Config\022)\n\014config_rules\030\001 \003(\0132\023.context.C" +
-      "onfigRule\"2\n\013SliceIdList\022#\n\tslice_ids\030\001 " +
-      "\003(\0132\020.context.SliceId\"+\n\tSliceList\022\036\n\006sl" +
-      "ices\030\001 \003(\0132\016.context.Slice\"O\n\nSliceEvent" +
-      "\022\035\n\005event\030\001 \001(\0132\016.context.Event\022\"\n\010slice" +
-      "_id\030\002 \001(\0132\020.context.SliceId\"6\n\014Connectio" +
-      "nId\022&\n\017connection_uuid\030\001 \001(\0132\r.context.U" +
-      "uid\"2\n\025ConnectionSettings_L0\022\031\n\021lsp_symb" +
-      "olic_name\030\001 \001(\t\"\236\001\n\025ConnectionSettings_L" +
-      "2\022\027\n\017src_mac_address\030\001 \001(\t\022\027\n\017dst_mac_ad" +
-      "dress\030\002 \001(\t\022\022\n\nether_type\030\003 \001(\r\022\017\n\007vlan_" +
-      "id\030\004 \001(\r\022\022\n\nmpls_label\030\005 \001(\r\022\032\n\022mpls_tra" +
-      "ffic_class\030\006 \001(\r\"t\n\025ConnectionSettings_L" +
-      "3\022\026\n\016src_ip_address\030\001 \001(\t\022\026\n\016dst_ip_addr" +
-      "ess\030\002 \001(\t\022\014\n\004dscp\030\003 \001(\r\022\020\n\010protocol\030\004 \001(" +
-      "\r\022\013\n\003ttl\030\005 \001(\r\"[\n\025ConnectionSettings_L4\022" +
-      "\020\n\010src_port\030\001 \001(\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\tt" +
-      "cp_flags\030\003 \001(\r\022\013\n\003ttl\030\004 \001(\r\"\304\001\n\022Connecti" +
-      "onSettings\022*\n\002l0\030\001 \001(\0132\036.context.Connect" +
-      "ionSettings_L0\022*\n\002l2\030\002 \001(\0132\036.context.Con" +
-      "nectionSettings_L2\022*\n\002l3\030\003 \001(\0132\036.context" +
-      ".ConnectionSettings_L3\022*\n\002l4\030\004 \001(\0132\036.con" +
-      "text.ConnectionSettings_L4\"\363\001\n\nConnectio" +
-      "n\022,\n\rconnection_id\030\001 \001(\0132\025.context.Conne" +
-      "ctionId\022&\n\nservice_id\030\002 \001(\0132\022.context.Se" +
-      "rviceId\0223\n\026path_hops_endpoint_ids\030\003 \003(\0132" +
-      "\023.context.EndPointId\022+\n\017sub_service_ids\030" +
-      "\004 \003(\0132\022.context.ServiceId\022-\n\010settings\030\005 " +
-      "\001(\0132\033.context.ConnectionSettings\"A\n\020Conn" +
-      "ectionIdList\022-\n\016connection_ids\030\001 \003(\0132\025.c" +
-      "ontext.ConnectionId\":\n\016ConnectionList\022(\n" +
-      "\013connections\030\001 \003(\0132\023.context.Connection\"" +
-      "^\n\017ConnectionEvent\022\035\n\005event\030\001 \001(\0132\016.cont" +
-      "ext.Event\022,\n\rconnection_id\030\002 \001(\0132\025.conte" +
-      "xt.ConnectionId\"\202\001\n\nEndPointId\022(\n\013topolo" +
-      "gy_id\030\001 \001(\0132\023.context.TopologyId\022$\n\tdevi" +
-      "ce_id\030\002 \001(\0132\021.context.DeviceId\022$\n\rendpoi" +
-      "nt_uuid\030\003 \001(\0132\r.context.Uuid\"\302\001\n\010EndPoin" +
-      "t\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPoin" +
-      "tId\022\014\n\004name\030\002 \001(\t\022\025\n\rendpoint_type\030\003 \001(\t" +
-      "\0229\n\020kpi_sample_types\030\004 \003(\0162\037.kpi_sample_" +
-      "types.KpiSampleType\022,\n\021endpoint_location" +
-      "\030\005 \001(\0132\021.context.Location\"{\n\014EndPointNam" +
-      "e\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPoin" +
-      "tId\022\023\n\013device_name\030\002 \001(\t\022\025\n\rendpoint_nam" +
-      "e\030\003 \001(\t\022\025\n\rendpoint_type\030\004 \001(\t\";\n\016EndPoi" +
-      "ntIdList\022)\n\014endpoint_ids\030\001 \003(\0132\023.context" +
-      ".EndPointId\"A\n\020EndPointNameList\022-\n\016endpo" +
-      "int_names\030\001 \003(\0132\025.context.EndPointName\"A" +
-      "\n\021ConfigRule_Custom\022\024\n\014resource_key\030\001 \001(" +
-      "\t\022\026\n\016resource_value\030\002 \001(\t\"]\n\016ConfigRule_" +
-      "ACL\022(\n\013endpoint_id\030\001 \001(\0132\023.context.EndPo" +
-      "intId\022!\n\010rule_set\030\002 \001(\0132\017.acl.AclRuleSet" +
-      "\"\234\001\n\nConfigRule\022)\n\006action\030\001 \001(\0162\031.contex" +
-      "t.ConfigActionEnum\022,\n\006custom\030\002 \001(\0132\032.con" +
-      "text.ConfigRule_CustomH\000\022&\n\003acl\030\003 \001(\0132\027." +
-      "context.ConfigRule_ACLH\000B\r\n\013config_rule\"" +
-      "F\n\021Constraint_Custom\022\027\n\017constraint_type\030" +
-      "\001 \001(\t\022\030\n\020constraint_value\030\002 \001(\t\"E\n\023Const" +
-      "raint_Schedule\022\027\n\017start_timestamp\030\001 \001(\002\022" +
-      "\025\n\rduration_days\030\002 \001(\002\"3\n\014GPS_Position\022\020" +
-      "\n\010latitude\030\001 \001(\002\022\021\n\tlongitude\030\002 \001(\002\"W\n\010L" +
-      "ocation\022\020\n\006region\030\001 \001(\tH\000\022-\n\014gps_positio" +
-      "n\030\002 \001(\0132\025.context.GPS_PositionH\000B\n\n\010loca" +
-      "tion\"l\n\033Constraint_EndPointLocation\022(\n\013e" +
-      "ndpoint_id\030\001 \001(\0132\023.context.EndPointId\022#\n" +
-      "\010location\030\002 \001(\0132\021.context.Location\"Y\n\033Co" +
-      "nstraint_EndPointPriority\022(\n\013endpoint_id" +
-      "\030\001 \001(\0132\023.context.EndPointId\022\020\n\010priority\030" +
-      "\002 \001(\r\"0\n\026Constraint_SLA_Latency\022\026\n\016e2e_l" +
-      "atency_ms\030\001 \001(\002\"0\n\027Constraint_SLA_Capaci" +
-      "ty\022\025\n\rcapacity_gbps\030\001 \001(\002\"M\n\033Constraint_" +
-      "SLA_Availability\022\032\n\022num_disjoint_paths\030\001" +
-      " \001(\r\022\022\n\nall_active\030\002 \001(\010\"V\n\036Constraint_S" +
-      "LA_Isolation_level\0224\n\017isolation_level\030\001 " +
-      "\003(\0162\033.context.IsolationLevelEnum\"\366\003\n\nCon" +
-      "straint\022,\n\006custom\030\001 \001(\0132\032.context.Constr" +
-      "aint_CustomH\000\0220\n\010schedule\030\002 \001(\0132\034.contex" +
-      "t.Constraint_ScheduleH\000\022A\n\021endpoint_loca" +
-      "tion\030\003 \001(\0132$.context.Constraint_EndPoint" +
-      "LocationH\000\022A\n\021endpoint_priority\030\004 \001(\0132$." +
-      "context.Constraint_EndPointPriorityH\000\0228\n" +
-      "\014sla_capacity\030\005 \001(\0132 .context.Constraint" +
-      "_SLA_CapacityH\000\0226\n\013sla_latency\030\006 \001(\0132\037.c" +
-      "ontext.Constraint_SLA_LatencyH\000\022@\n\020sla_a" +
-      "vailability\030\007 \001(\0132$.context.Constraint_S" +
-      "LA_AvailabilityH\000\022@\n\rsla_isolation\030\010 \001(\013" +
-      "2\'.context.Constraint_SLA_Isolation_leve" +
-      "lH\000B\014\n\nconstraint\"^\n\022TeraFlowController\022" +
-      "&\n\ncontext_id\030\001 \001(\0132\022.context.ContextId\022" +
-      "\022\n\nip_address\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Aut" +
-      "henticationResult\022&\n\ncontext_id\030\001 \001(\0132\022." +
-      "context.ContextId\022\025\n\rauthenticated\030\002 \001(\010" +
-      "*j\n\rEventTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED" +
-      "\020\000\022\024\n\020EVENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UP" +
-      "DATE\020\002\022\024\n\020EVENTTYPE_REMOVE\020\003*\332\001\n\020DeviceD" +
-      "riverEnum\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n" +
-      "\027DEVICEDRIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIV" +
-      "ER_TRANSPORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022" +
-      "&\n\"DEVICEDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022" +
-      "\033\n\027DEVICEDRIVER_ONF_TR_352\020\005\022\023\n\017DEVICEDR" +
-      "IVER_XR\020\006*\217\001\n\033DeviceOperationalStatusEnu" +
-      "m\022%\n!DEVICEOPERATIONALSTATUS_UNDEFINED\020\000" +
-      "\022$\n DEVICEOPERATIONALSTATUS_DISABLED\020\001\022#" +
-      "\n\037DEVICEOPERATIONALSTATUS_ENABLED\020\002*\201\001\n\017" +
-      "ServiceTypeEnum\022\027\n\023SERVICETYPE_UNKNOWN\020\000" +
-      "\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020SERVICETYPE_L2" +
-      "NM\020\002\022)\n%SERVICETYPE_TAPI_CONNECTIVITY_SE" +
-      "RVICE\020\003*\250\001\n\021ServiceStatusEnum\022\033\n\027SERVICE" +
-      "STATUS_UNDEFINED\020\000\022\031\n\025SERVICESTATUS_PLAN" +
-      "NED\020\001\022\030\n\024SERVICESTATUS_ACTIVE\020\002\022!\n\035SERVI" +
-      "CESTATUS_PENDING_REMOVAL\020\003\022\036\n\032SERVICESTA" +
-      "TUS_SLA_VIOLATED\020\004*\251\001\n\017SliceStatusEnum\022\031" +
-      "\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICESTATUS" +
-      "_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026\n\022SLIC" +
-      "ESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DEINIT\020\004" +
-      "\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020Config" +
-      "ActionEnum\022\032\n\026CONFIGACTION_UNDEFINED\020\000\022\024" +
-      "\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTION_DEL" +
-      "ETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLA" +
-      "TION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICA" +
-      "L_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031" +
-      "PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_" +
-      "NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_" +
-      "ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATI" +
-      "ON\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\353\024\n\016ContextS" +
-      "ervice\022:\n\016ListContextIds\022\016.context.Empty" +
-      "\032\026.context.ContextIdList\"\000\0226\n\014ListContex" +
-      "ts\022\016.context.Empty\032\024.context.ContextList" +
-      "\"\000\0224\n\nGetContext\022\022.context.ContextId\032\020.c" +
-      "ontext.Context\"\000\0224\n\nSetContext\022\020.context" +
-      ".Context\032\022.context.ContextId\"\000\0225\n\rRemove" +
-      "Context\022\022.context.ContextId\032\016.context.Em" +
-      "pty\"\000\022=\n\020GetContextEvents\022\016.context.Empt" +
-      "y\032\025.context.ContextEvent\"\0000\001\022@\n\017ListTopo" +
-      "logyIds\022\022.context.ContextId\032\027.context.To" +
-      "pologyIdList\"\000\022=\n\016ListTopologies\022\022.conte" +
-      "xt.ContextId\032\025.context.TopologyList\"\000\0227\n" +
-      "\013GetTopology\022\023.context.TopologyId\032\021.cont" +
-      "ext.Topology\"\000\022E\n\022GetTopologyDetails\022\023.c" +
-      "ontext.TopologyId\032\030.context.TopologyDeta" +
-      "ils\"\000\0227\n\013SetTopology\022\021.context.Topology\032" +
-      "\023.context.TopologyId\"\000\0227\n\016RemoveTopology" +
-      "\022\023.context.TopologyId\032\016.context.Empty\"\000\022" +
-      "?\n\021GetTopologyEvents\022\016.context.Empty\032\026.c" +
-      "ontext.TopologyEvent\"\0000\001\0228\n\rListDeviceId" +
-      "s\022\016.context.Empty\032\025.context.DeviceIdList" +
-      "\"\000\0224\n\013ListDevices\022\016.context.Empty\032\023.cont" +
-      "ext.DeviceList\"\000\0221\n\tGetDevice\022\021.context." +
-      "DeviceId\032\017.context.Device\"\000\0221\n\tSetDevice" +
-      "\022\017.context.Device\032\021.context.DeviceId\"\000\0223" +
-      "\n\014RemoveDevice\022\021.context.DeviceId\032\016.cont" +
-      "ext.Empty\"\000\022;\n\017GetDeviceEvents\022\016.context" +
-      ".Empty\032\024.context.DeviceEvent\"\0000\001\022I\n\021List" +
-      "EndPointNames\022\027.context.EndPointIdList\032\031" +
-      ".context.EndPointNameList\"\000\0224\n\013ListLinkI" +
-      "ds\022\016.context.Empty\032\023.context.LinkIdList\"" +
-      "\000\0220\n\tListLinks\022\016.context.Empty\032\021.context" +
-      ".LinkList\"\000\022+\n\007GetLink\022\017.context.LinkId\032" +
-      "\r.context.Link\"\000\022+\n\007SetLink\022\r.context.Li" +
-      "nk\032\017.context.LinkId\"\000\022/\n\nRemoveLink\022\017.co" +
-      "ntext.LinkId\032\016.context.Empty\"\000\0227\n\rGetLin" +
-      "kEvents\022\016.context.Empty\032\022.context.LinkEv" +
-      "ent\"\0000\001\022>\n\016ListServiceIds\022\022.context.Cont" +
-      "extId\032\026.context.ServiceIdList\"\000\022:\n\014ListS" +
-      "ervices\022\022.context.ContextId\032\024.context.Se" +
-      "rviceList\"\000\0224\n\nGetService\022\022.context.Serv" +
-      "iceId\032\020.context.Service\"\000\0224\n\nSetService\022" +
-      "\020.context.Service\032\022.context.ServiceId\"\000\022" +
-      "6\n\014UnsetService\022\020.context.Service\032\022.cont" +
-      "ext.ServiceId\"\000\0225\n\rRemoveService\022\022.conte" +
-      "xt.ServiceId\032\016.context.Empty\"\000\022=\n\020GetSer" +
-      "viceEvents\022\016.context.Empty\032\025.context.Ser" +
-      "viceEvent\"\0000\001\022:\n\014ListSliceIds\022\022.context." +
-      "ContextId\032\024.context.SliceIdList\"\000\0226\n\nLis" +
-      "tSlices\022\022.context.ContextId\032\022.context.Sl" +
-      "iceList\"\000\022.\n\010GetSlice\022\020.context.SliceId\032" +
-      "\016.context.Slice\"\000\022.\n\010SetSlice\022\016.context." +
-      "Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSlice\022" +
-      "\016.context.Slice\032\020.context.SliceId\"\000\0221\n\013R" +
-      "emoveSlice\022\020.context.SliceId\032\016.context.E" +
-      "mpty\"\000\0229\n\016GetSliceEvents\022\016.context.Empty" +
-      "\032\023.context.SliceEvent\"\0000\001\022D\n\021ListConnect" +
-      "ionIds\022\022.context.ServiceId\032\031.context.Con" +
-      "nectionIdList\"\000\022@\n\017ListConnections\022\022.con" +
-      "text.ServiceId\032\027.context.ConnectionList\"" +
-      "\000\022=\n\rGetConnection\022\025.context.ConnectionI" +
-      "d\032\023.context.Connection\"\000\022=\n\rSetConnectio" +
-      "n\022\023.context.Connection\032\025.context.Connect" +
-      "ionId\"\000\022;\n\020RemoveConnection\022\025.context.Co" +
-      "nnectionId\032\016.context.Empty\"\000\022C\n\023GetConne" +
-      "ctionEvents\022\016.context.Empty\032\030.context.Co" +
-      "nnectionEvent\"\0000\001b\006proto3"
+      "\003(\0132\022.context.Component\022(\n\rcontroller_id" +
+      "\030\t \001(\0132\021.context.DeviceId\" \n\tComponent\022\023" +
+      "\n\013comp_string\030\001 \003(\t\"9\n\014DeviceConfig\022)\n\014c" +
+      "onfig_rules\030\001 \003(\0132\023.context.ConfigRule\"5" +
+      "\n\014DeviceIdList\022%\n\ndevice_ids\030\001 \003(\0132\021.con" +
+      "text.DeviceId\".\n\nDeviceList\022 \n\007devices\030\001" +
+      " \003(\0132\017.context.Device\"\216\001\n\014DeviceFilter\022)" +
+      "\n\ndevice_ids\030\001 \001(\0132\025.context.DeviceIdLis" +
+      "t\022\031\n\021include_endpoints\030\002 \001(\010\022\034\n\024include_" +
+      "config_rules\030\003 \001(\010\022\032\n\022include_components" +
+      "\030\004 \001(\010\"\200\001\n\013DeviceEvent\022\035\n\005event\030\001 \001(\0132\016." +
+      "context.Event\022$\n\tdevice_id\030\002 \001(\0132\021.conte" +
+      "xt.DeviceId\022,\n\rdevice_config\030\003 \001(\0132\025.con" +
+      "text.DeviceConfig\"*\n\006LinkId\022 \n\tlink_uuid" +
+      "\030\001 \001(\0132\r.context.Uuid\"f\n\004Link\022 \n\007link_id" +
+      "\030\001 \001(\0132\017.context.LinkId\022\014\n\004name\030\002 \001(\t\022.\n" +
+      "\021link_endpoint_ids\030\003 \003(\0132\023.context.EndPo" +
+      "intId\"/\n\nLinkIdList\022!\n\010link_ids\030\001 \003(\0132\017." +
+      "context.LinkId\"(\n\010LinkList\022\034\n\005links\030\001 \003(" +
+      "\0132\r.context.Link\"L\n\tLinkEvent\022\035\n\005event\030\001" +
+      " \001(\0132\016.context.Event\022 \n\007link_id\030\002 \001(\0132\017." +
+      "context.LinkId\"X\n\tServiceId\022&\n\ncontext_i" +
+      "d\030\001 \001(\0132\022.context.ContextId\022#\n\014service_u" +
+      "uid\030\002 \001(\0132\r.context.Uuid\"\333\002\n\007Service\022&\n\n" +
+      "service_id\030\001 \001(\0132\022.context.ServiceId\022\014\n\004" +
+      "name\030\002 \001(\t\022.\n\014service_type\030\003 \001(\0162\030.conte" +
+      "xt.ServiceTypeEnum\0221\n\024service_endpoint_i" +
+      "ds\030\004 \003(\0132\023.context.EndPointId\0220\n\023service" +
+      "_constraints\030\005 \003(\0132\023.context.Constraint\022" +
+      ".\n\016service_status\030\006 \001(\0132\026.context.Servic" +
+      "eStatus\022.\n\016service_config\030\007 \001(\0132\026.contex" +
+      "t.ServiceConfig\022%\n\ttimestamp\030\010 \001(\0132\022.con" +
+      "text.Timestamp\"C\n\rServiceStatus\0222\n\016servi" +
+      "ce_status\030\001 \001(\0162\032.context.ServiceStatusE" +
+      "num\":\n\rServiceConfig\022)\n\014config_rules\030\001 \003" +
+      "(\0132\023.context.ConfigRule\"8\n\rServiceIdList" +
+      "\022\'\n\013service_ids\030\001 \003(\0132\022.context.ServiceI" +
+      "d\"1\n\013ServiceList\022\"\n\010services\030\001 \003(\0132\020.con" +
+      "text.Service\"\225\001\n\rServiceFilter\022+\n\013servic" +
+      "e_ids\030\001 \001(\0132\026.context.ServiceIdList\022\034\n\024i" +
+      "nclude_endpoint_ids\030\002 \001(\010\022\033\n\023include_con" +
+      "straints\030\003 \001(\010\022\034\n\024include_config_rules\030\004" +
+      " \001(\010\"U\n\014ServiceEvent\022\035\n\005event\030\001 \001(\0132\016.co" +
+      "ntext.Event\022&\n\nservice_id\030\002 \001(\0132\022.contex" +
+      "t.ServiceId\"T\n\007SliceId\022&\n\ncontext_id\030\001 \001" +
+      "(\0132\022.context.ContextId\022!\n\nslice_uuid\030\002 \001" +
+      "(\0132\r.context.Uuid\"\240\003\n\005Slice\022\"\n\010slice_id\030" +
+      "\001 \001(\0132\020.context.SliceId\022\014\n\004name\030\002 \001(\t\022/\n" +
+      "\022slice_endpoint_ids\030\003 \003(\0132\023.context.EndP" +
+      "ointId\022.\n\021slice_constraints\030\004 \003(\0132\023.cont" +
+      "ext.Constraint\022-\n\021slice_service_ids\030\005 \003(" +
+      "\0132\022.context.ServiceId\022,\n\022slice_subslice_" +
+      "ids\030\006 \003(\0132\020.context.SliceId\022*\n\014slice_sta" +
+      "tus\030\007 \001(\0132\024.context.SliceStatus\022*\n\014slice" +
+      "_config\030\010 \001(\0132\024.context.SliceConfig\022(\n\013s" +
+      "lice_owner\030\t \001(\0132\023.context.SliceOwner\022%\n" +
+      "\ttimestamp\030\n \001(\0132\022.context.Timestamp\"E\n\n" +
+      "SliceOwner\022!\n\nowner_uuid\030\001 \001(\0132\r.context" +
+      ".Uuid\022\024\n\014owner_string\030\002 \001(\t\"=\n\013SliceStat" +
+      "us\022.\n\014slice_status\030\001 \001(\0162\030.context.Slice" +
+      "StatusEnum\"8\n\013SliceConfig\022)\n\014config_rule" +
+      "s\030\001 \003(\0132\023.context.ConfigRule\"2\n\013SliceIdL" +
+      "ist\022#\n\tslice_ids\030\001 \003(\0132\020.context.SliceId" +
+      "\"+\n\tSliceList\022\036\n\006slices\030\001 \003(\0132\016.context." +
+      "Slice\"\312\001\n\013SliceFilter\022\'\n\tslice_ids\030\001 \001(\013" +
+      "2\024.context.SliceIdList\022\034\n\024include_endpoi" +
+      "nt_ids\030\002 \001(\010\022\033\n\023include_constraints\030\003 \001(" +
+      "\010\022\033\n\023include_service_ids\030\004 \001(\010\022\034\n\024includ" +
+      "e_subslice_ids\030\005 \001(\010\022\034\n\024include_config_r" +
+      "ules\030\006 \001(\010\"O\n\nSliceEvent\022\035\n\005event\030\001 \001(\0132" +
+      "\016.context.Event\022\"\n\010slice_id\030\002 \001(\0132\020.cont" +
+      "ext.SliceId\"6\n\014ConnectionId\022&\n\017connectio" +
+      "n_uuid\030\001 \001(\0132\r.context.Uuid\"2\n\025Connectio" +
+      "nSettings_L0\022\031\n\021lsp_symbolic_name\030\001 \001(\t\"" +
+      "\236\001\n\025ConnectionSettings_L2\022\027\n\017src_mac_add" +
+      "ress\030\001 \001(\t\022\027\n\017dst_mac_address\030\002 \001(\t\022\022\n\ne" +
+      "ther_type\030\003 \001(\r\022\017\n\007vlan_id\030\004 \001(\r\022\022\n\nmpls" +
+      "_label\030\005 \001(\r\022\032\n\022mpls_traffic_class\030\006 \001(\r" +
+      "\"t\n\025ConnectionSettings_L3\022\026\n\016src_ip_addr" +
+      "ess\030\001 \001(\t\022\026\n\016dst_ip_address\030\002 \001(\t\022\014\n\004dsc" +
+      "p\030\003 \001(\r\022\020\n\010protocol\030\004 \001(\r\022\013\n\003ttl\030\005 \001(\r\"[" +
+      "\n\025ConnectionSettings_L4\022\020\n\010src_port\030\001 \001(" +
+      "\r\022\020\n\010dst_port\030\002 \001(\r\022\021\n\ttcp_flags\030\003 \001(\r\022\013" +
+      "\n\003ttl\030\004 \001(\r\"\304\001\n\022ConnectionSettings\022*\n\002l0" +
+      "\030\001 \001(\0132\036.context.ConnectionSettings_L0\022*" +
+      "\n\002l2\030\002 \001(\0132\036.context.ConnectionSettings_" +
+      "L2\022*\n\002l3\030\003 \001(\0132\036.context.ConnectionSetti" +
+      "ngs_L3\022*\n\002l4\030\004 \001(\0132\036.context.ConnectionS" +
+      "ettings_L4\"\363\001\n\nConnection\022,\n\rconnection_" +
+      "id\030\001 \001(\0132\025.context.ConnectionId\022&\n\nservi" +
+      "ce_id\030\002 \001(\0132\022.context.ServiceId\0223\n\026path_" +
+      "hops_endpoint_ids\030\003 \003(\0132\023.context.EndPoi" +
+      "ntId\022+\n\017sub_service_ids\030\004 \003(\0132\022.context." +
+      "ServiceId\022-\n\010settings\030\005 \001(\0132\033.context.Co" +
+      "nnectionSettings\"A\n\020ConnectionIdList\022-\n\016" +
+      "connection_ids\030\001 \003(\0132\025.context.Connectio" +
+      "nId\":\n\016ConnectionList\022(\n\013connections\030\001 \003" +
+      "(\0132\023.context.Connection\"^\n\017ConnectionEve" +
+      "nt\022\035\n\005event\030\001 \001(\0132\016.context.Event\022,\n\rcon" +
+      "nection_id\030\002 \001(\0132\025.context.ConnectionId\"" +
+      "\202\001\n\nEndPointId\022(\n\013topology_id\030\001 \001(\0132\023.co" +
+      "ntext.TopologyId\022$\n\tdevice_id\030\002 \001(\0132\021.co" +
+      "ntext.DeviceId\022$\n\rendpoint_uuid\030\003 \001(\0132\r." +
+      "context.Uuid\"\302\001\n\010EndPoint\022(\n\013endpoint_id" +
+      "\030\001 \001(\0132\023.context.EndPointId\022\014\n\004name\030\002 \001(" +
+      "\t\022\025\n\rendpoint_type\030\003 \001(\t\0229\n\020kpi_sample_t" +
+      "ypes\030\004 \003(\0162\037.kpi_sample_types.KpiSampleT" +
+      "ype\022,\n\021endpoint_location\030\005 \001(\0132\021.context" +
+      ".Location\"{\n\014EndPointName\022(\n\013endpoint_id" +
+      "\030\001 \001(\0132\023.context.EndPointId\022\023\n\013device_na" +
+      "me\030\002 \001(\t\022\025\n\rendpoint_name\030\003 \001(\t\022\025\n\rendpo" +
+      "int_type\030\004 \001(\t\";\n\016EndPointIdList\022)\n\014endp" +
+      "oint_ids\030\001 \003(\0132\023.context.EndPointId\"A\n\020E" +
+      "ndPointNameList\022-\n\016endpoint_names\030\001 \003(\0132" +
+      "\025.context.EndPointName\"A\n\021ConfigRule_Cus" +
+      "tom\022\024\n\014resource_key\030\001 \001(\t\022\026\n\016resource_va" +
+      "lue\030\002 \001(\t\"]\n\016ConfigRule_ACL\022(\n\013endpoint_" +
+      "id\030\001 \001(\0132\023.context.EndPointId\022!\n\010rule_se" +
+      "t\030\002 \001(\0132\017.acl.AclRuleSet\"\234\001\n\nConfigRule\022" +
+      ")\n\006action\030\001 \001(\0162\031.context.ConfigActionEn" +
+      "um\022,\n\006custom\030\002 \001(\0132\032.context.ConfigRule_" +
+      "CustomH\000\022&\n\003acl\030\003 \001(\0132\027.context.ConfigRu" +
+      "le_ACLH\000B\r\n\013config_rule\"F\n\021Constraint_Cu" +
+      "stom\022\027\n\017constraint_type\030\001 \001(\t\022\030\n\020constra" +
+      "int_value\030\002 \001(\t\"E\n\023Constraint_Schedule\022\027" +
+      "\n\017start_timestamp\030\001 \001(\002\022\025\n\rduration_days" +
+      "\030\002 \001(\002\"3\n\014GPS_Position\022\020\n\010latitude\030\001 \001(\002" +
+      "\022\021\n\tlongitude\030\002 \001(\002\"W\n\010Location\022\020\n\006regio" +
+      "n\030\001 \001(\tH\000\022-\n\014gps_position\030\002 \001(\0132\025.contex" +
+      "t.GPS_PositionH\000B\n\n\010location\"l\n\033Constrai" +
+      "nt_EndPointLocation\022(\n\013endpoint_id\030\001 \001(\013" +
+      "2\023.context.EndPointId\022#\n\010location\030\002 \001(\0132" +
+      "\021.context.Location\"Y\n\033Constraint_EndPoin" +
+      "tPriority\022(\n\013endpoint_id\030\001 \001(\0132\023.context" +
+      ".EndPointId\022\020\n\010priority\030\002 \001(\r\"0\n\026Constra" +
+      "int_SLA_Latency\022\026\n\016e2e_latency_ms\030\001 \001(\002\"" +
+      "0\n\027Constraint_SLA_Capacity\022\025\n\rcapacity_g" +
+      "bps\030\001 \001(\002\"c\n\033Constraint_SLA_Availability" +
+      "\022\032\n\022num_disjoint_paths\030\001 \001(\r\022\022\n\nall_acti" +
+      "ve\030\002 \001(\010\022\024\n\014availability\030\003 \001(\002\"V\n\036Constr" +
+      "aint_SLA_Isolation_level\0224\n\017isolation_le" +
+      "vel\030\001 \003(\0162\033.context.IsolationLevelEnum\"\242" +
+      "\001\n\025Constraint_Exclusions\022\024\n\014is_permanent" +
+      "\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.Dev" +
+      "iceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context.En" +
+      "dPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.Lin" +
+      "kId\"\333\004\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.con" +
+      "text.ConstraintActionEnum\022,\n\006custom\030\002 \001(" +
+      "\0132\032.context.Constraint_CustomH\000\0220\n\010sched" +
+      "ule\030\003 \001(\0132\034.context.Constraint_ScheduleH" +
+      "\000\022A\n\021endpoint_location\030\004 \001(\0132$.context.C" +
+      "onstraint_EndPointLocationH\000\022A\n\021endpoint" +
+      "_priority\030\005 \001(\0132$.context.Constraint_End" +
+      "PointPriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 ." +
+      "context.Constraint_SLA_CapacityH\000\0226\n\013sla" +
+      "_latency\030\007 \001(\0132\037.context.Constraint_SLA_" +
+      "LatencyH\000\022@\n\020sla_availability\030\010 \001(\0132$.co" +
+      "ntext.Constraint_SLA_AvailabilityH\000\022@\n\rs" +
+      "la_isolation\030\t \001(\0132\'.context.Constraint_" +
+      "SLA_Isolation_levelH\000\0224\n\nexclusions\030\n \001(" +
+      "\0132\036.context.Constraint_ExclusionsH\000B\014\n\nc" +
+      "onstraint\"^\n\022TeraFlowController\022&\n\nconte" +
+      "xt_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip_ad" +
+      "dress\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenticat" +
+      "ionResult\022&\n\ncontext_id\030\001 \001(\0132\022.context." +
+      "ContextId\022\025\n\rauthenticated\030\002 \001(\010*j\n\rEven" +
+      "tTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EV" +
+      "ENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024" +
+      "\n\020EVENTTYPE_REMOVE\020\003*\231\002\n\020DeviceDriverEnu" +
+      "m\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICED" +
+      "RIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANS" +
+      "PORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVIC" +
+      "EDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVIC" +
+      "EDRIVER_ONF_TR_352\020\005\022\023\n\017DEVICEDRIVER_XR\020" +
+      "\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVICE" +
+      "DRIVER_GNMI_OPENCONFIG\020\010*\217\001\n\033DeviceOpera" +
+      "tionalStatusEnum\022%\n!DEVICEOPERATIONALSTA" +
+      "TUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTAT" +
+      "US_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS" +
+      "_ENABLED\020\002*\201\001\n\017ServiceTypeEnum\022\027\n\023SERVIC" +
+      "ETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n" +
+      "\020SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_TAPI_" +
+      "CONNECTIVITY_SERVICE\020\003*\304\001\n\021ServiceStatus" +
+      "Enum\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025SER" +
+      "VICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS_AC" +
+      "TIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n\035SE" +
+      "RVICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERVICE" +
+      "STATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatusEnu" +
+      "m\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICESTA" +
+      "TUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026\n\022S" +
+      "LICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DEINI" +
+      "T\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020Con" +
+      "figActionEnum\022\032\n\026CONFIGACTION_UNDEFINED\020" +
+      "\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTION_" +
+      "DELETE\020\002*m\n\024ConstraintActionEnum\022\036\n\032CONS" +
+      "TRAINTACTION_UNDEFINED\020\000\022\030\n\024CONSTRAINTAC" +
+      "TION_SET\020\001\022\033\n\027CONSTRAINTACTION_DELETE\020\002*" +
+      "\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLATION\020\000" +
+      "\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICAL_ISOL" +
+      "ATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031PHYSIC" +
+      "AL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_NETWOR" +
+      "K_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_ISOLAT" +
+      "ION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATION\020\007\022\025" +
+      "\n\021SERVICE_ISOLATION\020\0102\245\026\n\016ContextService" +
+      "\022:\n\016ListContextIds\022\016.context.Empty\032\026.con" +
+      "text.ContextIdList\"\000\0226\n\014ListContexts\022\016.c" +
+      "ontext.Empty\032\024.context.ContextList\"\000\0224\n\n" +
+      "GetContext\022\022.context.ContextId\032\020.context" +
+      ".Context\"\000\0224\n\nSetContext\022\020.context.Conte" +
+      "xt\032\022.context.ContextId\"\000\0225\n\rRemoveContex" +
+      "t\022\022.context.ContextId\032\016.context.Empty\"\000\022" +
+      "=\n\020GetContextEvents\022\016.context.Empty\032\025.co" +
+      "ntext.ContextEvent\"\0000\001\022@\n\017ListTopologyId" +
+      "s\022\022.context.ContextId\032\027.context.Topology" +
+      "IdList\"\000\022=\n\016ListTopologies\022\022.context.Con" +
+      "textId\032\025.context.TopologyList\"\000\0227\n\013GetTo" +
+      "pology\022\023.context.TopologyId\032\021.context.To" +
+      "pology\"\000\022E\n\022GetTopologyDetails\022\023.context" +
+      ".TopologyId\032\030.context.TopologyDetails\"\000\022" +
+      "7\n\013SetTopology\022\021.context.Topology\032\023.cont" +
+      "ext.TopologyId\"\000\0227\n\016RemoveTopology\022\023.con" +
+      "text.TopologyId\032\016.context.Empty\"\000\022?\n\021Get" +
+      "TopologyEvents\022\016.context.Empty\032\026.context" +
+      ".TopologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016.co" +
+      "ntext.Empty\032\025.context.DeviceIdList\"\000\0224\n\013" +
+      "ListDevices\022\016.context.Empty\032\023.context.De" +
+      "viceList\"\000\0221\n\tGetDevice\022\021.context.Device" +
+      "Id\032\017.context.Device\"\000\0221\n\tSetDevice\022\017.con" +
+      "text.Device\032\021.context.DeviceId\"\000\0223\n\014Remo" +
+      "veDevice\022\021.context.DeviceId\032\016.context.Em" +
+      "pty\"\000\022;\n\017GetDeviceEvents\022\016.context.Empty" +
+      "\032\024.context.DeviceEvent\"\0000\001\022<\n\014SelectDevi" +
+      "ce\022\025.context.DeviceFilter\032\023.context.Devi" +
+      "ceList\"\000\022I\n\021ListEndPointNames\022\027.context." +
+      "EndPointIdList\032\031.context.EndPointNameLis" +
+      "t\"\000\0224\n\013ListLinkIds\022\016.context.Empty\032\023.con" +
+      "text.LinkIdList\"\000\0220\n\tListLinks\022\016.context" +
+      ".Empty\032\021.context.LinkList\"\000\022+\n\007GetLink\022\017" +
+      ".context.LinkId\032\r.context.Link\"\000\022+\n\007SetL" +
+      "ink\022\r.context.Link\032\017.context.LinkId\"\000\022/\n" +
+      "\nRemoveLink\022\017.context.LinkId\032\016.context.E" +
+      "mpty\"\000\0227\n\rGetLinkEvents\022\016.context.Empty\032" +
+      "\022.context.LinkEvent\"\0000\001\022>\n\016ListServiceId" +
+      "s\022\022.context.ContextId\032\026.context.ServiceI" +
+      "dList\"\000\022:\n\014ListServices\022\022.context.Contex" +
+      "tId\032\024.context.ServiceList\"\000\0224\n\nGetServic" +
+      "e\022\022.context.ServiceId\032\020.context.Service\"" +
+      "\000\0224\n\nSetService\022\020.context.Service\032\022.cont" +
+      "ext.ServiceId\"\000\0226\n\014UnsetService\022\020.contex" +
+      "t.Service\032\022.context.ServiceId\"\000\0225\n\rRemov" +
+      "eService\022\022.context.ServiceId\032\016.context.E" +
+      "mpty\"\000\022=\n\020GetServiceEvents\022\016.context.Emp" +
+      "ty\032\025.context.ServiceEvent\"\0000\001\022?\n\rSelectS" +
+      "ervice\022\026.context.ServiceFilter\032\024.context" +
+      ".ServiceList\"\000\022:\n\014ListSliceIds\022\022.context" +
+      ".ContextId\032\024.context.SliceIdList\"\000\0226\n\nLi" +
+      "stSlices\022\022.context.ContextId\032\022.context.S" +
+      "liceList\"\000\022.\n\010GetSlice\022\020.context.SliceId" +
+      "\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016.context" +
+      ".Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSlice" +
+      "\022\016.context.Slice\032\020.context.SliceId\"\000\0221\n\013" +
+      "RemoveSlice\022\020.context.SliceId\032\016.context." +
+      "Empty\"\000\0229\n\016GetSliceEvents\022\016.context.Empt" +
+      "y\032\023.context.SliceEvent\"\0000\001\0229\n\013SelectSlic" +
+      "e\022\024.context.SliceFilter\032\022.context.SliceL" +
+      "ist\"\000\022D\n\021ListConnectionIds\022\022.context.Ser" +
+      "viceId\032\031.context.ConnectionIdList\"\000\022@\n\017L" +
+      "istConnections\022\022.context.ServiceId\032\027.con" +
+      "text.ConnectionList\"\000\022=\n\rGetConnection\022\025" +
+      ".context.ConnectionId\032\023.context.Connecti" +
+      "on\"\000\022=\n\rSetConnection\022\023.context.Connecti" +
+      "on\032\025.context.ConnectionId\"\000\022;\n\020RemoveCon" +
+      "nection\022\025.context.ConnectionId\032\016.context" +
+      ".Empty\"\000\022C\n\023GetConnectionEvents\022\016.contex" +
+      "t.Empty\032\030.context.ConnectionEvent\"\0000\001b\006p" +
+      "roto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -69301,7 +74426,7 @@ public final class ContextOuterClass {
     internal_static_context_Device_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Device_descriptor,
-        new java.lang.String[] { "DeviceId", "Name", "DeviceType", "DeviceConfig", "DeviceOperationalStatus", "DeviceDrivers", "DeviceEndpoints", "Component", });
+        new java.lang.String[] { "DeviceId", "Name", "DeviceType", "DeviceConfig", "DeviceOperationalStatus", "DeviceDrivers", "DeviceEndpoints", "Component", "ControllerId", });
     internal_static_context_Component_descriptor =
       getDescriptor().getMessageTypes().get(17);
     internal_static_context_Component_fieldAccessorTable = new
@@ -69326,314 +74451,338 @@ public final class ContextOuterClass {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_DeviceList_descriptor,
         new java.lang.String[] { "Devices", });
-    internal_static_context_DeviceEvent_descriptor =
+    internal_static_context_DeviceFilter_descriptor =
       getDescriptor().getMessageTypes().get(21);
+    internal_static_context_DeviceFilter_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_context_DeviceFilter_descriptor,
+        new java.lang.String[] { "DeviceIds", "IncludeEndpoints", "IncludeConfigRules", "IncludeComponents", });
+    internal_static_context_DeviceEvent_descriptor =
+      getDescriptor().getMessageTypes().get(22);
     internal_static_context_DeviceEvent_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_DeviceEvent_descriptor,
         new java.lang.String[] { "Event", "DeviceId", "DeviceConfig", });
     internal_static_context_LinkId_descriptor =
-      getDescriptor().getMessageTypes().get(22);
+      getDescriptor().getMessageTypes().get(23);
     internal_static_context_LinkId_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_LinkId_descriptor,
         new java.lang.String[] { "LinkUuid", });
     internal_static_context_Link_descriptor =
-      getDescriptor().getMessageTypes().get(23);
+      getDescriptor().getMessageTypes().get(24);
     internal_static_context_Link_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Link_descriptor,
         new java.lang.String[] { "LinkId", "Name", "LinkEndpointIds", });
     internal_static_context_LinkIdList_descriptor =
-      getDescriptor().getMessageTypes().get(24);
+      getDescriptor().getMessageTypes().get(25);
     internal_static_context_LinkIdList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_LinkIdList_descriptor,
         new java.lang.String[] { "LinkIds", });
     internal_static_context_LinkList_descriptor =
-      getDescriptor().getMessageTypes().get(25);
+      getDescriptor().getMessageTypes().get(26);
     internal_static_context_LinkList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_LinkList_descriptor,
         new java.lang.String[] { "Links", });
     internal_static_context_LinkEvent_descriptor =
-      getDescriptor().getMessageTypes().get(26);
+      getDescriptor().getMessageTypes().get(27);
     internal_static_context_LinkEvent_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_LinkEvent_descriptor,
         new java.lang.String[] { "Event", "LinkId", });
     internal_static_context_ServiceId_descriptor =
-      getDescriptor().getMessageTypes().get(27);
+      getDescriptor().getMessageTypes().get(28);
     internal_static_context_ServiceId_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ServiceId_descriptor,
         new java.lang.String[] { "ContextId", "ServiceUuid", });
     internal_static_context_Service_descriptor =
-      getDescriptor().getMessageTypes().get(28);
+      getDescriptor().getMessageTypes().get(29);
     internal_static_context_Service_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Service_descriptor,
         new java.lang.String[] { "ServiceId", "Name", "ServiceType", "ServiceEndpointIds", "ServiceConstraints", "ServiceStatus", "ServiceConfig", "Timestamp", });
     internal_static_context_ServiceStatus_descriptor =
-      getDescriptor().getMessageTypes().get(29);
+      getDescriptor().getMessageTypes().get(30);
     internal_static_context_ServiceStatus_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ServiceStatus_descriptor,
         new java.lang.String[] { "ServiceStatus", });
     internal_static_context_ServiceConfig_descriptor =
-      getDescriptor().getMessageTypes().get(30);
+      getDescriptor().getMessageTypes().get(31);
     internal_static_context_ServiceConfig_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ServiceConfig_descriptor,
         new java.lang.String[] { "ConfigRules", });
     internal_static_context_ServiceIdList_descriptor =
-      getDescriptor().getMessageTypes().get(31);
+      getDescriptor().getMessageTypes().get(32);
     internal_static_context_ServiceIdList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ServiceIdList_descriptor,
         new java.lang.String[] { "ServiceIds", });
     internal_static_context_ServiceList_descriptor =
-      getDescriptor().getMessageTypes().get(32);
+      getDescriptor().getMessageTypes().get(33);
     internal_static_context_ServiceList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ServiceList_descriptor,
         new java.lang.String[] { "Services", });
+    internal_static_context_ServiceFilter_descriptor =
+      getDescriptor().getMessageTypes().get(34);
+    internal_static_context_ServiceFilter_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_context_ServiceFilter_descriptor,
+        new java.lang.String[] { "ServiceIds", "IncludeEndpointIds", "IncludeConstraints", "IncludeConfigRules", });
     internal_static_context_ServiceEvent_descriptor =
-      getDescriptor().getMessageTypes().get(33);
+      getDescriptor().getMessageTypes().get(35);
     internal_static_context_ServiceEvent_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ServiceEvent_descriptor,
         new java.lang.String[] { "Event", "ServiceId", });
     internal_static_context_SliceId_descriptor =
-      getDescriptor().getMessageTypes().get(34);
+      getDescriptor().getMessageTypes().get(36);
     internal_static_context_SliceId_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceId_descriptor,
         new java.lang.String[] { "ContextId", "SliceUuid", });
     internal_static_context_Slice_descriptor =
-      getDescriptor().getMessageTypes().get(35);
+      getDescriptor().getMessageTypes().get(37);
     internal_static_context_Slice_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Slice_descriptor,
         new java.lang.String[] { "SliceId", "Name", "SliceEndpointIds", "SliceConstraints", "SliceServiceIds", "SliceSubsliceIds", "SliceStatus", "SliceConfig", "SliceOwner", "Timestamp", });
     internal_static_context_SliceOwner_descriptor =
-      getDescriptor().getMessageTypes().get(36);
+      getDescriptor().getMessageTypes().get(38);
     internal_static_context_SliceOwner_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceOwner_descriptor,
         new java.lang.String[] { "OwnerUuid", "OwnerString", });
     internal_static_context_SliceStatus_descriptor =
-      getDescriptor().getMessageTypes().get(37);
+      getDescriptor().getMessageTypes().get(39);
     internal_static_context_SliceStatus_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceStatus_descriptor,
         new java.lang.String[] { "SliceStatus", });
     internal_static_context_SliceConfig_descriptor =
-      getDescriptor().getMessageTypes().get(38);
+      getDescriptor().getMessageTypes().get(40);
     internal_static_context_SliceConfig_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceConfig_descriptor,
         new java.lang.String[] { "ConfigRules", });
     internal_static_context_SliceIdList_descriptor =
-      getDescriptor().getMessageTypes().get(39);
+      getDescriptor().getMessageTypes().get(41);
     internal_static_context_SliceIdList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceIdList_descriptor,
         new java.lang.String[] { "SliceIds", });
     internal_static_context_SliceList_descriptor =
-      getDescriptor().getMessageTypes().get(40);
+      getDescriptor().getMessageTypes().get(42);
     internal_static_context_SliceList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceList_descriptor,
         new java.lang.String[] { "Slices", });
+    internal_static_context_SliceFilter_descriptor =
+      getDescriptor().getMessageTypes().get(43);
+    internal_static_context_SliceFilter_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_context_SliceFilter_descriptor,
+        new java.lang.String[] { "SliceIds", "IncludeEndpointIds", "IncludeConstraints", "IncludeServiceIds", "IncludeSubsliceIds", "IncludeConfigRules", });
     internal_static_context_SliceEvent_descriptor =
-      getDescriptor().getMessageTypes().get(41);
+      getDescriptor().getMessageTypes().get(44);
     internal_static_context_SliceEvent_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_SliceEvent_descriptor,
         new java.lang.String[] { "Event", "SliceId", });
     internal_static_context_ConnectionId_descriptor =
-      getDescriptor().getMessageTypes().get(42);
+      getDescriptor().getMessageTypes().get(45);
     internal_static_context_ConnectionId_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionId_descriptor,
         new java.lang.String[] { "ConnectionUuid", });
     internal_static_context_ConnectionSettings_L0_descriptor =
-      getDescriptor().getMessageTypes().get(43);
+      getDescriptor().getMessageTypes().get(46);
     internal_static_context_ConnectionSettings_L0_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionSettings_L0_descriptor,
         new java.lang.String[] { "LspSymbolicName", });
     internal_static_context_ConnectionSettings_L2_descriptor =
-      getDescriptor().getMessageTypes().get(44);
+      getDescriptor().getMessageTypes().get(47);
     internal_static_context_ConnectionSettings_L2_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionSettings_L2_descriptor,
         new java.lang.String[] { "SrcMacAddress", "DstMacAddress", "EtherType", "VlanId", "MplsLabel", "MplsTrafficClass", });
     internal_static_context_ConnectionSettings_L3_descriptor =
-      getDescriptor().getMessageTypes().get(45);
+      getDescriptor().getMessageTypes().get(48);
     internal_static_context_ConnectionSettings_L3_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionSettings_L3_descriptor,
         new java.lang.String[] { "SrcIpAddress", "DstIpAddress", "Dscp", "Protocol", "Ttl", });
     internal_static_context_ConnectionSettings_L4_descriptor =
-      getDescriptor().getMessageTypes().get(46);
+      getDescriptor().getMessageTypes().get(49);
     internal_static_context_ConnectionSettings_L4_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionSettings_L4_descriptor,
         new java.lang.String[] { "SrcPort", "DstPort", "TcpFlags", "Ttl", });
     internal_static_context_ConnectionSettings_descriptor =
-      getDescriptor().getMessageTypes().get(47);
+      getDescriptor().getMessageTypes().get(50);
     internal_static_context_ConnectionSettings_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionSettings_descriptor,
         new java.lang.String[] { "L0", "L2", "L3", "L4", });
     internal_static_context_Connection_descriptor =
-      getDescriptor().getMessageTypes().get(48);
+      getDescriptor().getMessageTypes().get(51);
     internal_static_context_Connection_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Connection_descriptor,
         new java.lang.String[] { "ConnectionId", "ServiceId", "PathHopsEndpointIds", "SubServiceIds", "Settings", });
     internal_static_context_ConnectionIdList_descriptor =
-      getDescriptor().getMessageTypes().get(49);
+      getDescriptor().getMessageTypes().get(52);
     internal_static_context_ConnectionIdList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionIdList_descriptor,
         new java.lang.String[] { "ConnectionIds", });
     internal_static_context_ConnectionList_descriptor =
-      getDescriptor().getMessageTypes().get(50);
+      getDescriptor().getMessageTypes().get(53);
     internal_static_context_ConnectionList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionList_descriptor,
         new java.lang.String[] { "Connections", });
     internal_static_context_ConnectionEvent_descriptor =
-      getDescriptor().getMessageTypes().get(51);
+      getDescriptor().getMessageTypes().get(54);
     internal_static_context_ConnectionEvent_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConnectionEvent_descriptor,
         new java.lang.String[] { "Event", "ConnectionId", });
     internal_static_context_EndPointId_descriptor =
-      getDescriptor().getMessageTypes().get(52);
+      getDescriptor().getMessageTypes().get(55);
     internal_static_context_EndPointId_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_EndPointId_descriptor,
         new java.lang.String[] { "TopologyId", "DeviceId", "EndpointUuid", });
     internal_static_context_EndPoint_descriptor =
-      getDescriptor().getMessageTypes().get(53);
+      getDescriptor().getMessageTypes().get(56);
     internal_static_context_EndPoint_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_EndPoint_descriptor,
         new java.lang.String[] { "EndpointId", "Name", "EndpointType", "KpiSampleTypes", "EndpointLocation", });
     internal_static_context_EndPointName_descriptor =
-      getDescriptor().getMessageTypes().get(54);
+      getDescriptor().getMessageTypes().get(57);
     internal_static_context_EndPointName_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_EndPointName_descriptor,
         new java.lang.String[] { "EndpointId", "DeviceName", "EndpointName", "EndpointType", });
     internal_static_context_EndPointIdList_descriptor =
-      getDescriptor().getMessageTypes().get(55);
+      getDescriptor().getMessageTypes().get(58);
     internal_static_context_EndPointIdList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_EndPointIdList_descriptor,
         new java.lang.String[] { "EndpointIds", });
     internal_static_context_EndPointNameList_descriptor =
-      getDescriptor().getMessageTypes().get(56);
+      getDescriptor().getMessageTypes().get(59);
     internal_static_context_EndPointNameList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_EndPointNameList_descriptor,
         new java.lang.String[] { "EndpointNames", });
     internal_static_context_ConfigRule_Custom_descriptor =
-      getDescriptor().getMessageTypes().get(57);
+      getDescriptor().getMessageTypes().get(60);
     internal_static_context_ConfigRule_Custom_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConfigRule_Custom_descriptor,
         new java.lang.String[] { "ResourceKey", "ResourceValue", });
     internal_static_context_ConfigRule_ACL_descriptor =
-      getDescriptor().getMessageTypes().get(58);
+      getDescriptor().getMessageTypes().get(61);
     internal_static_context_ConfigRule_ACL_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConfigRule_ACL_descriptor,
         new java.lang.String[] { "EndpointId", "RuleSet", });
     internal_static_context_ConfigRule_descriptor =
-      getDescriptor().getMessageTypes().get(59);
+      getDescriptor().getMessageTypes().get(62);
     internal_static_context_ConfigRule_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_ConfigRule_descriptor,
         new java.lang.String[] { "Action", "Custom", "Acl", "ConfigRule", });
     internal_static_context_Constraint_Custom_descriptor =
-      getDescriptor().getMessageTypes().get(60);
+      getDescriptor().getMessageTypes().get(63);
     internal_static_context_Constraint_Custom_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_Custom_descriptor,
         new java.lang.String[] { "ConstraintType", "ConstraintValue", });
     internal_static_context_Constraint_Schedule_descriptor =
-      getDescriptor().getMessageTypes().get(61);
+      getDescriptor().getMessageTypes().get(64);
     internal_static_context_Constraint_Schedule_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_Schedule_descriptor,
         new java.lang.String[] { "StartTimestamp", "DurationDays", });
     internal_static_context_GPS_Position_descriptor =
-      getDescriptor().getMessageTypes().get(62);
+      getDescriptor().getMessageTypes().get(65);
     internal_static_context_GPS_Position_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_GPS_Position_descriptor,
         new java.lang.String[] { "Latitude", "Longitude", });
     internal_static_context_Location_descriptor =
-      getDescriptor().getMessageTypes().get(63);
+      getDescriptor().getMessageTypes().get(66);
     internal_static_context_Location_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Location_descriptor,
         new java.lang.String[] { "Region", "GpsPosition", "Location", });
     internal_static_context_Constraint_EndPointLocation_descriptor =
-      getDescriptor().getMessageTypes().get(64);
+      getDescriptor().getMessageTypes().get(67);
     internal_static_context_Constraint_EndPointLocation_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_EndPointLocation_descriptor,
         new java.lang.String[] { "EndpointId", "Location", });
     internal_static_context_Constraint_EndPointPriority_descriptor =
-      getDescriptor().getMessageTypes().get(65);
+      getDescriptor().getMessageTypes().get(68);
     internal_static_context_Constraint_EndPointPriority_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_EndPointPriority_descriptor,
         new java.lang.String[] { "EndpointId", "Priority", });
     internal_static_context_Constraint_SLA_Latency_descriptor =
-      getDescriptor().getMessageTypes().get(66);
+      getDescriptor().getMessageTypes().get(69);
     internal_static_context_Constraint_SLA_Latency_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_SLA_Latency_descriptor,
         new java.lang.String[] { "E2ELatencyMs", });
     internal_static_context_Constraint_SLA_Capacity_descriptor =
-      getDescriptor().getMessageTypes().get(67);
+      getDescriptor().getMessageTypes().get(70);
     internal_static_context_Constraint_SLA_Capacity_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_SLA_Capacity_descriptor,
         new java.lang.String[] { "CapacityGbps", });
     internal_static_context_Constraint_SLA_Availability_descriptor =
-      getDescriptor().getMessageTypes().get(68);
+      getDescriptor().getMessageTypes().get(71);
     internal_static_context_Constraint_SLA_Availability_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_SLA_Availability_descriptor,
-        new java.lang.String[] { "NumDisjointPaths", "AllActive", });
+        new java.lang.String[] { "NumDisjointPaths", "AllActive", "Availability", });
     internal_static_context_Constraint_SLA_Isolation_level_descriptor =
-      getDescriptor().getMessageTypes().get(69);
+      getDescriptor().getMessageTypes().get(72);
     internal_static_context_Constraint_SLA_Isolation_level_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_SLA_Isolation_level_descriptor,
         new java.lang.String[] { "IsolationLevel", });
+    internal_static_context_Constraint_Exclusions_descriptor =
+      getDescriptor().getMessageTypes().get(73);
+    internal_static_context_Constraint_Exclusions_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_context_Constraint_Exclusions_descriptor,
+        new java.lang.String[] { "IsPermanent", "DeviceIds", "EndpointIds", "LinkIds", });
     internal_static_context_Constraint_descriptor =
-      getDescriptor().getMessageTypes().get(70);
+      getDescriptor().getMessageTypes().get(74);
     internal_static_context_Constraint_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_descriptor,
-        new java.lang.String[] { "Custom", "Schedule", "EndpointLocation", "EndpointPriority", "SlaCapacity", "SlaLatency", "SlaAvailability", "SlaIsolation", "Constraint", });
+        new java.lang.String[] { "Action", "Custom", "Schedule", "EndpointLocation", "EndpointPriority", "SlaCapacity", "SlaLatency", "SlaAvailability", "SlaIsolation", "Exclusions", "Constraint", });
     internal_static_context_TeraFlowController_descriptor =
-      getDescriptor().getMessageTypes().get(71);
+      getDescriptor().getMessageTypes().get(75);
     internal_static_context_TeraFlowController_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_TeraFlowController_descriptor,
         new java.lang.String[] { "ContextId", "IpAddress", "Port", });
     internal_static_context_AuthenticationResult_descriptor =
-      getDescriptor().getMessageTypes().get(72);
+      getDescriptor().getMessageTypes().get(76);
     internal_static_context_AuthenticationResult_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_AuthenticationResult_descriptor,
diff --git a/src/automation/target/generated-sources/grpc/context/ContextService.java b/src/automation/target/generated-sources/grpc/context/ContextService.java
index 502501301a71cb28cac6ca9a804271558c15b5b5..b356bac75e24f5f412c51de5450d284ea340ce12 100644
--- a/src/automation/target/generated-sources/grpc/context/ContextService.java
+++ b/src/automation/target/generated-sources/grpc/context/ContextService.java
@@ -40,6 +40,8 @@ public interface ContextService extends MutinyService {
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> removeDevice(context.ContextOuterClass.DeviceId request);
     
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceList> selectDevice(context.ContextOuterClass.DeviceFilter request);
+    
     io.smallrye.mutiny.Uni<context.ContextOuterClass.EndPointNameList> listEndPointNames(context.ContextOuterClass.EndPointIdList request);
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.LinkIdList> listLinkIds(context.ContextOuterClass.Empty request);
@@ -64,6 +66,8 @@ public interface ContextService extends MutinyService {
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> removeService(context.ContextOuterClass.ServiceId request);
     
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceList> selectService(context.ContextOuterClass.ServiceFilter request);
+    
     io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceIdList> listSliceIds(context.ContextOuterClass.ContextId request);
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceList> listSlices(context.ContextOuterClass.ContextId request);
@@ -76,6 +80,8 @@ public interface ContextService extends MutinyService {
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> removeSlice(context.ContextOuterClass.SliceId request);
     
+    io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceList> selectSlice(context.ContextOuterClass.SliceFilter request);
+    
     io.smallrye.mutiny.Uni<context.ContextOuterClass.ConnectionIdList> listConnectionIds(context.ContextOuterClass.ServiceId request);
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.ConnectionList> listConnections(context.ContextOuterClass.ServiceId request);
diff --git a/src/automation/target/generated-sources/grpc/context/ContextServiceBean.java b/src/automation/target/generated-sources/grpc/context/ContextServiceBean.java
index 6ba64acb52614945846b453c6775775714652beb..45a7959c4425a981fcbdaba6b06c22cd2fe769ac 100644
--- a/src/automation/target/generated-sources/grpc/context/ContextServiceBean.java
+++ b/src/automation/target/generated-sources/grpc/context/ContextServiceBean.java
@@ -144,6 +144,14 @@ public class ContextServiceBean extends MutinyContextServiceGrpc.ContextServiceI
        }
     }
     @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceList> selectDevice(context.ContextOuterClass.DeviceFilter request) {
+       try {
+         return delegate.selectDevice(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.EndPointNameList> listEndPointNames(context.ContextOuterClass.EndPointIdList request) {
        try {
          return delegate.listEndPointNames(request);
@@ -240,6 +248,14 @@ public class ContextServiceBean extends MutinyContextServiceGrpc.ContextServiceI
        }
     }
     @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceList> selectService(context.ContextOuterClass.ServiceFilter request) {
+       try {
+         return delegate.selectService(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceIdList> listSliceIds(context.ContextOuterClass.ContextId request) {
        try {
          return delegate.listSliceIds(request);
@@ -288,6 +304,14 @@ public class ContextServiceBean extends MutinyContextServiceGrpc.ContextServiceI
        }
     }
     @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceList> selectSlice(context.ContextOuterClass.SliceFilter request) {
+       try {
+         return delegate.selectSlice(request);
+       } catch (UnsupportedOperationException e) {
+          throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+       }
+    }
+    @Override
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.ConnectionIdList> listConnectionIds(context.ContextOuterClass.ServiceId request) {
        try {
          return delegate.listConnectionIds(request);
diff --git a/src/automation/target/generated-sources/grpc/context/ContextServiceClient.java b/src/automation/target/generated-sources/grpc/context/ContextServiceClient.java
index c5a639ef6e212f75200779098589997ecc67c55c..0b0e9f83f74d1ce33ba6d609544dabb590024758 100644
--- a/src/automation/target/generated-sources/grpc/context/ContextServiceClient.java
+++ b/src/automation/target/generated-sources/grpc/context/ContextServiceClient.java
@@ -85,6 +85,10 @@ public class ContextServiceClient implements ContextService, MutinyClient<Mutiny
        return stub.removeDevice(request);
     }
     @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceList> selectDevice(context.ContextOuterClass.DeviceFilter request) {
+       return stub.selectDevice(request);
+    }
+    @Override
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.EndPointNameList> listEndPointNames(context.ContextOuterClass.EndPointIdList request) {
        return stub.listEndPointNames(request);
     }
@@ -133,6 +137,10 @@ public class ContextServiceClient implements ContextService, MutinyClient<Mutiny
        return stub.removeService(request);
     }
     @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceList> selectService(context.ContextOuterClass.ServiceFilter request) {
+       return stub.selectService(request);
+    }
+    @Override
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceIdList> listSliceIds(context.ContextOuterClass.ContextId request) {
        return stub.listSliceIds(request);
     }
@@ -157,6 +165,10 @@ public class ContextServiceClient implements ContextService, MutinyClient<Mutiny
        return stub.removeSlice(request);
     }
     @Override
+    public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceList> selectSlice(context.ContextOuterClass.SliceFilter request) {
+       return stub.selectSlice(request);
+    }
+    @Override
     public io.smallrye.mutiny.Uni<context.ContextOuterClass.ConnectionIdList> listConnectionIds(context.ContextOuterClass.ServiceId request) {
        return stub.listConnectionIds(request);
     }
diff --git a/src/automation/target/generated-sources/grpc/context/ContextServiceGrpc.java b/src/automation/target/generated-sources/grpc/context/ContextServiceGrpc.java
index eb5c892c6ae626d298eccdd69f25848529595f2f..27c73f5424bcf2d6739b5884f4946ced1515398c 100644
--- a/src/automation/target/generated-sources/grpc/context/ContextServiceGrpc.java
+++ b/src/automation/target/generated-sources/grpc/context/ContextServiceGrpc.java
@@ -603,6 +603,37 @@ public final class ContextServiceGrpc {
     return getGetDeviceEventsMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.DeviceFilter,
+      context.ContextOuterClass.DeviceList> getSelectDeviceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "SelectDevice",
+      requestType = context.ContextOuterClass.DeviceFilter.class,
+      responseType = context.ContextOuterClass.DeviceList.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<context.ContextOuterClass.DeviceFilter,
+      context.ContextOuterClass.DeviceList> getSelectDeviceMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.DeviceFilter, context.ContextOuterClass.DeviceList> getSelectDeviceMethod;
+    if ((getSelectDeviceMethod = ContextServiceGrpc.getSelectDeviceMethod) == null) {
+      synchronized (ContextServiceGrpc.class) {
+        if ((getSelectDeviceMethod = ContextServiceGrpc.getSelectDeviceMethod) == null) {
+          ContextServiceGrpc.getSelectDeviceMethod = getSelectDeviceMethod =
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.DeviceFilter, context.ContextOuterClass.DeviceList>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "SelectDevice"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.DeviceFilter.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.DeviceList.getDefaultInstance()))
+              .setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SelectDevice"))
+              .build();
+        }
+      }
+    }
+    return getSelectDeviceMethod;
+  }
+
   private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.EndPointIdList,
       context.ContextOuterClass.EndPointNameList> getListEndPointNamesMethod;
 
@@ -1037,6 +1068,37 @@ public final class ContextServiceGrpc {
     return getGetServiceEventsMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceFilter,
+      context.ContextOuterClass.ServiceList> getSelectServiceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "SelectService",
+      requestType = context.ContextOuterClass.ServiceFilter.class,
+      responseType = context.ContextOuterClass.ServiceList.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceFilter,
+      context.ContextOuterClass.ServiceList> getSelectServiceMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceFilter, context.ContextOuterClass.ServiceList> getSelectServiceMethod;
+    if ((getSelectServiceMethod = ContextServiceGrpc.getSelectServiceMethod) == null) {
+      synchronized (ContextServiceGrpc.class) {
+        if ((getSelectServiceMethod = ContextServiceGrpc.getSelectServiceMethod) == null) {
+          ContextServiceGrpc.getSelectServiceMethod = getSelectServiceMethod =
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.ServiceFilter, context.ContextOuterClass.ServiceList>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "SelectService"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.ServiceFilter.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.ServiceList.getDefaultInstance()))
+              .setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SelectService"))
+              .build();
+        }
+      }
+    }
+    return getSelectServiceMethod;
+  }
+
   private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.ContextId,
       context.ContextOuterClass.SliceIdList> getListSliceIdsMethod;
 
@@ -1254,6 +1316,37 @@ public final class ContextServiceGrpc {
     return getGetSliceEventsMethod;
   }
 
+  private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.SliceFilter,
+      context.ContextOuterClass.SliceList> getSelectSliceMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "SelectSlice",
+      requestType = context.ContextOuterClass.SliceFilter.class,
+      responseType = context.ContextOuterClass.SliceList.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<context.ContextOuterClass.SliceFilter,
+      context.ContextOuterClass.SliceList> getSelectSliceMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.SliceFilter, context.ContextOuterClass.SliceList> getSelectSliceMethod;
+    if ((getSelectSliceMethod = ContextServiceGrpc.getSelectSliceMethod) == null) {
+      synchronized (ContextServiceGrpc.class) {
+        if ((getSelectSliceMethod = ContextServiceGrpc.getSelectSliceMethod) == null) {
+          ContextServiceGrpc.getSelectSliceMethod = getSelectSliceMethod =
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.SliceFilter, context.ContextOuterClass.SliceList>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "SelectSlice"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.SliceFilter.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  context.ContextOuterClass.SliceList.getDefaultInstance()))
+              .setSchemaDescriptor(new ContextServiceMethodDescriptorSupplier("SelectSlice"))
+              .build();
+        }
+      }
+    }
+    return getSelectSliceMethod;
+  }
+
   private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.ServiceId,
       context.ContextOuterClass.ConnectionIdList> getListConnectionIdsMethod;
 
@@ -1621,6 +1714,13 @@ public final class ContextServiceGrpc {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetDeviceEventsMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void selectDevice(context.ContextOuterClass.DeviceFilter request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.DeviceList> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectDeviceMethod(), responseObserver);
+    }
+
     /**
      */
     public void listEndPointNames(context.ContextOuterClass.EndPointIdList request,
@@ -1719,6 +1819,13 @@ public final class ContextServiceGrpc {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetServiceEventsMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void selectService(context.ContextOuterClass.ServiceFilter request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceList> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectServiceMethod(), responseObserver);
+    }
+
     /**
      */
     public void listSliceIds(context.ContextOuterClass.ContextId request,
@@ -1768,6 +1875,13 @@ public final class ContextServiceGrpc {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSliceEventsMethod(), responseObserver);
     }
 
+    /**
+     */
+    public void selectSlice(context.ContextOuterClass.SliceFilter request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceList> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSelectSliceMethod(), responseObserver);
+    }
+
     /**
      */
     public void listConnectionIds(context.ContextOuterClass.ServiceId request,
@@ -1945,6 +2059,13 @@ public final class ContextServiceGrpc {
                 context.ContextOuterClass.Empty,
                 context.ContextOuterClass.DeviceEvent>(
                   this, METHODID_GET_DEVICE_EVENTS)))
+          .addMethod(
+            getSelectDeviceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                context.ContextOuterClass.DeviceFilter,
+                context.ContextOuterClass.DeviceList>(
+                  this, METHODID_SELECT_DEVICE)))
           .addMethod(
             getListEndPointNamesMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
@@ -2043,6 +2164,13 @@ public final class ContextServiceGrpc {
                 context.ContextOuterClass.Empty,
                 context.ContextOuterClass.ServiceEvent>(
                   this, METHODID_GET_SERVICE_EVENTS)))
+          .addMethod(
+            getSelectServiceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                context.ContextOuterClass.ServiceFilter,
+                context.ContextOuterClass.ServiceList>(
+                  this, METHODID_SELECT_SERVICE)))
           .addMethod(
             getListSliceIdsMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
@@ -2092,6 +2220,13 @@ public final class ContextServiceGrpc {
                 context.ContextOuterClass.Empty,
                 context.ContextOuterClass.SliceEvent>(
                   this, METHODID_GET_SLICE_EVENTS)))
+          .addMethod(
+            getSelectSliceMethod(),
+            io.grpc.stub.ServerCalls.asyncUnaryCall(
+              new MethodHandlers<
+                context.ContextOuterClass.SliceFilter,
+                context.ContextOuterClass.SliceList>(
+                  this, METHODID_SELECT_SLICE)))
           .addMethod(
             getListConnectionIdsMethod(),
             io.grpc.stub.ServerCalls.asyncUnaryCall(
@@ -2304,6 +2439,14 @@ public final class ContextServiceGrpc {
           getChannel().newCall(getGetDeviceEventsMethod(), getCallOptions()), request, responseObserver);
     }
 
+    /**
+     */
+    public void selectDevice(context.ContextOuterClass.DeviceFilter request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.DeviceList> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getSelectDeviceMethod(), getCallOptions()), request, responseObserver);
+    }
+
     /**
      */
     public void listEndPointNames(context.ContextOuterClass.EndPointIdList request,
@@ -2416,6 +2559,14 @@ public final class ContextServiceGrpc {
           getChannel().newCall(getGetServiceEventsMethod(), getCallOptions()), request, responseObserver);
     }
 
+    /**
+     */
+    public void selectService(context.ContextOuterClass.ServiceFilter request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceList> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getSelectServiceMethod(), getCallOptions()), request, responseObserver);
+    }
+
     /**
      */
     public void listSliceIds(context.ContextOuterClass.ContextId request,
@@ -2472,6 +2623,14 @@ public final class ContextServiceGrpc {
           getChannel().newCall(getGetSliceEventsMethod(), getCallOptions()), request, responseObserver);
     }
 
+    /**
+     */
+    public void selectSlice(context.ContextOuterClass.SliceFilter request,
+        io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceList> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getSelectSliceMethod(), getCallOptions()), request, responseObserver);
+    }
+
     /**
      */
     public void listConnectionIds(context.ContextOuterClass.ServiceId request,
@@ -2671,6 +2830,13 @@ public final class ContextServiceGrpc {
           getChannel(), getGetDeviceEventsMethod(), getCallOptions(), request);
     }
 
+    /**
+     */
+    public context.ContextOuterClass.DeviceList selectDevice(context.ContextOuterClass.DeviceFilter request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getSelectDeviceMethod(), getCallOptions(), request);
+    }
+
     /**
      */
     public context.ContextOuterClass.EndPointNameList listEndPointNames(context.ContextOuterClass.EndPointIdList request) {
@@ -2771,6 +2937,13 @@ public final class ContextServiceGrpc {
           getChannel(), getGetServiceEventsMethod(), getCallOptions(), request);
     }
 
+    /**
+     */
+    public context.ContextOuterClass.ServiceList selectService(context.ContextOuterClass.ServiceFilter request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getSelectServiceMethod(), getCallOptions(), request);
+    }
+
     /**
      */
     public context.ContextOuterClass.SliceIdList listSliceIds(context.ContextOuterClass.ContextId request) {
@@ -2821,6 +2994,13 @@ public final class ContextServiceGrpc {
           getChannel(), getGetSliceEventsMethod(), getCallOptions(), request);
     }
 
+    /**
+     */
+    public context.ContextOuterClass.SliceList selectSlice(context.ContextOuterClass.SliceFilter request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getSelectSliceMethod(), getCallOptions(), request);
+    }
+
     /**
      */
     public context.ContextOuterClass.ConnectionIdList listConnectionIds(context.ContextOuterClass.ServiceId request) {
@@ -3007,6 +3187,14 @@ public final class ContextServiceGrpc {
           getChannel().newCall(getRemoveDeviceMethod(), getCallOptions()), request);
     }
 
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.DeviceList> selectDevice(
+        context.ContextOuterClass.DeviceFilter request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getSelectDeviceMethod(), getCallOptions()), request);
+    }
+
     /**
      */
     public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.EndPointNameList> listEndPointNames(
@@ -3103,6 +3291,14 @@ public final class ContextServiceGrpc {
           getChannel().newCall(getRemoveServiceMethod(), getCallOptions()), request);
     }
 
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.ServiceList> selectService(
+        context.ContextOuterClass.ServiceFilter request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getSelectServiceMethod(), getCallOptions()), request);
+    }
+
     /**
      */
     public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.SliceIdList> listSliceIds(
@@ -3151,6 +3347,14 @@ public final class ContextServiceGrpc {
           getChannel().newCall(getRemoveSliceMethod(), getCallOptions()), request);
     }
 
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.SliceList> selectSlice(
+        context.ContextOuterClass.SliceFilter request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getSelectSliceMethod(), getCallOptions()), request);
+    }
+
     /**
      */
     public com.google.common.util.concurrent.ListenableFuture<context.ContextOuterClass.ConnectionIdList> listConnectionIds(
@@ -3211,33 +3415,36 @@ public final class ContextServiceGrpc {
   private static final int METHODID_SET_DEVICE = 16;
   private static final int METHODID_REMOVE_DEVICE = 17;
   private static final int METHODID_GET_DEVICE_EVENTS = 18;
-  private static final int METHODID_LIST_END_POINT_NAMES = 19;
-  private static final int METHODID_LIST_LINK_IDS = 20;
-  private static final int METHODID_LIST_LINKS = 21;
-  private static final int METHODID_GET_LINK = 22;
-  private static final int METHODID_SET_LINK = 23;
-  private static final int METHODID_REMOVE_LINK = 24;
-  private static final int METHODID_GET_LINK_EVENTS = 25;
-  private static final int METHODID_LIST_SERVICE_IDS = 26;
-  private static final int METHODID_LIST_SERVICES = 27;
-  private static final int METHODID_GET_SERVICE = 28;
-  private static final int METHODID_SET_SERVICE = 29;
-  private static final int METHODID_UNSET_SERVICE = 30;
-  private static final int METHODID_REMOVE_SERVICE = 31;
-  private static final int METHODID_GET_SERVICE_EVENTS = 32;
-  private static final int METHODID_LIST_SLICE_IDS = 33;
-  private static final int METHODID_LIST_SLICES = 34;
-  private static final int METHODID_GET_SLICE = 35;
-  private static final int METHODID_SET_SLICE = 36;
-  private static final int METHODID_UNSET_SLICE = 37;
-  private static final int METHODID_REMOVE_SLICE = 38;
-  private static final int METHODID_GET_SLICE_EVENTS = 39;
-  private static final int METHODID_LIST_CONNECTION_IDS = 40;
-  private static final int METHODID_LIST_CONNECTIONS = 41;
-  private static final int METHODID_GET_CONNECTION = 42;
-  private static final int METHODID_SET_CONNECTION = 43;
-  private static final int METHODID_REMOVE_CONNECTION = 44;
-  private static final int METHODID_GET_CONNECTION_EVENTS = 45;
+  private static final int METHODID_SELECT_DEVICE = 19;
+  private static final int METHODID_LIST_END_POINT_NAMES = 20;
+  private static final int METHODID_LIST_LINK_IDS = 21;
+  private static final int METHODID_LIST_LINKS = 22;
+  private static final int METHODID_GET_LINK = 23;
+  private static final int METHODID_SET_LINK = 24;
+  private static final int METHODID_REMOVE_LINK = 25;
+  private static final int METHODID_GET_LINK_EVENTS = 26;
+  private static final int METHODID_LIST_SERVICE_IDS = 27;
+  private static final int METHODID_LIST_SERVICES = 28;
+  private static final int METHODID_GET_SERVICE = 29;
+  private static final int METHODID_SET_SERVICE = 30;
+  private static final int METHODID_UNSET_SERVICE = 31;
+  private static final int METHODID_REMOVE_SERVICE = 32;
+  private static final int METHODID_GET_SERVICE_EVENTS = 33;
+  private static final int METHODID_SELECT_SERVICE = 34;
+  private static final int METHODID_LIST_SLICE_IDS = 35;
+  private static final int METHODID_LIST_SLICES = 36;
+  private static final int METHODID_GET_SLICE = 37;
+  private static final int METHODID_SET_SLICE = 38;
+  private static final int METHODID_UNSET_SLICE = 39;
+  private static final int METHODID_REMOVE_SLICE = 40;
+  private static final int METHODID_GET_SLICE_EVENTS = 41;
+  private static final int METHODID_SELECT_SLICE = 42;
+  private static final int METHODID_LIST_CONNECTION_IDS = 43;
+  private static final int METHODID_LIST_CONNECTIONS = 44;
+  private static final int METHODID_GET_CONNECTION = 45;
+  private static final int METHODID_SET_CONNECTION = 46;
+  private static final int METHODID_REMOVE_CONNECTION = 47;
+  private static final int METHODID_GET_CONNECTION_EVENTS = 48;
 
   private static final class MethodHandlers<Req, Resp> implements
       io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -3332,6 +3539,10 @@ public final class ContextServiceGrpc {
           serviceImpl.getDeviceEvents((context.ContextOuterClass.Empty) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.DeviceEvent>) responseObserver);
           break;
+        case METHODID_SELECT_DEVICE:
+          serviceImpl.selectDevice((context.ContextOuterClass.DeviceFilter) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.DeviceList>) responseObserver);
+          break;
         case METHODID_LIST_END_POINT_NAMES:
           serviceImpl.listEndPointNames((context.ContextOuterClass.EndPointIdList) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.EndPointNameList>) responseObserver);
@@ -3388,6 +3599,10 @@ public final class ContextServiceGrpc {
           serviceImpl.getServiceEvents((context.ContextOuterClass.Empty) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceEvent>) responseObserver);
           break;
+        case METHODID_SELECT_SERVICE:
+          serviceImpl.selectService((context.ContextOuterClass.ServiceFilter) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceList>) responseObserver);
+          break;
         case METHODID_LIST_SLICE_IDS:
           serviceImpl.listSliceIds((context.ContextOuterClass.ContextId) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceIdList>) responseObserver);
@@ -3416,6 +3631,10 @@ public final class ContextServiceGrpc {
           serviceImpl.getSliceEvents((context.ContextOuterClass.Empty) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceEvent>) responseObserver);
           break;
+        case METHODID_SELECT_SLICE:
+          serviceImpl.selectSlice((context.ContextOuterClass.SliceFilter) request,
+              (io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceList>) responseObserver);
+          break;
         case METHODID_LIST_CONNECTION_IDS:
           serviceImpl.listConnectionIds((context.ContextOuterClass.ServiceId) request,
               (io.grpc.stub.StreamObserver<context.ContextOuterClass.ConnectionIdList>) responseObserver);
@@ -3520,6 +3739,7 @@ public final class ContextServiceGrpc {
               .addMethod(getSetDeviceMethod())
               .addMethod(getRemoveDeviceMethod())
               .addMethod(getGetDeviceEventsMethod())
+              .addMethod(getSelectDeviceMethod())
               .addMethod(getListEndPointNamesMethod())
               .addMethod(getListLinkIdsMethod())
               .addMethod(getListLinksMethod())
@@ -3534,6 +3754,7 @@ public final class ContextServiceGrpc {
               .addMethod(getUnsetServiceMethod())
               .addMethod(getRemoveServiceMethod())
               .addMethod(getGetServiceEventsMethod())
+              .addMethod(getSelectServiceMethod())
               .addMethod(getListSliceIdsMethod())
               .addMethod(getListSlicesMethod())
               .addMethod(getGetSliceMethod())
@@ -3541,6 +3762,7 @@ public final class ContextServiceGrpc {
               .addMethod(getUnsetSliceMethod())
               .addMethod(getRemoveSliceMethod())
               .addMethod(getGetSliceEventsMethod())
+              .addMethod(getSelectSliceMethod())
               .addMethod(getListConnectionIdsMethod())
               .addMethod(getListConnectionsMethod())
               .addMethod(getGetConnectionMethod())
diff --git a/src/automation/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java b/src/automation/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java
index 3433cc9064805b7d138531d1626ae454516c616c..45d853aa7771c71679f1b7a67051a478b3f73be8 100644
--- a/src/automation/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java
+++ b/src/automation/target/generated-sources/grpc/context/MutinyContextServiceGrpc.java
@@ -116,6 +116,11 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
         }
 
         
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceList> selectDevice(context.ContextOuterClass.DeviceFilter request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::selectDevice);
+        }
+
+        
         public io.smallrye.mutiny.Uni<context.ContextOuterClass.EndPointNameList> listEndPointNames(context.ContextOuterClass.EndPointIdList request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::listEndPointNames);
         }
@@ -176,6 +181,11 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
         }
 
         
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceList> selectService(context.ContextOuterClass.ServiceFilter request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::selectService);
+        }
+
+        
         public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceIdList> listSliceIds(context.ContextOuterClass.ContextId request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::listSliceIds);
         }
@@ -206,6 +216,11 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
         }
 
         
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceList> selectSlice(context.ContextOuterClass.SliceFilter request) {
+            return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::selectSlice);
+        }
+
+        
         public io.smallrye.mutiny.Uni<context.ContextOuterClass.ConnectionIdList> listConnectionIds(context.ContextOuterClass.ServiceId request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::listConnectionIds);
         }
@@ -363,6 +378,11 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
         }
 
         
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.DeviceList> selectDevice(context.ContextOuterClass.DeviceFilter request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
         public io.smallrye.mutiny.Uni<context.ContextOuterClass.EndPointNameList> listEndPointNames(context.ContextOuterClass.EndPointIdList request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
@@ -423,6 +443,11 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
         }
 
         
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.ServiceList> selectService(context.ContextOuterClass.ServiceFilter request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
         public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceIdList> listSliceIds(context.ContextOuterClass.ContextId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
@@ -453,6 +478,11 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
         }
 
         
+        public io.smallrye.mutiny.Uni<context.ContextOuterClass.SliceList> selectSlice(context.ContextOuterClass.SliceFilter request) {
+            throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+        }
+
+        
         public io.smallrye.mutiny.Uni<context.ContextOuterClass.ConnectionIdList> listConnectionIds(context.ContextOuterClass.ServiceId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
@@ -647,6 +677,13 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
                                             context.ContextOuterClass.Empty,
                                             context.ContextOuterClass.DeviceEvent>(
                                             this, METHODID_GET_DEVICE_EVENTS, compression)))
+                    .addMethod(
+                            context.ContextServiceGrpc.getSelectDeviceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            context.ContextOuterClass.DeviceFilter,
+                                            context.ContextOuterClass.DeviceList>(
+                                            this, METHODID_SELECT_DEVICE, compression)))
                     .addMethod(
                             context.ContextServiceGrpc.getListEndPointNamesMethod(),
                             asyncUnaryCall(
@@ -745,6 +782,13 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
                                             context.ContextOuterClass.Empty,
                                             context.ContextOuterClass.ServiceEvent>(
                                             this, METHODID_GET_SERVICE_EVENTS, compression)))
+                    .addMethod(
+                            context.ContextServiceGrpc.getSelectServiceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            context.ContextOuterClass.ServiceFilter,
+                                            context.ContextOuterClass.ServiceList>(
+                                            this, METHODID_SELECT_SERVICE, compression)))
                     .addMethod(
                             context.ContextServiceGrpc.getListSliceIdsMethod(),
                             asyncUnaryCall(
@@ -794,6 +838,13 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
                                             context.ContextOuterClass.Empty,
                                             context.ContextOuterClass.SliceEvent>(
                                             this, METHODID_GET_SLICE_EVENTS, compression)))
+                    .addMethod(
+                            context.ContextServiceGrpc.getSelectSliceMethod(),
+                            asyncUnaryCall(
+                                    new MethodHandlers<
+                                            context.ContextOuterClass.SliceFilter,
+                                            context.ContextOuterClass.SliceList>(
+                                            this, METHODID_SELECT_SLICE, compression)))
                     .addMethod(
                             context.ContextServiceGrpc.getListConnectionIdsMethod(),
                             asyncUnaryCall(
@@ -859,33 +910,36 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
     private static final int METHODID_SET_DEVICE = 16;
     private static final int METHODID_REMOVE_DEVICE = 17;
     private static final int METHODID_GET_DEVICE_EVENTS = 18;
-    private static final int METHODID_LIST_END_POINT_NAMES = 19;
-    private static final int METHODID_LIST_LINK_IDS = 20;
-    private static final int METHODID_LIST_LINKS = 21;
-    private static final int METHODID_GET_LINK = 22;
-    private static final int METHODID_SET_LINK = 23;
-    private static final int METHODID_REMOVE_LINK = 24;
-    private static final int METHODID_GET_LINK_EVENTS = 25;
-    private static final int METHODID_LIST_SERVICE_IDS = 26;
-    private static final int METHODID_LIST_SERVICES = 27;
-    private static final int METHODID_GET_SERVICE = 28;
-    private static final int METHODID_SET_SERVICE = 29;
-    private static final int METHODID_UNSET_SERVICE = 30;
-    private static final int METHODID_REMOVE_SERVICE = 31;
-    private static final int METHODID_GET_SERVICE_EVENTS = 32;
-    private static final int METHODID_LIST_SLICE_IDS = 33;
-    private static final int METHODID_LIST_SLICES = 34;
-    private static final int METHODID_GET_SLICE = 35;
-    private static final int METHODID_SET_SLICE = 36;
-    private static final int METHODID_UNSET_SLICE = 37;
-    private static final int METHODID_REMOVE_SLICE = 38;
-    private static final int METHODID_GET_SLICE_EVENTS = 39;
-    private static final int METHODID_LIST_CONNECTION_IDS = 40;
-    private static final int METHODID_LIST_CONNECTIONS = 41;
-    private static final int METHODID_GET_CONNECTION = 42;
-    private static final int METHODID_SET_CONNECTION = 43;
-    private static final int METHODID_REMOVE_CONNECTION = 44;
-    private static final int METHODID_GET_CONNECTION_EVENTS = 45;
+    private static final int METHODID_SELECT_DEVICE = 19;
+    private static final int METHODID_LIST_END_POINT_NAMES = 20;
+    private static final int METHODID_LIST_LINK_IDS = 21;
+    private static final int METHODID_LIST_LINKS = 22;
+    private static final int METHODID_GET_LINK = 23;
+    private static final int METHODID_SET_LINK = 24;
+    private static final int METHODID_REMOVE_LINK = 25;
+    private static final int METHODID_GET_LINK_EVENTS = 26;
+    private static final int METHODID_LIST_SERVICE_IDS = 27;
+    private static final int METHODID_LIST_SERVICES = 28;
+    private static final int METHODID_GET_SERVICE = 29;
+    private static final int METHODID_SET_SERVICE = 30;
+    private static final int METHODID_UNSET_SERVICE = 31;
+    private static final int METHODID_REMOVE_SERVICE = 32;
+    private static final int METHODID_GET_SERVICE_EVENTS = 33;
+    private static final int METHODID_SELECT_SERVICE = 34;
+    private static final int METHODID_LIST_SLICE_IDS = 35;
+    private static final int METHODID_LIST_SLICES = 36;
+    private static final int METHODID_GET_SLICE = 37;
+    private static final int METHODID_SET_SLICE = 38;
+    private static final int METHODID_UNSET_SLICE = 39;
+    private static final int METHODID_REMOVE_SLICE = 40;
+    private static final int METHODID_GET_SLICE_EVENTS = 41;
+    private static final int METHODID_SELECT_SLICE = 42;
+    private static final int METHODID_LIST_CONNECTION_IDS = 43;
+    private static final int METHODID_LIST_CONNECTIONS = 44;
+    private static final int METHODID_GET_CONNECTION = 45;
+    private static final int METHODID_SET_CONNECTION = 46;
+    private static final int METHODID_REMOVE_CONNECTION = 47;
+    private static final int METHODID_GET_CONNECTION_EVENTS = 48;
 
     private static final class MethodHandlers<Req, Resp> implements
             io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
@@ -1020,6 +1074,12 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
                             compression,
                             serviceImpl::getDeviceEvents);
                     break;
+                case METHODID_SELECT_DEVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.DeviceFilter) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.DeviceList>) responseObserver,
+                            compression,
+                            serviceImpl::selectDevice);
+                    break;
                 case METHODID_LIST_END_POINT_NAMES:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.EndPointIdList) request,
                             (io.grpc.stub.StreamObserver<context.ContextOuterClass.EndPointNameList>) responseObserver,
@@ -1104,6 +1164,12 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
                             compression,
                             serviceImpl::getServiceEvents);
                     break;
+                case METHODID_SELECT_SERVICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.ServiceFilter) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.ServiceList>) responseObserver,
+                            compression,
+                            serviceImpl::selectService);
+                    break;
                 case METHODID_LIST_SLICE_IDS:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.ContextId) request,
                             (io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceIdList>) responseObserver,
@@ -1146,6 +1212,12 @@ public final class MutinyContextServiceGrpc implements io.quarkus.grpc.runtime.M
                             compression,
                             serviceImpl::getSliceEvents);
                     break;
+                case METHODID_SELECT_SLICE:
+                    io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.SliceFilter) request,
+                            (io.grpc.stub.StreamObserver<context.ContextOuterClass.SliceList>) responseObserver,
+                            compression,
+                            serviceImpl::selectSlice);
+                    break;
                 case METHODID_LIST_CONNECTION_IDS:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.ServiceId) request,
                             (io.grpc.stub.StreamObserver<context.ContextOuterClass.ConnectionIdList>) responseObserver,
diff --git a/src/automation/target/kubernetes/kubernetes.yml b/src/automation/target/kubernetes/kubernetes.yml
index 7aa68a257eeda04d6101f05b291882c274c43f86..e0dc96c13046e09ae84f2afb4a4bb839c4166a1b 100644
--- a/src/automation/target/kubernetes/kubernetes.yml
+++ b/src/automation/target/kubernetes/kubernetes.yml
@@ -16,8 +16,8 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 23832f2975e3c8967e9685f7e3a5f5458d04527a
-    app.quarkus.io/build-timestamp: 2023-04-04 - 11:47:48 +0000
+    app.quarkus.io/commit-id: 8d0654b519e90fe0127e7d1419adce25fa3a179d
+    app.quarkus.io/build-timestamp: 2023-07-10 - 09:42:53 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -42,8 +42,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 23832f2975e3c8967e9685f7e3a5f5458d04527a
-    app.quarkus.io/build-timestamp: 2023-04-04 - 11:47:48 +0000
+    app.quarkus.io/commit-id: 8d0654b519e90fe0127e7d1419adce25fa3a179d
+    app.quarkus.io/build-timestamp: 2023-07-10 - 09:42:53 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -60,8 +60,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 23832f2975e3c8967e9685f7e3a5f5458d04527a
-        app.quarkus.io/build-timestamp: 2023-04-04 - 11:47:48 +0000
+        app.quarkus.io/commit-id: 8d0654b519e90fe0127e7d1419adce25fa3a179d
+        app.quarkus.io/build-timestamp: 2023-07-10 - 09:42:53 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -76,10 +76,10 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: CONTEXT_SERVICE_HOST
-              value: contextservice
             - name: DEVICE_SERVICE_HOST
               value: deviceservice
+            - name: CONTEXT_SERVICE_HOST
+              value: contextservice
           image: labs.etsi.org:5050/tfs/controller/automation:0.2.0
           imagePullPolicy: Always
           livenessProbe:
diff --git a/src/common/Constants.py b/src/common/Constants.py
index ed1c1475ad3c69cfb9bd650f0d99f33c6cf0f2bc..423f2558b71b189b9e771e5af94968d28f8777c0 100644
--- a/src/common/Constants.py
+++ b/src/common/Constants.py
@@ -56,6 +56,7 @@ class ServiceNameEnum(Enum):
     OPTICALATTACKDETECTOR  = 'opticalattackdetector'
     OPTICALATTACKMITIGATOR = 'opticalattackmitigator'
     CACHING                = 'caching'
+    TE                     = 'te'
 
     # Used for test and debugging only
     DLT_GATEWAY    = 'dltgateway'
@@ -80,6 +81,7 @@ DEFAULT_SERVICE_GRPC_PORTS = {
     ServiceNameEnum.OPTICALATTACKMANAGER   .value : 10005,
     ServiceNameEnum.INTERDOMAIN            .value : 10010,
     ServiceNameEnum.PATHCOMP               .value : 10020,
+    ServiceNameEnum.TE                     .value : 10030,
 
     # Used for test and debugging only
     ServiceNameEnum.DLT_GATEWAY   .value : 50051,
diff --git a/src/common/message_broker/backend/nats/NatsBackendThread.py b/src/common/message_broker/backend/nats/NatsBackendThread.py
index 0bedd2b242f7eeaa1585d0eb41c5a0bd9efe07e5..3ac32b0cb8f7b4be2d693753e39919b82ab3948f 100644
--- a/src/common/message_broker/backend/nats/NatsBackendThread.py
+++ b/src/common/message_broker/backend/nats/NatsBackendThread.py
@@ -49,29 +49,41 @@ class NatsBackendThread(threading.Thread):
         self._publish_queue.put_nowait(Message(topic_name, message_content))
 
     async def _run_subscriber(
-        self, topic_name : str, timeout : float, out_queue : queue.Queue[Message], unsubscribe : threading.Event
+        self, topic_name : str, timeout : float, out_queue : queue.Queue[Message], unsubscribe : threading.Event,
+        ready_event : threading.Event
     ) -> None:
-        LOGGER.info('[_run_subscriber] NATS URI: {:s}'.format(str(self._nats_uri)))
-        client = await nats.connect(servers=[self._nats_uri])
-        LOGGER.info('[_run_subscriber] Connected!')
-        subscription = await client.subscribe(topic_name)
-        LOGGER.info('[_run_subscriber] Subscribed!')
-        while not self._terminate.is_set() and not unsubscribe.is_set():
-            try:
-                message = await subscription.next_msg(timeout)
-            except nats.errors.TimeoutError:
-                continue
-            except asyncio.CancelledError:
-                break
-            out_queue.put(Message(message.subject, message.data.decode('UTF-8')))
-        await subscription.unsubscribe()
-        await client.drain()
+        try:
+            LOGGER.info('[_run_subscriber] NATS URI: {:s}'.format(str(self._nats_uri)))
+            client = await nats.connect(servers=[self._nats_uri])
+            server_version = client.connected_server_version
+            LOGGER.info('[_run_subscriber] Connected! NATS Server version: {:s}'.format(str(repr(server_version))))
+            subscription = await client.subscribe(topic_name)
+            LOGGER.info('[_run_subscriber] Subscribed!')
+            ready_event.set()
+            while not self._terminate.is_set() and not unsubscribe.is_set():
+                try:
+                    message = await subscription.next_msg(timeout)
+                except nats.errors.TimeoutError:
+                    continue
+                except asyncio.CancelledError:
+                    break
+                out_queue.put(Message(message.subject, message.data.decode('UTF-8')))
+            await subscription.unsubscribe()
+            await client.drain()
+        except Exception:   # pylint: disable=broad-exception-caught
+            LOGGER.exception('[_run_subscriber] Unhandled Exception')
 
     def subscribe(
         self, topic_name : str, timeout : float, out_queue : queue.Queue[Message], unsubscribe : threading.Event
     ) -> None:
-        task = self._event_loop.create_task(self._run_subscriber(topic_name, timeout, out_queue, unsubscribe))
+        ready_event = threading.Event()
+        task = self._event_loop.create_task(
+            self._run_subscriber(topic_name, timeout, out_queue, unsubscribe, ready_event)
+        )
         self._tasks.append(task)
+        LOGGER.info('[subscribe] Waiting for subscriber to be ready...')
+        is_ready = ready_event.wait(timeout=120)
+        LOGGER.info('[subscribe] Subscriber is Ready? {:s}'.format(str(is_ready)))
 
     def run(self) -> None:
         asyncio.set_event_loop(self._event_loop)
diff --git a/src/common/tests/MockMessageBroker.py b/src/common/tests/MockMessageBroker.py
index 2eeea74cfc85fd360180c77a2d5b7387d2ef092f..27613a64d3f63a55276bb1c1f82fdb6c20a8e534 100644
--- a/src/common/tests/MockMessageBroker.py
+++ b/src/common/tests/MockMessageBroker.py
@@ -28,10 +28,6 @@ TOPIC_SERVICE    = 'service'
 TOPIC_SLICE      = 'slice'
 TOPIC_TOPOLOGY   = 'topology'
 
-TOPICS = {
-    TOPIC_CONNECTION, TOPIC_CONTEXT, TOPIC_DEVICE, TOPIC_LINK, TOPIC_POLICY, TOPIC_SERVICE, TOPIC_SLICE, TOPIC_TOPOLOGY
-}
-
 CONSUME_TIMEOUT = 0.5 # seconds
 
 class Message(NamedTuple):
diff --git a/src/common/tests/MockServicerImpl_Context.py b/src/common/tests/MockServicerImpl_Context.py
index 0e6f819d8c5e9ddc823b8090a8d4b74548471bd2..667c9ed658cfbe648e345d691523375e1c5f8b79 100644
--- a/src/common/tests/MockServicerImpl_Context.py
+++ b/src/common/tests/MockServicerImpl_Context.py
@@ -13,16 +13,17 @@
 # limitations under the License.
 
 import grpc, json, logging
-from typing import Any, Dict, Iterator, List
+from typing import Any, Dict, Iterator, List, Set
+from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
 from common.proto.context_pb2 import (
     Connection, ConnectionEvent, ConnectionId, ConnectionIdList, ConnectionList,
     Context, ContextEvent, ContextId, ContextIdList, ContextList,
-    Device, DeviceEvent, DeviceId, DeviceIdList, DeviceList,
+    Device, DeviceEvent, DeviceFilter, DeviceId, DeviceIdList, DeviceList,
     Empty, EventTypeEnum,
     Link, LinkEvent, LinkId, LinkIdList, LinkList,
-    Service, ServiceEvent, ServiceId, ServiceIdList, ServiceList,
-    Slice, SliceEvent, SliceId, SliceIdList, SliceList,
-    Topology, TopologyEvent, TopologyId, TopologyIdList, TopologyList)
+    Service, ServiceEvent, ServiceFilter, ServiceId, ServiceIdList, ServiceList,
+    Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList,
+    Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList)
 from common.proto.context_pb2_grpc import ContextServiceServicer
 from common.tests.MockMessageBroker import (
     TOPIC_CONNECTION, TOPIC_CONTEXT, TOPIC_DEVICE, TOPIC_LINK, TOPIC_SERVICE, TOPIC_SLICE, TOPIC_TOPOLOGY,
@@ -68,10 +69,19 @@ def del_entry(
     del container[entry_uuid]
     return Empty()
 
+def select_entries(database : Dict[str, Dict[str, Any]], container_name : str, entry_uuids : Set[str]) -> List[Any]:
+    if len(entry_uuids) == 0: return get_entries(database, container_name)
+    container = get_container(database, container_name)
+    return [
+        container[entry_uuid]
+        for entry_uuid in sorted(container.keys())
+        if entry_uuid in entry_uuids
+    ]
+
 class MockServicerImpl_Context(ContextServiceServicer):
     def __init__(self):
         LOGGER.info('[__init__] Creating Servicer...')
-        self.database : Dict[str, Any] = {}
+        self.database : Dict[str, Dict[str, Any]] = {}
         self.msg_broker = MockMessageBroker()
         LOGGER.info('[__init__] Servicer Created')
 
@@ -153,6 +163,29 @@ class MockServicerImpl_Context(ContextServiceServicer):
         LOGGER.info('[GetTopology] reply={:s}'.format(grpc_message_to_json_string(reply)))
         return reply
 
+    def GetTopologyDetails(self, request : TopologyId, context : grpc.ServicerContext) -> TopologyDetails:
+        LOGGER.info('[GetTopologyDetails] request={:s}'.format(grpc_message_to_json_string(request)))
+        context_uuid = request.context_id.context_uuid.uuid
+        container_name = 'topology[{:s}]'.format(str(context_uuid))
+        topology_uuid = request.topology_uuid.uuid
+        _reply = get_entry(context, self.database, container_name, topology_uuid)
+        reply = TopologyDetails()
+        reply.topology_id.CopyFrom(_reply.topology_id)
+        reply.name = _reply.name
+        if context_uuid == DEFAULT_CONTEXT_NAME and topology_uuid == DEFAULT_TOPOLOGY_NAME:
+            for device in get_entries(self.database, 'device'): reply.devices.append(device)
+            for link in get_entries(self.database, 'link'): reply.links.append(link)
+        else:
+            # TODO: to be improved; Mock does not associate devices/links to topologies automatically
+            for device_id in _reply.device_ids:
+                device = get_entry(context, self.database, 'device', device_id.device_uuid.uuid)
+                reply.devices.append(device)
+            for link_id in _reply.link_ids:
+                link = get_entry(context, self.database, 'link', link_id.link_uuid.uuid)
+                reply.links.append(link)
+        LOGGER.info('[GetTopologyDetails] reply={:s}'.format(grpc_message_to_json_string(reply)))
+        return reply
+
     def SetTopology(self, request: Topology, context : grpc.ServicerContext) -> TopologyId:
         LOGGER.info('[SetTopology] request={:s}'.format(grpc_message_to_json_string(request)))
         container_name = 'topology[{:s}]'.format(str(request.topology_id.context_id.context_uuid.uuid))
@@ -210,6 +243,33 @@ class MockServicerImpl_Context(ContextServiceServicer):
         LOGGER.info('[GetDeviceEvents] request={:s}'.format(grpc_message_to_json_string(request)))
         for message in self.msg_broker.consume({TOPIC_DEVICE}): yield DeviceEvent(**json.loads(message.content))
 
+    def SelectDevice(self, request : DeviceFilter, context : grpc.ServicerContext) -> DeviceList:
+        LOGGER.info('[SelectDevice] request={:s}'.format(grpc_message_to_json_string(request)))
+        container_entry_uuids : Dict[str, Set[str]] = {}
+        container_name = 'device'
+        for device_id in request.device_ids.device_ids:
+            device_uuid = device_id.device_uuid.uuid
+            container_entry_uuids.setdefault(container_name, set()).add(device_uuid)
+
+        exclude_endpoints = not request.include_endpoints
+        exclude_config_rules = not request.include_config_rules
+        exclude_components  = not request.include_components
+
+        devices = list()
+        for container_name in sorted(container_entry_uuids.keys()):
+             entry_uuids = container_entry_uuids[container_name]
+        for device in select_entries(self.database, container_name, entry_uuids):
+            reply_device = Device()
+            reply_device.CopyFrom(device)
+            if exclude_endpoints:    del reply_device.device_endpoints [:] # pylint: disable=no-member
+            if exclude_config_rules: del reply_device.device_config.config_rules[:] # pylint: disable=no-member
+            if exclude_components:   del reply_device.component[:] # pylint: disable=no-member
+            devices.append(reply_device)
+                
+        reply = DeviceList(devices=devices) 
+        LOGGER.info('[SelectDevice] reply={:s}'.format(grpc_message_to_json_string(reply)))
+        return reply
+
 
     # ----- Link -------------------------------------------------------------------------------------------------------
 
@@ -291,6 +351,37 @@ class MockServicerImpl_Context(ContextServiceServicer):
         LOGGER.info('[GetSliceEvents] request={:s}'.format(grpc_message_to_json_string(request)))
         for message in self.msg_broker.consume({TOPIC_SLICE}): yield SliceEvent(**json.loads(message.content))
 
+    def SelectSlice(self, request : SliceFilter, context : grpc.ServicerContext) -> SliceList:
+        LOGGER.info('[SelectSlice] request={:s}'.format(grpc_message_to_json_string(request)))
+        container_entry_uuids : Dict[str, Set[str]] = {}
+        for slice_id in request.slice_ids.slice_ids:
+            container_name = 'slice[{:s}]'.format(str(slice_id.context_id.context_uuid.uuid))
+            slice_uuid = slice_id.slice_uuid.uuid
+            container_entry_uuids.setdefault(container_name, set()).add(slice_uuid)
+            
+        exclude_endpoint_ids = not request.include_endpoint_ids
+        exclude_constraints  = not request.include_constraints
+        exclude_service_ids  = not request.include_service_ids
+        exclude_subslice_ids = not request.include_subslice_ids 
+        exclude_config_rules = not request.include_config_rules
+        
+        slices = list()
+        for container_name in sorted(container_entry_uuids.keys()):
+            entry_uuids = container_entry_uuids[container_name]
+            for eslice in select_entries(self.database, container_name, entry_uuids):
+                reply_slice = Slice()
+                reply_slice.CopyFrom(eslice)
+                if exclude_endpoint_ids: del reply_slice.service_endpoint_ids[:] # pylint: disable=no-member
+                if exclude_constraints : del reply_slice.service_constraints[:] # pylint: disable=no-member
+                if exclude_service_ids : del reply_slice.slice_service_ids[:] # pylint: disable=no-member
+                if exclude_subslice_ids : del reply_slice.slice_subslice_ids[:] # pylint: disable=no-member
+                if exclude_config_rules: del reply_slice.slice_config .config_rules[:] # pylint: disable=no-member
+                slices.append(reply_slice)
+                
+        reply = SliceList(slices=slices)
+        LOGGER.info('[SelectSlice] reply={:s}'.format(grpc_message_to_json_string(reply)))
+        return reply
+
 
     # ----- Service ----------------------------------------------------------------------------------------------------
 
@@ -335,6 +426,32 @@ class MockServicerImpl_Context(ContextServiceServicer):
         LOGGER.info('[GetServiceEvents] request={:s}'.format(grpc_message_to_json_string(request)))
         for message in self.msg_broker.consume({TOPIC_SERVICE}): yield ServiceEvent(**json.loads(message.content))
 
+    def SelectService(self, request : ServiceFilter, context : grpc.ServicerContext) -> ServiceList:
+        LOGGER.info('[SelectService] request={:s}'.format(grpc_message_to_json_string(request)))
+        container_entry_uuids : Dict[str, Set[str]] = {}
+        for service_id in request.service_ids.service_ids:
+            container_name = 'service[{:s}]'.format(str(service_id.context_id.context_uuid.uuid))
+            service_uuid = service_id.service_uuid.uuid
+            container_entry_uuids.setdefault(container_name, set()).add(service_uuid)
+            
+        exclude_endpoint_ids = not request.include_endpoint_ids
+        exclude_constraints  = not request.include_constraints
+        exclude_config_rules = not request.include_config_rules
+        
+        services = list()
+        for container_name in sorted(container_entry_uuids.keys()):
+            entry_uuids = container_entry_uuids[container_name]
+            for service in select_entries(self.database, container_name, entry_uuids):
+                reply_service = Service()
+                reply_service.CopyFrom(service)
+                if exclude_endpoint_ids: del reply_service.service_endpoint_ids[:] # pylint: disable=no-member
+                if exclude_constraints : del reply_service.service_constraints[:] # pylint: disable=no-member
+                if exclude_config_rules: del reply_service.service_config.config_rules[:] # pylint: disable=no-member
+                services.append(reply_service)
+                
+        reply = ServiceList(services=services) 
+        LOGGER.info('[SelectService] reply={:s}'.format(grpc_message_to_json_string(reply)))
+        return reply
 
     # ----- Connection -------------------------------------------------------------------------------------------------
 
diff --git a/src/common/tools/context_queries/Context.py b/src/common/tools/context_queries/Context.py
index a627b9ba5828d31caca8332d7241d28e126895d3..5e1facf2e077cd043c4ac9193941ac0a47372613 100644
--- a/src/common/tools/context_queries/Context.py
+++ b/src/common/tools/context_queries/Context.py
@@ -19,12 +19,12 @@ from common.tools.object_factory.Context import json_context
 from context.client.ContextClient import ContextClient
 
 def create_context(
-    context_client : ContextClient, context_uuid : str
+    context_client : ContextClient, context_uuid : str, name : Optional[str] = None
 ) -> None:
     existing_context_ids = context_client.ListContextIds(Empty())
     existing_context_uuids = {context_id.context_uuid.uuid for context_id in existing_context_ids.context_ids}
     if context_uuid in existing_context_uuids: return
-    context_client.SetContext(Context(**json_context(context_uuid)))
+    context_client.SetContext(Context(**json_context(context_uuid, name=name)))
 
 def get_context(context_client : ContextClient, context_uuid : str, rw_copy : bool = False) -> Optional[Context]:
     try:
diff --git a/src/common/tools/context_queries/InterDomain.py b/src/common/tools/context_queries/InterDomain.py
index edb640708b17b6734fbde6d759db5a2cdea692ec..aee7cbf7ff496aa8cb90bca62a0af402b6f7be3f 100644
--- a/src/common/tools/context_queries/InterDomain.py
+++ b/src/common/tools/context_queries/InterDomain.py
@@ -16,12 +16,12 @@ import logging
 from typing import Dict, List, Set, Tuple
 from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME
 from common.DeviceTypes import DeviceTypeEnum
-from common.proto.context_pb2 import ContextId, Device, Empty, EndPointId, ServiceTypeEnum, Slice
+from common.proto.context_pb2 import ContextId, Empty, EndPointId, ServiceTypeEnum, Slice
 from common.proto.pathcomp_pb2 import PathCompRequest
-from common.tools.context_queries.CheckType import device_type_is_network
-from common.tools.context_queries.Device import get_devices_in_topology
-from common.tools.context_queries.Topology import get_topology
-from common.tools.grpc.Tools import grpc_message_to_json_string
+from .CheckType import device_type_is_network
+from .Device import get_device #, get_devices_in_topology
+from .Topology import get_topology
+from common.tools.grpc.Tools import grpc_message_list_to_json, grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
 from context.client.ContextClient import ContextClient
 from pathcomp.frontend.client.PathCompClient import PathCompClient
@@ -33,28 +33,37 @@ DATACENTER_DEVICE_TYPES = {DeviceTypeEnum.DATACENTER, DeviceTypeEnum.EMULATED_DA
 
 def get_local_device_uuids(context_client : ContextClient) -> Set[str]:
     topologies = context_client.ListTopologies(ADMIN_CONTEXT_ID)
-    topologies = {topology.topology_id.topology_uuid.uuid : topology for topology in topologies.topologies}
-    LOGGER.debug('[get_local_device_uuids] topologies.keys()={:s}'.format(str(topologies.keys())))
 
-    local_topology_uuids = set(topologies.keys())
-    local_topology_uuids.discard(INTERDOMAIN_TOPOLOGY_NAME)
+    local_topologies = dict()
+    for topology in topologies.topologies:
+        topology_uuid = topology.topology_id.topology_uuid.uuid
+        if topology_uuid == INTERDOMAIN_TOPOLOGY_NAME: continue
+        topology_name = topology.name
+        if topology_name == INTERDOMAIN_TOPOLOGY_NAME: continue
+        local_topologies[topology_uuid] = topology
+    str_local_topologies = {
+        topology_uuid:grpc_message_to_json_string(topology)
+        for topology_uuid,topology in local_topologies.items()
+    }
+    LOGGER.debug('[get_local_device_uuids] local_topologies={:s}'.format(str(str_local_topologies)))
+
+    local_topology_uuids = set(local_topologies.keys())
     LOGGER.debug('[get_local_device_uuids] local_topology_uuids={:s}'.format(str(local_topology_uuids)))
 
+    # Add topology names except DEFAULT_TOPOLOGY_NAME and INTERDOMAIN_TOPOLOGY_NAME; they are abstracted as a
+    # local device in inter-domain and the name of the topology is used as abstract device name
+    # Add physical devices in the local topologies
     local_device_uuids = set()
+    for topology_uuid,topology in local_topologies.items():
+        if topology_uuid == DEFAULT_TOPOLOGY_NAME: continue
+        topology_name = topology.name
+        if topology_name == DEFAULT_TOPOLOGY_NAME: continue
+        #local_device_uuids.add(topology_uuid)
 
-    # add topology names except DEFAULT_TOPOLOGY_NAME and INTERDOMAIN_TOPOLOGY_NAME; they are abstracted as a
-    # local device in inter-domain and the name of the topology is used as abstract device name
-    for local_topology_uuid in local_topology_uuids:
-        if local_topology_uuid == DEFAULT_TOPOLOGY_NAME: continue
-        local_device_uuids.add(local_topology_uuid)
-
-    # add physical devices in the local topologies
-    for local_topology_uuid in local_topology_uuids:
-        topology_device_ids = topologies[local_topology_uuid].device_ids
-        topology_device_uuids = {device_id.device_uuid.uuid for device_id in topology_device_ids}
-        LOGGER.debug('[get_local_device_uuids] [loop] local_topology_uuid={:s} topology_device_uuids={:s}'.format(
-            str(local_topology_uuid), str(topology_device_uuids)))
-        local_device_uuids.update(topology_device_uuids)
+        device_uuids = {device_id.device_uuid.uuid for device_id in topology.device_ids}
+        LOGGER.debug('[get_local_device_uuids] [loop] topology_uuid={:s} device_uuids={:s}'.format(
+            str(topology_uuid), str(device_uuids)))
+        local_device_uuids.update(device_uuids)
 
     LOGGER.debug('[get_local_device_uuids] local_device_uuids={:s}'.format(str(local_device_uuids)))
     return local_device_uuids
@@ -74,17 +83,6 @@ def get_interdomain_device_uuids(context_client : ContextClient) -> Set[str]:
     LOGGER.debug('[get_interdomain_device_uuids] interdomain_device_uuids={:s}'.format(str(interdomain_device_uuids)))
     return interdomain_device_uuids
 
-def get_local_domain_devices(context_client : ContextClient) -> List[Device]:
-    local_device_uuids = get_local_device_uuids(context_client)
-    all_devices = context_client.ListDevices(Empty())
-    local_domain_devices = list()
-    for device in all_devices.devices:
-        if not device_type_is_network(device.device_type): continue
-        device_uuid = device.device_id.device_uuid.uuid
-        if device_uuid not in local_device_uuids: continue
-        local_domain_devices.append(device)
-    return local_domain_devices
-
 def is_inter_domain(context_client : ContextClient, endpoint_ids : List[EndPointId]) -> bool:
     interdomain_device_uuids = get_interdomain_device_uuids(context_client)
     LOGGER.debug('[is_inter_domain] interdomain_device_uuids={:s}'.format(str(interdomain_device_uuids)))
@@ -102,93 +100,22 @@ def is_inter_domain(context_client : ContextClient, endpoint_ids : List[EndPoint
     LOGGER.debug('[is_inter_domain] is_inter_domain={:s}'.format(str(is_inter_domain_)))
     return is_inter_domain_
 
-def is_multi_domain(context_client : ContextClient, endpoint_ids : List[EndPointId]) -> bool:
-    local_device_uuids = get_local_device_uuids(context_client)
-    LOGGER.debug('[is_multi_domain] local_device_uuids={:s}'.format(str(local_device_uuids)))
-    remote_endpoint_ids = [
-        endpoint_id
-        for endpoint_id in endpoint_ids
-        if endpoint_id.device_id.device_uuid.uuid not in local_device_uuids
-    ]
-    str_remote_endpoint_ids = [
-        (endpoint_id.device_id.device_uuid.uuid, endpoint_id.endpoint_uuid.uuid)
-        for endpoint_id in remote_endpoint_ids
-    ]
-    LOGGER.debug('[is_multi_domain] remote_endpoint_ids={:s}'.format(str(str_remote_endpoint_ids)))
-    is_multi_domain_ = len(remote_endpoint_ids) > 0
-    LOGGER.debug('[is_multi_domain] is_multi_domain={:s}'.format(str(is_multi_domain_)))
-    return is_multi_domain_
-
-def compute_interdomain_path(
-    pathcomp_client : PathCompClient, slice_ : Slice
-) -> List[Tuple[str, List[EndPointId]]]:
-    context_uuid = slice_.slice_id.context_id.context_uuid.uuid
-    slice_uuid = slice_.slice_id.slice_uuid.uuid
-
-    pathcomp_req = PathCompRequest()
-    pathcomp_req.shortest_path.Clear()                                          # pylint: disable=no-member
-    pathcomp_req_svc = pathcomp_req.services.add()                              # pylint: disable=no-member
-    pathcomp_req_svc.service_id.context_id.context_uuid.uuid = context_uuid
-    pathcomp_req_svc.service_id.service_uuid.uuid = slice_uuid
-    pathcomp_req_svc.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
-
-    for endpoint_id in slice_.slice_endpoint_ids:
-        service_endpoint_id = pathcomp_req_svc.service_endpoint_ids.add()
-        service_endpoint_id.CopyFrom(endpoint_id)
-    
-    constraint_sla_capacity = pathcomp_req_svc.service_constraints.add()
-    constraint_sla_capacity.sla_capacity.capacity_gbps = 10.0
-
-    constraint_sla_latency = pathcomp_req_svc.service_constraints.add()
-    constraint_sla_latency.sla_latency.e2e_latency_ms = 100.0
-
-    LOGGER.debug('pathcomp_req = {:s}'.format(grpc_message_to_json_string(pathcomp_req)))
-    pathcomp_rep = pathcomp_client.Compute(pathcomp_req)
-    LOGGER.debug('pathcomp_rep = {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
-
-    service = next(iter([
-        service
-        for service in pathcomp_rep.services
-        if service.service_id == pathcomp_req_svc.service_id
-    ]), None)
-    if service is None:
-        str_service_id = grpc_message_to_json_string(pathcomp_req_svc.service_id)
-        raise Exception('Service({:s}) not found'.format(str_service_id))
-
-    connection = next(iter([
-        connection
-        for connection in pathcomp_rep.connections
-        if connection.service_id == pathcomp_req_svc.service_id
-    ]), None)
-    if connection is None:
-        str_service_id = grpc_message_to_json_string(pathcomp_req_svc.service_id)
-        raise Exception('Connection for Service({:s}) not found'.format(str_service_id))
-
-    domain_list : List[str] = list()
-    domain_to_endpoint_ids : Dict[str, List[EndPointId]] = dict()
-    for endpoint_id in connection.path_hops_endpoint_ids:
-        device_uuid = endpoint_id.device_id.device_uuid.uuid
-        #endpoint_uuid = endpoint_id.endpoint_uuid.uuid
-        if device_uuid not in domain_to_endpoint_ids: domain_list.append(device_uuid)
-        domain_to_endpoint_ids.setdefault(device_uuid, []).append(endpoint_id)
-
-    return [
-        (domain_uuid, domain_to_endpoint_ids.get(domain_uuid))
-        for domain_uuid in domain_list
-    ]
-
 def get_device_to_domain_map(context_client : ContextClient) -> Dict[str, str]:
     devices_to_domains : Dict[str, str] = dict()
     contexts = context_client.ListContexts(Empty())
     for context in contexts.contexts:
         context_id = context.context_id
         context_uuid = context_id.context_uuid.uuid
+        context_name = context.name
         topologies = context_client.ListTopologies(context_id)
-        if context_uuid == DEFAULT_CONTEXT_NAME:
+        if (context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME):
             for topology in topologies.topologies:
                 topology_id = topology.topology_id
                 topology_uuid = topology_id.topology_uuid.uuid
+                topology_name = topology.name
+
                 if topology_uuid in {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME}: continue
+                if topology_name in {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME}: continue
 
                 # add topology names except DEFAULT_TOPOLOGY_NAME and INTERDOMAIN_TOPOLOGY_NAME; they are
                 # abstracted as a local device in inter-domain and the name of the topology is used as
@@ -204,9 +131,11 @@ def get_device_to_domain_map(context_client : ContextClient) -> Dict[str, str]:
             for topology in topologies.topologies:
                 topology_id = topology.topology_id
                 topology_uuid = topology_id.topology_uuid.uuid
+                topology_name = topology.name
 
                 # if topology is not interdomain
                 if topology_uuid in {INTERDOMAIN_TOPOLOGY_NAME}: continue
+                if topology_name in {INTERDOMAIN_TOPOLOGY_NAME}: continue
 
                 # add devices to the remote domain list
                 for device_id in topology.device_ids:
@@ -215,40 +144,117 @@ def get_device_to_domain_map(context_client : ContextClient) -> Dict[str, str]:
 
     return devices_to_domains
 
-def compute_traversed_domains(
-    context_client : ContextClient, interdomain_path : List[Tuple[str, List[EndPointId]]]
-) -> List[Tuple[str, bool, List[EndPointId]]]:
+def compute_interdomain_sub_slices(
+    context_client : ContextClient, pathcomp_client : PathCompClient, slice_ : Slice
+) -> Tuple[Dict[str, List[EndPointId]], Dict[str, List[EndPointId]]]:
+    context_uuid = slice_.slice_id.context_id.context_uuid.uuid
+    slice_uuid = slice_.slice_id.slice_uuid.uuid
+
+    pathcomp_req = PathCompRequest()
+    pathcomp_req.shortest_path.Clear()                                          # pylint: disable=no-member
+    pathcomp_req_svc = pathcomp_req.services.add()                              # pylint: disable=no-member
+    pathcomp_req_svc.service_id.context_id.context_uuid.uuid = context_uuid
+    pathcomp_req_svc.service_id.service_uuid.uuid = slice_uuid
+    pathcomp_req_svc.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
+
+    for endpoint_id in slice_.slice_endpoint_ids:
+        service_endpoint_id = pathcomp_req_svc.service_endpoint_ids.add()
+        service_endpoint_id.CopyFrom(endpoint_id)
+    
+    capacity_gbps  = 10.0   # default value; to be overwritten by constraints in slice
+    e2e_latency_ms = 100.0  # default value; to be overwritten by constraints in slice
+    for constraint in slice_.slice_constraints:
+        kind = constraint.WhichOneof('constraint')
+        if kind == 'sla_capacity':
+            capacity_gbps = constraint.sla_capacity.capacity_gbps
+        elif kind == 'sla_latency':
+            e2e_latency_ms = constraint.sla_latency.e2e_latency_ms
+
+    constraint_sla_capacity = pathcomp_req_svc.service_constraints.add()
+    constraint_sla_capacity.sla_capacity.capacity_gbps = capacity_gbps
+
+    constraint_sla_latency = pathcomp_req_svc.service_constraints.add()
+    constraint_sla_latency.sla_latency.e2e_latency_ms = e2e_latency_ms
+
+    LOGGER.debug('[compute_interdomain_sub_slices] pathcomp_req = {:s}'.format(
+        grpc_message_to_json_string(pathcomp_req)))
+    pathcomp_rep = pathcomp_client.Compute(pathcomp_req)
+    LOGGER.debug('[compute_interdomain_sub_slices] pathcomp_rep = {:s}'.format(
+        grpc_message_to_json_string(pathcomp_rep)))
+
+    num_services = len(pathcomp_rep.services)
+    if num_services == 0:
+        raise Exception('No services received : {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
+
+    num_connections = len(pathcomp_rep.connections)
+    if num_connections != num_services:
+        raise Exception('No connections received : {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
 
     local_device_uuids = get_local_device_uuids(context_client)
-    LOGGER.debug('[compute_traversed_domains] local_device_uuids={:s}'.format(str(local_device_uuids)))
+    LOGGER.debug('[compute_interdomain_sub_slices] local_device_uuids={:s}'.format(str(local_device_uuids)))
+
+    device_to_domain_map = get_device_to_domain_map(context_client)
+    LOGGER.debug('[compute_interdomain_sub_slices] device_to_domain_map={:s}'.format(str(device_to_domain_map)))
+
+    local_slices  : Dict[str, List[EndPointId]] = dict()
+    remote_slices : Dict[str, List[EndPointId]] = dict()
+    req_service_uuid = pathcomp_req_svc.service_id.service_uuid.uuid
+    for service in pathcomp_rep.services:
+        service_uuid = service.service_id.service_uuid.uuid
+        if service_uuid == req_service_uuid: continue # main synthetic service; we don't care
+        device_uuids = {
+            endpoint_id.device_id.device_uuid.uuid
+            for endpoint_id in service.service_endpoint_ids
+        }
+
+        local_domain_uuids = set()
+        remote_domain_uuids = set()
+        for device_uuid in device_uuids:
+            if device_uuid in local_device_uuids:
+                domain_uuid = device_to_domain_map.get(device_uuid)
+                if domain_uuid is None:
+                    raise Exception('Unable to map device({:s}) to a domain'.format(str(device_uuid)))
+                local_domain_uuids.add(domain_uuid)
+            else:
+                device = get_device(
+                    context_client, device_uuid, include_endpoints=True, include_config_rules=False,
+                    include_components=False)
+                if device is None: raise Exception('Device({:s}) not found'.format(str(device_uuid)))
+                if not device_type_is_network(device.device_type):
+                    MSG = 'Weird device({:s}) is not local and not network'
+                    raise Exception(MSG.format(grpc_message_to_json_string(device)))
+                remote_domain_uuids.add(device_uuid)
+
+        if len(local_domain_uuids) > 1:
+            MSG = 'Devices({:s}) map to multiple local domains({:s})'
+            raise Exception(MSG.format(str(device_uuids), str(local_domain_uuids)))
+        is_local = len(local_domain_uuids) == 1
+
+        if len(remote_domain_uuids) > 1:
+            MSG = 'Devices({:s}) map to multiple remote domains({:s})'
+            raise Exception(MSG.format(str(device_uuids), str(remote_domain_uuids)))
+        is_remote = len(remote_domain_uuids) == 1
+
+        if is_local == is_remote:
+            MSG = 'Weird service combines local and remote devices: {:s}'
+            raise Exception(MSG.format(grpc_message_to_json_string(service)))
+        elif is_local:
+            local_domain_uuid = local_domain_uuids.pop()
+            local_slices.setdefault(local_domain_uuid, list()).append(service.service_endpoint_ids)
+        else:
+            remote_domain_uuid = remote_domain_uuids.pop()
+            remote_slices.setdefault(remote_domain_uuid, list()).append(service.service_endpoint_ids)
 
-    interdomain_devices = get_devices_in_topology(context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME)
-    interdomain_devices = {
-        device.device_id.device_uuid.uuid : device
-        for device in interdomain_devices
+    str_local_slices = {
+        domain_uuid:grpc_message_list_to_json(endpoint_ids)
+        for domain_uuid,endpoint_ids in local_slices.items()
     }
+    LOGGER.debug('[compute_interdomain_sub_slices] local_slices={:s}'.format(str(str_local_slices)))
 
-    devices_to_domains = get_device_to_domain_map(context_client)
-    LOGGER.debug('[compute_traversed_domains] devices_to_domains={:s}'.format(str(devices_to_domains)))
-
-    traversed_domains : List[Tuple[str, bool, List[EndPointId]]] = list()
-    domains_dict : Dict[str, Tuple[str, bool, List[EndPointId]]] = dict()
-    for device_uuid, endpoint_ids in interdomain_path:
-        domain_uuid = devices_to_domains.get(device_uuid, '---')
-        domain = domains_dict.get(domain_uuid)
-        if domain is None:
-            is_local_domain = domain_uuid in local_device_uuids
-            domain = (domain_uuid, is_local_domain, [])
-            traversed_domains.append(domain)
-            domains_dict[domain_uuid] = domain
-        domain[2].extend(endpoint_ids)
-
-    str_traversed_domains = [
-        (domain_uuid, is_local_domain, [
-            (endpoint_id.device_id.device_uuid.uuid, endpoint_id.endpoint_uuid.uuid)
-            for endpoint_id in endpoint_ids
-        ])
-        for domain_uuid,is_local_domain,endpoint_ids in traversed_domains
-    ]
-    LOGGER.debug('[compute_traversed_domains] devices_to_domains={:s}'.format(str(str_traversed_domains)))
-    return traversed_domains
+    str_remote_slices = {
+        domain_uuid:grpc_message_list_to_json(endpoint_ids)
+        for domain_uuid,endpoint_ids in remote_slices.items()
+    }
+    LOGGER.debug('[compute_interdomain_sub_slices] remote_slices={:s}'.format(str(str_remote_slices)))
+
+    return local_slices, remote_slices
diff --git a/src/common/tools/context_queries/InterDomain_old.py b/src/common/tools/context_queries/InterDomain_old.py
new file mode 100644
index 0000000000000000000000000000000000000000..ef4f6aa808696d7290a2c80220c3212d3e586307
--- /dev/null
+++ b/src/common/tools/context_queries/InterDomain_old.py
@@ -0,0 +1,143 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from common.tools.context_queries.Device import get_device #, get_devices_in_topology
+
+## DEPRECATED
+#def get_local_domain_devices(context_client : ContextClient) -> List[Device]:
+#    local_device_uuids = get_local_device_uuids(context_client)
+#    all_devices = context_client.ListDevices(Empty())
+#    local_domain_devices = list()
+#    for device in all_devices.devices:
+#        if not device_type_is_network(device.device_type): continue
+#        device_uuid = device.device_id.device_uuid.uuid
+#        if device_uuid not in local_device_uuids: continue
+#        local_domain_devices.append(device)
+#    return local_domain_devices
+
+## DEPRECATED
+#def is_multi_domain(context_client : ContextClient, endpoint_ids : List[EndPointId]) -> bool:
+#    local_device_uuids = get_local_device_uuids(context_client)
+#    LOGGER.debug('[is_multi_domain] local_device_uuids={:s}'.format(str(local_device_uuids)))
+#    remote_endpoint_ids = [
+#        endpoint_id
+#        for endpoint_id in endpoint_ids
+#        if endpoint_id.device_id.device_uuid.uuid not in local_device_uuids
+#    ]
+#    str_remote_endpoint_ids = [
+#        (endpoint_id.device_id.device_uuid.uuid, endpoint_id.endpoint_uuid.uuid)
+#        for endpoint_id in remote_endpoint_ids
+#    ]
+#    LOGGER.debug('[is_multi_domain] remote_endpoint_ids={:s}'.format(str(str_remote_endpoint_ids)))
+#    is_multi_domain_ = len(remote_endpoint_ids) > 0
+#    LOGGER.debug('[is_multi_domain] is_multi_domain={:s}'.format(str(is_multi_domain_)))
+#    return is_multi_domain_
+
+## DEPRECATED
+#def compute_interdomain_path(
+#    pathcomp_client : PathCompClient, slice_ : Slice
+#) -> List[Tuple[str, List[EndPointId]]]:
+#    context_uuid = slice_.slice_id.context_id.context_uuid.uuid
+#    slice_uuid = slice_.slice_id.slice_uuid.uuid
+#
+#    pathcomp_req = PathCompRequest()
+#    pathcomp_req.shortest_path.Clear()                                          # pylint: disable=no-member
+#    pathcomp_req_svc = pathcomp_req.services.add()                              # pylint: disable=no-member
+#    pathcomp_req_svc.service_id.context_id.context_uuid.uuid = context_uuid
+#    pathcomp_req_svc.service_id.service_uuid.uuid = slice_uuid
+#    pathcomp_req_svc.service_type = ServiceTypeEnum.SERVICETYPE_L2NM
+#
+#    for endpoint_id in slice_.slice_endpoint_ids:
+#        service_endpoint_id = pathcomp_req_svc.service_endpoint_ids.add()
+#        service_endpoint_id.CopyFrom(endpoint_id)
+#    
+#    constraint_sla_capacity = pathcomp_req_svc.service_constraints.add()
+#    constraint_sla_capacity.sla_capacity.capacity_gbps = 10.0
+#
+#    constraint_sla_latency = pathcomp_req_svc.service_constraints.add()
+#    constraint_sla_latency.sla_latency.e2e_latency_ms = 100.0
+#
+#    LOGGER.debug('pathcomp_req = {:s}'.format(grpc_message_to_json_string(pathcomp_req)))
+#    pathcomp_rep = pathcomp_client.Compute(pathcomp_req)
+#    LOGGER.debug('pathcomp_rep = {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
+#
+#    service = next(iter([
+#        service
+#        for service in pathcomp_rep.services
+#        if service.service_id.service_uuid.uuid == pathcomp_req_svc.service_id.service_uuid.uuid
+#    ]), None)
+#    if service is None:
+#        str_service_id = grpc_message_to_json_string(pathcomp_req_svc.service_id)
+#        raise Exception('Service({:s}) not found'.format(str_service_id))
+#
+#    connection = next(iter([
+#        connection
+#        for connection in pathcomp_rep.connections
+#        if connection.service_id.service_uuid.uuid == pathcomp_req_svc.service_id.service_uuid.uuid
+#    ]), None)
+#    if connection is None:
+#        str_service_id = grpc_message_to_json_string(pathcomp_req_svc.service_id)
+#        raise Exception('Connection for Service({:s}) not found'.format(str_service_id))
+#
+#    domain_list : List[str] = list()
+#    domain_to_endpoint_ids : Dict[str, List[EndPointId]] = dict()
+#    for endpoint_id in connection.path_hops_endpoint_ids:
+#        device_uuid = endpoint_id.device_id.device_uuid.uuid
+#        #endpoint_uuid = endpoint_id.endpoint_uuid.uuid
+#        if device_uuid not in domain_to_endpoint_ids: domain_list.append(device_uuid)
+#        domain_to_endpoint_ids.setdefault(device_uuid, []).append(endpoint_id)
+#
+#    return [
+#        (domain_uuid, domain_to_endpoint_ids.get(domain_uuid))
+#        for domain_uuid in domain_list
+#    ]
+
+## DEPRECATED
+#def compute_traversed_domains(
+#    context_client : ContextClient, interdomain_path : List[Tuple[str, List[EndPointId]]]
+#) -> List[Tuple[str, bool, List[EndPointId]]]:
+#
+#    local_device_uuids = get_local_device_uuids(context_client)
+#    LOGGER.debug('[compute_traversed_domains] local_device_uuids={:s}'.format(str(local_device_uuids)))
+#
+#    #interdomain_devices = get_devices_in_topology(context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME)
+#    #interdomain_devices = {
+#    #    device.device_id.device_uuid.uuid : device
+#    #    for device in interdomain_devices
+#    #}
+#
+#    devices_to_domains = get_device_to_domain_map(context_client)
+#    LOGGER.debug('[compute_traversed_domains] devices_to_domains={:s}'.format(str(devices_to_domains)))
+#
+#    traversed_domains : List[Tuple[str, bool, List[EndPointId]]] = list()
+#    domains_dict : Dict[str, Tuple[str, bool, List[EndPointId]]] = dict()
+#    for device_uuid, endpoint_ids in interdomain_path:
+#        domain_uuid = devices_to_domains.get(device_uuid, '---')
+#        domain = domains_dict.get(domain_uuid)
+#        if domain is None:
+#            is_local_domain = domain_uuid in local_device_uuids
+#            domain = (domain_uuid, is_local_domain, [])
+#            traversed_domains.append(domain)
+#            domains_dict[domain_uuid] = domain
+#        domain[2].extend(endpoint_ids)
+#
+#    str_traversed_domains = [
+#        (domain_uuid, is_local_domain, [
+#            (endpoint_id.device_id.device_uuid.uuid, endpoint_id.endpoint_uuid.uuid)
+#            for endpoint_id in endpoint_ids
+#        ])
+#        for domain_uuid,is_local_domain,endpoint_ids in traversed_domains
+#    ]
+#    LOGGER.debug('[compute_traversed_domains] devices_to_domains={:s}'.format(str(str_traversed_domains)))
+#    return traversed_domains
diff --git a/src/common/tools/context_queries/Topology.py b/src/common/tools/context_queries/Topology.py
index 15217b8d14fec0137d94aa704e3cd8cb096f4a17..caf03ed0eb5271aa6e00a2c107a06f9e496d37dc 100644
--- a/src/common/tools/context_queries/Topology.py
+++ b/src/common/tools/context_queries/Topology.py
@@ -15,7 +15,7 @@
 import grpc, logging
 from typing import List, Optional
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import ContextId, Topology, TopologyId
+from common.proto.context_pb2 import ContextId, Topology, TopologyDetails, TopologyId
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Topology import json_topology
 from context.client.ContextClient import ContextClient
@@ -23,13 +23,13 @@ from context.client.ContextClient import ContextClient
 LOGGER = logging.getLogger(__name__)
 
 def create_topology(
-    context_client : ContextClient, context_uuid : str, topology_uuid : str
+    context_client : ContextClient, context_uuid : str, topology_uuid : str, name : Optional[str] = None
 ) -> None:
     context_id = ContextId(**json_context_id(context_uuid))
     existing_topology_ids = context_client.ListTopologyIds(context_id)
     existing_topology_uuids = {topology_id.topology_uuid.uuid for topology_id in existing_topology_ids.topology_ids}
     if topology_uuid in existing_topology_uuids: return
-    context_client.SetTopology(Topology(**json_topology(topology_uuid, context_id=context_id)))
+    context_client.SetTopology(Topology(**json_topology(topology_uuid, context_id=context_id, name=name)))
 
 def create_missing_topologies(
     context_client : ContextClient, context_id : ContextId, topology_uuids : List[str]
@@ -61,3 +61,21 @@ def get_topology(
     except grpc.RpcError:
         #LOGGER.exception('Unable to get topology({:s} / {:s})'.format(str(context_uuid), str(topology_uuid)))
         return None
+
+def get_topology_details(
+        context_client : ContextClient, topology_uuid : str, context_uuid : str = DEFAULT_CONTEXT_NAME,
+        rw_copy : bool = False
+    ) -> Optional[Topology]:
+    try:
+        # pylint: disable=no-member
+        topology_id = TopologyId()
+        topology_id.context_id.context_uuid.uuid = context_uuid
+        topology_id.topology_uuid.uuid = topology_uuid
+        ro_topology_details = context_client.GetTopologyDetails(topology_id)
+        if not rw_copy: return ro_topology_details
+        rw_topology_details = TopologyDetails()
+        rw_topology_details.CopyFrom(ro_topology_details)
+        return rw_topology_details
+    except grpc.RpcError:
+        #LOGGER.exception('Unable to get topology({:s} / {:s})'.format(str(context_uuid), str(topology_uuid)))
+        return None
diff --git a/src/common/tools/object_factory/Device.py b/src/common/tools/object_factory/Device.py
index 66c87b14dd866d44b5d48addf93d172aea962f8e..bc5c28740d5635df99c26ef56124c471d2c77d91 100644
--- a/src/common/tools/object_factory/Device.py
+++ b/src/common/tools/object_factory/Device.py
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 import copy
-from typing import Dict, List, Tuple
+from typing import Dict, List, Optional, Tuple
 from common.DeviceTypes import DeviceTypeEnum
 from common.proto.context_pb2 import DeviceDriverEnum, DeviceOperationalStatusEnum
 from common.tools.object_factory.ConfigRule import json_config_rule_set
@@ -50,10 +50,10 @@ def json_device_id(device_uuid : str):
     return {'device_uuid': {'uuid': device_uuid}}
 
 def json_device(
-        device_uuid : str, device_type : str, status : DeviceOperationalStatusEnum, endpoints : List[Dict] = [],
-        config_rules : List[Dict] = [], drivers : List[Dict] = []
+        device_uuid : str, device_type : str, status : DeviceOperationalStatusEnum, name : Optional[str] = None,
+        endpoints : List[Dict] = [], config_rules : List[Dict] = [], drivers : List[Dict] = []
     ):
-    return {
+    result = {
         'device_id'                : json_device_id(device_uuid),
         'device_type'              : device_type,
         'device_config'            : {'config_rules': copy.deepcopy(config_rules)},
@@ -61,76 +61,82 @@ def json_device(
         'device_drivers'           : copy.deepcopy(drivers),
         'device_endpoints'         : copy.deepcopy(endpoints),
     }
+    if name is not None: result['name'] = name
+    return result
 
 def json_device_emulated_packet_router_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_EMU_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_EMUPR_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules,
+        device_uuid, DEVICE_EMUPR_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
         drivers=drivers)
 
 def json_device_emulated_tapi_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_EMU_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_EMUOLS_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules,
+        device_uuid, DEVICE_EMUOLS_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
         drivers=drivers)
 
 def json_device_emulated_datacenter_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_EMU_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_EMUDC_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules,
+        device_uuid, DEVICE_EMUDC_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
         drivers=drivers)
 
 def json_device_packetrouter_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_PR_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_PR_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules, drivers=drivers)
+        device_uuid, DEVICE_PR_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
+        drivers=drivers)
 
 def json_device_tapi_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_TAPI_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_TAPI_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules, drivers=drivers)
+        device_uuid, DEVICE_TAPI_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
+        drivers=drivers)
 
 def json_device_xr_constellation_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_XR_CONSTELLATION_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_XR_CONSTELLATION_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules,
-        drivers=drivers)
+        device_uuid, DEVICE_XR_CONSTELLATION_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints,
+        config_rules=config_rules, drivers=drivers)
 
 def json_device_microwave_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_MICROWAVE_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_MICROWAVE_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules,
+        device_uuid, DEVICE_MICROWAVE_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
         drivers=drivers)
 
 def json_device_p4_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_P4_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_P4_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules, drivers=drivers)
+        device_uuid, DEVICE_P4_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
+        drivers=drivers)
 
 def json_device_tfs_disabled(
-        device_uuid : str, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
+        device_uuid : str, name : Optional[str] = None, endpoints : List[Dict] = [], config_rules : List[Dict] = [],
         drivers : List[Dict] = DEVICE_TFS_DRIVERS
     ):
     return json_device(
-        device_uuid, DEVICE_TFS_TYPE, DEVICE_DISABLED, endpoints=endpoints, config_rules=config_rules, drivers=drivers)
+        device_uuid, DEVICE_TFS_TYPE, DEVICE_DISABLED, name=name, endpoints=endpoints, config_rules=config_rules,
+        drivers=drivers)
 
-def json_device_connect_rules(address : str, port : int, settings : Dict = {}):
+def json_device_connect_rules(address : str, port : int, settings : Dict = {}) -> List[Dict]:
     return [
         json_config_rule_set('_connect/address',  address),
         json_config_rule_set('_connect/port',     port),
@@ -138,12 +144,7 @@ def json_device_connect_rules(address : str, port : int, settings : Dict = {}):
     ]
 
 def json_device_emulated_connect_rules(
-        endpoint_descriptors : List[Tuple[str, str, List[int]]], address : str = DEVICE_EMU_ADDRESS,
-        port : int = DEVICE_EMU_PORT
-    ):
-
-    settings = {'endpoints': [
-        {'uuid': endpoint_uuid, 'type': endpoint_type, 'sample_types': sample_types}
-        for endpoint_uuid,endpoint_type,sample_types in endpoint_descriptors
-    ]}
+    endpoint_descriptors : List[Dict], address : str = DEVICE_EMU_ADDRESS, port : int = DEVICE_EMU_PORT
+) -> List[Dict]:
+    settings = {'endpoints': endpoint_descriptors}
     return json_device_connect_rules(address, port, settings=settings)
diff --git a/src/common/tools/object_factory/EndPoint.py b/src/common/tools/object_factory/EndPoint.py
index 326c67e1e942e5c4056389a633c70e2830737217..a776dfebb42cea5b51bf0a2566038859ffc02fa5 100644
--- a/src/common/tools/object_factory/EndPoint.py
+++ b/src/common/tools/object_factory/EndPoint.py
@@ -13,7 +13,20 @@
 # limitations under the License.
 
 import copy
-from typing import Dict, List, Optional, Tuple
+from typing import Dict, List, Optional
+
+def json_endpoint_descriptor(
+    endpoint_uuid : str, endpoint_type : str, endpoint_name : Optional[str] = None,
+    sample_types : List[int] = [], location : Optional[Dict] = None
+) -> Dict:
+    result = {'uuid': endpoint_uuid, 'type': endpoint_type}
+    if endpoint_name is not None:
+        result['name'] = endpoint_name
+    if sample_types is not None and len(sample_types) > 0:
+        result['sample_types'] = sample_types
+    if location is not None and len(location) > 0:
+        result['location'] = location
+    return result
 
 def json_endpoint_id(device_id : Dict, endpoint_uuid : str, topology_id : Optional[Dict] = None):
     result = {'device_id': copy.deepcopy(device_id), 'endpoint_uuid': {'uuid': endpoint_uuid}}
@@ -21,31 +34,34 @@ def json_endpoint_id(device_id : Dict, endpoint_uuid : str, topology_id : Option
     return result
 
 def json_endpoint_ids(
-        device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]], topology_id : Optional[Dict] = None
+        device_id : Dict, endpoint_descriptors : List[Dict], topology_id : Optional[Dict] = None
     ):
     return [
-        json_endpoint_id(device_id, endpoint_uuid, topology_id=topology_id)
-        for endpoint_uuid, _, _ in endpoint_descriptors
+        json_endpoint_id(device_id, endpoint_data['uuid'], topology_id=topology_id)
+        for endpoint_data in endpoint_descriptors
     ]
 
 def json_endpoint(
         device_id : Dict, endpoint_uuid : str, endpoint_type : str, topology_id : Optional[Dict] = None,
-        kpi_sample_types : List[int] = []
+        kpi_sample_types : List[int] = [], location : Optional[Dict] = None
     ):
 
     result = {
         'endpoint_id': json_endpoint_id(device_id, endpoint_uuid, topology_id=topology_id),
         'endpoint_type': endpoint_type,
     }
-    if len(kpi_sample_types) > 0: result['kpi_sample_types'] = copy.deepcopy(kpi_sample_types)
+    if kpi_sample_types is not None and len(kpi_sample_types) > 0:
+        result['kpi_sample_types'] = copy.deepcopy(kpi_sample_types)
+    if location is not None:
+        result['endpoint_location'] = copy.deepcopy(location)
     return result
 
 def json_endpoints(
-        device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]], topology_id : Optional[Dict] = None
+        device_id : Dict, endpoint_descriptors : List[Dict], topology_id : Optional[Dict] = None
     ):
     return [
         json_endpoint(
-            device_id, endpoint_uuid, endpoint_type, topology_id=topology_id,
-            kpi_sample_types=endpoint_sample_types)
-        for endpoint_uuid, endpoint_type, endpoint_sample_types in endpoint_descriptors
+            device_id, endpoint_data['uuid'], endpoint_data['type'], topology_id=topology_id,
+            kpi_sample_types=endpoint_data.get('sample_types'), location=endpoint_data.get('location'))
+        for endpoint_data in endpoint_descriptors
     ]
diff --git a/src/common/tools/object_factory/Link.py b/src/common/tools/object_factory/Link.py
index dbb3d7fb15ac167e6b0a227d8bc8ab8002d93bba..5f8080d300d9d6d646b8d769ec5819b0bd26f789 100644
--- a/src/common/tools/object_factory/Link.py
+++ b/src/common/tools/object_factory/Link.py
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 import copy
-from typing import Dict, List, Tuple
+from typing import Dict, List, Optional, Tuple
 
 def get_link_uuid(a_endpoint_id : Dict, z_endpoint_id : Dict) -> str:
     return '{:s}/{:s}=={:s}/{:s}'.format(
@@ -23,8 +23,10 @@ def get_link_uuid(a_endpoint_id : Dict, z_endpoint_id : Dict) -> str:
 def json_link_id(link_uuid : str) -> Dict:
     return {'link_uuid': {'uuid': link_uuid}}
 
-def json_link(link_uuid : str, endpoint_ids : List[Dict]) -> Dict:
-    return {'link_id': json_link_id(link_uuid), 'link_endpoint_ids': copy.deepcopy(endpoint_ids)}
+def json_link(link_uuid : str, endpoint_ids : List[Dict], name : Optional[str] = None) -> Dict:
+    result = {'link_id': json_link_id(link_uuid), 'link_endpoint_ids': copy.deepcopy(endpoint_ids)}
+    if name is not None: result['name'] = name
+    return result
 
 def compose_link(endpoint_a, endpoint_z) -> Tuple[Dict, Dict]:
     link_uuid = get_link_uuid(endpoint_a['endpoint_id'], endpoint_z['endpoint_id'])
diff --git a/src/common/tools/object_factory/Location.py b/src/common/tools/object_factory/Location.py
new file mode 100644
index 0000000000000000000000000000000000000000..ac44ef4c64d8466be123c5a722bf7fe69f5e48a8
--- /dev/null
+++ b/src/common/tools/object_factory/Location.py
@@ -0,0 +1,30 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import copy
+from typing import Dict, Optional
+
+
+def json_gps_position(latitude : float, longitude : float):
+    return {'latitude': latitude, 'longitude': longitude}
+
+def json_location(region : Optional[str] = None, gps_position : Optional[Dict] = None):
+    if not region and not gps_position:
+        raise Exception('One of "region" or "gps_position" arguments must be filled')
+    if region:
+        result = {'region': region}
+    else:
+        result = {'gps_position': copy.deepcopy(gps_position)}
+
+    return result
diff --git a/src/common/type_checkers/Assertions.py b/src/common/type_checkers/Assertions.py
index d5476a9534ca6e2d74ba16d3af71ed367bc5ab51..25eb42fabf9c670256e9079a060aa38deb3c0f3d 100644
--- a/src/common/type_checkers/Assertions.py
+++ b/src/common/type_checkers/Assertions.py
@@ -34,6 +34,7 @@ def validate_device_driver_enum(message):
         'DEVICEDRIVER_ONF_TR_352',
         'DEVICEDRIVER_XR',
         'DEVICEDRIVER_IETF_L2VPN',
+        'DEVICEDRIVER_GNMI_OPENCONFIG',
     ]
 
 def validate_device_operational_status_enum(message):
diff --git a/src/compute/service/rest_server/nbi_plugins/debug_api/Resources.py b/src/compute/service/rest_server/nbi_plugins/debug_api/Resources.py
index 2d7b6bb769f1b11ec5654c65bebf54f6fa94c420..b3ced86c15d0f3b900264d48f3590b436ab5e865 100644
--- a/src/compute/service/rest_server/nbi_plugins/debug_api/Resources.py
+++ b/src/compute/service/rest_server/nbi_plugins/debug_api/Resources.py
@@ -20,7 +20,6 @@ from .Tools import (
     format_grpc_to_json, grpc_connection_id, grpc_context_id, grpc_device_id, grpc_link_id, grpc_policy_rule_id,
     grpc_service_id, grpc_service, grpc_slice_id, grpc_topology_id)
 
-
 class _Resource(Resource):
     def __init__(self) -> None:
         super().__init__()
diff --git a/src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py b/src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py
index 7e829479a0a3dbd4968d488a22dc62219fa5376c..d74276b75275d1fe4711e10f848d9b9b94c33c38 100644
--- a/src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py
+++ b/src/compute/service/rest_server/nbi_plugins/ietf_l2vpn/L2VPN_SiteNetworkAccesses.py
@@ -111,7 +111,7 @@ def process_site_network_access(context_client : ContextClient, site_id : str, s
             str_location_id = grpc_message_to_json_string(constraint.endpoint_location.location)
             location_endpoints.setdefault(str_location_id, set()).add(str_endpoint_id)
         num_endpoints_per_location = {len(endpoints) for endpoints in location_endpoints.values()}
-        num_disjoint_paths = min(num_endpoints_per_location)
+        num_disjoint_paths = max(num_endpoints_per_location)
         update_constraint_sla_availability(constraints, num_disjoint_paths, all_active, 0.0)
 
     return target
diff --git a/src/context/client/EventsCollector.py b/src/context/client/EventsCollector.py
index a8783fa8ea1d7576d4cb81fc53303203d83c75e5..c661e0cab3ab4a550dfca84c9e112759c31b9c8c 100644
--- a/src/context/client/EventsCollector.py
+++ b/src/context/client/EventsCollector.py
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Callable
 import grpc, logging, queue, threading, time
+from typing import Callable
 from common.proto.context_pb2 import Empty
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from context.client.ContextClient import ContextClient
@@ -23,7 +23,7 @@ LOGGER.setLevel(logging.DEBUG)
 
 class _Collector(threading.Thread):
     def __init__(
-        self, subscription_func : Callable, events_queue = queue.Queue,
+        self, subscription_func : Callable, events_queue = queue.PriorityQueue,
         terminate = threading.Event, log_events_received: bool = False
     ) -> None:
         super().__init__(daemon=False)
@@ -45,7 +45,8 @@ class _Collector(threading.Thread):
                     if self._log_events_received:
                         str_event = grpc_message_to_json_string(event)
                         LOGGER.info('[_collect] event: {:s}'.format(str_event))
-                    self._events_queue.put_nowait(event)
+                    timestamp = event.event.timestamp.timestamp
+                    self._events_queue.put_nowait((timestamp, event))
             except grpc.RpcError as e:
                 if e.code() == grpc.StatusCode.UNAVAILABLE:
                     LOGGER.info('[_collect] UNAVAILABLE... retrying...')
@@ -68,7 +69,7 @@ class EventsCollector:
         activate_slice_collector      : bool = True,
         activate_connection_collector : bool = True,
     ) -> None:
-        self._events_queue = queue.Queue()
+        self._events_queue = queue.PriorityQueue()
         self._terminate = threading.Event()
         self._log_events_received = log_events_received
 
@@ -120,7 +121,8 @@ class EventsCollector:
 
     def get_event(self, block : bool = True, timeout : float = 0.1):
         try:
-            return self._events_queue.get(block=block, timeout=timeout)
+            _,event = self._events_queue.get(block=block, timeout=timeout)
+            return event
         except queue.Empty: # pylint: disable=catching-non-exception
             return None
 
diff --git a/src/context/service/ContextServiceServicerImpl.py b/src/context/service/ContextServiceServicerImpl.py
index 6d540b4945df8516697c957316294a452186ddb1..93f078e75545c93a2cd312cf48e8f64cdeea87ac 100644
--- a/src/context/service/ContextServiceServicerImpl.py
+++ b/src/context/service/ContextServiceServicerImpl.py
@@ -12,14 +12,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import grpc, json, logging, sqlalchemy
+import grpc, logging, sqlalchemy
 from typing import Iterator
 from common.message_broker.MessageBroker import MessageBroker
 from common.proto.context_pb2 import (
     Connection, ConnectionEvent, ConnectionId, ConnectionIdList, ConnectionList,
     Context, ContextEvent, ContextId, ContextIdList, ContextList,
     Device, DeviceEvent, DeviceFilter, DeviceId, DeviceIdList, DeviceList,
-    Empty, EndPointIdList, EndPointNameList, EventTypeEnum,
+    Empty, EndPointIdList, EndPointNameList,
     Link, LinkEvent, LinkId, LinkIdList, LinkList,
     Service, ServiceEvent, ServiceFilter, ServiceId, ServiceIdList, ServiceList,
     Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList,
@@ -33,16 +33,16 @@ from .database.Connection import (
 from .database.Context import context_delete, context_get, context_list_ids, context_list_objs, context_set
 from .database.Device import device_delete, device_get, device_list_ids, device_list_objs, device_select, device_set
 from .database.EndPoint import endpoint_list_names
+from .database.Events import EventTopicEnum, consume_events
 from .database.Link import link_delete, link_get, link_list_ids, link_list_objs, link_set
 from .database.PolicyRule import (
     policyrule_delete, policyrule_get, policyrule_list_ids, policyrule_list_objs, policyrule_set)
-from .database.Service import service_delete, service_get, service_list_ids, service_list_objs, service_select, service_set, service_unset
-from .database.Slice import slice_delete, slice_get, slice_list_ids, slice_list_objs, slice_select, slice_set, slice_unset
+from .database.Service import (
+    service_delete, service_get, service_list_ids, service_list_objs, service_select, service_set, service_unset)
+from .database.Slice import (
+    slice_delete, slice_get, slice_list_ids, slice_list_objs, slice_select, slice_set, slice_unset)
 from .database.Topology import (
     topology_delete, topology_get, topology_get_details, topology_list_ids, topology_list_objs, topology_set)
-from .Events import (
-    CONSUME_TIMEOUT, TOPIC_CONNECTION, TOPIC_CONTEXT, TOPIC_DEVICE, TOPIC_LINK, TOPIC_POLICY, TOPIC_SERVICE,
-    TOPIC_SLICE, TOPIC_TOPOLOGY, notify_event)
 
 LOGGER = logging.getLogger(__name__)
 
@@ -62,308 +62,237 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListContextIds(self, request : Empty, context : grpc.ServicerContext) -> ContextIdList:
-        return ContextIdList(context_ids=context_list_ids(self.db_engine))
+        return context_list_ids(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListContexts(self, request : Empty, context : grpc.ServicerContext) -> ContextList:
-        return ContextList(contexts=context_list_objs(self.db_engine))
+        return context_list_objs(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetContext(self, request : ContextId, context : grpc.ServicerContext) -> Context:
-        return Context(**context_get(self.db_engine, request))
+        return context_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetContext(self, request : Context, context : grpc.ServicerContext) -> ContextId:
-        context_id,updated = context_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_CONTEXT, event_type, {'context_id': context_id})
-        return ContextId(**context_id)
+        return context_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveContext(self, request : ContextId, context : grpc.ServicerContext) -> Empty:
-        context_id,deleted = context_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_CONTEXT, event_type, {'context_id': context_id})
-        return Empty()
+        return context_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetContextEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[ContextEvent]:
-        for message in self.messagebroker.consume({TOPIC_CONTEXT}, consume_timeout=CONSUME_TIMEOUT):
-            yield ContextEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.CONTEXT}): yield message
 
 
     # ----- Topology ---------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListTopologyIds(self, request : ContextId, context : grpc.ServicerContext) -> TopologyIdList:
-        return TopologyIdList(topology_ids=topology_list_ids(self.db_engine, request))
+        return topology_list_ids(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListTopologies(self, request : ContextId, context : grpc.ServicerContext) -> TopologyList:
-        return TopologyList(topologies=topology_list_objs(self.db_engine, request))
+        return topology_list_objs(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetTopology(self, request : TopologyId, context : grpc.ServicerContext) -> Topology:
-        return Topology(**topology_get(self.db_engine, request))
+        return topology_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetTopologyDetails(self, request : TopologyId, context : grpc.ServicerContext) -> TopologyDetails:
-        return TopologyDetails(**topology_get_details(self.db_engine, request))
+        return topology_get_details(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetTopology(self, request : Topology, context : grpc.ServicerContext) -> TopologyId:
-        topology_id,updated = topology_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_TOPOLOGY, event_type, {'topology_id': topology_id})
-        return TopologyId(**topology_id)
+        return topology_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveTopology(self, request : TopologyId, context : grpc.ServicerContext) -> Empty:
-        topology_id,deleted = topology_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_TOPOLOGY, event_type, {'topology_id': topology_id})
-        return Empty()
+        return topology_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetTopologyEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[TopologyEvent]:
-        for message in self.messagebroker.consume({TOPIC_TOPOLOGY}, consume_timeout=CONSUME_TIMEOUT):
-            yield TopologyEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.TOPOLOGY}): yield message
 
 
     # ----- Device -----------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListDeviceIds(self, request : Empty, context : grpc.ServicerContext) -> DeviceIdList:
-        return DeviceIdList(device_ids=device_list_ids(self.db_engine))
+        return device_list_ids(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListDevices(self, request : Empty, context : grpc.ServicerContext) -> DeviceList:
-        return DeviceList(devices=device_list_objs(self.db_engine))
+        return device_list_objs(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetDevice(self, request : ContextId, context : grpc.ServicerContext) -> Device:
-        return Device(**device_get(self.db_engine, request))
+        return device_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetDevice(self, request : Device, context : grpc.ServicerContext) -> DeviceId:
-        device_id,updated = device_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_DEVICE, event_type, {'device_id': device_id})
-        return DeviceId(**device_id)
+        return device_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveDevice(self, request : DeviceId, context : grpc.ServicerContext) -> Empty:
-        device_id,deleted = device_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_DEVICE, event_type, {'device_id': device_id})
-        return Empty()
+        return device_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SelectDevice(self, request : DeviceFilter, context : grpc.ServicerContext) -> DeviceList:
-        return DeviceList(devices=device_select(self.db_engine, request))
+        return device_select(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetDeviceEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[DeviceEvent]:
-        for message in self.messagebroker.consume({TOPIC_DEVICE}, consume_timeout=CONSUME_TIMEOUT):
-            yield DeviceEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.DEVICE}): yield message
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListEndPointNames(self, request : EndPointIdList, context : grpc.ServicerContext) -> EndPointNameList:
-        return EndPointNameList(endpoint_names=endpoint_list_names(self.db_engine, request))
+        return endpoint_list_names(self.db_engine, request)
 
 
     # ----- Link -------------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListLinkIds(self, request : Empty, context : grpc.ServicerContext) -> LinkIdList:
-        return LinkIdList(link_ids=link_list_ids(self.db_engine))
+        return link_list_ids(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListLinks(self, request : Empty, context : grpc.ServicerContext) -> LinkList:
-        return LinkList(links=link_list_objs(self.db_engine))
+        return link_list_objs(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetLink(self, request : LinkId, context : grpc.ServicerContext) -> Link:
-        return Link(**link_get(self.db_engine, request))
+        return link_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetLink(self, request : Link, context : grpc.ServicerContext) -> LinkId:
-        link_id,updated = link_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_LINK, event_type, {'link_id': link_id})
-        return LinkId(**link_id)
+        return link_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveLink(self, request : LinkId, context : grpc.ServicerContext) -> Empty:
-        link_id,deleted = link_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_LINK, event_type, {'link_id': link_id})
-        return Empty()
+        return link_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetLinkEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[LinkEvent]:
-        for message in self.messagebroker.consume({TOPIC_LINK}, consume_timeout=CONSUME_TIMEOUT):
-            yield LinkEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.LINK}): yield message
 
 
     # ----- Service ----------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListServiceIds(self, request : ContextId, context : grpc.ServicerContext) -> ServiceIdList:
-        return ServiceIdList(service_ids=service_list_ids(self.db_engine, request))
+        return service_list_ids(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListServices(self, request : ContextId, context : grpc.ServicerContext) -> ServiceList:
-        return ServiceList(services=service_list_objs(self.db_engine, request))
+        return service_list_objs(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetService(self, request : ServiceId, context : grpc.ServicerContext) -> Service:
-        return Service(**service_get(self.db_engine, request))
+        return service_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetService(self, request : Service, context : grpc.ServicerContext) -> ServiceId:
-        service_id,updated = service_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id})
-        return ServiceId(**service_id)
+        return service_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def UnsetService(self, request : Service, context : grpc.ServicerContext) -> ServiceId:
-        service_id,updated = service_unset(self.db_engine, request)
-        if updated:
-            event_type = EventTypeEnum.EVENTTYPE_UPDATE
-            notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id})
-        return ServiceId(**service_id)
+        return service_unset(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveService(self, request : ServiceId, context : grpc.ServicerContext) -> Empty:
-        service_id,deleted = service_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id})
-        return Empty()
+        return service_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SelectService(self, request : ServiceFilter, context : grpc.ServicerContext) -> ServiceList:
-        return ServiceList(services=service_select(self.db_engine, request))
+        return service_select(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetServiceEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[ServiceEvent]:
-        for message in self.messagebroker.consume({TOPIC_SERVICE}, consume_timeout=CONSUME_TIMEOUT):
-            yield ServiceEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.SERVICE}): yield message
 
 
     # ----- Slice ----------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListSliceIds(self, request : ContextId, context : grpc.ServicerContext) -> SliceIdList:
-        return SliceIdList(slice_ids=slice_list_ids(self.db_engine, request))
+        return slice_list_ids(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListSlices(self, request : ContextId, context : grpc.ServicerContext) -> SliceList:
-        return SliceList(slices=slice_list_objs(self.db_engine, request))
+        return slice_list_objs(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetSlice(self, request : SliceId, context : grpc.ServicerContext) -> Slice:
-        return Slice(**slice_get(self.db_engine, request))
+        return slice_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetSlice(self, request : Slice, context : grpc.ServicerContext) -> SliceId:
-        slice_id,updated = slice_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_SLICE, event_type, {'slice_id': slice_id})
-        return SliceId(**slice_id)
+        return slice_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def UnsetSlice(self, request : Slice, context : grpc.ServicerContext) -> SliceId:
-        slice_id,updated = slice_unset(self.db_engine, request)
-        if updated:
-            event_type = EventTypeEnum.EVENTTYPE_UPDATE
-            notify_event(self.messagebroker, TOPIC_SLICE, event_type, {'slice_id': slice_id})
-        return SliceId(**slice_id)
+        return slice_unset(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveSlice(self, request : SliceId, context : grpc.ServicerContext) -> Empty:
-        slice_id,deleted = slice_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_SLICE, event_type, {'slice_id': slice_id})
-        return Empty()
+        return slice_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SelectSlice(self, request : SliceFilter, context : grpc.ServicerContext) -> SliceList:
-        return SliceList(slices=slice_select(self.db_engine, request))
+        return slice_select(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetSliceEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[SliceEvent]:
-        for message in self.messagebroker.consume({TOPIC_SLICE}, consume_timeout=CONSUME_TIMEOUT):
-            yield SliceEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.SLICE}): yield message
 
 
     # ----- Connection -------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListConnectionIds(self, request : ServiceId, context : grpc.ServicerContext) -> ConnectionIdList:
-        return ConnectionIdList(connection_ids=connection_list_ids(self.db_engine, request))
+        return connection_list_ids(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListConnections(self, request : ContextId, context : grpc.ServicerContext) -> ConnectionList:
-        return ConnectionList(connections=connection_list_objs(self.db_engine, request))
+        return connection_list_objs(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetConnection(self, request : ConnectionId, context : grpc.ServicerContext) -> Connection:
-        return Connection(**connection_get(self.db_engine, request))
+        return connection_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetConnection(self, request : Connection, context : grpc.ServicerContext) -> ConnectionId:
-        connection_id,updated = connection_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_CONNECTION, event_type, {'connection_id': connection_id})
-        return ConnectionId(**connection_id)
+        return connection_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemoveConnection(self, request : ConnectionId, context : grpc.ServicerContext) -> Empty:
-        connection_id,deleted = connection_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_CONNECTION, event_type, {'connection_id': connection_id})
-        return Empty()
+        return connection_delete(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetConnectionEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[ConnectionEvent]:
-        for message in self.messagebroker.consume({TOPIC_CONNECTION}, consume_timeout=CONSUME_TIMEOUT):
-            yield ConnectionEvent(**json.loads(message.content))
+        for message in consume_events(self.messagebroker, {EventTopicEnum.CONNECTION}): yield message
 
 
-    # ----- Policy -----------------------------------------------------------------------------------------------------
+    # ----- Policy Rule ------------------------------------------------------------------------------------------------
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListPolicyRuleIds(self, request : Empty, context: grpc.ServicerContext) -> PolicyRuleIdList:
-        return PolicyRuleIdList(policyRuleIdList=policyrule_list_ids(self.db_engine))
+        return policyrule_list_ids(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def ListPolicyRules(self, request : Empty, context: grpc.ServicerContext) -> PolicyRuleList:
-        return PolicyRuleList(policyRules=policyrule_list_objs(self.db_engine))
+        return policyrule_list_objs(self.db_engine)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetPolicyRule(self, request : PolicyRuleId, context: grpc.ServicerContext) -> PolicyRule:
-        return PolicyRule(**policyrule_get(self.db_engine, request))
+        return policyrule_get(self.db_engine, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetPolicyRule(self, request : PolicyRule, context: grpc.ServicerContext) -> PolicyRuleId:
-        policyrule_id,updated = policyrule_set(self.db_engine, request)
-        event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
-        notify_event(self.messagebroker, TOPIC_POLICY, event_type, {'policyrule_id': policyrule_id})
-        return PolicyRuleId(**policyrule_id)
+        return policyrule_set(self.db_engine, self.messagebroker, request)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def RemovePolicyRule(self, request : PolicyRuleId, context: grpc.ServicerContext) -> Empty:
-        policyrule_id,deleted = policyrule_delete(self.db_engine, request)
-        if deleted:
-            event_type = EventTypeEnum.EVENTTYPE_REMOVE
-            notify_event(self.messagebroker, TOPIC_POLICY, event_type, {'policyrule_id': policyrule_id})
-        return Empty()
+        return policyrule_delete(self.db_engine, self.messagebroker, request)
diff --git a/src/context/service/Events.py b/src/context/service/Events.py
deleted file mode 100644
index 5d20f144c93385c769dbd8526cb10b8088eee728..0000000000000000000000000000000000000000
--- a/src/context/service/Events.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# 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
-#
-#      http://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.
-
-import json, time
-from typing import Dict
-from common.message_broker.Message import Message
-from common.message_broker.MessageBroker import MessageBroker
-from common.proto.context_pb2 import EventTypeEnum
-
-TOPIC_CONNECTION = 'connection'
-TOPIC_CONTEXT    = 'context'
-TOPIC_DEVICE     = 'device'
-TOPIC_LINK       = 'link'
-TOPIC_POLICY     = 'policy'
-TOPIC_SERVICE    = 'service'
-TOPIC_SLICE      = 'slice'
-TOPIC_TOPOLOGY   = 'topology'
-
-TOPICS = {
-    TOPIC_CONNECTION, TOPIC_CONTEXT, TOPIC_DEVICE, TOPIC_LINK, TOPIC_POLICY, TOPIC_SERVICE, TOPIC_SLICE, TOPIC_TOPOLOGY
-}
-
-CONSUME_TIMEOUT = 0.5 # seconds
-
-def notify_event(
-    messagebroker : MessageBroker, topic_name : str, event_type : EventTypeEnum, fields : Dict[str, str]
-) -> None:
-    event = {'event': {'timestamp': {'timestamp': time.time()}, 'event_type': event_type}}
-    for field_name, field_value in fields.items():
-        event[field_name] = field_value
-    messagebroker.publish(Message(topic_name, json.dumps(event)))
diff --git a/src/context/service/database/Connection.py b/src/context/service/database/Connection.py
index 80d3b3a6d437986741ee5308205d8a902e897c40..0a659f662c5ca4116211b7939afc3f5fe39b835c 100644
--- a/src/context/service/database/Connection.py
+++ b/src/context/service/database/Connection.py
@@ -19,7 +19,9 @@ from sqlalchemy.exc import IntegrityError
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Tuple
-from common.proto.context_pb2 import Connection, ConnectionId, ServiceId
+from common.proto.context_pb2 import (
+    Connection, ConnectionId, ConnectionIdList, ConnectionList, Empty, EventTypeEnum, ServiceId)
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import NotFoundException
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Connection import json_connection_id
@@ -27,17 +29,19 @@ from .models.ConnectionModel import ConnectionEndPointModel, ConnectionModel, Co
 from .uuids.Connection import connection_get_uuid
 from .uuids.EndPoint import endpoint_get_uuid
 from .uuids.Service import service_get_uuid
+from .Events import notify_event_connection
 
 LOGGER = logging.getLogger(__name__)
 
-def connection_list_ids(db_engine : Engine, request : ServiceId) -> List[Dict]:
+def connection_list_ids(db_engine : Engine, request : ServiceId) -> ConnectionIdList:
     _,service_uuid = service_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[ConnectionModel] = session.query(ConnectionModel).filter_by(service_uuid=service_uuid).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    connection_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ConnectionIdList(connection_ids=connection_ids)
 
-def connection_list_objs(db_engine : Engine, request : ServiceId) -> List[Dict]:
+def connection_list_objs(db_engine : Engine, request : ServiceId) -> ConnectionList:
     _,service_uuid = service_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[ConnectionModel] = session.query(ConnectionModel)\
@@ -46,9 +50,10 @@ def connection_list_objs(db_engine : Engine, request : ServiceId) -> List[Dict]:
             .options(selectinload(ConnectionModel.connection_subservices))\
             .filter_by(service_uuid=service_uuid).all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    connections = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ConnectionList(connections=connections)
 
-def connection_get(db_engine : Engine, request : ConnectionId) -> Dict:
+def connection_get(db_engine : Engine, request : ConnectionId) -> Connection:
     connection_uuid = connection_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[ConnectionModel] = session.query(ConnectionModel)\
@@ -62,9 +67,9 @@ def connection_get(db_engine : Engine, request : ConnectionId) -> Dict:
         raise NotFoundException('Connection', request.connection_uuid.uuid, extra_details=[
             'connection_uuid generated was: {:s}'.format(connection_uuid),
         ])
-    return obj
+    return Connection(**obj)
 
-def connection_set(db_engine : Engine, request : Connection) -> Tuple[Dict, bool]:
+def connection_set(db_engine : Engine, messagebroker : MessageBroker, request : Connection) -> ConnectionId:
     connection_uuid = connection_get_uuid(request.connection_id, allow_random=True)
     _,service_uuid = service_get_uuid(request.service_id, allow_random=False)
     settings = grpc_message_to_json_string(request.settings),
@@ -143,12 +148,18 @@ def connection_set(db_engine : Engine, request : Connection) -> Tuple[Dict, bool
         return updated
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_connection_id(connection_uuid),updated
+    connection_id = json_connection_id(connection_uuid)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_connection(messagebroker, event_type, connection_id)
+    return ConnectionId(**connection_id)
 
-def connection_delete(db_engine : Engine, request : ConnectionId) -> Tuple[Dict, bool]:
+def connection_delete(db_engine : Engine, messagebroker : MessageBroker, request : ConnectionId) -> Tuple[Dict, bool]:
     connection_uuid = connection_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
         num_deleted = session.query(ConnectionModel).filter_by(connection_uuid=connection_uuid).delete()
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_connection_id(connection_uuid),deleted
+    connection_id = json_connection_id(connection_uuid)
+    if deleted:
+        notify_event_connection(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, connection_id)
+    return Empty()
diff --git a/src/context/service/database/Constraint.py b/src/context/service/database/Constraint.py
index b33316539e7ab728194bda52e80cbc4896981ca2..79970eacde5f6a08a22287cc72f1d75a954f969c 100644
--- a/src/context/service/database/Constraint.py
+++ b/src/context/service/database/Constraint.py
@@ -12,15 +12,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import datetime, logging
+import datetime, json, logging
 from sqlalchemy import delete
 #from sqlalchemy.dialects import postgresql
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.orm import Session
-from typing import Dict, List, Optional
+from typing import Dict, List, Optional, Set
 from common.proto.context_pb2 import Constraint
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from .models.ConstraintModel import ConstraintKindEnum, ServiceConstraintModel, SliceConstraintModel
+from .models.enums.ConstraintAction import ORM_ConstraintActionEnum, grpc_to_enum__constraint_action
 from .uuids._Builder import get_uuid_from_string
 from .uuids.EndPoint import endpoint_get_uuid
 
@@ -37,6 +38,7 @@ def compose_constraints_data(
         dict_constraint = {
             'position'  : position,
             'kind'      : kind,
+            'action'    : grpc_to_enum__constraint_action(constraint.action),
             'data'      : grpc_message_to_json_string(getattr(constraint, str_kind, {})),
             'created_at': now,
             'updated_at': now,
@@ -50,7 +52,8 @@ def compose_constraints_data(
             dict_constraint['slice_uuid'] = slice_uuid
             parent_kind,parent_uuid = 'slice',slice_uuid
         else:
-            MSG = 'Parent for Constraint({:s}) cannot be identified (service_uuid={:s}, slice_uuid={:s})'
+            MSG = 'Parent for Constraint({:s}) cannot be identified '+\
+                  '(service_uuid={:s}, slice_uuid={:s})'
             str_constraint = grpc_message_to_json_string(constraint)
             raise Exception(MSG.format(str_constraint, str(service_uuid), str(slice_uuid)))
 
@@ -70,7 +73,8 @@ def compose_constraints_data(
         }:
             constraint_name = '{:s}:{:s}:'.format(parent_kind, kind.value)
         else:
-            MSG = 'Name for Constraint({:s}) cannot be inferred (service_uuid={:s}, slice_uuid={:s})'
+            MSG = 'Name for Constraint({:s}) cannot be inferred '+\
+                  '(service_uuid={:s}, slice_uuid={:s})'
             str_constraint = grpc_message_to_json_string(constraint)
             raise Exception(MSG.format(str_constraint, str(service_uuid), str(slice_uuid)))
 
@@ -91,27 +95,34 @@ def upsert_constraints(
     else:
         MSG = 'DataModel cannot be identified (service_uuid={:s}, slice_uuid={:s})'
         raise Exception(MSG.format(str(service_uuid), str(slice_uuid)))
-
+    uuids_to_delete : Set[str] = set()
     uuids_to_upsert : Dict[str, int] = dict()
     rules_to_upsert : List[Dict] = list()
     for constraint in constraints:
         constraint_uuid = constraint['constraint_uuid']
-        position = uuids_to_upsert.get(constraint_uuid)
-        if position is None:
-            # if not added, add it
-            rules_to_upsert.append(constraint)
-            uuids_to_upsert[constraint_uuid] = len(rules_to_upsert) - 1
+        constraint_action = constraint['action']
+        if is_delete or constraint_action == ORM_ConstraintActionEnum.DELETE:
+            uuids_to_delete.add(constraint_uuid)
+        elif constraint_action == ORM_ConstraintActionEnum.SET:
+            position = uuids_to_upsert.get(constraint_uuid)
+            if position is None:
+                # if not added, add it
+                rules_to_upsert.append(constraint)
+                uuids_to_upsert[constraint_uuid] = len(rules_to_upsert) - 1
+            else:
+                # if already added, update occurrence
+                rules_to_upsert[position] = constraint
         else:
-            # if already added, update occurrence
-            rules_to_upsert[position] = constraint
+            MSG = 'Action for ConstraintRule({:s}) is not supported (service_uuid={:s}, slice_uuid={:s})'
+            LOGGER.warning(MSG.format(str(constraint), str(service_uuid), str(slice_uuid)))
+            # raise Exception(MSG.format(str_constraint, str(service_uuid), str(slice_uuid)))
 
-    # Delete all constraints not in uuids_to_upsert
     delete_affected = False
-    if len(uuids_to_upsert) > 0:
+    if len(uuids_to_delete) > 0:
         stmt = delete(klass)
         if service_uuid is not None: stmt = stmt.where(klass.service_uuid == service_uuid)
         if slice_uuid   is not None: stmt = stmt.where(klass.slice_uuid   == slice_uuid  )
-        stmt = stmt.where(klass.constraint_uuid.not_in(set(uuids_to_upsert.keys())))
+        stmt = stmt.where(klass.constraint_uuid.in_(uuids_to_delete))
         #str_stmt = stmt.compile(dialect=postgresql.dialect(), compile_kwargs={"literal_binds": True})
         #LOGGER.warning('delete stmt={:s}'.format(str(str_stmt)))
         constraint_deletes = session.execute(stmt)
@@ -125,6 +136,7 @@ def upsert_constraints(
             index_elements=[klass.constraint_uuid],
             set_=dict(
                 position   = stmt.excluded.position,
+                action     = stmt.excluded.action,
                 data       = stmt.excluded.data,
                 updated_at = stmt.excluded.updated_at,
             )
diff --git a/src/context/service/database/Context.py b/src/context/service/database/Context.py
index 4654095034749e1de985705b242ba9fa05a82f6a..403dcd2320d0ce925a95e92331a634785cfa2289 100644
--- a/src/context/service/database/Context.py
+++ b/src/context/service/database/Context.py
@@ -17,22 +17,25 @@ from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
-from typing import Dict, List, Optional, Tuple
-from common.proto.context_pb2 import Context, ContextId
+from typing import Dict, List, Optional
+from common.proto.context_pb2 import Context, ContextId, ContextIdList, ContextList, Empty, EventTypeEnum
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import NotFoundException
 from common.tools.object_factory.Context import json_context_id
 from .models.ContextModel import ContextModel
 from .uuids.Context import context_get_uuid
+from .Events import notify_event_context
 
 LOGGER = logging.getLogger(__name__)
 
-def context_list_ids(db_engine : Engine) -> List[Dict]:
+def context_list_ids(db_engine : Engine) -> ContextIdList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[ContextModel] = session.query(ContextModel).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    context_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ContextIdList(context_ids=context_ids)
 
-def context_list_objs(db_engine : Engine) -> List[Dict]:
+def context_list_objs(db_engine : Engine) -> ContextList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[ContextModel] = session.query(ContextModel)\
             .options(selectinload(ContextModel.topologies))\
@@ -40,9 +43,10 @@ def context_list_objs(db_engine : Engine) -> List[Dict]:
             .options(selectinload(ContextModel.slices))\
             .all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    contexts = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ContextList(contexts=contexts)
 
-def context_get(db_engine : Engine, request : ContextId) -> Dict:
+def context_get(db_engine : Engine, request : ContextId) -> Context:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[ContextModel] = session.query(ContextModel)\
@@ -57,9 +61,9 @@ def context_get(db_engine : Engine, request : ContextId) -> Dict:
         raise NotFoundException('Context', raw_context_uuid, extra_details=[
             'context_uuid generated was: {:s}'.format(context_uuid)
         ])
-    return obj
+    return Context(**obj)
 
-def context_set(db_engine : Engine, request : Context) -> Tuple[Dict, bool]:
+def context_set(db_engine : Engine, messagebroker : MessageBroker, request : Context) -> ContextId:
     context_name = request.name
     if len(context_name) == 0: context_name = request.context_id.context_uuid.uuid
     context_uuid = context_get_uuid(request.context_id, context_name=context_name, allow_random=True)
@@ -100,12 +104,18 @@ def context_set(db_engine : Engine, request : Context) -> Tuple[Dict, bool]:
         return updated_at > created_at
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_context_id(context_uuid),updated
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    context_id = json_context_id(context_uuid)
+    notify_event_context(messagebroker, event_type, context_id)
+    return ContextId(**context_id)
 
-def context_delete(db_engine : Engine, request : ContextId) -> Tuple[Dict, bool]:
+def context_delete(db_engine : Engine, messagebroker : MessageBroker, request : ContextId) -> Empty:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
         num_deleted = session.query(ContextModel).filter_by(context_uuid=context_uuid).delete()
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_context_id(context_uuid),deleted
+    context_id = json_context_id(context_uuid)
+    if deleted:
+        notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, context_id)
+    return Empty()
diff --git a/src/context/service/database/Device.py b/src/context/service/database/Device.py
index 7fc202b9077f2e1212d0c81313fcfbd1c05efb43..df57791adf7faf04cb24c372d82ce547f35b9c72 100644
--- a/src/context/service/database/Device.py
+++ b/src/context/service/database/Device.py
@@ -19,29 +19,33 @@ from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Set, Tuple
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
-from common.proto.context_pb2 import Device, DeviceFilter, DeviceId, TopologyId
-#from common.tools.grpc.Tools import grpc_message_to_json_string
+from common.message_broker.MessageBroker import MessageBroker
+from common.proto.context_pb2 import (
+    Device, DeviceFilter, DeviceId, DeviceIdList, DeviceList, Empty, EventTypeEnum, TopologyId)
+from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Device import json_device_id
 from context.service.database.uuids.Topology import topology_get_uuid
 from .models.DeviceModel import DeviceModel
 from .models.EndPointModel import EndPointModel
-from .models.TopologyModel import TopologyDeviceModel
+from .models.TopologyModel import TopologyDeviceModel, TopologyModel
 from .models.enums.DeviceDriver import grpc_to_enum__device_driver
 from .models.enums.DeviceOperationalStatus import grpc_to_enum__device_operational_status
 from .models.enums.KpiSampleType import grpc_to_enum__kpi_sample_type
 from .uuids.Device import device_get_uuid
 from .uuids.EndPoint import endpoint_get_uuid
 from .ConfigRule import compose_config_rules_data, upsert_config_rules
+from .Events import notify_event_context, notify_event_device, notify_event_topology
 
 LOGGER = logging.getLogger(__name__)
 
-def device_list_ids(db_engine : Engine) -> List[Dict]:
+def device_list_ids(db_engine : Engine) -> DeviceIdList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[DeviceModel] = session.query(DeviceModel).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    device_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return DeviceIdList(device_ids=device_ids)
 
-def device_list_objs(db_engine : Engine) -> List[Dict]:
+def device_list_objs(db_engine : Engine) -> DeviceList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[DeviceModel] = session.query(DeviceModel)\
             .options(selectinload(DeviceModel.endpoints))\
@@ -49,9 +53,10 @@ def device_list_objs(db_engine : Engine) -> List[Dict]:
             .all()
             #.options(selectinload(DeviceModel.components))\
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    devices = run_transaction(sessionmaker(bind=db_engine), callback)
+    return DeviceList(devices=devices)
 
-def device_get(db_engine : Engine, request : DeviceId) -> Dict:
+def device_get(db_engine : Engine, request : DeviceId) -> Device:
     device_uuid = device_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[DeviceModel] = session.query(DeviceModel)\
@@ -66,9 +71,9 @@ def device_get(db_engine : Engine, request : DeviceId) -> Dict:
         raise NotFoundException('Device', raw_device_uuid, extra_details=[
             'device_uuid generated was: {:s}'.format(device_uuid)
         ])
-    return obj
+    return Device(**obj)
 
-def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]:
+def device_set(db_engine : Engine, messagebroker : MessageBroker, request : Device) -> DeviceId:
     raw_device_uuid = request.device_id.device_uuid.uuid
     raw_device_name = request.name
     device_name = raw_device_uuid if len(raw_device_name) == 0 else raw_device_name
@@ -115,14 +120,15 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]:
         kpi_sample_types = [grpc_to_enum__kpi_sample_type(kst) for kst in endpoint.kpi_sample_types]
 
         endpoints_data.append({
-            'endpoint_uuid'   : endpoint_uuid,
-            'device_uuid'     : endpoint_device_uuid,
-            'topology_uuid'   : endpoint_topology_uuid,
-            'name'            : endpoint_name,
-            'endpoint_type'   : endpoint.endpoint_type,
-            'kpi_sample_types': kpi_sample_types,
-            'created_at'      : now,
-            'updated_at'      : now,
+            'endpoint_uuid'    : endpoint_uuid,
+            'device_uuid'      : endpoint_device_uuid,
+            'topology_uuid'    : endpoint_topology_uuid,
+            'name'             : endpoint_name,
+            'endpoint_type'    : endpoint.endpoint_type,
+            'kpi_sample_types' : kpi_sample_types,
+            'endpoint_location': grpc_message_to_json_string(endpoint.endpoint_location),
+            'created_at'       : now,
+            'updated_at'       : now,
         })
 
         if endpoint_topology_uuid not in topology_uuids:
@@ -147,7 +153,7 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]:
     if controller_uuid is not None:
         device_data[0]['controller_uuid'] = controller_uuid
 
-    def callback(session : Session) -> bool:
+    def callback(session : Session) -> Tuple[bool, List[Dict]]:
         stmt = insert(DeviceModel).values(device_data)
         stmt = stmt.on_conflict_do_update(
             index_elements=[DeviceModel.device_uuid],
@@ -179,29 +185,85 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]:
             endpoint_updates = session.execute(stmt).fetchall()
             updated_endpoints = any([(updated_at > created_at) for created_at,updated_at in endpoint_updates])
 
+        device_topology_ids = []
         if not updated or len(related_topologies) > 1:
             # Only update topology-device relations when device is created (not updated) or when endpoints are
             # modified (len(related_topologies) > 1).
-            session.execute(insert(TopologyDeviceModel).values(related_topologies).on_conflict_do_nothing(
+            stmt = insert(TopologyDeviceModel).values(related_topologies)
+            stmt = stmt.on_conflict_do_nothing(
                 index_elements=[TopologyDeviceModel.topology_uuid, TopologyDeviceModel.device_uuid]
-            ))
+            )
+            stmt = stmt.returning(TopologyDeviceModel.topology_uuid)
+            topology_uuids = session.execute(stmt).fetchall()
+
+            LOGGER.warning('RAW topology_uuids={:s}'.format(str(topology_uuids)))
+            if len(topology_uuids) > 0:
+                topology_uuids = [topology_uuid[0] for topology_uuid in topology_uuids]
+                LOGGER.warning('NEW topology_uuids={:s}'.format(str(topology_uuids)))
+                query = session.query(TopologyModel)
+                query = query.filter(TopologyModel.topology_uuid.in_(topology_uuids))
+                device_topologies : List[TopologyModel] = query.all()
+                device_topology_ids = [obj.dump_id() for obj in device_topologies]
+                LOGGER.warning('device_topology_ids={:s}'.format(str(device_topology_ids)))
 
         changed_config_rules = upsert_config_rules(session, config_rules, device_uuid=device_uuid)
 
-        return updated or updated_endpoints or changed_config_rules
+        return updated or updated_endpoints or changed_config_rules, device_topology_ids
+
+    updated, device_topology_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    device_id = json_device_id(device_uuid)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_device(messagebroker, event_type, device_id)
+
+    context_ids  : Dict[str, Dict] = dict()
+    topology_ids : Dict[str, Dict] = dict()
+    for topology_id in device_topology_ids:
+        topology_uuid = topology_id['topology_uuid']['uuid']
+        topology_ids[topology_uuid] = topology_id
+        context_id = topology_id['context_id']
+        context_uuid = context_id['context_uuid']['uuid']
+        context_ids[context_uuid] = context_id
+
+    for topology_id in topology_ids.values():
+        notify_event_topology(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, topology_id)
 
-    updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_device_id(device_uuid),updated
+    for context_id in context_ids.values():
+        notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
 
-def device_delete(db_engine : Engine, request : DeviceId) -> Tuple[Dict, bool]:
+    return DeviceId(**device_id)
+
+def device_delete(db_engine : Engine, messagebroker : MessageBroker, request : DeviceId) -> Empty:
     device_uuid = device_get_uuid(request, allow_random=False)
-    def callback(session : Session) -> bool:
+    def callback(session : Session) -> Tuple[bool, List[Dict]]:
+        query = session.query(TopologyDeviceModel)
+        query = query.filter_by(device_uuid=device_uuid)
+        topology_device_list : List[TopologyDeviceModel] = query.all()
+        topology_ids = [obj.topology.dump_id() for obj in topology_device_list]
         num_deleted = session.query(DeviceModel).filter_by(device_uuid=device_uuid).delete()
-        return num_deleted > 0
-    deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_device_id(device_uuid),deleted
+        return num_deleted > 0, topology_ids
+    deleted, updated_topology_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    device_id = json_device_id(device_uuid)
+    if deleted:
+        notify_event_device(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, device_id)
+
+        context_ids  : Dict[str, Dict] = dict()
+        topology_ids : Dict[str, Dict] = dict()
+        for topology_id in updated_topology_ids:
+            topology_uuid = topology_id['topology_uuid']['uuid']
+            topology_ids[topology_uuid] = topology_id
+            context_id = topology_id['context_id']
+            context_uuid = context_id['context_uuid']['uuid']
+            context_ids[context_uuid] = context_id
+
+        for topology_id in topology_ids.values():
+            notify_event_topology(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, topology_id)
+
+        for context_id in context_ids.values():
+            notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+
+    return Empty()
 
-def device_select(db_engine : Engine, request : DeviceFilter) -> List[Dict]:
+def device_select(db_engine : Engine, request : DeviceFilter) -> DeviceList:
     device_uuids = [
         device_get_uuid(device_id, allow_random=False)
         for device_id in request.device_ids.device_ids
@@ -218,4 +280,5 @@ def device_select(db_engine : Engine, request : DeviceFilter) -> List[Dict]:
         #if request.include_components  : query = query.options(selectinload(DeviceModel.components))
         obj_list : List[DeviceModel] = query.filter(DeviceModel.device_uuid.in_(device_uuids)).all()
         return [obj.dump(**dump_params) for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    devices = run_transaction(sessionmaker(bind=db_engine), callback)
+    return DeviceList(devices=devices)
\ No newline at end of file
diff --git a/src/context/service/database/EndPoint.py b/src/context/service/database/EndPoint.py
index b0df3bb8101a7b64a148e916178b1c9a77d511af..d7445b951dbd2d846900c21799e2fc03164ae6c5 100644
--- a/src/context/service/database/EndPoint.py
+++ b/src/context/service/database/EndPoint.py
@@ -17,13 +17,13 @@ from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List
-from common.proto.context_pb2 import EndPointIdList
+from common.proto.context_pb2 import EndPointIdList, EndPointNameList
 from .models.EndPointModel import EndPointModel
 from .uuids.EndPoint import endpoint_get_uuid
 
 LOGGER = logging.getLogger(__name__)
 
-def endpoint_list_names(db_engine : Engine, request : EndPointIdList) -> List[Dict]:
+def endpoint_list_names(db_engine : Engine, request : EndPointIdList) -> EndPointNameList:
     endpoint_uuids = {
         endpoint_get_uuid(endpoint_id, allow_random=False)[-1]
         for endpoint_id in request.endpoint_ids
@@ -33,4 +33,5 @@ def endpoint_list_names(db_engine : Engine, request : EndPointIdList) -> List[Di
             .options(selectinload(EndPointModel.device))\
             .filter(EndPointModel.endpoint_uuid.in_(endpoint_uuids)).all()
         return [obj.dump_name() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    endpoint_names = run_transaction(sessionmaker(bind=db_engine), callback)
+    return EndPointNameList(endpoint_names=endpoint_names)
diff --git a/src/context/service/database/Events.py b/src/context/service/database/Events.py
new file mode 100644
index 0000000000000000000000000000000000000000..36774a5170ba20914555b0adc47a5c2faa592799
--- /dev/null
+++ b/src/context/service/database/Events.py
@@ -0,0 +1,89 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import enum, json, logging, time
+from typing import Dict, Iterator, Set
+from common.message_broker.Message import Message
+from common.message_broker.MessageBroker import MessageBroker
+from common.proto.context_pb2 import (
+    ConnectionEvent, ContextEvent, DeviceEvent, EventTypeEnum, LinkEvent, ServiceEvent, SliceEvent, TopologyEvent)
+
+class EventTopicEnum(enum.Enum):
+    CONNECTION  = 'connection'
+    CONTEXT     = 'context'
+    DEVICE      = 'device'
+    LINK        = 'link'
+    POLICY_RULE = 'policy-rule'
+    SERVICE     = 'service'
+    SLICE       = 'slice'
+    TOPOLOGY    = 'topology'
+
+TOPIC_TO_EVENTCLASS = {
+    EventTopicEnum.CONNECTION.value  : ConnectionEvent,
+    EventTopicEnum.CONTEXT.value     : ContextEvent,
+    EventTopicEnum.DEVICE.value      : DeviceEvent,
+    EventTopicEnum.LINK.value        : LinkEvent,
+    #EventTopicEnum.POLICY_RULE.value : PolicyRuleEvent,  # Not defined in proto files
+    EventTopicEnum.SERVICE.value     : ServiceEvent,
+    EventTopicEnum.SLICE.value       : SliceEvent,
+    EventTopicEnum.TOPOLOGY.value    : TopologyEvent,
+}
+
+CONSUME_TIMEOUT = 0.5 # seconds
+
+LOGGER = logging.getLogger(__name__)
+
+def notify_event(
+    messagebroker : MessageBroker, topic_enum : EventTopicEnum, event_type : EventTypeEnum, fields : Dict[str, str]
+) -> None:
+    event = {'event': {'timestamp': {'timestamp': time.time()}, 'event_type': event_type}}
+    for field_name, field_value in fields.items():
+        event[field_name] = field_value
+    messagebroker.publish(Message(topic_enum.value, json.dumps(event)))
+
+def notify_event_context(messagebroker : MessageBroker, event_type : EventTypeEnum, context_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.CONTEXT, event_type, {'context_id': context_id})
+
+def notify_event_topology(messagebroker : MessageBroker, event_type : EventTypeEnum, topology_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.TOPOLOGY, event_type, {'topology_id': topology_id})
+
+def notify_event_device(messagebroker : MessageBroker, event_type : EventTypeEnum, device_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.DEVICE, event_type, {'device_id': device_id})
+
+def notify_event_link(messagebroker : MessageBroker, event_type : EventTypeEnum, link_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.LINK, event_type, {'link_id': link_id})
+
+def notify_event_service(messagebroker : MessageBroker, event_type : EventTypeEnum, service_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.SERVICE, event_type, {'service_id': service_id})
+
+def notify_event_slice(messagebroker : MessageBroker, event_type : EventTypeEnum, slice_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.SLICE, event_type, {'slice_id': slice_id})
+
+def notify_event_connection(messagebroker : MessageBroker, event_type : EventTypeEnum, connection_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.CONNECTION, event_type, {'connection_id': connection_id})
+
+def notify_event_policy_rule(messagebroker : MessageBroker, event_type : EventTypeEnum, policyrule_id : Dict) -> None:
+    notify_event(messagebroker, EventTopicEnum.POLICY_RULE, event_type, {'policyrule_id': policyrule_id})
+
+def consume_events(
+    messagebroker : MessageBroker, topic_enums : Set[EventTopicEnum], consume_timeout : float = CONSUME_TIMEOUT
+) -> Iterator:
+    topic_names = [topic_enum.value for topic_enum in topic_enums]
+    for message in messagebroker.consume(topic_names, consume_timeout=consume_timeout):
+        event_class = TOPIC_TO_EVENTCLASS.get(message.topic)
+        if event_class is None:
+            MSG = 'No EventClass defined for Topic({:s}). Ignoring...'
+            LOGGER.warning(MSG.format(str(message.topic)))
+            continue
+        yield event_class(**json.loads(message.content))
diff --git a/src/context/service/database/Link.py b/src/context/service/database/Link.py
index 76db07a9e30b4f62c4b51574ad95c222a1490f79..67ac9f518f610caedc631444187cac10aded56c7 100644
--- a/src/context/service/database/Link.py
+++ b/src/context/service/database/Link.py
@@ -18,32 +18,36 @@ from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Set, Tuple
-from common.proto.context_pb2 import Link, LinkId, TopologyId
+from common.proto.context_pb2 import Empty, EventTypeEnum, Link, LinkId, LinkIdList, LinkList, TopologyId
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import NotFoundException
 from common.tools.object_factory.Link import json_link_id
 from context.service.database.uuids.Topology import topology_get_uuid
 from .models.LinkModel import LinkModel, LinkEndPointModel
-from .models.TopologyModel import TopologyLinkModel
+from .models.TopologyModel import TopologyLinkModel, TopologyModel
 from .uuids.EndPoint import endpoint_get_uuid
 from .uuids.Link import link_get_uuid
+from .Events import notify_event_context, notify_event_link, notify_event_topology
 
 LOGGER = logging.getLogger(__name__)
 
-def link_list_ids(db_engine : Engine) -> List[Dict]:
+def link_list_ids(db_engine : Engine) -> LinkIdList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[LinkModel] = session.query(LinkModel).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    link_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return LinkIdList(link_ids=link_ids)
 
-def link_list_objs(db_engine : Engine) -> List[Dict]:
+def link_list_objs(db_engine : Engine) -> LinkList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[LinkModel] = session.query(LinkModel)\
             .options(selectinload(LinkModel.link_endpoints))\
             .all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    links = run_transaction(sessionmaker(bind=db_engine), callback)
+    return LinkList(links=links)
 
-def link_get(db_engine : Engine, request : LinkId) -> Dict:
+def link_get(db_engine : Engine, request : LinkId) -> Link:
     link_uuid = link_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[LinkModel] = session.query(LinkModel)\
@@ -56,9 +60,9 @@ def link_get(db_engine : Engine, request : LinkId) -> Dict:
         raise NotFoundException('Link', raw_link_uuid, extra_details=[
             'link_uuid generated was: {:s}'.format(link_uuid)
         ])
-    return obj
+    return Link(**obj)
 
-def link_set(db_engine : Engine, request : Link) -> Tuple[Dict, bool]:
+def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link) -> LinkId:
     raw_link_uuid = request.link_id.link_uuid.uuid
     raw_link_name = request.name
     link_name = raw_link_uuid if len(raw_link_name) == 0 else raw_link_name
@@ -102,7 +106,7 @@ def link_set(db_engine : Engine, request : Link) -> Tuple[Dict, bool]:
         'updated_at': now,
     }]
 
-    def callback(session : Session) -> bool:
+    def callback(session : Session) -> Tuple[bool, List[Dict]]:
         stmt = insert(LinkModel).values(link_data)
         stmt = stmt.on_conflict_do_update(
             index_elements=[LinkModel.link_uuid],
@@ -115,28 +119,88 @@ def link_set(db_engine : Engine, request : Link) -> Tuple[Dict, bool]:
         created_at,updated_at = session.execute(stmt).fetchone()
         updated = updated_at > created_at
 
+        updated_endpoints = False
         if len(link_endpoints_data) > 0:
             # TODO: manage add/remove of endpoints; manage changes in relations with topology
             stmt = insert(LinkEndPointModel).values(link_endpoints_data)
             stmt = stmt.on_conflict_do_nothing(
                 index_elements=[LinkEndPointModel.link_uuid, LinkEndPointModel.endpoint_uuid]
             )
-            session.execute(stmt)
-
-        if len(related_topologies) > 0:
-            session.execute(insert(TopologyLinkModel).values(related_topologies).on_conflict_do_nothing(
+            link_endpoint_inserts = session.execute(stmt)
+            updated_endpoints = int(link_endpoint_inserts.rowcount) > 0
+
+        link_topology_ids = []
+        if not updated or len(related_topologies) > 1:
+            # Only update topology-link relations when link is created (not updated) or when endpoint_ids are
+            # modified (len(related_topologies) > 1).
+            stmt = insert(TopologyLinkModel).values(related_topologies)
+            stmt = stmt.on_conflict_do_nothing(
                 index_elements=[TopologyLinkModel.topology_uuid, TopologyLinkModel.link_uuid]
-            ))
-
-        return updated
-
-    updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_link_id(link_uuid),updated
-
-def link_delete(db_engine : Engine, request : LinkId) -> Tuple[Dict, bool]:
+            )
+            stmt = stmt.returning(TopologyLinkModel.topology_uuid)
+            topology_uuids = session.execute(stmt).fetchall()
+
+            LOGGER.warning('RAW topology_uuids={:s}'.format(str(topology_uuids)))
+            if len(topology_uuids) > 0:
+                topology_uuids = [topology_uuid[0] for topology_uuid in topology_uuids]
+                LOGGER.warning('NEW topology_uuids={:s}'.format(str(topology_uuids)))
+                query = session.query(TopologyModel)
+                query = query.filter(TopologyModel.topology_uuid.in_(topology_uuids))
+                link_topologies : List[TopologyModel] = query.all()
+                link_topology_ids = [obj.dump_id() for obj in link_topologies]
+                LOGGER.warning('link_topology_ids={:s}'.format(str(link_topology_ids)))
+
+        return updated or updated_endpoints, link_topology_ids
+
+    updated, link_topology_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    link_id = json_link_id(link_uuid)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_link(messagebroker, event_type, link_id)
+
+    context_ids  : Dict[str, Dict] = dict()
+    topology_ids : Dict[str, Dict] = dict()
+    for topology_id in link_topology_ids:
+        topology_uuid = topology_id['topology_uuid']['uuid']
+        topology_ids[topology_uuid] = topology_id
+        context_id = topology_id['context_id']
+        context_uuid = context_id['context_uuid']['uuid']
+        context_ids[context_uuid] = context_id
+
+    for topology_id in topology_ids.values():
+        notify_event_topology(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, topology_id)
+
+    for context_id in context_ids.values():
+        notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+
+    return LinkId(**link_id)
+
+def link_delete(db_engine : Engine, messagebroker : MessageBroker, request : LinkId) -> Empty:
     link_uuid = link_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
+        query = session.query(TopologyLinkModel)
+        query = query.filter_by(link_uuid=link_uuid)
+        topology_link_list : List[TopologyLinkModel] = query.all()
+        topology_ids = [obj.topology.dump_id() for obj in topology_link_list]
         num_deleted = session.query(LinkModel).filter_by(link_uuid=link_uuid).delete()
-        return num_deleted > 0
-    deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_link_id(link_uuid),deleted
+        return num_deleted > 0, topology_ids
+    deleted, updated_topology_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    link_id = json_link_id(link_uuid)
+    if deleted:
+        notify_event_link(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, link_id)
+
+        context_ids  : Dict[str, Dict] = dict()
+        topology_ids : Dict[str, Dict] = dict()
+        for topology_id in updated_topology_ids:
+            topology_uuid = topology_id['topology_uuid']['uuid']
+            topology_ids[topology_uuid] = topology_id
+            context_id = topology_id['context_id']
+            context_uuid = context_id['context_uuid']['uuid']
+            context_ids[context_uuid] = context_id
+
+        for topology_id in topology_ids.values():
+            notify_event_topology(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, topology_id)
+
+        for context_id in context_ids.values():
+            notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+
+    return Empty()
diff --git a/src/context/service/database/PolicyRule.py b/src/context/service/database/PolicyRule.py
index 13f0a2698c17874e1e15f4d6a1d527d366141f56..3db0696a49cd851608d34797ce138ea0e63a1c51 100644
--- a/src/context/service/database/PolicyRule.py
+++ b/src/context/service/database/PolicyRule.py
@@ -12,13 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import datetime, json
+import datetime, json, logging
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
-from typing import Dict, List, Optional, Set, Tuple
+from typing import Dict, List, Optional, Set
+from common.proto.context_pb2 import Empty, EventTypeEnum
 from common.proto.policy_pb2 import PolicyRule, PolicyRuleId, PolicyRuleIdList, PolicyRuleList
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import NotFoundException
 from common.tools.grpc.Tools import grpc_message_to_json
 from common.tools.object_factory.PolicyRule import json_policyrule_id
@@ -27,21 +29,26 @@ from .models.enums.PolicyRuleState import grpc_to_enum__policyrule_state
 from .models.PolicyRuleModel import PolicyRuleDeviceModel, PolicyRuleKindEnum, PolicyRuleModel
 from .uuids.PolicuRule import policyrule_get_uuid
 from .uuids.Service import service_get_uuid
+from .Events import notify_event_policy_rule
 
-def policyrule_list_ids(db_engine : Engine) -> List[Dict]:
+LOGGER = logging.getLogger(__name__)
+
+def policyrule_list_ids(db_engine : Engine) -> PolicyRuleIdList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[PolicyRuleModel] = session.query(PolicyRuleModel).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    policy_rule_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return PolicyRuleIdList(policyRuleIdList=policy_rule_ids)
 
-def policyrule_list_objs(db_engine : Engine) -> List[Dict]:
+def policyrule_list_objs(db_engine : Engine) -> PolicyRuleList:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[PolicyRuleModel] = session.query(PolicyRuleModel)\
             .options(selectinload(PolicyRuleModel.policyrule_service))\
             .options(selectinload(PolicyRuleModel.policyrule_devices))\
             .all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    policy_rules = run_transaction(sessionmaker(bind=db_engine), callback)
+    return PolicyRuleList(policyRules=policy_rules)
 
 def policyrule_get(db_engine : Engine, request : PolicyRuleId) -> PolicyRule:
     policyrule_uuid = policyrule_get_uuid(request, allow_random=False)
@@ -57,9 +64,9 @@ def policyrule_get(db_engine : Engine, request : PolicyRuleId) -> PolicyRule:
         raise NotFoundException('PolicyRule', raw_policyrule_uuid, extra_details=[
             'policyrule_uuid generated was: {:s}'.format(policyrule_uuid)
         ])
-    return obj
+    return PolicyRule(**obj)
 
-def policyrule_set(db_engine : Engine, request : PolicyRule) -> Tuple[PolicyRuleId, bool]:
+def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request : PolicyRule) -> PolicyRuleId:
     policyrule_kind = request.WhichOneof('policy_rule')
     policyrule_spec = getattr(request, policyrule_kind)
     policyrule_basic = policyrule_spec.policyRuleBasic
@@ -130,12 +137,18 @@ def policyrule_set(db_engine : Engine, request : PolicyRule) -> Tuple[PolicyRule
         return updated
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_policyrule_id(policyrule_uuid),updated
+    policyrule_id = json_policyrule_id(policyrule_uuid)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_policy_rule(messagebroker, event_type, policyrule_id)
+    return PolicyRuleId(**policyrule_id)
 
-def policyrule_delete(db_engine : Engine, request : PolicyRuleId) -> Tuple[Dict, bool]:
+def policyrule_delete(db_engine : Engine, messagebroker : MessageBroker, request : PolicyRuleId) -> Empty:
     policyrule_uuid = policyrule_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
         num_deleted = session.query(PolicyRuleModel).filter_by(policyrule_uuid=policyrule_uuid).delete()
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_policyrule_id(policyrule_uuid),deleted
+    policyrule_id = json_policyrule_id(policyrule_uuid)
+    if deleted:
+        notify_event_policy_rule(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, policyrule_id)
+    return Empty()
diff --git a/src/context/service/database/Service.py b/src/context/service/database/Service.py
index b6916dc3a19fef4bde3aff93300e63f360b362c0..fc196ddded291aa82c8f9df932c15611d13121e4 100644
--- a/src/context/service/database/Service.py
+++ b/src/context/service/database/Service.py
@@ -18,8 +18,10 @@ from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
-from typing import Dict, List, Optional, Set, Tuple
-from common.proto.context_pb2 import ContextId, Service, ServiceFilter, ServiceId
+from typing import Dict, List, Optional, Set
+from common.proto.context_pb2 import (
+    ContextId, Empty, EventTypeEnum, Service, ServiceFilter, ServiceId, ServiceIdList, ServiceList)
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Service import json_service_id
@@ -31,17 +33,19 @@ from .models.ServiceModel import ServiceModel, ServiceEndPointModel
 from .uuids.Context import context_get_uuid
 from .uuids.EndPoint import endpoint_get_uuid
 from .uuids.Service import service_get_uuid
+from .Events import notify_event_context, notify_event_service
 
 LOGGER = logging.getLogger(__name__)
 
-def service_list_ids(db_engine : Engine, request : ContextId) -> List[Dict]:
+def service_list_ids(db_engine : Engine, request : ContextId) -> ServiceIdList:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[ServiceModel] = session.query(ServiceModel).filter_by(context_uuid=context_uuid).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    service_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ServiceIdList(service_ids=service_ids)
 
-def service_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
+def service_list_objs(db_engine : Engine, request : ContextId) -> ServiceList:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[ServiceModel] = session.query(ServiceModel)\
@@ -50,9 +54,10 @@ def service_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
             .options(selectinload(ServiceModel.config_rules))\
             .filter_by(context_uuid=context_uuid).all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    services = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ServiceList(services=services)
 
-def service_get(db_engine : Engine, request : ServiceId) -> Dict:
+def service_get(db_engine : Engine, request : ServiceId) -> Service:
     _,service_uuid = service_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[ServiceModel] = session.query(ServiceModel)\
@@ -69,9 +74,9 @@ def service_get(db_engine : Engine, request : ServiceId) -> Dict:
             'context_uuid generated was: {:s}'.format(context_uuid),
             'service_uuid generated was: {:s}'.format(service_uuid),
         ])
-    return obj
+    return Service(**obj)
 
-def service_set(db_engine : Engine, request : Service) -> Tuple[Dict, bool]:
+def service_set(db_engine : Engine, messagebroker : MessageBroker, request : Service) -> ServiceId:
     raw_context_uuid = request.service_id.context_id.context_uuid.uuid
     raw_service_uuid = request.service_id.service_uuid.uuid
     raw_service_name = request.name
@@ -145,9 +150,14 @@ def service_set(db_engine : Engine, request : Service) -> Tuple[Dict, bool]:
         return updated or changed_constraints or changed_config_rules
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_service_id(service_uuid, json_context_id(context_uuid)),updated
-
-def service_unset(db_engine : Engine, request : Service) -> Tuple[Dict, bool]:
+    context_id = json_context_id(context_uuid)
+    service_id = json_service_id(service_uuid, context_id=context_id)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_service(messagebroker, event_type, service_id)
+    notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+    return ServiceId(**service_id)
+
+def service_unset(db_engine : Engine, messagebroker : MessageBroker, request : Service) -> ServiceId:
     raw_context_uuid = request.service_id.context_id.context_uuid.uuid
     raw_service_uuid = request.service_id.service_uuid.uuid
     raw_service_name = request.name
@@ -184,17 +194,25 @@ def service_unset(db_engine : Engine, request : Service) -> Tuple[Dict, bool]:
         return num_deletes > 0 or changed_constraints or changed_config_rules
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_service_id(service_uuid, json_context_id(context_uuid)),updated
+    service_id = json_service_id(service_uuid, json_context_id(context_uuid))
+    if updated:
+        notify_event_service(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, service_id)
+    return ServiceId(**service_id)
 
-def service_delete(db_engine : Engine, request : ServiceId) -> Tuple[Dict, bool]:
+def service_delete(db_engine : Engine, messagebroker : MessageBroker, request : ServiceId) -> Empty:
     context_uuid,service_uuid = service_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
         num_deleted = session.query(ServiceModel).filter_by(service_uuid=service_uuid).delete()
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_service_id(service_uuid, json_context_id(context_uuid)),deleted
-
-def service_select(db_engine : Engine, request : ServiceFilter) -> List[Dict]:
+    context_id = json_context_id(context_uuid)
+    service_id = json_service_id(service_uuid, context_id=context_id)
+    if deleted:
+        notify_event_service(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, service_id)
+        notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+    return Empty()
+
+def service_select(db_engine : Engine, request : ServiceFilter) -> ServiceList:
     service_uuids = [
         service_get_uuid(service_id, allow_random=False)[1]
         for service_id in request.service_ids.service_ids
@@ -211,4 +229,5 @@ def service_select(db_engine : Engine, request : ServiceFilter) -> List[Dict]:
         if request.include_config_rules: query = query.options(selectinload(ServiceModel.config_rules))
         obj_list : List[ServiceModel] = query.filter(ServiceModel.service_uuid.in_(service_uuids)).all()
         return [obj.dump(**dump_params) for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    services = run_transaction(sessionmaker(bind=db_engine), callback)
+    return ServiceList(services=services)
diff --git a/src/context/service/database/Slice.py b/src/context/service/database/Slice.py
index abd140024f2a13289c7af6a3bafe363a8247e053..98a5ef7a8dd5d6f489c11bc2798ea16fc5b9c128 100644
--- a/src/context/service/database/Slice.py
+++ b/src/context/service/database/Slice.py
@@ -18,8 +18,10 @@ from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
-from typing import Dict, List, Optional, Set, Tuple
-from common.proto.context_pb2 import ContextId, Slice, SliceFilter, SliceId
+from typing import Dict, List, Optional, Set
+from common.proto.context_pb2 import (
+    ContextId, Empty, EventTypeEnum, Slice, SliceFilter, SliceId, SliceIdList, SliceList)
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Slice import json_slice_id
@@ -31,17 +33,19 @@ from .uuids.Context import context_get_uuid
 from .uuids.EndPoint import endpoint_get_uuid
 from .uuids.Service import service_get_uuid
 from .uuids.Slice import slice_get_uuid
+from .Events import notify_event_context, notify_event_slice
 
 LOGGER = logging.getLogger(__name__)
 
-def slice_list_ids(db_engine : Engine, request : ContextId) -> List[Dict]:
+def slice_list_ids(db_engine : Engine, request : ContextId) -> SliceIdList:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[SliceModel] = session.query(SliceModel).filter_by(context_uuid=context_uuid).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    slice_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return SliceIdList(slice_ids=slice_ids)
 
-def slice_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
+def slice_list_objs(db_engine : Engine, request : ContextId) -> SliceList:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[SliceModel] = session.query(SliceModel)\
@@ -52,9 +56,10 @@ def slice_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
             .options(selectinload(SliceModel.config_rules))\
             .filter_by(context_uuid=context_uuid).all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    slices = run_transaction(sessionmaker(bind=db_engine), callback)
+    return SliceList(slices=slices)
 
-def slice_get(db_engine : Engine, request : SliceId) -> Dict:
+def slice_get(db_engine : Engine, request : SliceId) -> Slice:
     _,slice_uuid = slice_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[SliceModel] = session.query(SliceModel)\
@@ -73,9 +78,9 @@ def slice_get(db_engine : Engine, request : SliceId) -> Dict:
             'context_uuid generated was: {:s}'.format(context_uuid),
             'slice_uuid generated was: {:s}'.format(slice_uuid),
         ])
-    return obj
+    return Slice(**obj)
 
-def slice_set(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
+def slice_set(db_engine : Engine, messagebroker : MessageBroker, request : Slice) -> SliceId:
     raw_context_uuid = request.slice_id.context_id.context_uuid.uuid
     raw_slice_uuid = request.slice_id.slice_uuid.uuid
     raw_slice_name = request.name
@@ -182,9 +187,14 @@ def slice_set(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
         return updated or changed_constraints or changed_config_rules
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_slice_id(slice_uuid, json_context_id(context_uuid)),updated
-
-def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
+    context_id = json_context_id(context_uuid)
+    slice_id = json_slice_id(slice_uuid, context_id=context_id)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_slice(messagebroker, event_type, slice_id)
+    notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+    return SliceId(**slice_id)
+
+def slice_unset(db_engine : Engine, messagebroker : MessageBroker, request : Slice) -> SliceId:
     raw_context_uuid = request.slice_id.context_id.context_uuid.uuid
     raw_slice_uuid = request.slice_id.slice_uuid.uuid
     raw_slice_name = request.name
@@ -243,17 +253,25 @@ def slice_unset(db_engine : Engine, request : Slice) -> Tuple[Dict, bool]:
         return num_deletes > 0 or changed_constraints or changed_config_rules
 
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_slice_id(slice_uuid, json_context_id(context_uuid)),updated
+    slice_id = json_slice_id(slice_uuid, json_context_id(context_uuid))
+    if updated:
+        notify_event_slice(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, slice_id)
+    return SliceId(**slice_id)
 
-def slice_delete(db_engine : Engine, request : SliceId) -> Tuple[Dict, bool]:
+def slice_delete(db_engine : Engine, messagebroker : MessageBroker, request : SliceId) -> Empty:
     context_uuid,slice_uuid = slice_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
         num_deleted = session.query(SliceModel).filter_by(slice_uuid=slice_uuid).delete()
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_slice_id(slice_uuid, json_context_id(context_uuid)),deleted
-
-def slice_select(db_engine : Engine, request : SliceFilter) -> List[Dict]:
+    context_id = json_context_id(context_uuid)
+    slice_id = json_slice_id(slice_uuid, context_id=context_id)
+    if deleted:
+        notify_event_slice(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, slice_id)
+        notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+    return Empty()
+
+def slice_select(db_engine : Engine, request : SliceFilter) -> SliceList:
     slice_uuids = [
         slice_get_uuid(slice_id, allow_random=False)[1]
         for slice_id in request.slice_ids.slice_ids
@@ -274,4 +292,5 @@ def slice_select(db_engine : Engine, request : SliceFilter) -> List[Dict]:
         if request.include_config_rules: query = query.options(selectinload(SliceModel.config_rules))
         obj_list : List[SliceModel] = query.filter(SliceModel.slice_uuid.in_(slice_uuids)).all()
         return [obj.dump(**dump_params) for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    slices = run_transaction(sessionmaker(bind=db_engine), callback)
+    return SliceList(slices=slices)
diff --git a/src/context/service/database/Topology.py b/src/context/service/database/Topology.py
index 4440299b63f68613854e79998270872389d385cb..1f0fb6c0b3c400d58ea83bc857e97bc50a1324a3 100644
--- a/src/context/service/database/Topology.py
+++ b/src/context/service/database/Topology.py
@@ -17,8 +17,10 @@ from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
 from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
-from typing import Dict, List, Optional, Tuple
-from common.proto.context_pb2 import ContextId, Topology, TopologyId
+from typing import Dict, List, Optional
+from common.proto.context_pb2 import (
+    ContextId, Empty, EventTypeEnum, Topology, TopologyDetails, TopologyId, TopologyIdList, TopologyList)
+from common.message_broker.MessageBroker import MessageBroker
 from common.method_wrappers.ServiceExceptions import NotFoundException
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Topology import json_topology_id
@@ -27,17 +29,19 @@ from .models.LinkModel import LinkModel
 from .models.TopologyModel import TopologyDeviceModel, TopologyLinkModel, TopologyModel
 from .uuids.Context import context_get_uuid
 from .uuids.Topology import topology_get_uuid
+from .Events import notify_event_context, notify_event_topology
 
 LOGGER = logging.getLogger(__name__)
 
-def topology_list_ids(db_engine : Engine, request : ContextId) -> List[Dict]:
+def topology_list_ids(db_engine : Engine, request : ContextId) -> TopologyIdList:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[TopologyModel] = session.query(TopologyModel).filter_by(context_uuid=context_uuid).all()
         return [obj.dump_id() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    topology_ids = run_transaction(sessionmaker(bind=db_engine), callback)
+    return TopologyIdList(topology_ids=topology_ids)
 
-def topology_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
+def topology_list_objs(db_engine : Engine, request : ContextId) -> TopologyList:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
         obj_list : List[TopologyModel] = session.query(TopologyModel)\
@@ -45,9 +49,10 @@ def topology_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
             .options(selectinload(TopologyModel.topology_links))\
             .filter_by(context_uuid=context_uuid).all()
         return [obj.dump() for obj in obj_list]
-    return run_transaction(sessionmaker(bind=db_engine), callback)
+    topologies = run_transaction(sessionmaker(bind=db_engine), callback)
+    return TopologyList(topologies=topologies)
 
-def topology_get(db_engine : Engine, request : TopologyId) -> Dict:
+def topology_get(db_engine : Engine, request : TopologyId) -> Topology:
     _,topology_uuid = topology_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[TopologyModel] = session.query(TopologyModel)\
@@ -63,9 +68,9 @@ def topology_get(db_engine : Engine, request : TopologyId) -> Dict:
             'context_uuid generated was: {:s}'.format(context_uuid),
             'topology_uuid generated was: {:s}'.format(topology_uuid),
         ])
-    return obj
+    return Topology(**obj)
 
-def topology_get_details(db_engine : Engine, request : TopologyId) -> Dict:
+def topology_get_details(db_engine : Engine, request : TopologyId) -> TopologyDetails:
     _,topology_uuid = topology_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[TopologyModel] = session.query(TopologyModel)\
@@ -82,9 +87,9 @@ def topology_get_details(db_engine : Engine, request : TopologyId) -> Dict:
             'context_uuid generated was: {:s}'.format(context_uuid),
             'topology_uuid generated was: {:s}'.format(topology_uuid),
         ])
-    return obj
+    return TopologyDetails(**obj)
 
-def topology_set(db_engine : Engine, request : Topology) -> Tuple[Dict, bool]:
+def topology_set(db_engine : Engine, messagebroker : MessageBroker, request : Topology) -> TopologyId:
     topology_name = request.name
     if len(topology_name) == 0: topology_name = request.topology_id.topology_uuid.uuid
     context_uuid,topology_uuid = topology_get_uuid(request.topology_id, topology_name=topology_name, allow_random=True)
@@ -120,14 +125,24 @@ def topology_set(db_engine : Engine, request : Topology) -> Tuple[Dict, bool]:
         stmt = stmt.returning(TopologyModel.created_at, TopologyModel.updated_at)
         created_at,updated_at = session.execute(stmt).fetchone()
         return updated_at > created_at
-    
+
     updated = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_topology_id(topology_uuid, context_id=json_context_id(context_uuid)),updated
+    context_id = json_context_id(context_uuid)
+    topology_id = json_topology_id(topology_uuid, context_id=context_id)
+    event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE
+    notify_event_topology(messagebroker, event_type, topology_id)
+    notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+    return TopologyId(**topology_id)
 
-def topology_delete(db_engine : Engine, request : TopologyId) -> Tuple[Dict, bool]:
+def topology_delete(db_engine : Engine, messagebroker : MessageBroker, request : TopologyId) -> Empty:
     context_uuid,topology_uuid = topology_get_uuid(request, allow_random=False)
     def callback(session : Session) -> bool:
         num_deleted = session.query(TopologyModel).filter_by(topology_uuid=topology_uuid).delete()
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
-    return json_topology_id(topology_uuid, context_id=json_context_id(context_uuid)),deleted
+    context_id = json_context_id(context_uuid)
+    topology_id = json_topology_id(topology_uuid, context_id=context_id)
+    if deleted:
+        notify_event_topology(messagebroker, EventTypeEnum.EVENTTYPE_REMOVE, topology_id)
+        notify_event_context(messagebroker, EventTypeEnum.EVENTTYPE_UPDATE, context_id)
+    return Empty()
diff --git a/src/context/service/database/models/ConstraintModel.py b/src/context/service/database/models/ConstraintModel.py
index d093e782adde23092d9c9d3949f9153c8ee9d4f3..112a5f35c8d23f4b4b84f5472c14dc3b1bc7fbec 100644
--- a/src/context/service/database/models/ConstraintModel.py
+++ b/src/context/service/database/models/ConstraintModel.py
@@ -16,6 +16,7 @@ import enum, json
 from sqlalchemy import CheckConstraint, Column, DateTime, Enum, ForeignKey, Integer, String
 from sqlalchemy.dialects.postgresql import UUID
 from typing import Dict
+from .enums.ConstraintAction import ORM_ConstraintActionEnum
 from ._Base import _Base
 
 # Enum values should match name of field in Constraint message
@@ -39,6 +40,7 @@ class ServiceConstraintModel(_Base):
     service_uuid    = Column(ForeignKey('service.service_uuid', ondelete='CASCADE'), nullable=False) #, index=True
     position        = Column(Integer, nullable=False)
     kind            = Column(Enum(ConstraintKindEnum), nullable=False)
+    action          = Column(Enum(ORM_ConstraintActionEnum), nullable=False)
     data            = Column(String, nullable=False)
     created_at      = Column(DateTime, nullable=False)
     updated_at      = Column(DateTime, nullable=False)
@@ -49,7 +51,10 @@ class ServiceConstraintModel(_Base):
     )
 
     def dump(self) -> Dict:
-        return {self.kind.value: json.loads(self.data)}
+        return {
+            'action': self.action.value,
+            self.kind.value: json.loads(self.data),
+        }
 
 class SliceConstraintModel(_Base):
     __tablename__ = 'slice_constraint'
@@ -58,6 +63,7 @@ class SliceConstraintModel(_Base):
     slice_uuid      = Column(ForeignKey('slice.slice_uuid', ondelete='CASCADE'), nullable=False) #, index=True
     position        = Column(Integer, nullable=False)
     kind            = Column(Enum(ConstraintKindEnum), nullable=False)
+    action          = Column(Enum(ORM_ConstraintActionEnum), nullable=False)
     data            = Column(String, nullable=False)
     created_at      = Column(DateTime, nullable=False)
     updated_at      = Column(DateTime, nullable=False)
@@ -68,4 +74,7 @@ class SliceConstraintModel(_Base):
     )
 
     def dump(self) -> Dict:
-        return {self.kind.value: json.loads(self.data)}
+        return {
+            'action': self.action.value,
+            self.kind.value: json.loads(self.data),
+        }
diff --git a/src/context/service/database/models/EndPointModel.py b/src/context/service/database/models/EndPointModel.py
index a079f9900e39fdf3a4329e604f4e596e7f5d1f89..9bb2adb2d4209bde8cee4299d10521887f371428 100644
--- a/src/context/service/database/models/EndPointModel.py
+++ b/src/context/service/database/models/EndPointModel.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import json
 from sqlalchemy import Column, DateTime, Enum, ForeignKey, String
 from sqlalchemy.dialects.postgresql import ARRAY, UUID
 from sqlalchemy.orm import relationship
@@ -22,14 +23,15 @@ from ._Base import _Base
 class EndPointModel(_Base):
     __tablename__ = 'endpoint'
 
-    endpoint_uuid    = Column(UUID(as_uuid=False), primary_key=True)
-    device_uuid      = Column(ForeignKey('device.device_uuid',     ondelete='CASCADE' ), nullable=False, index=True)
-    topology_uuid    = Column(ForeignKey('topology.topology_uuid', ondelete='RESTRICT'), nullable=False, index=True)
-    name             = Column(String, nullable=False)
-    endpoint_type    = Column(String, nullable=False)
-    kpi_sample_types = Column(ARRAY(Enum(ORM_KpiSampleTypeEnum), dimensions=1))
-    created_at       = Column(DateTime, nullable=False)
-    updated_at       = Column(DateTime, nullable=False)
+    endpoint_uuid     = Column(UUID(as_uuid=False), primary_key=True)
+    device_uuid       = Column(ForeignKey('device.device_uuid',     ondelete='CASCADE' ), nullable=False, index=True)
+    topology_uuid     = Column(ForeignKey('topology.topology_uuid', ondelete='RESTRICT'), nullable=False, index=True)
+    name              = Column(String, nullable=False)
+    endpoint_type     = Column(String, nullable=False)
+    kpi_sample_types  = Column(ARRAY(Enum(ORM_KpiSampleTypeEnum), dimensions=1))
+    created_at        = Column(DateTime, nullable=False)
+    updated_at        = Column(DateTime, nullable=False)
+    endpoint_location = Column(String, nullable=True)
 
     device            = relationship('DeviceModel',          back_populates='endpoints') # lazy='selectin'
     topology          = relationship('TopologyModel', lazy='selectin')
@@ -46,10 +48,11 @@ class EndPointModel(_Base):
 
     def dump(self) -> Dict:
         return {
-            'endpoint_id'     : self.dump_id(),
-            'name'            : self.name,
-            'endpoint_type'   : self.endpoint_type,
-            'kpi_sample_types': [kst.value for kst in self.kpi_sample_types],
+            'endpoint_id'      : self.dump_id(),
+            'name'             : self.name,
+            'endpoint_type'    : self.endpoint_type,
+            'kpi_sample_types' : [kst.value for kst in self.kpi_sample_types],
+            'endpoint_location': json.loads(self.endpoint_location)
         }
 
     def dump_name(self) -> Dict:
diff --git a/src/context/service/database/models/TopologyModel.py b/src/context/service/database/models/TopologyModel.py
index 0ed4a038bcf4426f4cf112bd03c5cb36cb42c822..68d97edf36ee42c04948cc6782b86bce028cb76a 100644
--- a/src/context/service/database/models/TopologyModel.py
+++ b/src/context/service/database/models/TopologyModel.py
@@ -67,7 +67,7 @@ class TopologyDeviceModel(_Base):
     topology_uuid = Column(ForeignKey('topology.topology_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     device_uuid   = Column(ForeignKey('device.device_uuid',     ondelete='CASCADE' ), primary_key=True, index=True)
 
-    #topology = relationship('TopologyModel', lazy='selectin') # back_populates='topology_devices'
+    topology = relationship('TopologyModel', lazy='selectin', viewonly=True) # back_populates='topology_devices'
     device   = relationship('DeviceModel',   lazy='selectin') # back_populates='topology_devices'
 
 class TopologyLinkModel(_Base):
@@ -76,5 +76,5 @@ class TopologyLinkModel(_Base):
     topology_uuid = Column(ForeignKey('topology.topology_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     link_uuid     = Column(ForeignKey('link.link_uuid',         ondelete='CASCADE' ), primary_key=True, index=True)
 
-    #topology = relationship('TopologyModel', lazy='selectin') # back_populates='topology_links'
+    topology = relationship('TopologyModel', lazy='selectin', viewonly=True) # back_populates='topology_links'
     link     = relationship('LinkModel',     lazy='selectin') # back_populates='topology_links'
diff --git a/src/tests/scenario3/l3/launch_l3_attack_detection_and_mitigation_complete.sh b/src/context/service/database/models/enums/ConstraintAction.py
similarity index 57%
rename from src/tests/scenario3/l3/launch_l3_attack_detection_and_mitigation_complete.sh
rename to src/context/service/database/models/enums/ConstraintAction.py
index 05b20077eb951102ab11fc90aaab53463c41f94f..65533b6f579ffe153b046dfcb39d37758f4c0577 100644
--- a/src/tests/scenario3/l3/launch_l3_attack_detection_and_mitigation_complete.sh
+++ b/src/context/service/database/models/enums/ConstraintAction.py
@@ -1,4 +1,3 @@
-#!/bin/bash
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,14 +12,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cd /home/ubuntu/tfs-ctrl
-source my_deploy.sh
-./deploy.sh
-./show_deploy.sh
+import enum, functools
+from common.proto.context_pb2 import ConstraintActionEnum
+from ._GrpcToEnum import grpc_to_enum
 
-source tfs_runtime_env_vars.sh
+class ORM_ConstraintActionEnum(enum.Enum):
+    UNDEFINED = ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED
+    SET       = ConstraintActionEnum.CONSTRAINTACTION_SET
+    DELETE    = ConstraintActionEnum.CONSTRAINTACTION_DELETE
 
-ofc22/run_test_01_bootstrap.sh
-ofc22/run_test_02_create_service.sh
-
-sshpass -p "ubuntu" ssh -o StrictHostKeyChecking=no -n -f ubuntu@192.168.165.73 "sh -c 'nohup /home/ubuntu/TeraflowDockerDistributed/restart.sh > /dev/null 2>&1 &'"
+grpc_to_enum__constraint_action = functools.partial(
+    grpc_to_enum, ConstraintActionEnum, ORM_ConstraintActionEnum)
diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py
index a612803e235de2c6d2d8c91052416a675a3a3085..09be94b1d7ec041f2d3f50f832f15017fb62e63c 100644
--- a/src/context/service/database/models/enums/DeviceDriver.py
+++ b/src/context/service/database/models/enums/DeviceDriver.py
@@ -25,6 +25,7 @@ class ORM_DeviceDriverEnum(enum.Enum):
     ONF_TR_352            = DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352
     XR                    = DeviceDriverEnum.DEVICEDRIVER_XR
     IETF_L2VPN            = DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN
+    GNMI_OPENCONFIG       = DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG
 
 grpc_to_enum__device_driver = functools.partial(
     grpc_to_enum, DeviceDriverEnum, ORM_DeviceDriverEnum)
diff --git a/src/context/service/database/models/enums/ServiceType.py b/src/context/service/database/models/enums/ServiceType.py
index 668133abff416dd21f693ff41d7b3c6431f5e148..3937eaa114429ce9d004933a5d5baf1ae6137513 100644
--- a/src/context/service/database/models/enums/ServiceType.py
+++ b/src/context/service/database/models/enums/ServiceType.py
@@ -21,6 +21,7 @@ class ORM_ServiceTypeEnum(enum.Enum):
     L3NM                      = ServiceTypeEnum.SERVICETYPE_L3NM
     L2NM                      = ServiceTypeEnum.SERVICETYPE_L2NM
     TAPI_CONNECTIVITY_SERVICE = ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE
+    TE                        = ServiceTypeEnum.SERVICETYPE_TE
 
 grpc_to_enum__service_type = functools.partial(
     grpc_to_enum, ServiceTypeEnum, ORM_ServiceTypeEnum)
diff --git a/src/dbscanserving/.gitlab-ci.yml b/src/dbscanserving/.gitlab-ci.yml
index 5d5204cdd26d56aa8e47f056c8f3b84db1a1ceb3..d665bdaf2993bc578024cfc7ef8517ae44ccef7a 100644
--- a/src/dbscanserving/.gitlab-ci.yml
+++ b/src/dbscanserving/.gitlab-ci.yml
@@ -54,7 +54,7 @@ unit_test dbscanserving:
     - sleep 5
     - docker ps -a
     - docker logs $IMAGE_NAME
-    - docker exec ps -a
+    - docker ps -a
     - sleep 5
     - docker logs $IMAGE_NAME
     - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/home/${IMAGE_NAME}/results/${IMAGE_NAME}_report.xml"
diff --git a/src/dbscanserving/tests/test_unitary.py b/src/dbscanserving/tests/test_unitary.py
index 7349978e51cf5be8aa2f9899a91de91e13d1ae7e..a9d5c7e139d84e854ef58976ca6edba31cea6d11 100644
--- a/src/dbscanserving/tests/test_unitary.py
+++ b/src/dbscanserving/tests/test_unitary.py
@@ -23,30 +23,27 @@ from common.proto.dbscanserving_pb2 import (DetectionRequest,
                                             DetectionResponse, Sample)
 
 from dbscanserving.client.DbscanServingClient import DbscanServingClient
-from dbscanserving.Config import GRPC_SERVICE_PORT
 from dbscanserving.service.DbscanService import DbscanService
 
-port = 10000 + GRPC_SERVICE_PORT  # avoid privileged ports
-
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
 
 
 @pytest.fixture(scope="session")
 def dbscanserving_service():
-    _service = DbscanService(port=port)
+    _service = DbscanService()
     _service.start()
     yield _service
     _service.stop()
 
 
 @pytest.fixture(scope="session")
-def dbscanserving_client():
+def dbscanserving_client(dbscanserving_service: DbscanService):
     with patch.dict(
         os.environ,
         {
             "DBSCANSERVINGSERVICE_SERVICE_HOST": "127.0.0.1",
-            "DBSCANSERVINGSERVICE_SERVICE_PORT_GRPC": str(port),
+            "DBSCANSERVINGSERVICE_SERVICE_PORT_GRPC": str(dbscanserving_service.bind_port),
         },
         clear=True,
     ):
diff --git a/src/device/Dockerfile b/src/device/Dockerfile
index 7ddf719a389b4a059a03c4ab845b94a349955b43..6566625527f8ceaa8de4639d558c92572c4835cb 100644
--- a/src/device/Dockerfile
+++ b/src/device/Dockerfile
@@ -16,7 +16,7 @@ FROM python:3.9-slim
 
 # Install dependencies
 RUN apt-get --yes --quiet --quiet update && \
-    apt-get --yes --quiet --quiet install wget g++ && \
+    apt-get --yes --quiet --quiet install wget g++ git && \
     rm -rf /var/lib/apt/lists/*
 
 # Set Python to show logs as they occur
diff --git a/src/device/requirements.in b/src/device/requirements.in
index 50b941160937aa09976dd3dda4afab6c69d309bb..c81e814603d4c84e0211e3b433fc916b616ecd04 100644
--- a/src/device/requirements.in
+++ b/src/device/requirements.in
@@ -14,14 +14,15 @@
 
 
 anytree==2.8.0
-APScheduler==3.8.1
+APScheduler==3.10.1
+cryptography==36.0.2
 #fastcache==1.1.0
 Jinja2==3.0.3
 ncclient==0.6.13
 p4runtime==1.3.0
 paramiko==2.9.2
 python-json-logger==2.0.2
-pytz==2021.3
+#pytz==2021.3
 #redis==4.1.2
 requests==2.27.1
 requests-mock==1.9.3
@@ -29,6 +30,9 @@ xmltodict==0.12.0
 tabulate
 ipaddress
 macaddress
+yattag
+pyang
+git+https://github.com/robshakir/pyangbind.git
 websockets==10.4
 
 # pip's dependency resolver does not take into account installed packages.
diff --git a/src/device/service/Tools.py b/src/device/service/Tools.py
index 8717254cb59ad1b83a6e65ca3c1ba68757663674..b2b206471e07b654e5339f81db632699ae8b95df 100644
--- a/src/device/service/Tools.py
+++ b/src/device/service/Tools.py
@@ -16,12 +16,11 @@ import json, logging
 from typing import Any, Dict, List, Optional, Tuple, Union
 from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException
-from common.proto.context_pb2 import ConfigActionEnum, Device, DeviceConfig, Link
+from common.proto.context_pb2 import ConfigActionEnum, ConfigRule_ACL, Device, DeviceConfig, Link, Location
 from common.proto.device_pb2 import MonitoringSettings
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
 from common.tools.grpc.ConfigRules import update_config_rule_custom
 from common.tools.grpc.Tools import grpc_message_to_json
-from context.client.ContextClient import ContextClient
 from .driver_api._Driver import _Driver, RESOURCE_ENDPOINTS
 from .monitoring.MonitoringLoops import MonitoringLoops
 from .ErrorMessages import (
@@ -202,6 +201,10 @@ def populate_endpoints(
                 device_endpoint.kpi_sample_types.append(kpi_sample_type)
                 monitoring_loops.add_resource_key(device_uuid, endpoint_uuid, kpi_sample_type, monitor_resource_key)
 
+            location = resource_value.get('location', None)
+            if location is not None:
+                device_endpoint.endpoint_location.MergeFrom(Location(**location))
+
         elif resource_key.startswith('/links/link'):
             # create sub-link
             _sub_link_uuid = resource_value['uuid']
@@ -253,6 +256,7 @@ def _raw_config_rules_to_grpc(
 
         if resource_value is None: continue
         resource_value = json.loads(resource_value) if isinstance(resource_value, str) else resource_value
+        if isinstance(resource_value, ConfigRule_ACL): resource_value = grpc_message_to_json(resource_value)
         resource_value = {field_name : (field_value, False) for field_name,field_value in resource_value.items()}
         update_config_rule_custom(device_config.config_rules, resource_key, resource_value, new_action=config_action)
 
@@ -272,21 +276,36 @@ def populate_initial_config_rules(device_uuid : str, device_config : DeviceConfi
 def compute_rules_to_add_delete(
     device : Device, request : Device
 ) -> Tuple[List[Tuple[str, Any]], List[Tuple[str, Any]]]:
-    # convert config rules from context into a dictionary
-    # TODO: add support for non-custom config rules
-    context_config_rules = {
-        config_rule.custom.resource_key: config_rule.custom.resource_value
-        for config_rule in device.device_config.config_rules
-        if config_rule.WhichOneof('config_rule') == 'custom'
-    }
-
-    # convert config rules from request into a list
-    # TODO: add support for non-custom config rules
-    request_config_rules = [
-        (config_rule.action, config_rule.custom.resource_key, config_rule.custom.resource_value)
-        for config_rule in request.device_config.config_rules
-        if config_rule.WhichOneof('config_rule') == 'custom'
-    ]
+    # convert config rules from context into a dictionary  
+    context_config_rules = {}
+    for config_rule in device.device_config.config_rules: 
+        config_rule_kind = config_rule.WhichOneof('config_rule')
+        if config_rule_kind == 'custom':    # process "custom" rules
+            context_config_rules[config_rule.custom.resource_key] = config_rule.custom.resource_value # get the resource value of the rule resource
+        elif config_rule_kind == 'acl':     # process "custom" rules
+            device_uuid = config_rule.acl.endpoint_id.device_id.device_uuid.uuid # get the device name
+            endpoint_uuid = config_rule.acl.endpoint_id.endpoint_uuid.uuid       # get the endpoint name
+            acl_ruleset_name = config_rule.acl.rule_set.name                     # get the acl name
+            ACL_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/acl_ruleset[{:s}]'
+            key_or_path = ACL_KEY_TEMPLATE.format(device_uuid, endpoint_uuid, acl_ruleset_name)            
+            context_config_rules[key_or_path] = grpc_message_to_json(config_rule.acl)    # get the resource value of the acl
+ 
+    request_config_rules = []
+    for config_rule in request.device_config.config_rules:
+        config_rule_kind = config_rule.WhichOneof('config_rule')
+        if config_rule_kind == 'custom': # resource management of "custom" rule  
+            request_config_rules.append((
+                config_rule.action, config_rule.custom.resource_key, config_rule.custom.resource_value
+            ))
+        elif config_rule_kind == 'acl':  # resource management of "acl" rule  
+            device_uuid = config_rule.acl.endpoint_id.device_id.device_uuid.uuid
+            endpoint_uuid = config_rule.acl.endpoint_id.endpoint_uuid.uuid
+            acl_ruleset_name = config_rule.acl.rule_set.name
+            ACL_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/acl_ruleset[{:s}]'
+            key_or_path = ACL_KEY_TEMPLATE.format(device_uuid, endpoint_uuid, acl_ruleset_name) 
+            request_config_rules.append((
+                config_rule.action, key_or_path, grpc_message_to_json(config_rule.acl)
+            ))
 
     resources_to_set    : List[Tuple[str, Any]] = [] # key, value
     resources_to_delete : List[Tuple[str, Any]] = [] # key, value
diff --git a/src/device/service/__main__.py b/src/device/service/__main__.py
index a07a2ab90d15d99bdabe6b3fb6b0e0c9c497cf3c..401711b4e366dad5347cf771651516fe5e125d55 100644
--- a/src/device/service/__main__.py
+++ b/src/device/service/__main__.py
@@ -58,13 +58,14 @@ def main():
     driver_factory = DriverFactory(DRIVERS)
     driver_instance_cache = DriverInstanceCache(driver_factory)
 
-    # Initialize drivers with existing devices in context
-    preload_drivers(driver_instance_cache)
-
     # Starting device service
     grpc_service = DeviceService(driver_instance_cache)
     grpc_service.start()
 
+    # Initialize drivers with existing devices in context
+    LOGGER.info('Pre-loading drivers...')
+    preload_drivers(driver_instance_cache)
+
     # Wait for Ctrl+C or termination signal
     while not terminate.wait(timeout=1.0): pass
 
diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index b3b485a471899dd96a4985fedb4bb6ede2432921..4ae7128b0258536dae5fbed2ae86457d4f9f969f 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -70,6 +70,7 @@ DRIVERS.append(
         #        DeviceDriverEnum.DEVICEDRIVER_P4,
         #        DeviceDriverEnum.DEVICEDRIVER_IETF_NETWORK_TOPOLOGY,
         #        DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352,
+        #        DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
         #    ],
         #}
     ]))
@@ -94,6 +95,17 @@ if LOAD_ALL_DEVICE_DRIVERS:
             }
         ]))
 
+if LOAD_ALL_DEVICE_DRIVERS:
+    from .gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
+    DRIVERS.append(
+        (GnmiOpenConfigDriver, [
+            {
+                # Real Packet Router, specifying gNMI OpenConfig Driver => use GnmiOpenConfigDriver
+                FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.PACKET_ROUTER,
+                FilterFieldEnum.DRIVER     : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
+            }
+        ]))
+
 if LOAD_ALL_DEVICE_DRIVERS:
     from .transport_api.TransportApiDriver import TransportApiDriver # pylint: disable=wrong-import-position
     DRIVERS.append(
diff --git a/src/device/service/drivers/emulated/Tools.py b/src/device/service/drivers/emulated/Tools.py
index 0ac92bf56d5538a5ed4d3e7c53bc480d5ecd40bd..15fa342388159a19bf071985ab1a7fc74d8b28a2 100644
--- a/src/device/service/drivers/emulated/Tools.py
+++ b/src/device/service/drivers/emulated/Tools.py
@@ -79,7 +79,10 @@ def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[
 
         if len(sample_types) > 0:
             endpoint_resource_value['sample_types'] = sample_types
-
+    
+        if 'location' in endpoint_data:
+            endpoint_resource_value['location'] = endpoint_data['location']
+            
         return endpoint_resource_key, endpoint_resource_value
     except: # pylint: disable=bare-except
         LOGGER.exception('Problem composing endpoint({:s})'.format(str(endpoint_data)))
diff --git a/src/device/service/drivers/gnmi_openconfig/DeltaSampleCache.py b/src/device/service/drivers/gnmi_openconfig/DeltaSampleCache.py
new file mode 100644
index 0000000000000000000000000000000000000000..5083082fe5694a95e95d95cd8ed72563d77dc098
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/DeltaSampleCache.py
@@ -0,0 +1,35 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import copy
+from typing import Any, Dict, Tuple, Union
+
+class DeltaSampleCache:
+    def __init__(self) -> None:
+        self._previous_samples : Dict[str, Tuple[float, Union[int, float]]] = dict()
+
+    def get_delta(self, path : str, current_timestamp : float, current_value : Any) -> None:
+        previous_sample = copy.deepcopy(self._previous_samples.get(path))
+        self._previous_samples[path] = current_timestamp, current_value
+
+        if not isinstance(current_value, (int, float)): return None
+        if previous_sample is None: return current_timestamp, 0
+        previous_timestamp, previous_value = previous_sample
+        if not isinstance(previous_value, (int, float)): return None
+
+        delta_value = max(0, current_value - previous_value)
+        delay = current_timestamp - previous_timestamp
+        delta_sample = current_timestamp, delta_value / delay
+
+        return delta_sample
diff --git a/src/device/service/drivers/gnmi_openconfig/GnmiOpenConfigDriver.py b/src/device/service/drivers/gnmi_openconfig/GnmiOpenConfigDriver.py
new file mode 100644
index 0000000000000000000000000000000000000000..882c0de07440c3b89c4a82f522d08155329b5d7e
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/GnmiOpenConfigDriver.py
@@ -0,0 +1,100 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging, queue, threading
+from typing import Any, Iterator, List, Optional, Tuple, Union
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.type_checkers.Checkers import chk_type
+from device.service.driver_api._Driver import _Driver
+from .GnmiSessionHandler import GnmiSessionHandler
+
+DRIVER_NAME = 'gnmi_openconfig'
+METRICS_POOL = MetricsPool('Device', 'Driver', labels={'driver': DRIVER_NAME})
+
+class GnmiOpenConfigDriver(_Driver):
+    def __init__(self, address : str, port : int, **settings) -> None:
+        super().__init__(DRIVER_NAME, address, port, **settings)
+        self.__logger = logging.getLogger('{:s}:[{:s}:{:s}]'.format(str(__name__), str(self.address), str(self.port)))
+        self.__lock = threading.Lock()
+        self.__started = threading.Event()
+        self.__terminate = threading.Event()
+        self.__handler = GnmiSessionHandler(self.address, self.port, settings, self.__logger)
+        self.__out_samples = self.__handler.out_samples
+
+    def Connect(self) -> bool:
+        with self.__lock:
+            if self.__started.is_set(): return True
+            self.__handler.connect()
+            self.__started.set()
+            return True
+
+    def Disconnect(self) -> bool:
+        with self.__lock:
+            # Trigger termination of loops and processes
+            self.__terminate.set()
+            # If not started, assume it is already disconnected
+            if not self.__started.is_set(): return True
+            self.__handler.disconnect()
+            return True
+
+    @metered_subclass_method(METRICS_POOL)
+    def GetInitialConfig(self) -> List[Tuple[str, Any]]:
+        with self.__lock:
+            return []
+
+    @metered_subclass_method(METRICS_POOL)
+    def GetConfig(self, resource_keys : List[str] = []) -> List[Tuple[str, Union[Any, None, Exception]]]:
+        chk_type('resources', resource_keys, list)
+        with self.__lock:
+            return self.__handler.get(resource_keys)
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+        with self.__lock:
+            return self.__handler.set(resources)
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+        with self.__lock:
+            return self.__handler.delete(resources)
+
+    @metered_subclass_method(METRICS_POOL)
+    def SubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]:
+        chk_type('subscriptions', subscriptions, list)
+        if len(subscriptions) == 0: return []
+        with self.__lock:
+            return self.__handler.subscribe(subscriptions)
+
+    @metered_subclass_method(METRICS_POOL)
+    def UnsubscribeState(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]:
+        chk_type('subscriptions', subscriptions, list)
+        if len(subscriptions) == 0: return []
+        with self.__lock:
+            return self.__handler.unsubscribe(subscriptions)
+
+    def GetState(self, blocking=False, terminate : Optional[threading.Event] = None) -> Iterator[Tuple[str, Any]]:
+        while True:
+            if self.__terminate.is_set(): break
+            if terminate is not None and terminate.is_set(): break
+            try:
+                sample = self.__out_samples.get(block=blocking, timeout=0.1)
+            except queue.Empty:
+                if blocking: continue
+                return
+            if sample is None: continue
+            yield sample
diff --git a/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py b/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py
new file mode 100644
index 0000000000000000000000000000000000000000..04dae4f5fcc6427c735b528b0ab32ba1c967709a
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py
@@ -0,0 +1,332 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import copy, grpc, json, logging, queue, threading
+from typing import Any, Dict, List, Optional, Tuple, Union
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from common.type_checkers.Checkers import chk_float, chk_length, chk_string, chk_type
+from .gnmi.gnmi_pb2_grpc import gNMIStub
+from .gnmi.gnmi_pb2 import Encoding, GetRequest, SetRequest, UpdateResult   # pylint: disable=no-name-in-module
+from .handlers import ALL_RESOURCE_KEYS, compose, get_path, parse
+from .tools.Capabilities import get_supported_encodings
+from .tools.Channel import get_grpc_channel
+from .tools.Path import path_from_string, path_to_string #, compose_path
+from .tools.Subscriptions import Subscriptions
+from .tools.Value import decode_value #, value_exists
+from .MonitoringThread import MonitoringThread
+
+class GnmiSessionHandler:
+    def __init__(self, address : str, port : int, settings : Dict, logger : logging.Logger) -> None:
+        self._address   = address
+        self._port      = port
+        self._settings  = copy.deepcopy(settings)
+        self._logger    = logger
+        self._lock      = threading.Lock()
+        self._connected = threading.Event()
+        self._username  = settings.get('username')
+        self._password  = settings.get('password')
+        self._use_tls   = settings.get('use_tls', False)
+        self._channel : Optional[grpc.Channel] = None
+        self._stub : Optional[gNMIStub] = None
+        self._monit_thread = None
+        self._supported_encodings = None
+        self._subscriptions = Subscriptions()
+        self._in_subscriptions = queue.Queue()
+        self._out_samples = queue.Queue()
+
+    @property
+    def subscriptions(self): return self._subscriptions
+
+    @property
+    def in_subscriptions(self): return self._in_subscriptions
+
+    @property
+    def out_samples(self): return self._out_samples
+
+    def connect(self):
+        with self._lock:
+            self._channel = get_grpc_channel(self._address, self._port, self._use_tls, self._logger)
+            self._stub = gNMIStub(self._channel)
+            self._supported_encodings = get_supported_encodings(
+                self._stub, self._username, self._password, timeout=120)
+            self._monit_thread = MonitoringThread(
+                self._stub, self._logger, self._settings, self._in_subscriptions, self._out_samples)
+            self._monit_thread.start()
+            self._connected.set()
+
+    def disconnect(self):
+        if not self._connected.is_set(): return
+        with self._lock:
+            self._monit_thread.stop()
+            self._monit_thread.join()
+            self._channel.close()
+            self._connected.clear()
+
+    def get(self, resource_keys : List[str]) -> List[Tuple[str, Union[Any, None, Exception]]]:
+        if len(resource_keys) == 0: resource_keys = ALL_RESOURCE_KEYS
+        chk_type('resources', resource_keys, list)
+
+        parsing_results = []
+
+        get_request = GetRequest()
+        get_request.type = GetRequest.DataType.ALL
+        get_request.encoding = Encoding.JSON_IETF
+        #get_request.use_models.add() # kept empty: return for all models supported
+        for i,resource_key in enumerate(resource_keys):
+            str_resource_name = 'resource_key[#{:d}]'.format(i)
+            try:
+                chk_string(str_resource_name, resource_key, allow_empty=False)
+                self._logger.debug('[GnmiSessionHandler:get] resource_key = {:s}'.format(str(resource_key)))
+                str_path = get_path(resource_key)
+                self._logger.debug('[GnmiSessionHandler:get] str_path = {:s}'.format(str(str_path)))
+                get_request.path.append(path_from_string(str_path))
+            except Exception as e: # pylint: disable=broad-except
+                MSG = 'Exception parsing {:s}: {:s}'
+                self._logger.exception(MSG.format(str_resource_name, str(resource_key)))
+                parsing_results.append((resource_key, e)) # if validation fails, store the exception
+
+        if len(parsing_results) > 0:
+            return parsing_results
+
+        metadata = [('username', self._username), ('password', self._password)]
+        timeout = None # GNMI_SUBSCRIPTION_TIMEOUT = int(sampling_duration)
+        get_reply = self._stub.Get(get_request, metadata=metadata, timeout=timeout)
+        #self._logger.info('get_reply={:s}'.format(grpc_message_to_json_string(get_reply)))
+
+        results = []
+        #results[str_filter] = [i, None, False]  # (index, value, processed?)
+
+        for notification in get_reply.notification:
+            #for delete_path in notification.delete:
+            #    self._logger.info('delete_path={:s}'.format(grpc_message_to_json_string(delete_path)))
+            #    str_path = path_to_string(delete_path)
+            #    resource_key_tuple = results.get(str_path)
+            #    if resource_key_tuple is None:
+            #        # pylint: disable=broad-exception-raised
+            #        MSG = 'Unexpected Delete Path({:s}); requested resource_keys({:s})'
+            #        raise Exception(MSG.format(str(str_path), str(resource_keys)))
+            #    resource_key_tuple[2] = True
+
+            for update in notification.update:
+                #self._logger.info('update={:s}'.format(grpc_message_to_json_string(update)))
+                str_path = path_to_string(update.path)
+                #resource_key_tuple = results.get(str_path)
+                #if resource_key_tuple is None:
+                #    # pylint: disable=broad-exception-raised
+                #    MSG = 'Unexpected Update Path({:s}); requested resource_keys({:s})'
+                #    raise Exception(MSG.format(str(str_path), str(resource_keys)))
+                try:
+                    value = decode_value(update.val)
+                    #resource_key_tuple[1] = value
+                    #resource_key_tuple[2] = True
+                    results.extend(parse(str_path, value))
+                except Exception as e: # pylint: disable=broad-except
+                    MSG = 'Exception processing notification {:s}'
+                    self._logger.exception(MSG.format(grpc_message_to_json_string(notification)))
+                    results.append((str_path, e)) # if validation fails, store the exception
+
+        #_results = sorted(results.items(), key=lambda x: x[1][0])
+        #results = list()
+        #for resource_key,resource_key_tuple in _results:
+        #    _, value, processed = resource_key_tuple
+        #    value = value if processed else Exception('Not Processed')
+        #    results.append((resource_key, value))
+        return results
+
+    def set(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        #resource_keys = [key for key,_ in resources]
+        #current_values = self.get(resource_keys)
+
+        #resource_tuples = {
+        #    resource_key : [i, value, value_exists(value), None]
+        #    for i,(resource_key,value) in enumerate(current_values)
+        #}
+
+        #self._logger.info('---0')
+        #self._logger.info(str(resource_tuples))
+
+        set_request = SetRequest()
+        #for resource_key in resource_keys:
+        for resource_key, resource_value in resources:
+            self._logger.info('---1')
+            self._logger.info(str(resource_key))
+            self._logger.info(str(resource_value))
+            #resource_tuple = resource_tuples.get(resource_key)
+            #if resource_tuple is None: continue
+            #_, value, exists, operation_done = resource_tuple
+            if isinstance(resource_value, str): resource_value = json.loads(resource_value)
+            str_path, str_data = compose(resource_key, resource_value, delete=False)
+            self._logger.info('---3')
+            self._logger.info(str(str_path))
+            self._logger.info(str(str_data))
+            set_request_list = set_request.update #if exists else set_request.replace
+            set_request_entry = set_request_list.add()
+            set_request_entry.path.CopyFrom(path_from_string(str_path))
+            set_request_entry.val.json_val = str_data.encode('UTF-8')
+
+        self._logger.info('set_request={:s}'.format(grpc_message_to_json_string(set_request)))
+        metadata = [('username', self._username), ('password', self._password)]
+        timeout = None # GNMI_SUBSCRIPTION_TIMEOUT = int(sampling_duration)
+        set_reply = self._stub.Set(set_request, metadata=metadata, timeout=timeout)
+        self._logger.info('set_reply={:s}'.format(grpc_message_to_json_string(set_reply)))
+
+        results = []
+        for (resource_key, resource_value), update_result in zip(resources, set_reply.response):
+            operation = update_result.op
+            if operation == UpdateResult.UPDATE:
+                results.append((resource_key, True))
+            else:
+                results.append((resource_key, Exception('Unexpected')))
+
+            #str_path = path_to_string(update_result.path)
+            #resource_tuple = resource_tuples.get(str_path)
+            #if resource_tuple is None: continue
+            #resource_tuple[3] = operation
+
+        #resource_tuples = sorted(resource_tuples.items(), key=lambda x: x[1][0])
+        #results = list()
+        #for resource_key,resource_tuple in resource_tuples:
+        #    _, _, exists, operation_done = resource_tuple
+        #    desired_operation = 'update' if exists else 'replace'
+        #
+        #    if operation_done == UpdateResult.INVALID:
+        #        value = Exception('Invalid')
+        #    elif operation_done == UpdateResult.DELETE:
+        #        value = Exception('Unexpected Delete')
+        #    elif operation_done == UpdateResult.REPLACE:
+        #        value = True if desired_operation == 'replace' else Exception('Failed')
+        #    elif operation_done == UpdateResult.UPDATE:
+        #        value = True if desired_operation == 'update' else Exception('Failed')
+        #    else:
+        #        value = Exception('Unexpected')
+        #    results.append((resource_key, value))
+        return results
+
+    def delete(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        #resource_keys = [key for key,_ in resources]
+        #current_values = self.get(resource_keys)
+
+        #resource_tuples = {
+        #    resource_key : [i, value, value_exists(value), None]
+        #    for i,(resource_key,value) in enumerate(current_values)
+        #}
+
+        #self._logger.info('---0')
+        #self._logger.info(str(resource_tuples))
+
+        set_request = SetRequest()
+        #for resource_key in resource_keys:
+        for resource_key, resource_value in resources:
+            self._logger.info('---1')
+            self._logger.info(str(resource_key))
+            self._logger.info(str(resource_value))
+            #resource_tuple = resource_tuples.get(resource_key)
+            #if resource_tuple is None: continue
+            #_, value, exists, operation_done = resource_tuple
+            #if not exists: continue
+            if isinstance(resource_value, str): resource_value = json.loads(resource_value)
+            str_path, str_data = compose(resource_key, resource_value, delete=True)
+            self._logger.info('---3')
+            self._logger.info(str(str_path))
+            self._logger.info(str(str_data))
+            set_request_entry = set_request.delete.add()
+            set_request_entry.CopyFrom(path_from_string(str_path))
+
+        self._logger.info('set_request={:s}'.format(grpc_message_to_json_string(set_request)))
+        metadata = [('username', self._username), ('password', self._password)]
+        timeout = None # GNMI_SUBSCRIPTION_TIMEOUT = int(sampling_duration)
+        set_reply = self._stub.Set(set_request, metadata=metadata, timeout=timeout)
+        self._logger.info('set_reply={:s}'.format(grpc_message_to_json_string(set_reply)))
+
+        results = []
+        for (resource_key, resource_value), update_result in zip(resources, set_reply.response):
+            operation = update_result.op
+            if operation == UpdateResult.DELETE:
+                results.append((resource_key, True))
+            else:
+                results.append((resource_key, Exception('Unexpected')))
+
+            #str_path = path_to_string(update_result.path)
+            #resource_tuple = resource_tuples.get(str_path)
+            #if resource_tuple is None: continue
+            #resource_tuple[3] = operation
+
+        #resource_tuples = sorted(resource_tuples.items(), key=lambda x: x[1][0])
+        #results = list()
+        #for resource_key,resource_tuple in resource_tuples:
+        #    _, _, exists, operation_done = resource_tuple
+        #    if operation_done == UpdateResult.INVALID:
+        #        value = Exception('Invalid')
+        #    elif operation_done == UpdateResult.DELETE:
+        #        value = True
+        #    elif operation_done == UpdateResult.REPLACE:
+        #        value = Exception('Unexpected Replace')
+        #    elif operation_done == UpdateResult.UPDATE:
+        #        value = Exception('Unexpected Update')
+        #    else:
+        #        value = Exception('Unexpected')
+        #    results.append((resource_key, value))
+        return results
+
+    def subscribe(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]:
+        results = []
+        for i,subscription in enumerate(subscriptions):
+            str_subscription_name = 'subscriptions[#{:d}]'.format(i)
+            try:
+                chk_type(str_subscription_name, subscription, (list, tuple))
+                chk_length(str_subscription_name, subscription, min_length=3, max_length=3)
+                resource_key, sampling_duration, sampling_interval = subscription
+                chk_string(str_subscription_name + '.resource_key', resource_key, allow_empty=False)
+                chk_float(str_subscription_name + '.sampling_duration', sampling_duration, min_value=0)
+                chk_float(str_subscription_name + '.sampling_interval', sampling_interval, min_value=0)
+            except Exception as e: # pylint: disable=broad-except
+                MSG = 'Exception validating {:s}: {:s}'
+                self._logger.exception(MSG.format(str_subscription_name, str(resource_key)))
+                results.append(e) # if validation fails, store the exception
+                continue
+
+            #resource_path = resource_key.split('/')
+            #self._subscriptions.add(resource_path, sampling_duration, sampling_interval, reference)
+            subscription = 'subscribe', resource_key, sampling_duration, sampling_interval
+            self._in_subscriptions.put_nowait(subscription)
+            results.append(True)
+        return results
+
+    def unsubscribe(self, subscriptions : List[Tuple[str, float, float]]) -> List[Union[bool, Exception]]:
+        results = []
+        for i,subscription in enumerate(subscriptions):
+            str_subscription_name = 'subscriptions[#{:d}]'.format(i)
+            try:
+                chk_type(str_subscription_name, subscription, (list, tuple))
+                chk_length(str_subscription_name, subscription, min_length=3, max_length=3)
+                resource_key, sampling_duration, sampling_interval = subscription
+                chk_string(str_subscription_name + '.resource_key', resource_key, allow_empty=False)
+                chk_float(str_subscription_name + '.sampling_duration', sampling_duration, min_value=0)
+                chk_float(str_subscription_name + '.sampling_interval', sampling_interval, min_value=0)
+            except Exception as e: # pylint: disable=broad-except
+                MSG = 'Exception validating {:s}: {:s}'
+                self._logger.exception(MSG.format(str_subscription_name, str(resource_key)))
+                results.append(e) # if validation fails, store the exception
+                continue
+
+            #resource_path = resource_key.split('/')
+            #reference = self._subscriptions.get(resource_path, sampling_duration, sampling_interval)
+            #if reference is None:
+            #    results.append(False)
+            #    continue
+            #self._subscriptions.delete(reference)
+            subscription = 'unsubscribe', resource_key, sampling_duration, sampling_interval
+            self._in_subscriptions.put_nowait(subscription)
+            results.append(True)
+        return results
diff --git a/src/device/service/drivers/gnmi_openconfig/MonitoringThread.py b/src/device/service/drivers/gnmi_openconfig/MonitoringThread.py
new file mode 100644
index 0000000000000000000000000000000000000000..7cbd0da87d15b6fac0ea7f4a5de3c02259a07dc8
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/MonitoringThread.py
@@ -0,0 +1,171 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+# Ref: https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md
+# Ref: https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto
+
+from __future__ import annotations
+import grpc, logging, queue, re, threading
+from collections.abc import Iterator
+from datetime import datetime
+from typing import Dict
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from .gnmi.gnmi_pb2 import ( # pylint: disable=no-name-in-module
+    QOSMarking, SubscribeRequest, Subscription, SubscriptionList, SubscriptionMode
+)
+from .gnmi.gnmi_pb2_grpc import gNMIStub
+from .tools.Path import path_from_string, path_to_string
+from .DeltaSampleCache import DeltaSampleCache
+
+
+LOGGER = logging.getLogger(__name__)
+
+# SubscriptionList Mode: Mode of the subscription.
+#  STREAM = 0: Values streamed by the target. gNMI Specification Section 3.5.1.5.2
+#  ONCE   = 1: Values sent once-off by the target. gNMI Specification Section 3.5.1.5.1
+#  POLL   = 2: Values sent in response to a poll request. gNMI Specification Section 3.5.1.5.3
+GNMI_SUBSCRIPTION_LIST_MODE = SubscriptionList.Mode.STREAM
+
+# Path Prefix: Prefix used for paths.
+GNMI_PATH_PREFIX = None
+
+# QOS MArking: DSCP marking to be used.
+GNMI_QOS_MARKING = None
+
+# Allow Aggregation: Whether elements of the schema that are marked as eligible for aggregation
+# should be aggregated or not.
+GNMI_ALLOW_AGGREGATION = False
+
+# Encoding: The encoding that the target should use within the Notifications generated
+# corresponding to the SubscriptionList.
+GNMI_ENCODING = 'JSON'
+
+#Subscription Mode: The mode of the subscription, specifying how the target must return values
+# in a subscription. gNMI Specification Section 3.5.1.3
+#  TARGET_DEFINED = 0: The target selects the relevant mode for each element.
+#  ON_CHANGE      = 1: The target sends an update on element value change.
+#  SAMPLE         = 2: The target samples values according to the interval.
+GNMI_SUBSCRIPTION_MODE = SubscriptionMode.SAMPLE
+
+# Suppress Redundant: Indicates whether values that have not changed should be sent in a SAMPLE
+# subscription. gNMI Specification Section 3.5.1.3
+GNMI_SUPPRESS_REDUNDANT = False
+
+# Heartbeat Interval: Specifies the maximum allowable silent period in nanoseconds when
+# suppress_redundant is in use. The target should send a value at least once in the period
+# specified. gNMI Specification Section 3.5.1.3
+GNMI_HEARTBEAT_INTERVAL = 10 # seconds
+
+GNMI_SUBSCRIPTION_TIMEOUT = None
+
+class MonitoringThread(threading.Thread):
+    def __init__(
+        self, stub : gNMIStub, logger : logging.Logger, settings : Dict,
+        in_subscriptions : queue.Queue, out_samples : queue.Queue
+    ) -> None:
+        super().__init__(daemon=True)
+        self._terminate = threading.Event()
+        self._stub = stub
+        self._logger = logger
+        self._username = settings.get('username')
+        self._password = settings.get('password')
+        self._in_subscriptions = in_subscriptions
+        self._out_samples = out_samples
+        self._response_iterator = None
+        self._delta_sample_cache = DeltaSampleCache()
+
+    def stop(self) -> None:
+        self._terminate.set()
+        if self._response_iterator is not None:
+            self._response_iterator.cancel()
+
+    def generate_requests(self) -> Iterator[SubscribeRequest]:
+        subscriptions = []
+        while not self._terminate.is_set():
+            try:
+                subscription = self._in_subscriptions.get(block=True, timeout=0.1)
+                operation, resource_key, sampling_duration, sampling_interval = subscription   # pylint: disable=unused-variable
+                if operation != 'subscribe': continue # Unsubscribe not supported by gNM, needs to cancel entire connection
+                # options.timeout = int(sampling_duration)
+                #_path = parse_xpath(resource_key)
+                path = path_from_string(resource_key)
+                subscription = Subscription(
+                    path=path, mode=GNMI_SUBSCRIPTION_MODE, suppress_redundant=GNMI_SUPPRESS_REDUNDANT,
+                    sample_interval=int(sampling_interval * 1000000000),
+                    heartbeat_interval=int(GNMI_HEARTBEAT_INTERVAL * 1000000000))
+                subscriptions.append(subscription)
+            except queue.Empty:
+                if len(subscriptions) == 0: continue
+                #self._logger.warning('[generate_requests] process')
+                prefix = path_from_string(GNMI_PATH_PREFIX) if GNMI_PATH_PREFIX is not None else None
+                qos = QOSMarking(marking=GNMI_QOS_MARKING) if GNMI_QOS_MARKING is not None else None
+                subscriptions_list = SubscriptionList(
+                    prefix=prefix, mode=GNMI_SUBSCRIPTION_LIST_MODE, allow_aggregation=GNMI_ALLOW_AGGREGATION,
+                    encoding=GNMI_ENCODING, subscription=subscriptions, qos=qos)
+                subscribe_request = SubscribeRequest(subscribe=subscriptions_list)
+                #str_subscribe_request = grpc_message_to_json_string(subscribe_request)
+                #self._logger.warning('[generate_requests] subscribe_request={:s}'.format(str_subscribe_request))
+                yield subscribe_request
+                subscriptions = []
+            except: # pylint: disable=bare-except
+                self._logger.exception('[generate_requests] Unhandled Exception')
+
+    def run(self) -> None:
+        # Add a dummy subscription to be used as keep-alive
+        # usable only with SRLinux native data models
+        #subscription = ('/system/name/host-name', None, 1)
+        #self._in_subscriptions.put_nowait(subscription)
+
+        try:
+            request_iterator = self.generate_requests()
+            metadata = [('username', self._username), ('password', self._password)]
+            timeout = None # GNMI_SUBSCRIPTION_TIMEOUT = int(sampling_duration)
+            self._response_iterator = self._stub.Subscribe(request_iterator, metadata=metadata, timeout=timeout)
+            for subscribe_response in self._response_iterator:
+                str_subscribe_response = grpc_message_to_json_string(subscribe_response)
+                self._logger.warning('[run] subscribe_response={:s}'.format(str_subscribe_response))
+                update = subscribe_response.update
+                timestamp_device = float(update.timestamp) / 1.e9
+                timestamp_local = datetime.timestamp(datetime.utcnow())
+                # if difference between timestamp from device and local is lower than 1 second
+                if abs(timestamp_device - timestamp_local) <= 1:
+                    # assume clocks are synchronized, use timestamp from device
+                    timestamp = timestamp_device
+                else:
+                    # might be clocks are not synchronized, use local timestamp
+                    timestamp = timestamp_local
+                for update_entry in update.update:
+                    str_path = path_to_string(update_entry.path)
+                    #if str_path != '/system/name/host-name': continue
+                    #counter_name = update_entry.path[-1].name
+                    value_type = update_entry.val.WhichOneof('value')
+                    value = getattr(update_entry.val, value_type)
+                    if re.match(r'^[0-9]+$', value) is not None:
+                        value = int(value)
+                    elif re.match(r'^[0-9]*\.[0-9]*$', value) is not None:
+                        value = float(value)
+                    else:
+                        value = str(value)
+                    delta_sample = self._delta_sample_cache.get_delta(str_path, timestamp, value)
+                    if delta_sample is None:
+                        sample = (timestamp, str_path, value)
+                    else:
+                        sample = (delta_sample[0], str_path, delta_sample[1])
+                    self._logger.warning('[run] sample={:s}'.format(str(sample)))
+                    self._out_samples.put_nowait(sample)
+        except grpc.RpcError as e:
+            if e.code() != grpc.StatusCode.CANCELLED: raise                 # pylint: disable=no-member
+            if e.details() != 'Locally cancelled by application!': raise    # pylint: disable=no-member
+        except: # pylint: disable=bare-except
+            self._logger.exception('Unhandled Exception')
diff --git a/src/tests/scenario3/l3/launch_webui.sh b/src/device/service/drivers/gnmi_openconfig/__init__.py
old mode 100755
new mode 100644
similarity index 91%
rename from src/tests/scenario3/l3/launch_webui.sh
rename to src/device/service/drivers/gnmi_openconfig/__init__.py
index bf1867eb108331647f3ad343b0ab23d098617aff..1549d9811aa5d1c193a44ad45d0d7773236c0612
--- a/src/tests/scenario3/l3/launch_webui.sh
+++ b/src/device/service/drivers/gnmi_openconfig/__init__.py
@@ -1,4 +1,3 @@
-#!/bin/bash
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,4 +12,3 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-ssh -L 12345:localhost:80 ubuntu@192.168.165.78
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/Acknowledgement.txt b/src/device/service/drivers/gnmi_openconfig/gnmi/Acknowledgement.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a004e1f58bdea3ba78263a06e6e473f593e1b390
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/Acknowledgement.txt
@@ -0,0 +1,25 @@
+This code is partially based on:
+https://github.com/nokia/pygnmi/blob/master/gNMI_Subscribe.py
+
+
+MIT License
+
+Copyright (c) 2017 Nokia
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/__init__.py b/src/device/service/drivers/gnmi_openconfig/gnmi/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi.proto b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi.proto
new file mode 100644
index 0000000000000000000000000000000000000000..292880a55586f5a5c05b0edcfc0f2f73baf7be13
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi.proto
@@ -0,0 +1,501 @@
+syntax = "proto3";
+
+import "google/protobuf/any.proto";
+import "google/protobuf/descriptor.proto";
+// import gnmi_ext.proto;
+
+// Package gNMI defines a service specification for the gRPC Network Management
+// Interface. This interface is defined to be a standard interface via which
+// a network management system ("client") can subscribe to state values,
+// retrieve snapshots of state information, and manipulate the state of a data
+// tree supported by a device ("target").
+//
+// This document references the gNMI Specification which can be found at
+// http://github.com/openconfig/reference/blob/master/rpc/gnmi
+package gnmi;
+
+// Define a protobuf FileOption that defines the gNMI service version.
+extend google.protobuf.FileOptions {
+  // The gNMI service semantic version.
+  string gnmi_service = 1001;
+}
+
+// gNMI_service is the current version of the gNMI service, returned through
+// the Capabilities RPC.
+option (gnmi_service) = "0.8.0";
+
+option go_package = "github.com/openconfig/gnmi/proto/gnmi";
+option java_multiple_files = true;
+option java_outer_classname = "GnmiProto";
+option java_package = "com.github.gnmi.proto";
+
+
+service gNMI {
+  // Capabilities allows the client to retrieve the set of capabilities that
+  // is supported by the target. This allows the target to validate the
+  // service version that is implemented and retrieve the set of models that
+  // the target supports. The models can then be specified in subsequent RPCs
+  // to restrict the set of data that is utilized.
+  // Reference: gNMI Specification Section 3.2
+  rpc Capabilities(CapabilityRequest) returns (CapabilityResponse);
+  // Retrieve a snapshot of data from the target. A Get RPC requests that the
+  // target snapshots a subset of the data tree as specified by the paths
+  // included in the message and serializes this to be returned to the
+  // client using the specified encoding.
+  // Reference: gNMI Specification Section 3.3
+  rpc Get(GetRequest) returns (GetResponse);
+  // Set allows the client to modify the state of data on the target. The
+  // paths to modified along with the new values that the client wishes
+  // to set the value to.
+  // Reference: gNMI Specification Section 3.4
+  rpc Set(SetRequest) returns (SetResponse);
+  // Subscribe allows a client to request the target to send it values
+  // of particular paths within the data tree. These values may be streamed
+  // at a particular cadence (STREAM), sent one off on a long-lived channel
+  // (POLL), or sent as a one-off retrieval (ONCE).
+  // Reference: gNMI Specification Section 3.5
+  rpc Subscribe(stream SubscribeRequest) returns (stream SubscribeResponse);
+}
+// The Extension message contains a single gNMI extension.
+message Extension {
+  oneof ext {
+    RegisteredExtension registered_ext = 1;    // A registered extension.
+    // Well known extensions.
+    MasterArbitration master_arbitration = 2;  // Master arbitration extension.
+    History history = 3;                       // History extension.
+  }
+}
+
+// The RegisteredExtension message defines an extension which is defined outside
+// of this file.
+message RegisteredExtension {
+  ExtensionID id = 1; // The unique ID assigned to this extension.
+  bytes msg = 2;      // The binary-marshalled protobuf extension payload.
+}
+
+// RegisteredExtension is an enumeration acting as a registry for extensions
+// defined by external sources.
+enum ExtensionID {
+  EID_UNSET = 0;
+  // New extensions are to be defined within this enumeration - their definition
+  // MUST link to a reference describing their implementation.
+
+  // An experimental extension that may be used during prototyping of a new
+  // extension.
+  EID_EXPERIMENTAL = 999;
+}
+
+// MasterArbitration is used to select the master among multiple gNMI clients
+// with the same Roles. The client with the largest election_id is honored as
+// the master.
+// The document about gNMI master arbitration can be found at
+// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-master-arbitration.md
+message MasterArbitration {
+  Role role = 1;
+  Uint128 election_id = 2;
+}
+
+// Representation of unsigned 128-bit integer.
+message Uint128 {
+  uint64 high = 1;
+  uint64 low = 2;
+}
+
+// There can be one master for each role. The role is identified by its id.
+message Role {
+  string id = 1;
+  // More fields can be added if needed, for example, to specify what paths the
+  // role can read/write.
+}
+
+// The History extension allows clients to request historical data. Its
+// spec can be found at
+// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md
+message History {
+  oneof request {
+    int64 snapshot_time = 1; // Nanoseconds since the epoch
+    TimeRange range = 2;
+  }
+}
+
+message TimeRange {
+  int64 start = 1; // Nanoseconds since the epoch
+  int64 end = 2;   // Nanoseconds since the epoch
+}
+// Notification is a re-usable message that is used to encode data from the
+// target to the client. A Notification carries two types of changes to the data
+// tree:
+//  - Deleted values (delete) - a set of paths that have been removed from the
+//    data tree.
+//  - Updated values (update) - a set of path-value pairs indicating the path
+//    whose value has changed in the data tree.
+// Reference: gNMI Specification Section 2.1
+message Notification {
+  int64 timestamp = 1;          // Timestamp in nanoseconds since Epoch.
+  Path prefix = 2;              // Prefix used for paths in the message.
+  repeated Update update = 4;   // Data elements that have changed values.
+  repeated Path delete = 5;     // Data elements that have been deleted.
+  // This notification contains a set of paths that are always updated together
+  // referenced by a globally unique prefix.
+  bool atomic = 6;
+  // Reserved field numbers and identifiers.
+  reserved "alias";
+  reserved 3;
+}
+
+// Update is a re-usable message that is used to store a particular Path,
+// Value pair.
+// Reference: gNMI Specification Section 2.1
+message Update {
+  Path path = 1;                      // The path (key) for the update.
+  Value value = 2 [deprecated=true];  // The value (value) for the update.
+  TypedValue val = 3;                 // The explicitly typed update value.
+  uint32 duplicates = 4;              // Number of coalesced duplicates.
+}
+
+// TypedValue is used to encode a value being sent between the client and
+// target (originated by either entity).
+message TypedValue {
+  // One of the fields within the val oneof is populated with the value
+  // of the update. The type of the value being included in the Update
+  // determines which field should be populated. In the case that the
+  // encoding is a particular form of the base protobuf type, a specific
+  // field is used to store the value (e.g., json_val).
+  oneof value {
+    string string_val = 1;            // String value.
+    int64 int_val = 2;                // Integer value.
+    uint64 uint_val = 3;              // Unsigned integer value.
+    bool bool_val = 4;                // Bool value.
+    bytes bytes_val = 5;              // Arbitrary byte sequence value.
+    float float_val = 6 [deprecated=true]; // Deprecated - use double_val.
+    double double_val = 14;           // Floating point value.
+    Decimal64 decimal_val = 7 [deprecated=true]; // Deprecated - use double_val.
+    ScalarArray leaflist_val = 8;     // Mixed type scalar array value.
+    google.protobuf.Any any_val = 9;  // protobuf.Any encoded bytes.
+    bytes json_val = 10;              // JSON-encoded text.
+    bytes json_ietf_val = 11;         // JSON-encoded text per RFC7951.
+    string ascii_val = 12;            // Arbitrary ASCII text.
+    // Protobuf binary encoded bytes. The message type is not included.
+    // See the specification at
+    // github.com/openconfig/reference/blob/master/rpc/gnmi/protobuf-vals.md
+    // for a complete specification. [Experimental]
+    bytes proto_bytes = 13;
+  }
+}
+
+// Path encodes a data tree path as a series of repeated strings, with
+// each element of the path representing a data tree node name and the
+// associated attributes.
+// Reference: gNMI Specification Section 2.2.2.
+message Path {
+  // Elements of the path are no longer encoded as a string, but rather within
+  // the elem field as a PathElem message.
+  repeated string element = 1 [deprecated=true];
+  string origin = 2;                              // Label to disambiguate path.
+  repeated PathElem elem = 3;                     // Elements of the path.
+  string target = 4;                              // The name of the target
+                                                  // (Sec. 2.2.2.1)
+}
+
+// PathElem encodes an element of a gNMI path, along with any attributes (keys)
+// that may be associated with it.
+// Reference: gNMI Specification Section 2.2.2.
+message PathElem {
+  string name = 1;                    // The name of the element in the path.
+  map<string, string> key = 2;        // Map of key (attribute) name to value.
+}
+
+// Value encodes a data tree node's value - along with the way in which
+// the value is encoded. This message is deprecated by gNMI 0.3.0.
+// Reference: gNMI Specification Section 2.2.3.
+message Value {
+  option deprecated = true;
+  bytes value = 1;      // Value of the variable being transmitted.
+  Encoding type = 2;    // Encoding used for the value field.
+}
+
+// Encoding defines the value encoding formats that are supported by the gNMI
+// protocol. These encodings are used by both the client (when sending Set
+// messages to modify the state of the target) and the target when serializing
+// data to be returned to the client (in both Subscribe and Get RPCs).
+// Reference: gNMI Specification Section 2.3
+enum Encoding {
+  JSON = 0;           // JSON encoded text.
+  BYTES = 1;          // Arbitrarily encoded bytes.
+  PROTO = 2;          // Encoded according to scalar values of TypedValue.
+  ASCII = 3;          // ASCII text of an out-of-band agreed format.
+  JSON_IETF = 4;      // JSON encoded text as per RFC7951.
+}
+
+// Error message previously utilised to return errors to the client. Deprecated
+// in favour of using the google.golang.org/genproto/googleapis/rpc/status
+// message in the RPC response.
+// Reference: gNMI Specification Section 2.5
+message Error {
+  option deprecated = true;
+  uint32 code = 1;                // Canonical gRPC error code.
+  string message = 2;             // Human readable error.
+  google.protobuf.Any data = 3;   // Optional additional information.
+}
+
+// Decimal64 is used to encode a fixed precision decimal number. The value
+// is expressed as a set of digits with the precision specifying the
+// number of digits following the decimal point in the digit set.
+// This message is deprecated in favor of encoding all floating point types
+// as double precision.
+message Decimal64 {
+  option deprecated = true;
+  int64 digits = 1;         // Set of digits.
+  uint32 precision = 2;     // Number of digits following the decimal point.
+}
+
+// ScalarArray is used to encode a mixed-type array of values.
+message ScalarArray {
+  // The set of elements within the array. Each TypedValue message should
+  // specify only elements that have a field identifier of 1-7 (i.e., the
+  // values are scalar values).
+  repeated TypedValue element = 1;
+}
+
+// SubscribeRequest is the message sent by the client to the target when
+// initiating a subscription to a set of paths within the data tree. The
+// request field must be populated and the initial message must specify a
+// SubscriptionList to initiate a subscription.
+// Reference: gNMI Specification Section 3.5.1.1
+message SubscribeRequest {
+  oneof request {
+    SubscriptionList subscribe = 1; // Specify the paths within a subscription.
+    Poll poll = 3;                  // Trigger a polled update.
+  }
+  // Extension messages associated with the SubscribeRequest. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 5;
+  // Reserved field numbers and identifiers.
+  reserved 4;
+  reserved "aliases";
+}
+
+// Poll is sent within a SubscribeRequest to trigger the device to
+// send telemetry updates for the paths that are associated with the
+// subscription.
+// Reference: gNMI Specification Section Section 3.5.1.4
+message Poll {
+}
+
+// SubscribeResponse is the message used by the target within a Subscribe RPC.
+// The target includes a Notification message which is used to transmit values
+// of the path(s) that are associated with the subscription. The same message
+// is to indicate that the target has sent all data values once (is
+// synchronized).
+// Reference: gNMI Specification Section 3.5.1.4
+message SubscribeResponse {
+  oneof response {
+    Notification update = 1;          // Changed or sampled value for a path.
+    // Indicate target has sent all values associated with the subscription
+    // at least once.
+    bool sync_response = 3;
+    // Deprecated in favour of google.golang.org/genproto/googleapis/rpc/status
+    Error error = 4 [deprecated=true];
+  }
+  // Extension messages associated with the SubscribeResponse. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 5;
+}
+
+// SubscriptionList is used within a Subscribe message to specify the list of
+// paths that the client wishes to subscribe to. The message consists of a
+// list of (possibly prefixed) paths, and options that relate to the
+// subscription.
+// Reference: gNMI Specification Section 3.5.1.2
+message SubscriptionList {
+  Path prefix = 1;                          // Prefix used for paths.
+  repeated Subscription subscription = 2;   // Set of subscriptions to create.
+  QOSMarking qos = 4;                       // DSCP marking to be used.
+  // Mode of the subscription.
+  enum Mode {
+    STREAM = 0; // Values streamed by the target (Sec. 3.5.1.5.2).
+    ONCE = 1;   // Values sent once-off by the target (Sec. 3.5.1.5.1).
+    POLL = 2;   // Values sent in response to a poll request (Sec. 3.5.1.5.3).
+  }
+  Mode mode = 5;
+  // Whether elements of the schema that are marked as eligible for aggregation
+  // should be aggregated or not.
+  bool allow_aggregation = 6;
+  // The set of schemas that define the elements of the data tree that should
+  // be sent by the target.
+  repeated ModelData use_models = 7;
+  // The encoding that the target should use within the Notifications generated
+  // corresponding to the SubscriptionList.
+  Encoding encoding = 8;
+  // An optional field to specify that only updates to current state should be
+  // sent to a client. If set, the initial state is not sent to the client but
+  // rather only the sync message followed by any subsequent updates to the
+  // current state. For ONCE and POLL modes, this causes the server to send only
+  // the sync message (Sec. 3.5.2.3).
+  bool updates_only = 9;
+  // Reserved field numbers and identifiers.
+  reserved 3;
+  reserved "use_aliases";
+}
+
+// Subscription is a single request within a SubscriptionList. The path
+// specified is interpreted (along with the prefix) as the elements of the data
+// tree that the client is subscribing to. The mode determines how the target
+// should trigger updates to be sent.
+// Reference: gNMI Specification Section 3.5.1.3
+message Subscription {
+  Path path = 1;                    // The data tree path.
+  SubscriptionMode mode = 2;        // Subscription mode to be used.
+  uint64 sample_interval = 3;       // ns between samples in SAMPLE mode.
+  // Indicates whether values that have not changed should be sent in a SAMPLE
+  // subscription.
+  bool suppress_redundant = 4;
+  // Specifies the maximum allowable silent period in nanoseconds when
+  // suppress_redundant is in use. The target should send a value at least once
+  // in the period specified.
+  uint64 heartbeat_interval = 5;
+}
+
+// SubscriptionMode is the mode of the subscription, specifying how the
+// target must return values in a subscription.
+// Reference: gNMI Specification Section 3.5.1.3
+enum SubscriptionMode {
+  TARGET_DEFINED = 0;  // The target selects the relevant mode for each element.
+  ON_CHANGE      = 1;  // The target sends an update on element value change.
+  SAMPLE         = 2;  // The target samples values according to the interval.
+}
+
+// QOSMarking specifies the DSCP value to be set on transmitted telemetry
+// updates from the target.
+// Reference: gNMI Specification Section 3.5.1.2
+message QOSMarking {
+  uint32 marking = 1;
+}
+
+// SetRequest is sent from a client to the target to update values in the data
+// tree. Paths are either deleted by the client, or modified by means of being
+// updated, or replaced. Where a replace is used, unspecified values are
+// considered to be replaced, whereas when update is used the changes are
+// considered to be incremental. The set of changes that are specified within
+// a single SetRequest are considered to be a transaction.
+// Reference: gNMI Specification Section 3.4.1
+message SetRequest {
+  Path prefix = 1;                // Prefix used for paths in the message.
+  repeated Path delete = 2;       // Paths to be deleted from the data tree.
+  repeated Update replace = 3;    // Updates specifying elements to be replaced.
+  repeated Update update = 4;     // Updates specifying elements to updated.
+  // Extension messages associated with the SetRequest. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 5;
+}
+
+// SetResponse is the response to a SetRequest, sent from the target to the
+// client. It reports the result of the modifications to the data tree that were
+// specified by the client. Errors for this RPC should be reported using the
+// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
+// message in the RPC return. The gnmi.Error message can be used to add additional
+// details where required.
+// Reference: gNMI Specification Section 3.4.2
+message SetResponse {
+  Path prefix = 1;                      // Prefix used for paths.
+  // A set of responses specifying the result of the operations specified in
+  // the SetRequest.
+  repeated UpdateResult response = 2;
+  Error message = 3 [deprecated=true]; // The overall status of the transaction.
+  int64 timestamp = 4;                 // Timestamp of transaction (ns since epoch).
+  // Extension messages associated with the SetResponse. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 5;
+}
+
+// UpdateResult is used within the SetResponse message to communicate the
+// result of an operation specified within a SetRequest message.
+// Reference: gNMI Specification Section 3.4.2
+message UpdateResult {
+  // The operation that was associated with the Path specified.
+  enum Operation {
+    INVALID = 0;
+    DELETE = 1;           // The result relates to a delete of Path.
+    REPLACE = 2;          // The result relates to a replace of Path.
+    UPDATE = 3;           // The result relates to an update of Path.
+  }
+  // Deprecated timestamp for the UpdateResult, this field has been
+  // replaced by the timestamp within the SetResponse message, since
+  // all mutations effected by a set should be applied as a single
+  // transaction.
+  int64 timestamp = 1 [deprecated=true];
+  Path path = 2;                            // Path associated with the update.
+  Error message = 3 [deprecated=true];      // Status of the update operation.
+  Operation op = 4;                         // Update operation type.
+}
+
+// GetRequest is sent when a client initiates a Get RPC. It is used to specify
+// the set of data elements for which the target should return a snapshot of
+// data. The use_models field specifies the set of schema modules that are to
+// be used by the target - where use_models is not specified then the target
+// must use all schema models that it has.
+// Reference: gNMI Specification Section 3.3.1
+message GetRequest {
+  Path prefix = 1;                      // Prefix used for paths.
+  repeated Path path = 2;               // Paths requested by the client.
+  // Type of elements within the data tree.
+  enum DataType {
+    ALL = 0;                            // All data elements.
+    CONFIG = 1;                         // Config (rw) only elements.
+    STATE = 2;                          // State (ro) only elements.
+    // Data elements marked in the schema as operational. This refers to data
+    // elements whose value relates to the state of processes or interactions
+    // running on the device.
+    OPERATIONAL = 3;
+  }
+  DataType type = 3;                    // The type of data being requested.
+  Encoding encoding = 5;                // Encoding to be used.
+  repeated ModelData use_models = 6;    // The schema models to be used.
+  // Extension messages associated with the GetRequest. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 7;
+}
+
+// GetResponse is used by the target to respond to a GetRequest from a client.
+// The set of Notifications corresponds to the data values that are requested
+// by the client in the GetRequest.
+// Reference: gNMI Specification Section 3.3.2
+message GetResponse {
+  repeated Notification notification = 1;   // Data values.
+  Error error = 2 [deprecated=true];        // Errors that occurred in the Get.
+  // Extension messages associated with the GetResponse. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 3;
+}
+
+// CapabilityRequest is sent by the client in the Capabilities RPC to request
+// that the target reports its capabilities.
+// Reference: gNMI Specification Section 3.2.1
+message CapabilityRequest {
+  // Extension messages associated with the CapabilityRequest. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 1;
+}
+
+// CapabilityResponse is used by the target to report its capabilities to the
+// client within the Capabilities RPC.
+// Reference: gNMI Specification Section 3.2.2
+message CapabilityResponse {
+  repeated ModelData supported_models = 1;    // Supported schema models.
+  repeated Encoding supported_encodings = 2;  // Supported encodings.
+  string gNMI_version = 3;                    // Supported gNMI version.
+  // Extension messages associated with the CapabilityResponse. See the
+  // gNMI extension specification for further definition.
+  repeated Extension extension = 4;
+}
+
+// ModelData is used to describe a set of schema modules. It can be used in a
+// CapabilityResponse where a target reports the set of modules that it
+// supports, and within the SubscribeRequest and GetRequest messages to specify
+// the set of models from which data tree elements should be reported.
+// Reference: gNMI Specification Section 3.2.3
+message ModelData {
+  string name = 1;            // Name of the model.
+  string organization = 2;    // Organization publishing the model.
+  string version = 3;         // Semantic version of the model.
+}
\ No newline at end of file
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_ext.proto b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_ext.proto
new file mode 100644
index 0000000000000000000000000000000000000000..9960f12afa9d19a45b3d30fd127cb27586f02607
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_ext.proto
@@ -0,0 +1,76 @@
+syntax = "proto3";
+
+// Package gnmi_ext defines a set of extensions messages which can be optionally
+// included with the request and response messages of gNMI RPCs. A set of
+// well-known extensions are defined within this file, along with a registry for
+// extensions defined outside of this package.
+package gnmi_ext;
+
+option go_package = "github.com/openconfig/gnmi/proto/gnmi_ext";
+
+// The Extension message contains a single gNMI extension.
+message Extension {
+  oneof ext {
+    RegisteredExtension registered_ext = 1;    // A registered extension.
+    // Well known extensions.
+    MasterArbitration master_arbitration = 2;  // Master arbitration extension.
+    History history = 3;                       // History extension.
+  }
+}
+
+// The RegisteredExtension message defines an extension which is defined outside
+// of this file.
+message RegisteredExtension {
+  ExtensionID id = 1; // The unique ID assigned to this extension.
+  bytes msg = 2;      // The binary-marshalled protobuf extension payload.
+}
+
+// RegisteredExtension is an enumeration acting as a registry for extensions
+// defined by external sources.
+enum ExtensionID {
+  EID_UNSET = 0;
+  // New extensions are to be defined within this enumeration - their definition
+  // MUST link to a reference describing their implementation.
+
+  // An experimental extension that may be used during prototyping of a new
+  // extension.
+  EID_EXPERIMENTAL = 999;
+}
+
+// MasterArbitration is used to select the master among multiple gNMI clients
+// with the same Roles. The client with the largest election_id is honored as
+// the master.
+// The document about gNMI master arbitration can be found at
+// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-master-arbitration.md
+message MasterArbitration {
+  Role role = 1;
+  Uint128 election_id = 2;
+}
+
+// Representation of unsigned 128-bit integer.
+message Uint128 {
+  uint64 high = 1;
+  uint64 low = 2;
+}
+
+// There can be one master for each role. The role is identified by its id.
+message Role {
+  string id = 1;
+  // More fields can be added if needed, for example, to specify what paths the
+  // role can read/write.
+}
+
+// The History extension allows clients to request historical data. Its
+// spec can be found at
+// https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md
+message History {
+  oneof request {
+    int64 snapshot_time = 1; // Nanoseconds since the epoch
+    TimeRange range = 2;
+  }
+}
+
+message TimeRange {
+  int64 start = 1; // Nanoseconds since the epoch
+  int64 end = 2;   // Nanoseconds since the epoch
+}
\ No newline at end of file
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.py b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.py
new file mode 100644
index 0000000000000000000000000000000000000000..af67f9a8ca1d4e01d1a95a0d86adbabe6d8e83ea
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: gnmi.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
+from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\ngnmi.proto\x12\x04gnmi\x1a\x19google/protobuf/any.proto\x1a google/protobuf/descriptor.proto\"\xa0\x01\n\tExtension\x12\x33\n\x0eregistered_ext\x18\x01 \x01(\x0b\x32\x19.gnmi.RegisteredExtensionH\x00\x12\x35\n\x12master_arbitration\x18\x02 \x01(\x0b\x32\x17.gnmi.MasterArbitrationH\x00\x12 \n\x07history\x18\x03 \x01(\x0b\x32\r.gnmi.HistoryH\x00\x42\x05\n\x03\x65xt\"A\n\x13RegisteredExtension\x12\x1d\n\x02id\x18\x01 \x01(\x0e\x32\x11.gnmi.ExtensionID\x12\x0b\n\x03msg\x18\x02 \x01(\x0c\"Q\n\x11MasterArbitration\x12\x18\n\x04role\x18\x01 \x01(\x0b\x32\n.gnmi.Role\x12\"\n\x0b\x65lection_id\x18\x02 \x01(\x0b\x32\r.gnmi.Uint128\"$\n\x07Uint128\x12\x0c\n\x04high\x18\x01 \x01(\x04\x12\x0b\n\x03low\x18\x02 \x01(\x04\"\x12\n\x04Role\x12\n\n\x02id\x18\x01 \x01(\t\"O\n\x07History\x12\x17\n\rsnapshot_time\x18\x01 \x01(\x03H\x00\x12 \n\x05range\x18\x02 \x01(\x0b\x32\x0f.gnmi.TimeRangeH\x00\x42\t\n\x07request\"\'\n\tTimeRange\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\"\x94\x01\n\x0cNotification\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x1a\n\x06prefix\x18\x02 \x01(\x0b\x32\n.gnmi.Path\x12\x1c\n\x06update\x18\x04 \x03(\x0b\x32\x0c.gnmi.Update\x12\x1a\n\x06\x64\x65lete\x18\x05 \x03(\x0b\x32\n.gnmi.Path\x12\x0e\n\x06\x61tomic\x18\x06 \x01(\x08J\x04\x08\x03\x10\x04R\x05\x61lias\"u\n\x06Update\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0b.gnmi.ValueB\x02\x18\x01\x12\x1d\n\x03val\x18\x03 \x01(\x0b\x32\x10.gnmi.TypedValue\x12\x12\n\nduplicates\x18\x04 \x01(\r\"\x83\x03\n\nTypedValue\x12\x14\n\nstring_val\x18\x01 \x01(\tH\x00\x12\x11\n\x07int_val\x18\x02 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x03 \x01(\x04H\x00\x12\x12\n\x08\x62ool_val\x18\x04 \x01(\x08H\x00\x12\x13\n\tbytes_val\x18\x05 \x01(\x0cH\x00\x12\x17\n\tfloat_val\x18\x06 \x01(\x02\x42\x02\x18\x01H\x00\x12\x14\n\ndouble_val\x18\x0e \x01(\x01H\x00\x12*\n\x0b\x64\x65\x63imal_val\x18\x07 \x01(\x0b\x32\x0f.gnmi.Decimal64B\x02\x18\x01H\x00\x12)\n\x0cleaflist_val\x18\x08 \x01(\x0b\x32\x11.gnmi.ScalarArrayH\x00\x12\'\n\x07\x61ny_val\x18\t \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12\x12\n\x08json_val\x18\n \x01(\x0cH\x00\x12\x17\n\rjson_ietf_val\x18\x0b \x01(\x0cH\x00\x12\x13\n\tascii_val\x18\x0c \x01(\tH\x00\x12\x15\n\x0bproto_bytes\x18\r \x01(\x0cH\x00\x42\x07\n\x05value\"Y\n\x04Path\x12\x13\n\x07\x65lement\x18\x01 \x03(\tB\x02\x18\x01\x12\x0e\n\x06origin\x18\x02 \x01(\t\x12\x1c\n\x04\x65lem\x18\x03 \x03(\x0b\x32\x0e.gnmi.PathElem\x12\x0e\n\x06target\x18\x04 \x01(\t\"j\n\x08PathElem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x03key\x18\x02 \x03(\x0b\x32\x17.gnmi.PathElem.KeyEntry\x1a*\n\x08KeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"8\n\x05Value\x12\r\n\x05value\x18\x01 \x01(\x0c\x12\x1c\n\x04type\x18\x02 \x01(\x0e\x32\x0e.gnmi.Encoding:\x02\x18\x01\"N\n\x05\x45rror\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x18\x01\"2\n\tDecimal64\x12\x0e\n\x06\x64igits\x18\x01 \x01(\x03\x12\x11\n\tprecision\x18\x02 \x01(\r:\x02\x18\x01\"0\n\x0bScalarArray\x12!\n\x07\x65lement\x18\x01 \x03(\x0b\x32\x10.gnmi.TypedValue\"\x99\x01\n\x10SubscribeRequest\x12+\n\tsubscribe\x18\x01 \x01(\x0b\x32\x16.gnmi.SubscriptionListH\x00\x12\x1a\n\x04poll\x18\x03 \x01(\x0b\x32\n.gnmi.PollH\x00\x12\"\n\textension\x18\x05 \x03(\x0b\x32\x0f.gnmi.ExtensionB\t\n\x07requestJ\x04\x08\x04\x10\x05R\x07\x61liases\"\x06\n\x04Poll\"\xa4\x01\n\x11SubscribeResponse\x12$\n\x06update\x18\x01 \x01(\x0b\x32\x12.gnmi.NotificationH\x00\x12\x17\n\rsync_response\x18\x03 \x01(\x08H\x00\x12 \n\x05\x65rror\x18\x04 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01H\x00\x12\"\n\textension\x18\x05 \x03(\x0b\x32\x0f.gnmi.ExtensionB\n\n\x08response\"\xd5\x02\n\x10SubscriptionList\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12(\n\x0csubscription\x18\x02 \x03(\x0b\x32\x12.gnmi.Subscription\x12\x1d\n\x03qos\x18\x04 \x01(\x0b\x32\x10.gnmi.QOSMarking\x12)\n\x04mode\x18\x05 \x01(\x0e\x32\x1b.gnmi.SubscriptionList.Mode\x12\x19\n\x11\x61llow_aggregation\x18\x06 \x01(\x08\x12#\n\nuse_models\x18\x07 \x03(\x0b\x32\x0f.gnmi.ModelData\x12 \n\x08\x65ncoding\x18\x08 \x01(\x0e\x32\x0e.gnmi.Encoding\x12\x14\n\x0cupdates_only\x18\t \x01(\x08\"&\n\x04Mode\x12\n\n\x06STREAM\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\x08\n\x04POLL\x10\x02J\x04\x08\x03\x10\x04R\x0buse_aliases\"\x9f\x01\n\x0cSubscription\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12$\n\x04mode\x18\x02 \x01(\x0e\x32\x16.gnmi.SubscriptionMode\x12\x17\n\x0fsample_interval\x18\x03 \x01(\x04\x12\x1a\n\x12suppress_redundant\x18\x04 \x01(\x08\x12\x1a\n\x12heartbeat_interval\x18\x05 \x01(\x04\"\x1d\n\nQOSMarking\x12\x0f\n\x07marking\x18\x01 \x01(\r\"\xa5\x01\n\nSetRequest\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x1a\n\x06\x64\x65lete\x18\x02 \x03(\x0b\x32\n.gnmi.Path\x12\x1d\n\x07replace\x18\x03 \x03(\x0b\x32\x0c.gnmi.Update\x12\x1c\n\x06update\x18\x04 \x03(\x0b\x32\x0c.gnmi.Update\x12\"\n\textension\x18\x05 \x03(\x0b\x32\x0f.gnmi.Extension\"\xa8\x01\n\x0bSetResponse\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12$\n\x08response\x18\x02 \x03(\x0b\x32\x12.gnmi.UpdateResult\x12 \n\x07message\x18\x03 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\x03\x12\"\n\textension\x18\x05 \x03(\x0b\x32\x0f.gnmi.Extension\"\xca\x01\n\x0cUpdateResult\x12\x15\n\ttimestamp\x18\x01 \x01(\x03\x42\x02\x18\x01\x12\x18\n\x04path\x18\x02 \x01(\x0b\x32\n.gnmi.Path\x12 \n\x07message\x18\x03 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12(\n\x02op\x18\x04 \x01(\x0e\x32\x1c.gnmi.UpdateResult.Operation\"=\n\tOperation\x12\x0b\n\x07INVALID\x10\x00\x12\n\n\x06\x44\x45LETE\x10\x01\x12\x0b\n\x07REPLACE\x10\x02\x12\n\n\x06UPDATE\x10\x03\"\x93\x02\n\nGetRequest\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x18\n\x04path\x18\x02 \x03(\x0b\x32\n.gnmi.Path\x12\'\n\x04type\x18\x03 \x01(\x0e\x32\x19.gnmi.GetRequest.DataType\x12 \n\x08\x65ncoding\x18\x05 \x01(\x0e\x32\x0e.gnmi.Encoding\x12#\n\nuse_models\x18\x06 \x03(\x0b\x32\x0f.gnmi.ModelData\x12\"\n\textension\x18\x07 \x03(\x0b\x32\x0f.gnmi.Extension\";\n\x08\x44\x61taType\x12\x07\n\x03\x41LL\x10\x00\x12\n\n\x06\x43ONFIG\x10\x01\x12\t\n\x05STATE\x10\x02\x12\x0f\n\x0bOPERATIONAL\x10\x03\"{\n\x0bGetResponse\x12(\n\x0cnotification\x18\x01 \x03(\x0b\x32\x12.gnmi.Notification\x12\x1e\n\x05\x65rror\x18\x02 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12\"\n\textension\x18\x03 \x03(\x0b\x32\x0f.gnmi.Extension\"7\n\x11\x43\x61pabilityRequest\x12\"\n\textension\x18\x01 \x03(\x0b\x32\x0f.gnmi.Extension\"\xa6\x01\n\x12\x43\x61pabilityResponse\x12)\n\x10supported_models\x18\x01 \x03(\x0b\x32\x0f.gnmi.ModelData\x12+\n\x13supported_encodings\x18\x02 \x03(\x0e\x32\x0e.gnmi.Encoding\x12\x14\n\x0cgNMI_version\x18\x03 \x01(\t\x12\"\n\textension\x18\x04 \x03(\x0b\x32\x0f.gnmi.Extension\"@\n\tModelData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0corganization\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t*3\n\x0b\x45xtensionID\x12\r\n\tEID_UNSET\x10\x00\x12\x15\n\x10\x45ID_EXPERIMENTAL\x10\xe7\x07*D\n\x08\x45ncoding\x12\x08\n\x04JSON\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\t\n\x05\x41SCII\x10\x03\x12\r\n\tJSON_IETF\x10\x04*A\n\x10SubscriptionMode\x12\x12\n\x0eTARGET_DEFINED\x10\x00\x12\r\n\tON_CHANGE\x10\x01\x12\n\n\x06SAMPLE\x10\x02\x32\xe3\x01\n\x04gNMI\x12\x41\n\x0c\x43\x61pabilities\x12\x17.gnmi.CapabilityRequest\x1a\x18.gnmi.CapabilityResponse\x12*\n\x03Get\x12\x10.gnmi.GetRequest\x1a\x11.gnmi.GetResponse\x12*\n\x03Set\x12\x10.gnmi.SetRequest\x1a\x11.gnmi.SetResponse\x12@\n\tSubscribe\x12\x16.gnmi.SubscribeRequest\x1a\x17.gnmi.SubscribeResponse(\x01\x30\x01:3\n\x0cgnmi_service\x12\x1c.google.protobuf.FileOptions\x18\xe9\x07 \x01(\tBS\n\x15\x63om.github.gnmi.protoB\tGnmiProtoP\x01Z%github.com/openconfig/gnmi/proto/gnmi\xca>\x05\x30.8.0b\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'gnmi_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+  google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(gnmi_service)
+
+  DESCRIPTOR._options = None
+  DESCRIPTOR._serialized_options = b'\n\025com.github.gnmi.protoB\tGnmiProtoP\001Z%github.com/openconfig/gnmi/proto/gnmi\312>\0050.8.0'
+  _UPDATE.fields_by_name['value']._options = None
+  _UPDATE.fields_by_name['value']._serialized_options = b'\030\001'
+  _TYPEDVALUE.fields_by_name['float_val']._options = None
+  _TYPEDVALUE.fields_by_name['float_val']._serialized_options = b'\030\001'
+  _TYPEDVALUE.fields_by_name['decimal_val']._options = None
+  _TYPEDVALUE.fields_by_name['decimal_val']._serialized_options = b'\030\001'
+  _PATH.fields_by_name['element']._options = None
+  _PATH.fields_by_name['element']._serialized_options = b'\030\001'
+  _PATHELEM_KEYENTRY._options = None
+  _PATHELEM_KEYENTRY._serialized_options = b'8\001'
+  _VALUE._options = None
+  _VALUE._serialized_options = b'\030\001'
+  _ERROR._options = None
+  _ERROR._serialized_options = b'\030\001'
+  _DECIMAL64._options = None
+  _DECIMAL64._serialized_options = b'\030\001'
+  _SUBSCRIBERESPONSE.fields_by_name['error']._options = None
+  _SUBSCRIBERESPONSE.fields_by_name['error']._serialized_options = b'\030\001'
+  _SETRESPONSE.fields_by_name['message']._options = None
+  _SETRESPONSE.fields_by_name['message']._serialized_options = b'\030\001'
+  _UPDATERESULT.fields_by_name['timestamp']._options = None
+  _UPDATERESULT.fields_by_name['timestamp']._serialized_options = b'\030\001'
+  _UPDATERESULT.fields_by_name['message']._options = None
+  _UPDATERESULT.fields_by_name['message']._serialized_options = b'\030\001'
+  _GETRESPONSE.fields_by_name['error']._options = None
+  _GETRESPONSE.fields_by_name['error']._serialized_options = b'\030\001'
+  _EXTENSIONID._serialized_start=3780
+  _EXTENSIONID._serialized_end=3831
+  _ENCODING._serialized_start=3833
+  _ENCODING._serialized_end=3901
+  _SUBSCRIPTIONMODE._serialized_start=3903
+  _SUBSCRIPTIONMODE._serialized_end=3968
+  _EXTENSION._serialized_start=82
+  _EXTENSION._serialized_end=242
+  _REGISTEREDEXTENSION._serialized_start=244
+  _REGISTEREDEXTENSION._serialized_end=309
+  _MASTERARBITRATION._serialized_start=311
+  _MASTERARBITRATION._serialized_end=392
+  _UINT128._serialized_start=394
+  _UINT128._serialized_end=430
+  _ROLE._serialized_start=432
+  _ROLE._serialized_end=450
+  _HISTORY._serialized_start=452
+  _HISTORY._serialized_end=531
+  _TIMERANGE._serialized_start=533
+  _TIMERANGE._serialized_end=572
+  _NOTIFICATION._serialized_start=575
+  _NOTIFICATION._serialized_end=723
+  _UPDATE._serialized_start=725
+  _UPDATE._serialized_end=842
+  _TYPEDVALUE._serialized_start=845
+  _TYPEDVALUE._serialized_end=1232
+  _PATH._serialized_start=1234
+  _PATH._serialized_end=1323
+  _PATHELEM._serialized_start=1325
+  _PATHELEM._serialized_end=1431
+  _PATHELEM_KEYENTRY._serialized_start=1389
+  _PATHELEM_KEYENTRY._serialized_end=1431
+  _VALUE._serialized_start=1433
+  _VALUE._serialized_end=1489
+  _ERROR._serialized_start=1491
+  _ERROR._serialized_end=1569
+  _DECIMAL64._serialized_start=1571
+  _DECIMAL64._serialized_end=1621
+  _SCALARARRAY._serialized_start=1623
+  _SCALARARRAY._serialized_end=1671
+  _SUBSCRIBEREQUEST._serialized_start=1674
+  _SUBSCRIBEREQUEST._serialized_end=1827
+  _POLL._serialized_start=1829
+  _POLL._serialized_end=1835
+  _SUBSCRIBERESPONSE._serialized_start=1838
+  _SUBSCRIBERESPONSE._serialized_end=2002
+  _SUBSCRIPTIONLIST._serialized_start=2005
+  _SUBSCRIPTIONLIST._serialized_end=2346
+  _SUBSCRIPTIONLIST_MODE._serialized_start=2289
+  _SUBSCRIPTIONLIST_MODE._serialized_end=2327
+  _SUBSCRIPTION._serialized_start=2349
+  _SUBSCRIPTION._serialized_end=2508
+  _QOSMARKING._serialized_start=2510
+  _QOSMARKING._serialized_end=2539
+  _SETREQUEST._serialized_start=2542
+  _SETREQUEST._serialized_end=2707
+  _SETRESPONSE._serialized_start=2710
+  _SETRESPONSE._serialized_end=2878
+  _UPDATERESULT._serialized_start=2881
+  _UPDATERESULT._serialized_end=3083
+  _UPDATERESULT_OPERATION._serialized_start=3022
+  _UPDATERESULT_OPERATION._serialized_end=3083
+  _GETREQUEST._serialized_start=3086
+  _GETREQUEST._serialized_end=3361
+  _GETREQUEST_DATATYPE._serialized_start=3302
+  _GETREQUEST_DATATYPE._serialized_end=3361
+  _GETRESPONSE._serialized_start=3363
+  _GETRESPONSE._serialized_end=3486
+  _CAPABILITYREQUEST._serialized_start=3488
+  _CAPABILITYREQUEST._serialized_end=3543
+  _CAPABILITYRESPONSE._serialized_start=3546
+  _CAPABILITYRESPONSE._serialized_end=3712
+  _MODELDATA._serialized_start=3714
+  _MODELDATA._serialized_end=3778
+  _GNMI._serialized_start=3971
+  _GNMI._serialized_end=4198
+# @@protoc_insertion_point(module_scope)
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.py.old b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.py.old
new file mode 100644
index 0000000000000000000000000000000000000000..313674f8ce5be1586c63df02226570f5082544ba
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.py.old
@@ -0,0 +1,2037 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: proto/gnmi/gnmi.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
+from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='proto/gnmi/gnmi.proto',
+  package='gnmi',
+  syntax='proto3',
+  serialized_pb=_b('\n\x15proto/gnmi/gnmi.proto\x12\x04gnmi\x1a\x19google/protobuf/any.proto\x1a google/protobuf/descriptor.proto\"\x86\x01\n\x0cNotification\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x1a\n\x06prefix\x18\x02 \x01(\x0b\x32\n.gnmi.Path\x12\r\n\x05\x61lias\x18\x03 \x01(\t\x12\x1c\n\x06update\x18\x04 \x03(\x0b\x32\x0c.gnmi.Update\x12\x1a\n\x06\x64\x65lete\x18\x05 \x03(\x0b\x32\n.gnmi.Path\"u\n\x06Update\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0b.gnmi.ValueB\x02\x18\x01\x12\x1d\n\x03val\x18\x03 \x01(\x0b\x32\x10.gnmi.TypedValue\x12\x12\n\nduplicates\x18\x04 \x01(\r\"\xce\x02\n\nTypedValue\x12\x14\n\nstring_val\x18\x01 \x01(\tH\x00\x12\x11\n\x07int_val\x18\x02 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x03 \x01(\x04H\x00\x12\x12\n\x08\x62ool_val\x18\x04 \x01(\x08H\x00\x12\x13\n\tbytes_val\x18\x05 \x01(\x0cH\x00\x12\x13\n\tfloat_val\x18\x06 \x01(\x02H\x00\x12&\n\x0b\x64\x65\x63imal_val\x18\x07 \x01(\x0b\x32\x0f.gnmi.Decimal64H\x00\x12)\n\x0cleaflist_val\x18\x08 \x01(\x0b\x32\x11.gnmi.ScalarArrayH\x00\x12\'\n\x07\x61ny_val\x18\t \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12\x12\n\x08json_val\x18\n \x01(\x0cH\x00\x12\x17\n\rjson_ietf_val\x18\x0b \x01(\x0cH\x00\x12\x13\n\tascii_val\x18\x0c \x01(\tH\x00\x42\x07\n\x05value\"Y\n\x04Path\x12\x13\n\x07\x65lement\x18\x01 \x03(\tB\x02\x18\x01\x12\x0e\n\x06origin\x18\x02 \x01(\t\x12\x1c\n\x04\x65lem\x18\x03 \x03(\x0b\x32\x0e.gnmi.PathElem\x12\x0e\n\x06target\x18\x04 \x01(\t\"j\n\x08PathElem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x03key\x18\x02 \x03(\x0b\x32\x17.gnmi.PathElem.KeyEntry\x1a*\n\x08KeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"8\n\x05Value\x12\r\n\x05value\x18\x01 \x01(\x0c\x12\x1c\n\x04type\x18\x02 \x01(\x0e\x32\x0e.gnmi.Encoding:\x02\x18\x01\"N\n\x05\x45rror\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x18\x01\".\n\tDecimal64\x12\x0e\n\x06\x64igits\x18\x01 \x01(\x04\x12\x11\n\tprecision\x18\x02 \x01(\r\"0\n\x0bScalarArray\x12!\n\x07\x65lement\x18\x01 \x03(\x0b\x32\x10.gnmi.TypedValue\"\x8a\x01\n\x10SubscribeRequest\x12+\n\tsubscribe\x18\x01 \x01(\x0b\x32\x16.gnmi.SubscriptionListH\x00\x12\x1a\n\x04poll\x18\x03 \x01(\x0b\x32\n.gnmi.PollH\x00\x12\"\n\x07\x61liases\x18\x04 \x01(\x0b\x32\x0f.gnmi.AliasListH\x00\x42\t\n\x07request\"\x06\n\x04Poll\"\x80\x01\n\x11SubscribeResponse\x12$\n\x06update\x18\x01 \x01(\x0b\x32\x12.gnmi.NotificationH\x00\x12\x17\n\rsync_response\x18\x03 \x01(\x08H\x00\x12 \n\x05\x65rror\x18\x04 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01H\x00\x42\n\n\x08response\"\xd7\x02\n\x10SubscriptionList\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12(\n\x0csubscription\x18\x02 \x03(\x0b\x32\x12.gnmi.Subscription\x12\x13\n\x0buse_aliases\x18\x03 \x01(\x08\x12\x1d\n\x03qos\x18\x04 \x01(\x0b\x32\x10.gnmi.QOSMarking\x12)\n\x04mode\x18\x05 \x01(\x0e\x32\x1b.gnmi.SubscriptionList.Mode\x12\x19\n\x11\x61llow_aggregation\x18\x06 \x01(\x08\x12#\n\nuse_models\x18\x07 \x03(\x0b\x32\x0f.gnmi.ModelData\x12 \n\x08\x65ncoding\x18\x08 \x01(\x0e\x32\x0e.gnmi.Encoding\x12\x14\n\x0cupdates_only\x18\t \x01(\x08\"&\n\x04Mode\x12\n\n\x06STREAM\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\x08\n\x04POLL\x10\x02\"\x9f\x01\n\x0cSubscription\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12$\n\x04mode\x18\x02 \x01(\x0e\x32\x16.gnmi.SubscriptionMode\x12\x17\n\x0fsample_interval\x18\x03 \x01(\x04\x12\x1a\n\x12suppress_redundant\x18\x04 \x01(\x08\x12\x1a\n\x12heartbeat_interval\x18\x05 \x01(\x04\"\x1d\n\nQOSMarking\x12\x0f\n\x07marking\x18\x01 \x01(\r\"0\n\x05\x41lias\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\r\n\x05\x61lias\x18\x02 \x01(\t\"\'\n\tAliasList\x12\x1a\n\x05\x61lias\x18\x01 \x03(\x0b\x32\x0b.gnmi.Alias\"\x81\x01\n\nSetRequest\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x1a\n\x06\x64\x65lete\x18\x02 \x03(\x0b\x32\n.gnmi.Path\x12\x1d\n\x07replace\x18\x03 \x03(\x0b\x32\x0c.gnmi.Update\x12\x1c\n\x06update\x18\x04 \x03(\x0b\x32\x0c.gnmi.Update\"\x84\x01\n\x0bSetResponse\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12$\n\x08response\x18\x02 \x03(\x0b\x32\x12.gnmi.UpdateResult\x12 \n\x07message\x18\x03 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\x03\"\xca\x01\n\x0cUpdateResult\x12\x15\n\ttimestamp\x18\x01 \x01(\x03\x42\x02\x18\x01\x12\x18\n\x04path\x18\x02 \x01(\x0b\x32\n.gnmi.Path\x12 \n\x07message\x18\x03 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12(\n\x02op\x18\x04 \x01(\x0e\x32\x1c.gnmi.UpdateResult.Operation\"=\n\tOperation\x12\x0b\n\x07INVALID\x10\x00\x12\n\n\x06\x44\x45LETE\x10\x01\x12\x0b\n\x07REPLACE\x10\x02\x12\n\n\x06UPDATE\x10\x03\"\xef\x01\n\nGetRequest\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x18\n\x04path\x18\x02 \x03(\x0b\x32\n.gnmi.Path\x12\'\n\x04type\x18\x03 \x01(\x0e\x32\x19.gnmi.GetRequest.DataType\x12 \n\x08\x65ncoding\x18\x05 \x01(\x0e\x32\x0e.gnmi.Encoding\x12#\n\nuse_models\x18\x06 \x03(\x0b\x32\x0f.gnmi.ModelData\";\n\x08\x44\x61taType\x12\x07\n\x03\x41LL\x10\x00\x12\n\n\x06\x43ONFIG\x10\x01\x12\t\n\x05STATE\x10\x02\x12\x0f\n\x0bOPERATIONAL\x10\x03\"W\n\x0bGetResponse\x12(\n\x0cnotification\x18\x01 \x03(\x0b\x32\x12.gnmi.Notification\x12\x1e\n\x05\x65rror\x18\x02 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\"\x13\n\x11\x43\x61pabilityRequest\"\x82\x01\n\x12\x43\x61pabilityResponse\x12)\n\x10supported_models\x18\x01 \x03(\x0b\x32\x0f.gnmi.ModelData\x12+\n\x13supported_encodings\x18\x02 \x03(\x0e\x32\x0e.gnmi.Encoding\x12\x14\n\x0cgNMI_version\x18\x03 \x01(\t\"@\n\tModelData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0corganization\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t*D\n\x08\x45ncoding\x12\x08\n\x04JSON\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\t\n\x05\x41SCII\x10\x03\x12\r\n\tJSON_IETF\x10\x04*A\n\x10SubscriptionMode\x12\x12\n\x0eTARGET_DEFINED\x10\x00\x12\r\n\tON_CHANGE\x10\x01\x12\n\n\x06SAMPLE\x10\x02\x32\xe3\x01\n\x04gNMI\x12\x41\n\x0c\x43\x61pabilities\x12\x17.gnmi.CapabilityRequest\x1a\x18.gnmi.CapabilityResponse\x12*\n\x03Get\x12\x10.gnmi.GetRequest\x1a\x11.gnmi.GetResponse\x12*\n\x03Set\x12\x10.gnmi.SetRequest\x1a\x11.gnmi.SetResponse\x12@\n\tSubscribe\x12\x16.gnmi.SubscribeRequest\x1a\x17.gnmi.SubscribeResponse(\x01\x30\x01:3\n\x0cgnmi_service\x12\x1c.google.protobuf.FileOptions\x18\xe9\x07 \x01(\tB\x08\xca>\x05\x30.5.0b\x06proto3')
+  ,
+  dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,])
+
+_ENCODING = _descriptor.EnumDescriptor(
+  name='Encoding',
+  full_name='gnmi.Encoding',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='JSON', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BYTES', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='PROTO', index=2, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ASCII', index=3, number=3,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='JSON_IETF', index=4, number=4,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=3053,
+  serialized_end=3121,
+)
+_sym_db.RegisterEnumDescriptor(_ENCODING)
+
+Encoding = enum_type_wrapper.EnumTypeWrapper(_ENCODING)
+_SUBSCRIPTIONMODE = _descriptor.EnumDescriptor(
+  name='SubscriptionMode',
+  full_name='gnmi.SubscriptionMode',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='TARGET_DEFINED', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ON_CHANGE', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='SAMPLE', index=2, number=2,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=3123,
+  serialized_end=3188,
+)
+_sym_db.RegisterEnumDescriptor(_SUBSCRIPTIONMODE)
+
+SubscriptionMode = enum_type_wrapper.EnumTypeWrapper(_SUBSCRIPTIONMODE)
+JSON = 0
+BYTES = 1
+PROTO = 2
+ASCII = 3
+JSON_IETF = 4
+TARGET_DEFINED = 0
+ON_CHANGE = 1
+SAMPLE = 2
+
+GNMI_SERVICE_FIELD_NUMBER = 1001
+gnmi_service = _descriptor.FieldDescriptor(
+  name='gnmi_service', full_name='gnmi.gnmi_service', index=0,
+  number=1001, type=9, cpp_type=9, label=1,
+  has_default_value=False, default_value=_b("").decode('utf-8'),
+  message_type=None, enum_type=None, containing_type=None,
+  is_extension=True, extension_scope=None,
+  options=None)
+
+_SUBSCRIPTIONLIST_MODE = _descriptor.EnumDescriptor(
+  name='Mode',
+  full_name='gnmi.SubscriptionList.Mode',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='STREAM', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='ONCE', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='POLL', index=2, number=2,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=1706,
+  serialized_end=1744,
+)
+_sym_db.RegisterEnumDescriptor(_SUBSCRIPTIONLIST_MODE)
+
+_UPDATERESULT_OPERATION = _descriptor.EnumDescriptor(
+  name='Operation',
+  full_name='gnmi.UpdateResult.Operation',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='INVALID', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DELETE', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='REPLACE', index=2, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='UPDATE', index=3, number=3,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=2439,
+  serialized_end=2500,
+)
+_sym_db.RegisterEnumDescriptor(_UPDATERESULT_OPERATION)
+
+_GETREQUEST_DATATYPE = _descriptor.EnumDescriptor(
+  name='DataType',
+  full_name='gnmi.GetRequest.DataType',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='ALL', index=0, number=0,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='CONFIG', index=1, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='STATE', index=2, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='OPERATIONAL', index=3, number=3,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=2683,
+  serialized_end=2742,
+)
+_sym_db.RegisterEnumDescriptor(_GETREQUEST_DATATYPE)
+
+
+_NOTIFICATION = _descriptor.Descriptor(
+  name='Notification',
+  full_name='gnmi.Notification',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='gnmi.Notification.timestamp', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='prefix', full_name='gnmi.Notification.prefix', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='gnmi.Notification.alias', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='update', full_name='gnmi.Notification.update', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='gnmi.Notification.delete', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=93,
+  serialized_end=227,
+)
+
+
+_UPDATE = _descriptor.Descriptor(
+  name='Update',
+  full_name='gnmi.Update',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gnmi.Update.path', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='gnmi.Update.value', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+    _descriptor.FieldDescriptor(
+      name='val', full_name='gnmi.Update.val', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='duplicates', full_name='gnmi.Update.duplicates', index=3,
+      number=4, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=229,
+  serialized_end=346,
+)
+
+
+_TYPEDVALUE = _descriptor.Descriptor(
+  name='TypedValue',
+  full_name='gnmi.TypedValue',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='string_val', full_name='gnmi.TypedValue.string_val', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='int_val', full_name='gnmi.TypedValue.int_val', index=1,
+      number=2, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='uint_val', full_name='gnmi.TypedValue.uint_val', index=2,
+      number=3, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='bool_val', full_name='gnmi.TypedValue.bool_val', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='bytes_val', full_name='gnmi.TypedValue.bytes_val', index=4,
+      number=5, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='float_val', full_name='gnmi.TypedValue.float_val', index=5,
+      number=6, type=2, cpp_type=6, label=1,
+      has_default_value=False, default_value=float(0),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='decimal_val', full_name='gnmi.TypedValue.decimal_val', index=6,
+      number=7, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='leaflist_val', full_name='gnmi.TypedValue.leaflist_val', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='any_val', full_name='gnmi.TypedValue.any_val', index=8,
+      number=9, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='json_val', full_name='gnmi.TypedValue.json_val', index=9,
+      number=10, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='json_ietf_val', full_name='gnmi.TypedValue.json_ietf_val', index=10,
+      number=11, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='ascii_val', full_name='gnmi.TypedValue.ascii_val', index=11,
+      number=12, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='value', full_name='gnmi.TypedValue.value',
+      index=0, containing_type=None, fields=[]),
+  ],
+  serialized_start=349,
+  serialized_end=683,
+)
+
+
+_PATH = _descriptor.Descriptor(
+  name='Path',
+  full_name='gnmi.Path',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='element', full_name='gnmi.Path.element', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+    _descriptor.FieldDescriptor(
+      name='origin', full_name='gnmi.Path.origin', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='elem', full_name='gnmi.Path.elem', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='target', full_name='gnmi.Path.target', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=685,
+  serialized_end=774,
+)
+
+
+_PATHELEM_KEYENTRY = _descriptor.Descriptor(
+  name='KeyEntry',
+  full_name='gnmi.PathElem.KeyEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='gnmi.PathElem.KeyEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='gnmi.PathElem.KeyEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=840,
+  serialized_end=882,
+)
+
+_PATHELEM = _descriptor.Descriptor(
+  name='PathElem',
+  full_name='gnmi.PathElem',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gnmi.PathElem.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='key', full_name='gnmi.PathElem.key', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[_PATHELEM_KEYENTRY, ],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=776,
+  serialized_end=882,
+)
+
+
+_VALUE = _descriptor.Descriptor(
+  name='Value',
+  full_name='gnmi.Value',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='value', full_name='gnmi.Value.value', index=0,
+      number=1, type=12, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b(""),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='gnmi.Value.type', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001')),
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=884,
+  serialized_end=940,
+)
+
+
+_ERROR = _descriptor.Descriptor(
+  name='Error',
+  full_name='gnmi.Error',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='code', full_name='gnmi.Error.code', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='message', full_name='gnmi.Error.message', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='data', full_name='gnmi.Error.data', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001')),
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=942,
+  serialized_end=1020,
+)
+
+
+_DECIMAL64 = _descriptor.Descriptor(
+  name='Decimal64',
+  full_name='gnmi.Decimal64',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='digits', full_name='gnmi.Decimal64.digits', index=0,
+      number=1, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='precision', full_name='gnmi.Decimal64.precision', index=1,
+      number=2, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1022,
+  serialized_end=1068,
+)
+
+
+_SCALARARRAY = _descriptor.Descriptor(
+  name='ScalarArray',
+  full_name='gnmi.ScalarArray',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='element', full_name='gnmi.ScalarArray.element', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1070,
+  serialized_end=1118,
+)
+
+
+_SUBSCRIBEREQUEST = _descriptor.Descriptor(
+  name='SubscribeRequest',
+  full_name='gnmi.SubscribeRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='subscribe', full_name='gnmi.SubscribeRequest.subscribe', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='poll', full_name='gnmi.SubscribeRequest.poll', index=1,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='aliases', full_name='gnmi.SubscribeRequest.aliases', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='request', full_name='gnmi.SubscribeRequest.request',
+      index=0, containing_type=None, fields=[]),
+  ],
+  serialized_start=1121,
+  serialized_end=1259,
+)
+
+
+_POLL = _descriptor.Descriptor(
+  name='Poll',
+  full_name='gnmi.Poll',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1261,
+  serialized_end=1267,
+)
+
+
+_SUBSCRIBERESPONSE = _descriptor.Descriptor(
+  name='SubscribeResponse',
+  full_name='gnmi.SubscribeResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='update', full_name='gnmi.SubscribeResponse.update', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='sync_response', full_name='gnmi.SubscribeResponse.sync_response', index=1,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='gnmi.SubscribeResponse.error', index=2,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+    _descriptor.OneofDescriptor(
+      name='response', full_name='gnmi.SubscribeResponse.response',
+      index=0, containing_type=None, fields=[]),
+  ],
+  serialized_start=1270,
+  serialized_end=1398,
+)
+
+
+_SUBSCRIPTIONLIST = _descriptor.Descriptor(
+  name='SubscriptionList',
+  full_name='gnmi.SubscriptionList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='prefix', full_name='gnmi.SubscriptionList.prefix', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='subscription', full_name='gnmi.SubscriptionList.subscription', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='use_aliases', full_name='gnmi.SubscriptionList.use_aliases', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='qos', full_name='gnmi.SubscriptionList.qos', index=3,
+      number=4, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='gnmi.SubscriptionList.mode', index=4,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='allow_aggregation', full_name='gnmi.SubscriptionList.allow_aggregation', index=5,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='use_models', full_name='gnmi.SubscriptionList.use_models', index=6,
+      number=7, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='encoding', full_name='gnmi.SubscriptionList.encoding', index=7,
+      number=8, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='updates_only', full_name='gnmi.SubscriptionList.updates_only', index=8,
+      number=9, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _SUBSCRIPTIONLIST_MODE,
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1401,
+  serialized_end=1744,
+)
+
+
+_SUBSCRIPTION = _descriptor.Descriptor(
+  name='Subscription',
+  full_name='gnmi.Subscription',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gnmi.Subscription.path', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='gnmi.Subscription.mode', index=1,
+      number=2, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='sample_interval', full_name='gnmi.Subscription.sample_interval', index=2,
+      number=3, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='suppress_redundant', full_name='gnmi.Subscription.suppress_redundant', index=3,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='heartbeat_interval', full_name='gnmi.Subscription.heartbeat_interval', index=4,
+      number=5, type=4, cpp_type=4, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1747,
+  serialized_end=1906,
+)
+
+
+_QOSMARKING = _descriptor.Descriptor(
+  name='QOSMarking',
+  full_name='gnmi.QOSMarking',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='marking', full_name='gnmi.QOSMarking.marking', index=0,
+      number=1, type=13, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1908,
+  serialized_end=1937,
+)
+
+
+_ALIAS = _descriptor.Descriptor(
+  name='Alias',
+  full_name='gnmi.Alias',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gnmi.Alias.path', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='gnmi.Alias.alias', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1939,
+  serialized_end=1987,
+)
+
+
+_ALIASLIST = _descriptor.Descriptor(
+  name='AliasList',
+  full_name='gnmi.AliasList',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='alias', full_name='gnmi.AliasList.alias', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1989,
+  serialized_end=2028,
+)
+
+
+_SETREQUEST = _descriptor.Descriptor(
+  name='SetRequest',
+  full_name='gnmi.SetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='prefix', full_name='gnmi.SetRequest.prefix', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='delete', full_name='gnmi.SetRequest.delete', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='replace', full_name='gnmi.SetRequest.replace', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='update', full_name='gnmi.SetRequest.update', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2031,
+  serialized_end=2160,
+)
+
+
+_SETRESPONSE = _descriptor.Descriptor(
+  name='SetResponse',
+  full_name='gnmi.SetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='prefix', full_name='gnmi.SetResponse.prefix', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='response', full_name='gnmi.SetResponse.response', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='message', full_name='gnmi.SetResponse.message', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='gnmi.SetResponse.timestamp', index=3,
+      number=4, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2163,
+  serialized_end=2295,
+)
+
+
+_UPDATERESULT = _descriptor.Descriptor(
+  name='UpdateResult',
+  full_name='gnmi.UpdateResult',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='timestamp', full_name='gnmi.UpdateResult.timestamp', index=0,
+      number=1, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gnmi.UpdateResult.path', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='message', full_name='gnmi.UpdateResult.message', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+    _descriptor.FieldDescriptor(
+      name='op', full_name='gnmi.UpdateResult.op', index=3,
+      number=4, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _UPDATERESULT_OPERATION,
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2298,
+  serialized_end=2500,
+)
+
+
+_GETREQUEST = _descriptor.Descriptor(
+  name='GetRequest',
+  full_name='gnmi.GetRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='prefix', full_name='gnmi.GetRequest.prefix', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='gnmi.GetRequest.path', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='type', full_name='gnmi.GetRequest.type', index=2,
+      number=3, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='encoding', full_name='gnmi.GetRequest.encoding', index=3,
+      number=5, type=14, cpp_type=8, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='use_models', full_name='gnmi.GetRequest.use_models', index=4,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+    _GETREQUEST_DATATYPE,
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2503,
+  serialized_end=2742,
+)
+
+
+_GETRESPONSE = _descriptor.Descriptor(
+  name='GetResponse',
+  full_name='gnmi.GetResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='notification', full_name='gnmi.GetResponse.notification', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='error', full_name='gnmi.GetResponse.error', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2744,
+  serialized_end=2831,
+)
+
+
+_CAPABILITYREQUEST = _descriptor.Descriptor(
+  name='CapabilityRequest',
+  full_name='gnmi.CapabilityRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2833,
+  serialized_end=2852,
+)
+
+
+_CAPABILITYRESPONSE = _descriptor.Descriptor(
+  name='CapabilityResponse',
+  full_name='gnmi.CapabilityResponse',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='supported_models', full_name='gnmi.CapabilityResponse.supported_models', index=0,
+      number=1, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supported_encodings', full_name='gnmi.CapabilityResponse.supported_encodings', index=1,
+      number=2, type=14, cpp_type=8, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='gNMI_version', full_name='gnmi.CapabilityResponse.gNMI_version', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2855,
+  serialized_end=2985,
+)
+
+
+_MODELDATA = _descriptor.Descriptor(
+  name='ModelData',
+  full_name='gnmi.ModelData',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='gnmi.ModelData.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='organization', full_name='gnmi.ModelData.organization', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='version', full_name='gnmi.ModelData.version', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2987,
+  serialized_end=3051,
+)
+
+_NOTIFICATION.fields_by_name['prefix'].message_type = _PATH
+_NOTIFICATION.fields_by_name['update'].message_type = _UPDATE
+_NOTIFICATION.fields_by_name['delete'].message_type = _PATH
+_UPDATE.fields_by_name['path'].message_type = _PATH
+_UPDATE.fields_by_name['value'].message_type = _VALUE
+_UPDATE.fields_by_name['val'].message_type = _TYPEDVALUE
+_TYPEDVALUE.fields_by_name['decimal_val'].message_type = _DECIMAL64
+_TYPEDVALUE.fields_by_name['leaflist_val'].message_type = _SCALARARRAY
+_TYPEDVALUE.fields_by_name['any_val'].message_type = google_dot_protobuf_dot_any__pb2._ANY
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['string_val'])
+_TYPEDVALUE.fields_by_name['string_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['int_val'])
+_TYPEDVALUE.fields_by_name['int_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['uint_val'])
+_TYPEDVALUE.fields_by_name['uint_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['bool_val'])
+_TYPEDVALUE.fields_by_name['bool_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['bytes_val'])
+_TYPEDVALUE.fields_by_name['bytes_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['float_val'])
+_TYPEDVALUE.fields_by_name['float_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['decimal_val'])
+_TYPEDVALUE.fields_by_name['decimal_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['leaflist_val'])
+_TYPEDVALUE.fields_by_name['leaflist_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['any_val'])
+_TYPEDVALUE.fields_by_name['any_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['json_val'])
+_TYPEDVALUE.fields_by_name['json_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['json_ietf_val'])
+_TYPEDVALUE.fields_by_name['json_ietf_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_TYPEDVALUE.oneofs_by_name['value'].fields.append(
+  _TYPEDVALUE.fields_by_name['ascii_val'])
+_TYPEDVALUE.fields_by_name['ascii_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value']
+_PATH.fields_by_name['elem'].message_type = _PATHELEM
+_PATHELEM_KEYENTRY.containing_type = _PATHELEM
+_PATHELEM.fields_by_name['key'].message_type = _PATHELEM_KEYENTRY
+_VALUE.fields_by_name['type'].enum_type = _ENCODING
+_ERROR.fields_by_name['data'].message_type = google_dot_protobuf_dot_any__pb2._ANY
+_SCALARARRAY.fields_by_name['element'].message_type = _TYPEDVALUE
+_SUBSCRIBEREQUEST.fields_by_name['subscribe'].message_type = _SUBSCRIPTIONLIST
+_SUBSCRIBEREQUEST.fields_by_name['poll'].message_type = _POLL
+_SUBSCRIBEREQUEST.fields_by_name['aliases'].message_type = _ALIASLIST
+_SUBSCRIBEREQUEST.oneofs_by_name['request'].fields.append(
+  _SUBSCRIBEREQUEST.fields_by_name['subscribe'])
+_SUBSCRIBEREQUEST.fields_by_name['subscribe'].containing_oneof = _SUBSCRIBEREQUEST.oneofs_by_name['request']
+_SUBSCRIBEREQUEST.oneofs_by_name['request'].fields.append(
+  _SUBSCRIBEREQUEST.fields_by_name['poll'])
+_SUBSCRIBEREQUEST.fields_by_name['poll'].containing_oneof = _SUBSCRIBEREQUEST.oneofs_by_name['request']
+_SUBSCRIBEREQUEST.oneofs_by_name['request'].fields.append(
+  _SUBSCRIBEREQUEST.fields_by_name['aliases'])
+_SUBSCRIBEREQUEST.fields_by_name['aliases'].containing_oneof = _SUBSCRIBEREQUEST.oneofs_by_name['request']
+_SUBSCRIBERESPONSE.fields_by_name['update'].message_type = _NOTIFICATION
+_SUBSCRIBERESPONSE.fields_by_name['error'].message_type = _ERROR
+_SUBSCRIBERESPONSE.oneofs_by_name['response'].fields.append(
+  _SUBSCRIBERESPONSE.fields_by_name['update'])
+_SUBSCRIBERESPONSE.fields_by_name['update'].containing_oneof = _SUBSCRIBERESPONSE.oneofs_by_name['response']
+_SUBSCRIBERESPONSE.oneofs_by_name['response'].fields.append(
+  _SUBSCRIBERESPONSE.fields_by_name['sync_response'])
+_SUBSCRIBERESPONSE.fields_by_name['sync_response'].containing_oneof = _SUBSCRIBERESPONSE.oneofs_by_name['response']
+_SUBSCRIBERESPONSE.oneofs_by_name['response'].fields.append(
+  _SUBSCRIBERESPONSE.fields_by_name['error'])
+_SUBSCRIBERESPONSE.fields_by_name['error'].containing_oneof = _SUBSCRIBERESPONSE.oneofs_by_name['response']
+_SUBSCRIPTIONLIST.fields_by_name['prefix'].message_type = _PATH
+_SUBSCRIPTIONLIST.fields_by_name['subscription'].message_type = _SUBSCRIPTION
+_SUBSCRIPTIONLIST.fields_by_name['qos'].message_type = _QOSMARKING
+_SUBSCRIPTIONLIST.fields_by_name['mode'].enum_type = _SUBSCRIPTIONLIST_MODE
+_SUBSCRIPTIONLIST.fields_by_name['use_models'].message_type = _MODELDATA
+_SUBSCRIPTIONLIST.fields_by_name['encoding'].enum_type = _ENCODING
+_SUBSCRIPTIONLIST_MODE.containing_type = _SUBSCRIPTIONLIST
+_SUBSCRIPTION.fields_by_name['path'].message_type = _PATH
+_SUBSCRIPTION.fields_by_name['mode'].enum_type = _SUBSCRIPTIONMODE
+_ALIAS.fields_by_name['path'].message_type = _PATH
+_ALIASLIST.fields_by_name['alias'].message_type = _ALIAS
+_SETREQUEST.fields_by_name['prefix'].message_type = _PATH
+_SETREQUEST.fields_by_name['delete'].message_type = _PATH
+_SETREQUEST.fields_by_name['replace'].message_type = _UPDATE
+_SETREQUEST.fields_by_name['update'].message_type = _UPDATE
+_SETRESPONSE.fields_by_name['prefix'].message_type = _PATH
+_SETRESPONSE.fields_by_name['response'].message_type = _UPDATERESULT
+_SETRESPONSE.fields_by_name['message'].message_type = _ERROR
+_UPDATERESULT.fields_by_name['path'].message_type = _PATH
+_UPDATERESULT.fields_by_name['message'].message_type = _ERROR
+_UPDATERESULT.fields_by_name['op'].enum_type = _UPDATERESULT_OPERATION
+_UPDATERESULT_OPERATION.containing_type = _UPDATERESULT
+_GETREQUEST.fields_by_name['prefix'].message_type = _PATH
+_GETREQUEST.fields_by_name['path'].message_type = _PATH
+_GETREQUEST.fields_by_name['type'].enum_type = _GETREQUEST_DATATYPE
+_GETREQUEST.fields_by_name['encoding'].enum_type = _ENCODING
+_GETREQUEST.fields_by_name['use_models'].message_type = _MODELDATA
+_GETREQUEST_DATATYPE.containing_type = _GETREQUEST
+_GETRESPONSE.fields_by_name['notification'].message_type = _NOTIFICATION
+_GETRESPONSE.fields_by_name['error'].message_type = _ERROR
+_CAPABILITYRESPONSE.fields_by_name['supported_models'].message_type = _MODELDATA
+_CAPABILITYRESPONSE.fields_by_name['supported_encodings'].enum_type = _ENCODING
+DESCRIPTOR.message_types_by_name['Notification'] = _NOTIFICATION
+DESCRIPTOR.message_types_by_name['Update'] = _UPDATE
+DESCRIPTOR.message_types_by_name['TypedValue'] = _TYPEDVALUE
+DESCRIPTOR.message_types_by_name['Path'] = _PATH
+DESCRIPTOR.message_types_by_name['PathElem'] = _PATHELEM
+DESCRIPTOR.message_types_by_name['Value'] = _VALUE
+DESCRIPTOR.message_types_by_name['Error'] = _ERROR
+DESCRIPTOR.message_types_by_name['Decimal64'] = _DECIMAL64
+DESCRIPTOR.message_types_by_name['ScalarArray'] = _SCALARARRAY
+DESCRIPTOR.message_types_by_name['SubscribeRequest'] = _SUBSCRIBEREQUEST
+DESCRIPTOR.message_types_by_name['Poll'] = _POLL
+DESCRIPTOR.message_types_by_name['SubscribeResponse'] = _SUBSCRIBERESPONSE
+DESCRIPTOR.message_types_by_name['SubscriptionList'] = _SUBSCRIPTIONLIST
+DESCRIPTOR.message_types_by_name['Subscription'] = _SUBSCRIPTION
+DESCRIPTOR.message_types_by_name['QOSMarking'] = _QOSMARKING
+DESCRIPTOR.message_types_by_name['Alias'] = _ALIAS
+DESCRIPTOR.message_types_by_name['AliasList'] = _ALIASLIST
+DESCRIPTOR.message_types_by_name['SetRequest'] = _SETREQUEST
+DESCRIPTOR.message_types_by_name['SetResponse'] = _SETRESPONSE
+DESCRIPTOR.message_types_by_name['UpdateResult'] = _UPDATERESULT
+DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST
+DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE
+DESCRIPTOR.message_types_by_name['CapabilityRequest'] = _CAPABILITYREQUEST
+DESCRIPTOR.message_types_by_name['CapabilityResponse'] = _CAPABILITYRESPONSE
+DESCRIPTOR.message_types_by_name['ModelData'] = _MODELDATA
+DESCRIPTOR.enum_types_by_name['Encoding'] = _ENCODING
+DESCRIPTOR.enum_types_by_name['SubscriptionMode'] = _SUBSCRIPTIONMODE
+DESCRIPTOR.extensions_by_name['gnmi_service'] = gnmi_service
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Notification = _reflection.GeneratedProtocolMessageType('Notification', (_message.Message,), dict(
+  DESCRIPTOR = _NOTIFICATION,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Notification)
+  ))
+_sym_db.RegisterMessage(Notification)
+
+Update = _reflection.GeneratedProtocolMessageType('Update', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Update)
+  ))
+_sym_db.RegisterMessage(Update)
+
+TypedValue = _reflection.GeneratedProtocolMessageType('TypedValue', (_message.Message,), dict(
+  DESCRIPTOR = _TYPEDVALUE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.TypedValue)
+  ))
+_sym_db.RegisterMessage(TypedValue)
+
+Path = _reflection.GeneratedProtocolMessageType('Path', (_message.Message,), dict(
+  DESCRIPTOR = _PATH,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Path)
+  ))
+_sym_db.RegisterMessage(Path)
+
+PathElem = _reflection.GeneratedProtocolMessageType('PathElem', (_message.Message,), dict(
+
+  KeyEntry = _reflection.GeneratedProtocolMessageType('KeyEntry', (_message.Message,), dict(
+    DESCRIPTOR = _PATHELEM_KEYENTRY,
+    __module__ = 'proto.gnmi.gnmi_pb2'
+    # @@protoc_insertion_point(class_scope:gnmi.PathElem.KeyEntry)
+    ))
+  ,
+  DESCRIPTOR = _PATHELEM,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.PathElem)
+  ))
+_sym_db.RegisterMessage(PathElem)
+_sym_db.RegisterMessage(PathElem.KeyEntry)
+
+Value = _reflection.GeneratedProtocolMessageType('Value', (_message.Message,), dict(
+  DESCRIPTOR = _VALUE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Value)
+  ))
+_sym_db.RegisterMessage(Value)
+
+Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), dict(
+  DESCRIPTOR = _ERROR,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Error)
+  ))
+_sym_db.RegisterMessage(Error)
+
+Decimal64 = _reflection.GeneratedProtocolMessageType('Decimal64', (_message.Message,), dict(
+  DESCRIPTOR = _DECIMAL64,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Decimal64)
+  ))
+_sym_db.RegisterMessage(Decimal64)
+
+ScalarArray = _reflection.GeneratedProtocolMessageType('ScalarArray', (_message.Message,), dict(
+  DESCRIPTOR = _SCALARARRAY,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.ScalarArray)
+  ))
+_sym_db.RegisterMessage(ScalarArray)
+
+SubscribeRequest = _reflection.GeneratedProtocolMessageType('SubscribeRequest', (_message.Message,), dict(
+  DESCRIPTOR = _SUBSCRIBEREQUEST,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.SubscribeRequest)
+  ))
+_sym_db.RegisterMessage(SubscribeRequest)
+
+Poll = _reflection.GeneratedProtocolMessageType('Poll', (_message.Message,), dict(
+  DESCRIPTOR = _POLL,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Poll)
+  ))
+_sym_db.RegisterMessage(Poll)
+
+SubscribeResponse = _reflection.GeneratedProtocolMessageType('SubscribeResponse', (_message.Message,), dict(
+  DESCRIPTOR = _SUBSCRIBERESPONSE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.SubscribeResponse)
+  ))
+_sym_db.RegisterMessage(SubscribeResponse)
+
+SubscriptionList = _reflection.GeneratedProtocolMessageType('SubscriptionList', (_message.Message,), dict(
+  DESCRIPTOR = _SUBSCRIPTIONLIST,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.SubscriptionList)
+  ))
+_sym_db.RegisterMessage(SubscriptionList)
+
+Subscription = _reflection.GeneratedProtocolMessageType('Subscription', (_message.Message,), dict(
+  DESCRIPTOR = _SUBSCRIPTION,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Subscription)
+  ))
+_sym_db.RegisterMessage(Subscription)
+
+QOSMarking = _reflection.GeneratedProtocolMessageType('QOSMarking', (_message.Message,), dict(
+  DESCRIPTOR = _QOSMARKING,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.QOSMarking)
+  ))
+_sym_db.RegisterMessage(QOSMarking)
+
+Alias = _reflection.GeneratedProtocolMessageType('Alias', (_message.Message,), dict(
+  DESCRIPTOR = _ALIAS,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.Alias)
+  ))
+_sym_db.RegisterMessage(Alias)
+
+AliasList = _reflection.GeneratedProtocolMessageType('AliasList', (_message.Message,), dict(
+  DESCRIPTOR = _ALIASLIST,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.AliasList)
+  ))
+_sym_db.RegisterMessage(AliasList)
+
+SetRequest = _reflection.GeneratedProtocolMessageType('SetRequest', (_message.Message,), dict(
+  DESCRIPTOR = _SETREQUEST,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.SetRequest)
+  ))
+_sym_db.RegisterMessage(SetRequest)
+
+SetResponse = _reflection.GeneratedProtocolMessageType('SetResponse', (_message.Message,), dict(
+  DESCRIPTOR = _SETRESPONSE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.SetResponse)
+  ))
+_sym_db.RegisterMessage(SetResponse)
+
+UpdateResult = _reflection.GeneratedProtocolMessageType('UpdateResult', (_message.Message,), dict(
+  DESCRIPTOR = _UPDATERESULT,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.UpdateResult)
+  ))
+_sym_db.RegisterMessage(UpdateResult)
+
+GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), dict(
+  DESCRIPTOR = _GETREQUEST,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.GetRequest)
+  ))
+_sym_db.RegisterMessage(GetRequest)
+
+GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), dict(
+  DESCRIPTOR = _GETRESPONSE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.GetResponse)
+  ))
+_sym_db.RegisterMessage(GetResponse)
+
+CapabilityRequest = _reflection.GeneratedProtocolMessageType('CapabilityRequest', (_message.Message,), dict(
+  DESCRIPTOR = _CAPABILITYREQUEST,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.CapabilityRequest)
+  ))
+_sym_db.RegisterMessage(CapabilityRequest)
+
+CapabilityResponse = _reflection.GeneratedProtocolMessageType('CapabilityResponse', (_message.Message,), dict(
+  DESCRIPTOR = _CAPABILITYRESPONSE,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.CapabilityResponse)
+  ))
+_sym_db.RegisterMessage(CapabilityResponse)
+
+ModelData = _reflection.GeneratedProtocolMessageType('ModelData', (_message.Message,), dict(
+  DESCRIPTOR = _MODELDATA,
+  __module__ = 'proto.gnmi.gnmi_pb2'
+  # @@protoc_insertion_point(class_scope:gnmi.ModelData)
+  ))
+_sym_db.RegisterMessage(ModelData)
+
+google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(gnmi_service)
+
+DESCRIPTOR.has_options = True
+DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\312>\0050.5.0'))
+_UPDATE.fields_by_name['value'].has_options = True
+_UPDATE.fields_by_name['value']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_PATH.fields_by_name['element'].has_options = True
+_PATH.fields_by_name['element']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_PATHELEM_KEYENTRY.has_options = True
+_PATHELEM_KEYENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+_VALUE.has_options = True
+_VALUE._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001'))
+_ERROR.has_options = True
+_ERROR._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001'))
+_SUBSCRIBERESPONSE.fields_by_name['error'].has_options = True
+_SUBSCRIBERESPONSE.fields_by_name['error']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_SETRESPONSE.fields_by_name['message'].has_options = True
+_SETRESPONSE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_UPDATERESULT.fields_by_name['timestamp'].has_options = True
+_UPDATERESULT.fields_by_name['timestamp']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_UPDATERESULT.fields_by_name['message'].has_options = True
+_UPDATERESULT.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+_GETRESPONSE.fields_by_name['error'].has_options = True
+_GETRESPONSE.fields_by_name['error']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))
+try:
+  # THESE ELEMENTS WILL BE DEPRECATED.
+  # Please use the generated *_pb2_grpc.py files instead.
+  import grpc
+  from grpc.beta import implementations as beta_implementations
+  from grpc.beta import interfaces as beta_interfaces
+  from grpc.framework.common import cardinality
+  from grpc.framework.interfaces.face import utilities as face_utilities
+
+
+  class gNMIStub(object):
+    # missing associated documentation comment in .proto file
+    pass
+
+    def __init__(self, channel):
+      """Constructor.
+
+      Args:
+        channel: A grpc.Channel.
+      """
+      self.Capabilities = channel.unary_unary(
+          '/gnmi.gNMI/Capabilities',
+          request_serializer=CapabilityRequest.SerializeToString,
+          response_deserializer=CapabilityResponse.FromString,
+          )
+      self.Get = channel.unary_unary(
+          '/gnmi.gNMI/Get',
+          request_serializer=GetRequest.SerializeToString,
+          response_deserializer=GetResponse.FromString,
+          )
+      self.Set = channel.unary_unary(
+          '/gnmi.gNMI/Set',
+          request_serializer=SetRequest.SerializeToString,
+          response_deserializer=SetResponse.FromString,
+          )
+      self.Subscribe = channel.stream_stream(
+          '/gnmi.gNMI/Subscribe',
+          request_serializer=SubscribeRequest.SerializeToString,
+          response_deserializer=SubscribeResponse.FromString,
+          )
+
+
+  class gNMIServicer(object):
+    # missing associated documentation comment in .proto file
+    pass
+
+    def Capabilities(self, request, context):
+      """Capabilities allows the client to retrieve the set of capabilities that
+      is supported by the target. This allows the target to validate the
+      service version that is implemented and retrieve the set of models that
+      the target supports. The models can then be specified in subsequent RPCs
+      to restrict the set of data that is utilized.
+      Reference: gNMI Specification Section 3.2
+      """
+      context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+      context.set_details('Method not implemented!')
+      raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+      """Retrieve a snapshot of data from the target. A Get RPC requests that the
+      target snapshots a subset of the data tree as specified by the paths
+      included in the message and serializes this to be returned to the
+      client using the specified encoding.
+      Reference: gNMI Specification Section 3.3
+      """
+      context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+      context.set_details('Method not implemented!')
+      raise NotImplementedError('Method not implemented!')
+
+    def Set(self, request, context):
+      """Set allows the client to modify the state of data on the target. The
+      paths to modified along with the new values that the client wishes
+      to set the value to.
+      Reference: gNMI Specification Section 3.4
+      """
+      context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+      context.set_details('Method not implemented!')
+      raise NotImplementedError('Method not implemented!')
+
+    def Subscribe(self, request_iterator, context):
+      """Subscribe allows a client to request the target to send it values
+      of particular paths within the data tree. These values may be streamed
+      at a particular cadence (STREAM), sent one off on a long-lived channel
+      (POLL), or sent as a one-off retrieval (ONCE).
+      Reference: gNMI Specification Section 3.5
+      """
+      context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+      context.set_details('Method not implemented!')
+      raise NotImplementedError('Method not implemented!')
+
+
+  def add_gNMIServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+        'Capabilities': grpc.unary_unary_rpc_method_handler(
+            servicer.Capabilities,
+            request_deserializer=CapabilityRequest.FromString,
+            response_serializer=CapabilityResponse.SerializeToString,
+        ),
+        'Get': grpc.unary_unary_rpc_method_handler(
+            servicer.Get,
+            request_deserializer=GetRequest.FromString,
+            response_serializer=GetResponse.SerializeToString,
+        ),
+        'Set': grpc.unary_unary_rpc_method_handler(
+            servicer.Set,
+            request_deserializer=SetRequest.FromString,
+            response_serializer=SetResponse.SerializeToString,
+        ),
+        'Subscribe': grpc.stream_stream_rpc_method_handler(
+            servicer.Subscribe,
+            request_deserializer=SubscribeRequest.FromString,
+            response_serializer=SubscribeResponse.SerializeToString,
+        ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+        'gnmi.gNMI', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+  class BetagNMIServicer(object):
+    """The Beta API is deprecated for 0.15.0 and later.
+
+    It is recommended to use the GA API (classes and functions in this
+    file not marked beta) for all further purposes. This class was generated
+    only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
+    # missing associated documentation comment in .proto file
+    pass
+    def Capabilities(self, request, context):
+      """Capabilities allows the client to retrieve the set of capabilities that
+      is supported by the target. This allows the target to validate the
+      service version that is implemented and retrieve the set of models that
+      the target supports. The models can then be specified in subsequent RPCs
+      to restrict the set of data that is utilized.
+      Reference: gNMI Specification Section 3.2
+      """
+      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+    def Get(self, request, context):
+      """Retrieve a snapshot of data from the target. A Get RPC requests that the
+      target snapshots a subset of the data tree as specified by the paths
+      included in the message and serializes this to be returned to the
+      client using the specified encoding.
+      Reference: gNMI Specification Section 3.3
+      """
+      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+    def Set(self, request, context):
+      """Set allows the client to modify the state of data on the target. The
+      paths to modified along with the new values that the client wishes
+      to set the value to.
+      Reference: gNMI Specification Section 3.4
+      """
+      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+    def Subscribe(self, request_iterator, context):
+      """Subscribe allows a client to request the target to send it values
+      of particular paths within the data tree. These values may be streamed
+      at a particular cadence (STREAM), sent one off on a long-lived channel
+      (POLL), or sent as a one-off retrieval (ONCE).
+      Reference: gNMI Specification Section 3.5
+      """
+      context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
+
+
+  class BetagNMIStub(object):
+    """The Beta API is deprecated for 0.15.0 and later.
+
+    It is recommended to use the GA API (classes and functions in this
+    file not marked beta) for all further purposes. This class was generated
+    only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
+    # missing associated documentation comment in .proto file
+    pass
+    def Capabilities(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+      """Capabilities allows the client to retrieve the set of capabilities that
+      is supported by the target. This allows the target to validate the
+      service version that is implemented and retrieve the set of models that
+      the target supports. The models can then be specified in subsequent RPCs
+      to restrict the set of data that is utilized.
+      Reference: gNMI Specification Section 3.2
+      """
+      raise NotImplementedError()
+    Capabilities.future = None
+    def Get(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+      """Retrieve a snapshot of data from the target. A Get RPC requests that the
+      target snapshots a subset of the data tree as specified by the paths
+      included in the message and serializes this to be returned to the
+      client using the specified encoding.
+      Reference: gNMI Specification Section 3.3
+      """
+      raise NotImplementedError()
+    Get.future = None
+    def Set(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
+      """Set allows the client to modify the state of data on the target. The
+      paths to modified along with the new values that the client wishes
+      to set the value to.
+      Reference: gNMI Specification Section 3.4
+      """
+      raise NotImplementedError()
+    Set.future = None
+    def Subscribe(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
+      """Subscribe allows a client to request the target to send it values
+      of particular paths within the data tree. These values may be streamed
+      at a particular cadence (STREAM), sent one off on a long-lived channel
+      (POLL), or sent as a one-off retrieval (ONCE).
+      Reference: gNMI Specification Section 3.5
+      """
+      raise NotImplementedError()
+
+
+  def beta_create_gNMI_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
+    """The Beta API is deprecated for 0.15.0 and later.
+
+    It is recommended to use the GA API (classes and functions in this
+    file not marked beta) for all further purposes. This function was
+    generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
+    request_deserializers = {
+      ('gnmi.gNMI', 'Capabilities'): CapabilityRequest.FromString,
+      ('gnmi.gNMI', 'Get'): GetRequest.FromString,
+      ('gnmi.gNMI', 'Set'): SetRequest.FromString,
+      ('gnmi.gNMI', 'Subscribe'): SubscribeRequest.FromString,
+    }
+    response_serializers = {
+      ('gnmi.gNMI', 'Capabilities'): CapabilityResponse.SerializeToString,
+      ('gnmi.gNMI', 'Get'): GetResponse.SerializeToString,
+      ('gnmi.gNMI', 'Set'): SetResponse.SerializeToString,
+      ('gnmi.gNMI', 'Subscribe'): SubscribeResponse.SerializeToString,
+    }
+    method_implementations = {
+      ('gnmi.gNMI', 'Capabilities'): face_utilities.unary_unary_inline(servicer.Capabilities),
+      ('gnmi.gNMI', 'Get'): face_utilities.unary_unary_inline(servicer.Get),
+      ('gnmi.gNMI', 'Set'): face_utilities.unary_unary_inline(servicer.Set),
+      ('gnmi.gNMI', 'Subscribe'): face_utilities.stream_stream_inline(servicer.Subscribe),
+    }
+    server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
+    return beta_implementations.server(method_implementations, options=server_options)
+
+
+  def beta_create_gNMI_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
+    """The Beta API is deprecated for 0.15.0 and later.
+
+    It is recommended to use the GA API (classes and functions in this
+    file not marked beta) for all further purposes. This function was
+    generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
+    request_serializers = {
+      ('gnmi.gNMI', 'Capabilities'): CapabilityRequest.SerializeToString,
+      ('gnmi.gNMI', 'Get'): GetRequest.SerializeToString,
+      ('gnmi.gNMI', 'Set'): SetRequest.SerializeToString,
+      ('gnmi.gNMI', 'Subscribe'): SubscribeRequest.SerializeToString,
+    }
+    response_deserializers = {
+      ('gnmi.gNMI', 'Capabilities'): CapabilityResponse.FromString,
+      ('gnmi.gNMI', 'Get'): GetResponse.FromString,
+      ('gnmi.gNMI', 'Set'): SetResponse.FromString,
+      ('gnmi.gNMI', 'Subscribe'): SubscribeResponse.FromString,
+    }
+    cardinalities = {
+      'Capabilities': cardinality.Cardinality.UNARY_UNARY,
+      'Get': cardinality.Cardinality.UNARY_UNARY,
+      'Set': cardinality.Cardinality.UNARY_UNARY,
+      'Subscribe': cardinality.Cardinality.STREAM_STREAM,
+    }
+    stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
+    return beta_implementations.dynamic_stub(channel, 'gnmi.gNMI', cardinalities, options=stub_options)
+except ImportError:
+  pass
+# @@protoc_insertion_point(module_scope)
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.pyi b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.pyi
new file mode 100644
index 0000000000000000000000000000000000000000..423bcfb90e1a603c2ebcdc29092569c7695db2d0
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2.pyi
@@ -0,0 +1,380 @@
+from google.protobuf import any_pb2 as _any_pb2
+from google.protobuf import descriptor_pb2 as _descriptor_pb2
+from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
+
+ASCII: Encoding
+BYTES: Encoding
+DESCRIPTOR: _descriptor.FileDescriptor
+EID_EXPERIMENTAL: ExtensionID
+EID_UNSET: ExtensionID
+GNMI_SERVICE_FIELD_NUMBER: _ClassVar[int]
+JSON: Encoding
+JSON_IETF: Encoding
+ON_CHANGE: SubscriptionMode
+PROTO: Encoding
+SAMPLE: SubscriptionMode
+TARGET_DEFINED: SubscriptionMode
+gnmi_service: _descriptor.FieldDescriptor
+
+class CapabilityRequest(_message.Message):
+    __slots__ = ["extension"]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    def __init__(self, extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class CapabilityResponse(_message.Message):
+    __slots__ = ["extension", "gNMI_version", "supported_encodings", "supported_models"]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    GNMI_VERSION_FIELD_NUMBER: _ClassVar[int]
+    SUPPORTED_ENCODINGS_FIELD_NUMBER: _ClassVar[int]
+    SUPPORTED_MODELS_FIELD_NUMBER: _ClassVar[int]
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    gNMI_version: str
+    supported_encodings: _containers.RepeatedScalarFieldContainer[Encoding]
+    supported_models: _containers.RepeatedCompositeFieldContainer[ModelData]
+    def __init__(self, supported_models: _Optional[_Iterable[_Union[ModelData, _Mapping]]] = ..., supported_encodings: _Optional[_Iterable[_Union[Encoding, str]]] = ..., gNMI_version: _Optional[str] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class Decimal64(_message.Message):
+    __slots__ = ["digits", "precision"]
+    DIGITS_FIELD_NUMBER: _ClassVar[int]
+    PRECISION_FIELD_NUMBER: _ClassVar[int]
+    digits: int
+    precision: int
+    def __init__(self, digits: _Optional[int] = ..., precision: _Optional[int] = ...) -> None: ...
+
+class Error(_message.Message):
+    __slots__ = ["code", "data", "message"]
+    CODE_FIELD_NUMBER: _ClassVar[int]
+    DATA_FIELD_NUMBER: _ClassVar[int]
+    MESSAGE_FIELD_NUMBER: _ClassVar[int]
+    code: int
+    data: _any_pb2.Any
+    message: str
+    def __init__(self, code: _Optional[int] = ..., message: _Optional[str] = ..., data: _Optional[_Union[_any_pb2.Any, _Mapping]] = ...) -> None: ...
+
+class Extension(_message.Message):
+    __slots__ = ["history", "master_arbitration", "registered_ext"]
+    HISTORY_FIELD_NUMBER: _ClassVar[int]
+    MASTER_ARBITRATION_FIELD_NUMBER: _ClassVar[int]
+    REGISTERED_EXT_FIELD_NUMBER: _ClassVar[int]
+    history: History
+    master_arbitration: MasterArbitration
+    registered_ext: RegisteredExtension
+    def __init__(self, registered_ext: _Optional[_Union[RegisteredExtension, _Mapping]] = ..., master_arbitration: _Optional[_Union[MasterArbitration, _Mapping]] = ..., history: _Optional[_Union[History, _Mapping]] = ...) -> None: ...
+
+class GetRequest(_message.Message):
+    __slots__ = ["encoding", "extension", "path", "prefix", "type", "use_models"]
+    class DataType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+        __slots__ = []
+    ALL: GetRequest.DataType
+    CONFIG: GetRequest.DataType
+    ENCODING_FIELD_NUMBER: _ClassVar[int]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    OPERATIONAL: GetRequest.DataType
+    PATH_FIELD_NUMBER: _ClassVar[int]
+    PREFIX_FIELD_NUMBER: _ClassVar[int]
+    STATE: GetRequest.DataType
+    TYPE_FIELD_NUMBER: _ClassVar[int]
+    USE_MODELS_FIELD_NUMBER: _ClassVar[int]
+    encoding: Encoding
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    path: _containers.RepeatedCompositeFieldContainer[Path]
+    prefix: Path
+    type: GetRequest.DataType
+    use_models: _containers.RepeatedCompositeFieldContainer[ModelData]
+    def __init__(self, prefix: _Optional[_Union[Path, _Mapping]] = ..., path: _Optional[_Iterable[_Union[Path, _Mapping]]] = ..., type: _Optional[_Union[GetRequest.DataType, str]] = ..., encoding: _Optional[_Union[Encoding, str]] = ..., use_models: _Optional[_Iterable[_Union[ModelData, _Mapping]]] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class GetResponse(_message.Message):
+    __slots__ = ["error", "extension", "notification"]
+    ERROR_FIELD_NUMBER: _ClassVar[int]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    NOTIFICATION_FIELD_NUMBER: _ClassVar[int]
+    error: Error
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    notification: _containers.RepeatedCompositeFieldContainer[Notification]
+    def __init__(self, notification: _Optional[_Iterable[_Union[Notification, _Mapping]]] = ..., error: _Optional[_Union[Error, _Mapping]] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class History(_message.Message):
+    __slots__ = ["range", "snapshot_time"]
+    RANGE_FIELD_NUMBER: _ClassVar[int]
+    SNAPSHOT_TIME_FIELD_NUMBER: _ClassVar[int]
+    range: TimeRange
+    snapshot_time: int
+    def __init__(self, snapshot_time: _Optional[int] = ..., range: _Optional[_Union[TimeRange, _Mapping]] = ...) -> None: ...
+
+class MasterArbitration(_message.Message):
+    __slots__ = ["election_id", "role"]
+    ELECTION_ID_FIELD_NUMBER: _ClassVar[int]
+    ROLE_FIELD_NUMBER: _ClassVar[int]
+    election_id: Uint128
+    role: Role
+    def __init__(self, role: _Optional[_Union[Role, _Mapping]] = ..., election_id: _Optional[_Union[Uint128, _Mapping]] = ...) -> None: ...
+
+class ModelData(_message.Message):
+    __slots__ = ["name", "organization", "version"]
+    NAME_FIELD_NUMBER: _ClassVar[int]
+    ORGANIZATION_FIELD_NUMBER: _ClassVar[int]
+    VERSION_FIELD_NUMBER: _ClassVar[int]
+    name: str
+    organization: str
+    version: str
+    def __init__(self, name: _Optional[str] = ..., organization: _Optional[str] = ..., version: _Optional[str] = ...) -> None: ...
+
+class Notification(_message.Message):
+    __slots__ = ["atomic", "delete", "prefix", "timestamp", "update"]
+    ATOMIC_FIELD_NUMBER: _ClassVar[int]
+    DELETE_FIELD_NUMBER: _ClassVar[int]
+    PREFIX_FIELD_NUMBER: _ClassVar[int]
+    TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
+    UPDATE_FIELD_NUMBER: _ClassVar[int]
+    atomic: bool
+    delete: _containers.RepeatedCompositeFieldContainer[Path]
+    prefix: Path
+    timestamp: int
+    update: _containers.RepeatedCompositeFieldContainer[Update]
+    def __init__(self, timestamp: _Optional[int] = ..., prefix: _Optional[_Union[Path, _Mapping]] = ..., update: _Optional[_Iterable[_Union[Update, _Mapping]]] = ..., delete: _Optional[_Iterable[_Union[Path, _Mapping]]] = ..., atomic: bool = ...) -> None: ...
+
+class Path(_message.Message):
+    __slots__ = ["elem", "element", "origin", "target"]
+    ELEMENT_FIELD_NUMBER: _ClassVar[int]
+    ELEM_FIELD_NUMBER: _ClassVar[int]
+    ORIGIN_FIELD_NUMBER: _ClassVar[int]
+    TARGET_FIELD_NUMBER: _ClassVar[int]
+    elem: _containers.RepeatedCompositeFieldContainer[PathElem]
+    element: _containers.RepeatedScalarFieldContainer[str]
+    origin: str
+    target: str
+    def __init__(self, element: _Optional[_Iterable[str]] = ..., origin: _Optional[str] = ..., elem: _Optional[_Iterable[_Union[PathElem, _Mapping]]] = ..., target: _Optional[str] = ...) -> None: ...
+
+class PathElem(_message.Message):
+    __slots__ = ["key", "name"]
+    class KeyEntry(_message.Message):
+        __slots__ = ["key", "value"]
+        KEY_FIELD_NUMBER: _ClassVar[int]
+        VALUE_FIELD_NUMBER: _ClassVar[int]
+        key: str
+        value: str
+        def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
+    KEY_FIELD_NUMBER: _ClassVar[int]
+    NAME_FIELD_NUMBER: _ClassVar[int]
+    key: _containers.ScalarMap[str, str]
+    name: str
+    def __init__(self, name: _Optional[str] = ..., key: _Optional[_Mapping[str, str]] = ...) -> None: ...
+
+class Poll(_message.Message):
+    __slots__ = []
+    def __init__(self) -> None: ...
+
+class QOSMarking(_message.Message):
+    __slots__ = ["marking"]
+    MARKING_FIELD_NUMBER: _ClassVar[int]
+    marking: int
+    def __init__(self, marking: _Optional[int] = ...) -> None: ...
+
+class RegisteredExtension(_message.Message):
+    __slots__ = ["id", "msg"]
+    ID_FIELD_NUMBER: _ClassVar[int]
+    MSG_FIELD_NUMBER: _ClassVar[int]
+    id: ExtensionID
+    msg: bytes
+    def __init__(self, id: _Optional[_Union[ExtensionID, str]] = ..., msg: _Optional[bytes] = ...) -> None: ...
+
+class Role(_message.Message):
+    __slots__ = ["id"]
+    ID_FIELD_NUMBER: _ClassVar[int]
+    id: str
+    def __init__(self, id: _Optional[str] = ...) -> None: ...
+
+class ScalarArray(_message.Message):
+    __slots__ = ["element"]
+    ELEMENT_FIELD_NUMBER: _ClassVar[int]
+    element: _containers.RepeatedCompositeFieldContainer[TypedValue]
+    def __init__(self, element: _Optional[_Iterable[_Union[TypedValue, _Mapping]]] = ...) -> None: ...
+
+class SetRequest(_message.Message):
+    __slots__ = ["delete", "extension", "prefix", "replace", "update"]
+    DELETE_FIELD_NUMBER: _ClassVar[int]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    PREFIX_FIELD_NUMBER: _ClassVar[int]
+    REPLACE_FIELD_NUMBER: _ClassVar[int]
+    UPDATE_FIELD_NUMBER: _ClassVar[int]
+    delete: _containers.RepeatedCompositeFieldContainer[Path]
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    prefix: Path
+    replace: _containers.RepeatedCompositeFieldContainer[Update]
+    update: _containers.RepeatedCompositeFieldContainer[Update]
+    def __init__(self, prefix: _Optional[_Union[Path, _Mapping]] = ..., delete: _Optional[_Iterable[_Union[Path, _Mapping]]] = ..., replace: _Optional[_Iterable[_Union[Update, _Mapping]]] = ..., update: _Optional[_Iterable[_Union[Update, _Mapping]]] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class SetResponse(_message.Message):
+    __slots__ = ["extension", "message", "prefix", "response", "timestamp"]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    MESSAGE_FIELD_NUMBER: _ClassVar[int]
+    PREFIX_FIELD_NUMBER: _ClassVar[int]
+    RESPONSE_FIELD_NUMBER: _ClassVar[int]
+    TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    message: Error
+    prefix: Path
+    response: _containers.RepeatedCompositeFieldContainer[UpdateResult]
+    timestamp: int
+    def __init__(self, prefix: _Optional[_Union[Path, _Mapping]] = ..., response: _Optional[_Iterable[_Union[UpdateResult, _Mapping]]] = ..., message: _Optional[_Union[Error, _Mapping]] = ..., timestamp: _Optional[int] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class SubscribeRequest(_message.Message):
+    __slots__ = ["extension", "poll", "subscribe"]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    POLL_FIELD_NUMBER: _ClassVar[int]
+    SUBSCRIBE_FIELD_NUMBER: _ClassVar[int]
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    poll: Poll
+    subscribe: SubscriptionList
+    def __init__(self, subscribe: _Optional[_Union[SubscriptionList, _Mapping]] = ..., poll: _Optional[_Union[Poll, _Mapping]] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class SubscribeResponse(_message.Message):
+    __slots__ = ["error", "extension", "sync_response", "update"]
+    ERROR_FIELD_NUMBER: _ClassVar[int]
+    EXTENSION_FIELD_NUMBER: _ClassVar[int]
+    SYNC_RESPONSE_FIELD_NUMBER: _ClassVar[int]
+    UPDATE_FIELD_NUMBER: _ClassVar[int]
+    error: Error
+    extension: _containers.RepeatedCompositeFieldContainer[Extension]
+    sync_response: bool
+    update: Notification
+    def __init__(self, update: _Optional[_Union[Notification, _Mapping]] = ..., sync_response: bool = ..., error: _Optional[_Union[Error, _Mapping]] = ..., extension: _Optional[_Iterable[_Union[Extension, _Mapping]]] = ...) -> None: ...
+
+class Subscription(_message.Message):
+    __slots__ = ["heartbeat_interval", "mode", "path", "sample_interval", "suppress_redundant"]
+    HEARTBEAT_INTERVAL_FIELD_NUMBER: _ClassVar[int]
+    MODE_FIELD_NUMBER: _ClassVar[int]
+    PATH_FIELD_NUMBER: _ClassVar[int]
+    SAMPLE_INTERVAL_FIELD_NUMBER: _ClassVar[int]
+    SUPPRESS_REDUNDANT_FIELD_NUMBER: _ClassVar[int]
+    heartbeat_interval: int
+    mode: SubscriptionMode
+    path: Path
+    sample_interval: int
+    suppress_redundant: bool
+    def __init__(self, path: _Optional[_Union[Path, _Mapping]] = ..., mode: _Optional[_Union[SubscriptionMode, str]] = ..., sample_interval: _Optional[int] = ..., suppress_redundant: bool = ..., heartbeat_interval: _Optional[int] = ...) -> None: ...
+
+class SubscriptionList(_message.Message):
+    __slots__ = ["allow_aggregation", "encoding", "mode", "prefix", "qos", "subscription", "updates_only", "use_models"]
+    class Mode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+        __slots__ = []
+    ALLOW_AGGREGATION_FIELD_NUMBER: _ClassVar[int]
+    ENCODING_FIELD_NUMBER: _ClassVar[int]
+    MODE_FIELD_NUMBER: _ClassVar[int]
+    ONCE: SubscriptionList.Mode
+    POLL: SubscriptionList.Mode
+    PREFIX_FIELD_NUMBER: _ClassVar[int]
+    QOS_FIELD_NUMBER: _ClassVar[int]
+    STREAM: SubscriptionList.Mode
+    SUBSCRIPTION_FIELD_NUMBER: _ClassVar[int]
+    UPDATES_ONLY_FIELD_NUMBER: _ClassVar[int]
+    USE_MODELS_FIELD_NUMBER: _ClassVar[int]
+    allow_aggregation: bool
+    encoding: Encoding
+    mode: SubscriptionList.Mode
+    prefix: Path
+    qos: QOSMarking
+    subscription: _containers.RepeatedCompositeFieldContainer[Subscription]
+    updates_only: bool
+    use_models: _containers.RepeatedCompositeFieldContainer[ModelData]
+    def __init__(self, prefix: _Optional[_Union[Path, _Mapping]] = ..., subscription: _Optional[_Iterable[_Union[Subscription, _Mapping]]] = ..., qos: _Optional[_Union[QOSMarking, _Mapping]] = ..., mode: _Optional[_Union[SubscriptionList.Mode, str]] = ..., allow_aggregation: bool = ..., use_models: _Optional[_Iterable[_Union[ModelData, _Mapping]]] = ..., encoding: _Optional[_Union[Encoding, str]] = ..., updates_only: bool = ...) -> None: ...
+
+class TimeRange(_message.Message):
+    __slots__ = ["end", "start"]
+    END_FIELD_NUMBER: _ClassVar[int]
+    START_FIELD_NUMBER: _ClassVar[int]
+    end: int
+    start: int
+    def __init__(self, start: _Optional[int] = ..., end: _Optional[int] = ...) -> None: ...
+
+class TypedValue(_message.Message):
+    __slots__ = ["any_val", "ascii_val", "bool_val", "bytes_val", "decimal_val", "double_val", "float_val", "int_val", "json_ietf_val", "json_val", "leaflist_val", "proto_bytes", "string_val", "uint_val"]
+    ANY_VAL_FIELD_NUMBER: _ClassVar[int]
+    ASCII_VAL_FIELD_NUMBER: _ClassVar[int]
+    BOOL_VAL_FIELD_NUMBER: _ClassVar[int]
+    BYTES_VAL_FIELD_NUMBER: _ClassVar[int]
+    DECIMAL_VAL_FIELD_NUMBER: _ClassVar[int]
+    DOUBLE_VAL_FIELD_NUMBER: _ClassVar[int]
+    FLOAT_VAL_FIELD_NUMBER: _ClassVar[int]
+    INT_VAL_FIELD_NUMBER: _ClassVar[int]
+    JSON_IETF_VAL_FIELD_NUMBER: _ClassVar[int]
+    JSON_VAL_FIELD_NUMBER: _ClassVar[int]
+    LEAFLIST_VAL_FIELD_NUMBER: _ClassVar[int]
+    PROTO_BYTES_FIELD_NUMBER: _ClassVar[int]
+    STRING_VAL_FIELD_NUMBER: _ClassVar[int]
+    UINT_VAL_FIELD_NUMBER: _ClassVar[int]
+    any_val: _any_pb2.Any
+    ascii_val: str
+    bool_val: bool
+    bytes_val: bytes
+    decimal_val: Decimal64
+    double_val: float
+    float_val: float
+    int_val: int
+    json_ietf_val: bytes
+    json_val: bytes
+    leaflist_val: ScalarArray
+    proto_bytes: bytes
+    string_val: str
+    uint_val: int
+    def __init__(self, string_val: _Optional[str] = ..., int_val: _Optional[int] = ..., uint_val: _Optional[int] = ..., bool_val: bool = ..., bytes_val: _Optional[bytes] = ..., float_val: _Optional[float] = ..., double_val: _Optional[float] = ..., decimal_val: _Optional[_Union[Decimal64, _Mapping]] = ..., leaflist_val: _Optional[_Union[ScalarArray, _Mapping]] = ..., any_val: _Optional[_Union[_any_pb2.Any, _Mapping]] = ..., json_val: _Optional[bytes] = ..., json_ietf_val: _Optional[bytes] = ..., ascii_val: _Optional[str] = ..., proto_bytes: _Optional[bytes] = ...) -> None: ...
+
+class Uint128(_message.Message):
+    __slots__ = ["high", "low"]
+    HIGH_FIELD_NUMBER: _ClassVar[int]
+    LOW_FIELD_NUMBER: _ClassVar[int]
+    high: int
+    low: int
+    def __init__(self, high: _Optional[int] = ..., low: _Optional[int] = ...) -> None: ...
+
+class Update(_message.Message):
+    __slots__ = ["duplicates", "path", "val", "value"]
+    DUPLICATES_FIELD_NUMBER: _ClassVar[int]
+    PATH_FIELD_NUMBER: _ClassVar[int]
+    VALUE_FIELD_NUMBER: _ClassVar[int]
+    VAL_FIELD_NUMBER: _ClassVar[int]
+    duplicates: int
+    path: Path
+    val: TypedValue
+    value: Value
+    def __init__(self, path: _Optional[_Union[Path, _Mapping]] = ..., value: _Optional[_Union[Value, _Mapping]] = ..., val: _Optional[_Union[TypedValue, _Mapping]] = ..., duplicates: _Optional[int] = ...) -> None: ...
+
+class UpdateResult(_message.Message):
+    __slots__ = ["message", "op", "path", "timestamp"]
+    class Operation(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+        __slots__ = []
+    DELETE: UpdateResult.Operation
+    INVALID: UpdateResult.Operation
+    MESSAGE_FIELD_NUMBER: _ClassVar[int]
+    OP_FIELD_NUMBER: _ClassVar[int]
+    PATH_FIELD_NUMBER: _ClassVar[int]
+    REPLACE: UpdateResult.Operation
+    TIMESTAMP_FIELD_NUMBER: _ClassVar[int]
+    UPDATE: UpdateResult.Operation
+    message: Error
+    op: UpdateResult.Operation
+    path: Path
+    timestamp: int
+    def __init__(self, timestamp: _Optional[int] = ..., path: _Optional[_Union[Path, _Mapping]] = ..., message: _Optional[_Union[Error, _Mapping]] = ..., op: _Optional[_Union[UpdateResult.Operation, str]] = ...) -> None: ...
+
+class Value(_message.Message):
+    __slots__ = ["type", "value"]
+    TYPE_FIELD_NUMBER: _ClassVar[int]
+    VALUE_FIELD_NUMBER: _ClassVar[int]
+    type: Encoding
+    value: bytes
+    def __init__(self, value: _Optional[bytes] = ..., type: _Optional[_Union[Encoding, str]] = ...) -> None: ...
+
+class ExtensionID(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+    __slots__ = []
+
+class Encoding(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+    __slots__ = []
+
+class SubscriptionMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+    __slots__ = []
\ No newline at end of file
diff --git a/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2_grpc.py b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2_grpc.py
new file mode 100644
index 0000000000000000000000000000000000000000..517d3d9eb41c5833a28cc9b7f43859dde186f348
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/gnmi/gnmi_pb2_grpc.py
@@ -0,0 +1,185 @@
+# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
+import grpc
+
+from . import gnmi_pb2 as gnmi__pb2
+
+
+class gNMIStub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.Capabilities = channel.unary_unary(
+                '/gnmi.gNMI/Capabilities',
+                request_serializer=gnmi__pb2.CapabilityRequest.SerializeToString,
+                response_deserializer=gnmi__pb2.CapabilityResponse.FromString,
+                )
+        self.Get = channel.unary_unary(
+                '/gnmi.gNMI/Get',
+                request_serializer=gnmi__pb2.GetRequest.SerializeToString,
+                response_deserializer=gnmi__pb2.GetResponse.FromString,
+                )
+        self.Set = channel.unary_unary(
+                '/gnmi.gNMI/Set',
+                request_serializer=gnmi__pb2.SetRequest.SerializeToString,
+                response_deserializer=gnmi__pb2.SetResponse.FromString,
+                )
+        self.Subscribe = channel.stream_stream(
+                '/gnmi.gNMI/Subscribe',
+                request_serializer=gnmi__pb2.SubscribeRequest.SerializeToString,
+                response_deserializer=gnmi__pb2.SubscribeResponse.FromString,
+                )
+
+
+class gNMIServicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def Capabilities(self, request, context):
+        """Capabilities allows the client to retrieve the set of capabilities that
+        is supported by the target. This allows the target to validate the
+        service version that is implemented and retrieve the set of models that
+        the target supports. The models can then be specified in subsequent RPCs
+        to restrict the set of data that is utilized.
+        Reference: gNMI Specification Section 3.2
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Get(self, request, context):
+        """Retrieve a snapshot of data from the target. A Get RPC requests that the
+        target snapshots a subset of the data tree as specified by the paths
+        included in the message and serializes this to be returned to the
+        client using the specified encoding.
+        Reference: gNMI Specification Section 3.3
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Set(self, request, context):
+        """Set allows the client to modify the state of data on the target. The
+        paths to modified along with the new values that the client wishes
+        to set the value to.
+        Reference: gNMI Specification Section 3.4
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def Subscribe(self, request_iterator, context):
+        """Subscribe allows a client to request the target to send it values
+        of particular paths within the data tree. These values may be streamed
+        at a particular cadence (STREAM), sent one off on a long-lived channel
+        (POLL), or sent as a one-off retrieval (ONCE).
+        Reference: gNMI Specification Section 3.5
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_gNMIServicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'Capabilities': grpc.unary_unary_rpc_method_handler(
+                    servicer.Capabilities,
+                    request_deserializer=gnmi__pb2.CapabilityRequest.FromString,
+                    response_serializer=gnmi__pb2.CapabilityResponse.SerializeToString,
+            ),
+            'Get': grpc.unary_unary_rpc_method_handler(
+                    servicer.Get,
+                    request_deserializer=gnmi__pb2.GetRequest.FromString,
+                    response_serializer=gnmi__pb2.GetResponse.SerializeToString,
+            ),
+            'Set': grpc.unary_unary_rpc_method_handler(
+                    servicer.Set,
+                    request_deserializer=gnmi__pb2.SetRequest.FromString,
+                    response_serializer=gnmi__pb2.SetResponse.SerializeToString,
+            ),
+            'Subscribe': grpc.stream_stream_rpc_method_handler(
+                    servicer.Subscribe,
+                    request_deserializer=gnmi__pb2.SubscribeRequest.FromString,
+                    response_serializer=gnmi__pb2.SubscribeResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'gnmi.gNMI', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class gNMI(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def Capabilities(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/gnmi.gNMI/Capabilities',
+            gnmi__pb2.CapabilityRequest.SerializeToString,
+            gnmi__pb2.CapabilityResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Get(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/gnmi.gNMI/Get',
+            gnmi__pb2.GetRequest.SerializeToString,
+            gnmi__pb2.GetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Set(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/gnmi.gNMI/Set',
+            gnmi__pb2.SetRequest.SerializeToString,
+            gnmi__pb2.SetResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def Subscribe(request_iterator,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.stream_stream(request_iterator, target, '/gnmi.gNMI/Subscribe',
+            gnmi__pb2.SubscribeRequest.SerializeToString,
+            gnmi__pb2.SubscribeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Component.py b/src/device/service/drivers/gnmi_openconfig/handlers/Component.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b3c1f9705353548025cb4365ea31e68978c79f1
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/Component.py
@@ -0,0 +1,63 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging
+from typing import Any, Dict, List, Tuple
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from ._Handler import _Handler
+
+LOGGER = logging.getLogger(__name__)
+
+PATH_IF_CTR = "/interfaces/interface[name={:s}]/state/counters/{:s}"
+
+class ComponentHandler(_Handler):
+    def get_resource_key(self) -> str: return '/endpoints/endpoint'
+    def get_path(self) -> str: return '/components/component'
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        #LOGGER.info('json_data = {:s}'.format(json.dumps(json_data)))
+        json_component_list : List[Dict] = json_data.get('component', [])
+        response = []
+        for json_component in json_component_list:
+            #LOGGER.info('json_component = {:s}'.format(json.dumps(json_component)))
+
+            endpoint = {}
+
+            component_type = json_component.get('state', {}).get('type')
+            if component_type is None: continue
+            component_type = component_type.replace('oc-platform-types:', '')
+            component_type = component_type.replace('openconfig-platform-types:', '')
+            if component_type not in {'PORT'}: continue
+            endpoint['type'] = '-'
+
+            #LOGGER.info('PORT json_component = {:s}'.format(json.dumps(json_component)))
+
+            component_name = json_component.get('name')
+            if component_name is None: continue
+
+            # TODO: improve mapping between interface name and component name
+            # By now, computed by time for the sake of saving time for the Hackfest.
+            interface_name = component_name.lower().replace('-port', '')
+
+            endpoint['uuid'] = interface_name
+            endpoint['sample_types'] = {
+                KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED     : PATH_IF_CTR.format(interface_name, 'in-octets' ),
+                KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED  : PATH_IF_CTR.format(interface_name, 'out-octets'),
+                KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED   : PATH_IF_CTR.format(interface_name, 'in-pkts'   ),
+                KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED: PATH_IF_CTR.format(interface_name, 'out-pkts'  ),
+            }
+
+            if len(endpoint) == 0: continue
+            response.append(('/endpoints/endpoint[{:s}]'.format(endpoint['uuid']), endpoint))
+        return response
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py b/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py
new file mode 100644
index 0000000000000000000000000000000000000000..20f79b3c2e15b58ab99166a68422fd35d40fd00f
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py
@@ -0,0 +1,248 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import json, logging
+from typing import Any, Dict, List, Tuple
+from ._Handler import _Handler
+from .Tools import dict_get_first
+
+LOGGER = logging.getLogger(__name__)
+
+class InterfaceHandler(_Handler):
+    def get_resource_key(self) -> str: return '/interface'
+    def get_path(self) -> str: return '/interfaces/interface'
+
+    def compose(self, resource_key : str, resource_value : Dict, delete : bool = False) -> Tuple[str, str]:
+        if_name          = str (resource_value['name'                         ])    # ethernet-1/1
+        sif_index        = int (resource_value.get('sub_if_index'       , 0   ))    # 0
+
+        if delete:
+            PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]'
+            str_path = PATH_TMPL.format(if_name, sif_index)
+            str_data = json.dumps({})
+            return str_path, str_data
+
+        if_enabled       = bool(resource_value.get('enabled'            , True))    # True/False
+        sif_enabled      = bool(resource_value.get('sub_if_enabled'     , True))    # True/False
+        sif_ipv4_enabled = bool(resource_value.get('sub_if_ipv4_enabled', True))    # True/False
+        sif_ipv4_address = str (resource_value['sub_if_ipv4_address'          ])    # 172.16.0.1
+        sif_ipv4_prefix  = int (resource_value['sub_if_ipv4_prefix'           ])    # 24
+
+        str_path = '/interfaces/interface[name={:s}]'.format(if_name)
+        str_data = json.dumps({
+            'name': if_name,
+            'config': {'name': if_name, 'enabled': if_enabled},
+            'subinterfaces': {
+                'subinterface': {
+                    'index': sif_index,
+                    'config': {'index': sif_index, 'enabled': sif_enabled},
+                    'ipv4': {
+                        'config': {'enabled': sif_ipv4_enabled},
+                        'addresses': {
+                            'address': {
+                                'ip': sif_ipv4_address,
+                                'config': {'ip': sif_ipv4_address, 'prefix_length': sif_ipv4_prefix},
+                            }
+                        }
+                    }
+                }
+            }
+        })
+        return str_path, str_data
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        #LOGGER.info('json_data = {:s}'.format(json.dumps(json_data)))
+        json_interface_list : List[Dict] = json_data.get('interface', [])
+
+        response = []
+        for json_interface in json_interface_list:
+            #LOGGER.info('json_interface = {:s}'.format(json.dumps(json_interface)))
+
+            interface = {}
+
+            interface_name = json_interface.get('name')
+            if interface_name is None:
+                LOGGER.info('DISCARDED json_interface = {:s}'.format(json.dumps(json_interface)))
+                continue
+            interface['name'] = interface_name
+
+            CONFIG_FIELDS = ('config', 'openconfig-interface:config', 'oci:config')
+            json_config : Dict = dict_get_first(json_interface, CONFIG_FIELDS, default={})
+
+            STATE_FIELDS = ('state', 'openconfig-interface:state', 'oci:state')
+            json_state : Dict = dict_get_first(json_interface, STATE_FIELDS, default={})
+
+            interface_type = json_config.get('type')
+            if interface_type is None: interface_type = json_state.get('type')
+            if interface_type is None:
+                LOGGER.info('DISCARDED json_interface = {:s}'.format(json.dumps(json_interface)))
+                continue
+            interface_type = interface_type.replace('ianaift:', '')
+            interface_type = interface_type.replace('iana-if-type:', '')
+            interface['type'] = interface_type
+
+            interface_mtu = json_config.get('mtu')
+            if interface_mtu is None: interface_mtu = json_state.get('mtu')
+            if interface_mtu is not None: interface['mtu'] = int(interface_mtu)
+
+            interface_enabled = json_config.get('enabled')
+            if interface_enabled is None: interface_enabled = json_state.get('enabled')
+            interface['enabled'] = False if interface_enabled is None else bool(interface_enabled)
+
+            interface_management = json_config.get('management')
+            if interface_management is None: interface_management = json_state.get('management')
+            interface['management'] = False if interface_management is None else bool(interface_management)
+
+            interface_descr = json_interface.get('config', {}).get('description')
+            if interface_descr is not None: interface['description'] = interface_descr
+
+            json_subinterfaces = json_interface.get('subinterfaces', {})
+            json_subinterface_list : List[Dict] = json_subinterfaces.get('subinterface', [])
+
+            for json_subinterface in json_subinterface_list:
+                #LOGGER.info('json_subinterface = {:s}'.format(json.dumps(json_subinterface)))
+
+                subinterface = {}
+
+                subinterface_index = json_subinterface.get('state', {}).get('index')
+                if subinterface_index is None: continue
+                subinterface['index'] = int(subinterface_index)
+
+                subinterface_name = json_subinterface.get('state', {}).get('name')
+                if subinterface_name is None: continue
+                subinterface['name'] = subinterface_name
+
+                subinterface_enabled = json_subinterface.get('state', {}).get('enabled', False)
+                subinterface['enabled'] = bool(subinterface_enabled)
+
+                VLAN_FIELDS = ('vlan', 'openconfig-vlan:vlan', 'ocv:vlan')
+                json_vlan = dict_get_first(json_subinterface, VLAN_FIELDS, default={})
+
+                MATCH_FIELDS = ('match', 'openconfig-vlan:match', 'ocv:match')
+                json_vlan = dict_get_first(json_vlan, MATCH_FIELDS, default={})
+
+                SIN_TAG_FIELDS = ('single-tagged', 'openconfig-vlan:single-tagged', 'ocv:single-tagged')
+                json_vlan = dict_get_first(json_vlan, SIN_TAG_FIELDS, default={})
+
+                CONFIG_FIELDS = ('config', 'openconfig-vlan:config', 'ocv:config')
+                json_vlan = dict_get_first(json_vlan, CONFIG_FIELDS, default={})
+
+                VLAN_ID_FIELDS = ('vlan-id', 'openconfig-vlan:vlan-id', 'ocv:vlan-id')
+                subinterface_vlan_id = dict_get_first(json_vlan, VLAN_ID_FIELDS)
+                if subinterface_vlan_id is not None: subinterface['vlan_id'] = subinterface_vlan_id
+
+
+                # TODO: implement support for multiple IP addresses per subinterface
+
+                IPV4_FIELDS = ('ipv4', 'openconfig-if-ip:ipv4', 'ociip:ipv4')
+                json_ipv4 = dict_get_first(json_subinterface, IPV4_FIELDS, default={})
+                
+                IPV4_ADDRESSES_FIELDS = ('addresses', 'openconfig-if-ip:addresses', 'ociip:addresses')
+                json_ipv4_addresses = dict_get_first(json_ipv4, IPV4_ADDRESSES_FIELDS, default={})
+
+                IPV4_ADDRESS_FIELDS = ('address', 'openconfig-if-ip:address', 'ociip:address')
+                json_ipv4_address_list : List[Dict] = dict_get_first(json_ipv4_addresses, IPV4_ADDRESS_FIELDS, default=[])
+
+                #ipv4_addresses = []
+                for json_ipv4_address in json_ipv4_address_list:
+                    #LOGGER.info('json_ipv4_address = {:s}'.format(json.dumps(json_ipv4_address)))
+
+                    STATE_FIELDS = ('state', 'openconfig-if-ip:state', 'ociip:state')
+                    json_ipv4_address_state = dict_get_first(json_ipv4_address, STATE_FIELDS, default={})
+
+                    #ipv4_address = {}
+
+                    #ORIGIN_FIELDS = ('origin', 'openconfig-if-ip:origin', 'ociip:origin')
+                    #ipv4_address_origin = dict_get_first(json_ipv4_address_state, ORIGIN_FIELDS, default={})
+                    #if ipv4_address_origin is not None: ipv4_address['origin'] = ipv4_address_origin
+
+                    IP_FIELDS = ('ip', 'openconfig-if-ip:ip', 'ociip:ip')
+                    ipv4_address_ip = dict_get_first(json_ipv4_address_state, IP_FIELDS)
+                    #if ipv4_address_ip is not None: ipv4_address['address_ip'] = ipv4_address_ip
+                    if ipv4_address_ip is not None: subinterface['address_ip'] = ipv4_address_ip
+
+                    PREFIX_FIELDS = ('prefix-length', 'openconfig-if-ip:prefix-length', 'ociip:prefix-length')
+                    ipv4_address_prefix = dict_get_first(json_ipv4_address_state, PREFIX_FIELDS)
+                    #if ipv4_address_prefix is not None: ipv4_address['address_prefix'] = int(ipv4_address_prefix)
+                    if ipv4_address_prefix is not None: subinterface['address_prefix'] = int(ipv4_address_prefix)
+
+                    #if len(ipv4_address) == 0: continue
+                    #ipv4_addresses.append(ipv4_address)
+
+                #subinterface['ipv4_addresses'] = ipv4_addresses
+
+                if len(subinterface) == 0: continue
+                resource_key = '/interface[{:s}]/subinterface[{:s}]'.format(interface['name'], str(subinterface['index']))
+                response.append((resource_key, subinterface))
+
+            if len(interface) == 0: continue
+            response.append(('/interface[{:s}]'.format(interface['name']), interface))
+
+        return response
+
+    def parse_counters(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        LOGGER.info('[parse_counters] json_data = {:s}'.format(json.dumps(json_data)))
+        json_interface_list : List[Dict] = json_data.get('interface', [])
+
+        response = []
+        for json_interface in json_interface_list:
+            LOGGER.info('[parse_counters] json_interface = {:s}'.format(json.dumps(json_interface)))
+
+            interface = {}
+
+            NAME_FIELDS = ('name', 'openconfig-interface:name', 'oci:name')
+            interface_name = dict_get_first(json_interface, NAME_FIELDS)
+            if interface_name is None: continue
+            interface['name'] = interface_name
+
+            STATE_FIELDS = ('state', 'openconfig-interface:state', 'oci:state')
+            json_state = dict_get_first(json_interface, STATE_FIELDS, default={})
+
+            COUNTERS_FIELDS = ('counters', 'openconfig-interface:counters', 'oci:counters')
+            json_counters = dict_get_first(json_state, COUNTERS_FIELDS, default={})
+
+            IN_PKTS_FIELDS = ('in-pkts', 'openconfig-interface:in-pkts', 'oci:in-pkts')
+            interface_in_pkts = dict_get_first(json_counters, IN_PKTS_FIELDS)
+            if interface_in_pkts is not None: interface['in-pkts'] = int(interface_in_pkts)
+
+            IN_OCTETS_FIELDS = ('in-octets', 'openconfig-interface:in-octets', 'oci:in-octets')
+            interface_in_octets = dict_get_first(json_counters, IN_OCTETS_FIELDS)
+            if interface_in_octets is not None: interface['in-octets'] = int(interface_in_octets)
+
+            IN_ERRORS_FIELDS = ('in-errors', 'openconfig-interface:in-errors', 'oci:in-errors')
+            interface_in_errors = dict_get_first(json_counters, IN_ERRORS_FIELDS)
+            if interface_in_errors is not None: interface['in-errors'] = int(interface_in_errors)
+
+            OUT_OCTETS_FIELDS = ('out-octets', 'openconfig-interface:out-octets', 'oci:out-octets')
+            interface_out_octets = dict_get_first(json_counters, OUT_OCTETS_FIELDS)
+            if interface_out_octets is not None: interface['out-octets'] = int(interface_out_octets)
+
+            OUT_PKTS_FIELDS = ('out-pkts', 'openconfig-interface:out-pkts', 'oci:out-pkts')
+            interface_out_pkts = dict_get_first(json_counters, OUT_PKTS_FIELDS)
+            if interface_out_pkts is not None: interface['out-pkts'] = int(interface_out_pkts)
+
+            OUT_ERRORS_FIELDS = ('out-errors', 'openconfig-interface:out-errors', 'oci:out-errors')
+            interface_out_errors = dict_get_first(json_counters, OUT_ERRORS_FIELDS)
+            if interface_out_errors is not None: interface['out-errors'] = int(interface_out_errors)
+
+            OUT_DISCARDS_FIELDS = ('out-discards', 'openconfig-interface:out-discards', 'oci:out-discards')
+            interface_out_discards = dict_get_first(json_counters, OUT_DISCARDS_FIELDS)
+            if interface_out_discards is not None: interface['out-discards'] = int(interface_out_discards)
+
+            #LOGGER.info('[parse_counters] interface = {:s}'.format(str(interface)))
+
+            if len(interface) == 0: continue
+            response.append(('/interface[{:s}]'.format(interface['name']), interface))
+
+        return response
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/InterfaceCounter.py b/src/device/service/drivers/gnmi_openconfig/handlers/InterfaceCounter.py
new file mode 100644
index 0000000000000000000000000000000000000000..a45dc9e7f972445691143df15d6d56d079384fc4
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/InterfaceCounter.py
@@ -0,0 +1,80 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import json, logging
+from typing import Any, Dict, List, Tuple
+from ._Handler import _Handler
+from .Tools import dict_get_first
+
+LOGGER = logging.getLogger(__name__)
+
+class InterfaceCounterHandler(_Handler):
+    def get_resource_key(self) -> str: return '/interface/counters'
+    def get_path(self) -> str: return '/interfaces/interface/state/counters'
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        LOGGER.info('[parse] json_data = {:s}'.format(json.dumps(json_data)))
+        json_interface_list : List[Dict] = json_data.get('interface', [])
+
+        response = []
+        for json_interface in json_interface_list:
+            LOGGER.info('[parse] json_interface = {:s}'.format(json.dumps(json_interface)))
+
+            interface = {}
+
+            NAME_FIELDS = ('name', 'openconfig-interface:name', 'oci:name')
+            interface_name = dict_get_first(json_interface, NAME_FIELDS)
+            if interface_name is None: continue
+            interface['name'] = interface_name
+
+            STATE_FIELDS = ('state', 'openconfig-interface:state', 'oci:state')
+            json_state = dict_get_first(json_interface, STATE_FIELDS, default={})
+
+            COUNTERS_FIELDS = ('counters', 'openconfig-interface:counters', 'oci:counters')
+            json_counters = dict_get_first(json_state, COUNTERS_FIELDS, default={})
+
+            IN_PKTS_FIELDS = ('in-pkts', 'openconfig-interface:in-pkts', 'oci:in-pkts')
+            interface_in_pkts = dict_get_first(json_counters, IN_PKTS_FIELDS)
+            if interface_in_pkts is not None: interface['in-pkts'] = int(interface_in_pkts)
+
+            IN_OCTETS_FIELDS = ('in-octets', 'openconfig-interface:in-octets', 'oci:in-octets')
+            interface_in_octets = dict_get_first(json_counters, IN_OCTETS_FIELDS)
+            if interface_in_octets is not None: interface['in-octets'] = int(interface_in_octets)
+
+            IN_ERRORS_FIELDS = ('in-errors', 'openconfig-interface:in-errors', 'oci:in-errors')
+            interface_in_errors = dict_get_first(json_counters, IN_ERRORS_FIELDS)
+            if interface_in_errors is not None: interface['in-errors'] = int(interface_in_errors)
+
+            OUT_OCTETS_FIELDS = ('out-octets', 'openconfig-interface:out-octets', 'oci:out-octets')
+            interface_out_octets = dict_get_first(json_counters, OUT_OCTETS_FIELDS)
+            if interface_out_octets is not None: interface['out-octets'] = int(interface_out_octets)
+
+            OUT_PKTS_FIELDS = ('out-pkts', 'openconfig-interface:out-pkts', 'oci:out-pkts')
+            interface_out_pkts = dict_get_first(json_counters, OUT_PKTS_FIELDS)
+            if interface_out_pkts is not None: interface['out-pkts'] = int(interface_out_pkts)
+
+            OUT_ERRORS_FIELDS = ('out-errors', 'openconfig-interface:out-errors', 'oci:out-errors')
+            interface_out_errors = dict_get_first(json_counters, OUT_ERRORS_FIELDS)
+            if interface_out_errors is not None: interface['out-errors'] = int(interface_out_errors)
+
+            OUT_DISCARDS_FIELDS = ('out-discards', 'openconfig-interface:out-discards', 'oci:out-discards')
+            interface_out_discards = dict_get_first(json_counters, OUT_DISCARDS_FIELDS)
+            if interface_out_discards is not None: interface['out-discards'] = int(interface_out_discards)
+
+            #LOGGER.info('[parse] interface = {:s}'.format(str(interface)))
+
+            if len(interface) == 0: continue
+            response.append(('/interface[{:s}]'.format(interface['name']), interface))
+
+        return response
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py
new file mode 100644
index 0000000000000000000000000000000000000000..aed821a06fa7fcafe96a21ad5f5fa06be2902038
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py
@@ -0,0 +1,62 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import json, logging
+from typing import Any, Dict, List, Tuple
+from ._Handler import _Handler
+
+LOGGER = logging.getLogger(__name__)
+
+class NetworkInstanceHandler(_Handler):
+    def get_resource_key(self) -> str: return '/network_instance'
+    def get_path(self) -> str: return '/network-instances/network-instance'
+
+    def compose(self, resource_key : str, resource_value : Dict, delete : bool = False) -> Tuple[str, str]:
+        ni_name   = str(resource_value['name'])   # test-svc
+
+        if delete:
+            PATH_TMPL = '/network-instances/network-instance[name={:s}]'
+            str_path = PATH_TMPL.format(ni_name)
+            str_data = json.dumps({})
+            return str_path, str_data
+
+        ni_type   = str(resource_value['type'])   # L3VRF / L2VSI / ...
+
+        # not works: [FailedPrecondition] unsupported identifier 'DIRECTLY_CONNECTED'
+        #protocols = [self._compose_directly_connected()]
+
+        MAP_OC_NI_TYPE = {
+            'L3VRF': 'openconfig-network-instance-types:L3VRF',
+        }
+        ni_type = MAP_OC_NI_TYPE.get(ni_type, ni_type)
+
+        str_path = '/network-instances/network-instance[name={:s}]'.format(ni_name)
+        str_data = json.dumps({
+            'name': ni_name,
+            'config': {'name': ni_name, 'type': ni_type},
+            #'protocols': {'protocol': protocols},
+        })
+        return str_path, str_data
+
+    def _compose_directly_connected(self, name=None, enabled=True) -> Dict:
+        identifier = 'DIRECTLY_CONNECTED'
+        if name is None: name = 'DIRECTLY_CONNECTED'
+        return {
+            'identifier': identifier, 'name': name,
+            'config': {'identifier': identifier, 'name': name, 'enabled': enabled},
+        }
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        response = []
+        return response
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py
new file mode 100644
index 0000000000000000000000000000000000000000..205373fca870ea7338a3c9c043c60306b535c1c0
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py
@@ -0,0 +1,46 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import json, logging
+from typing import Any, Dict, List, Tuple
+from ._Handler import _Handler
+
+LOGGER = logging.getLogger(__name__)
+
+class NetworkInstanceInterfaceHandler(_Handler):
+    def get_resource_key(self) -> str: return '/network_instance/interface'
+    def get_path(self) -> str: return '/network-instances/network-instance/interfaces'
+
+    def compose(self, resource_key : str, resource_value : Dict, delete : bool = False) -> Tuple[str, str]:
+        ni_name   = str(resource_value['name'     ])    # test-svc
+        if_name   = str(resource_value['if_name'  ])    # ethernet-1/1
+        sif_index = int(resource_value['sif_index'])    # 0
+        if_id     = '{:s}.{:d}'.format(if_name, sif_index)
+
+        if delete:
+            PATH_TMPL = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]'
+            str_path = PATH_TMPL.format(ni_name, if_id)
+            str_data = json.dumps({})
+            return str_path, str_data
+
+        str_path = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]'.format(ni_name, if_id)
+        str_data = json.dumps({
+            'id': if_id,
+            'config': {'id': if_id, 'interface': if_name, 'subinterface': sif_index},
+        })
+        return str_path, str_data
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        response = []
+        return response
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceStaticRoute.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceStaticRoute.py
new file mode 100644
index 0000000000000000000000000000000000000000..9d75e9ac66e023c8f7be44d892cb6eec647761eb
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceStaticRoute.py
@@ -0,0 +1,61 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import json, logging
+from typing import Any, Dict, List, Tuple
+from ._Handler import _Handler
+
+LOGGER = logging.getLogger(__name__)
+
+class NetworkInstanceStaticRouteHandler(_Handler):
+    def get_resource_key(self) -> str: return '/network_instance/static_route'
+    def get_path(self) -> str: return '/network-instances/network-instance/static_route'
+
+    def compose(self, resource_key : str, resource_value : Dict, delete : bool = False) -> Tuple[str, str]:
+        ni_name        = str(resource_value['name'                 ]) # test-svc
+        prefix         = str(resource_value['prefix'               ]) # '172.0.1.0/24'
+
+        identifier = 'STATIC'
+        name = 'static'
+        if delete:
+            PATH_TMPL  = '/network-instances/network-instance[name={:s}]/protocols'
+            PATH_TMPL += '/protocol[identifier={:s}][name={:s}]/static-routes/static[prefix={:s}]'
+            str_path = PATH_TMPL.format(ni_name, identifier, name, prefix)
+            str_data = json.dumps({})
+            return str_path, str_data
+
+        next_hop       = str(resource_value['next_hop'             ]) # '172.0.0.1'
+        next_hop_index = int(resource_value.get('next_hop_index', 0)) # 0
+
+        PATH_TMPL = '/network-instances/network-instance[name={:s}]/protocols/protocol[identifier={:s}][name={:s}]'
+        str_path = PATH_TMPL.format(ni_name, identifier, name)
+        str_data = json.dumps({
+            'identifier': identifier, 'name': name,
+            'config': {'identifier': identifier, 'name': name, 'enabled': True},
+            'static_routes': {'static': [{
+                'prefix': prefix,
+                'config': {'prefix': prefix},
+                'next_hops': {
+                    'next-hop': [{
+                        'index': next_hop_index,
+                        'config': {'index': next_hop_index, 'next_hop': next_hop}
+                    }]
+                }
+            }]}
+        })
+        return str_path, str_data
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        response = []
+        return response
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Tools.py b/src/device/service/drivers/gnmi_openconfig/handlers/Tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..30343ac28a46a0c1d24bcb66d07fa03fa377f9fa
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/Tools.py
@@ -0,0 +1,30 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import re
+from typing import Any, Dict, Iterable
+
+RE_REMOVE_FILTERS = re.compile(r'\[[^\]]+\]')
+RE_REMOVE_NAMESPACES = re.compile(r'\/[a-zA-Z0-9\_\-]+:')
+
+def get_schema(resource_key : str):
+    resource_key = RE_REMOVE_FILTERS.sub('', resource_key)
+    resource_key = RE_REMOVE_NAMESPACES.sub('/', resource_key)
+    return resource_key
+
+def dict_get_first(d : Dict, field_names : Iterable[str], default=None) -> Any:
+    for field_name in field_names:
+        if field_name not in d: continue
+        return d[field_name]
+    return default
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/_Handler.py b/src/device/service/drivers/gnmi_openconfig/handlers/_Handler.py
new file mode 100644
index 0000000000000000000000000000000000000000..d20c77b1165decce7ea07243beb782a6b749734b
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/_Handler.py
@@ -0,0 +1,32 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from typing import Any, Dict, List, Tuple
+
+class _Handler:
+    def get_resource_key(self) -> str:
+        # Retrieve the TeraFlowSDN resource_key path schema used to point this handler
+        raise NotImplementedError()
+
+    def get_path(self) -> str:
+        # Retrieve the OpenConfig path schema used to interrogate the device
+        raise NotImplementedError()
+
+    def compose(self, resource_key : str, resource_value : Dict, delete : bool = False) -> Tuple[str, str]:
+        # Compose a Set/Delete message based on the resource_key/resource_value fields, and the delete flag
+        raise NotImplementedError()
+
+    def parse(self, json_data : Dict) -> List[Tuple[str, Dict[str, Any]]]:
+        # Parse a Reply from the device and return a list of resource_key/resource_value pairs
+        raise NotImplementedError()
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py b/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..39cd7c66ad5e8c16e89192ad0f2ffb7c43ae6c50
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/__init__.py
@@ -0,0 +1,103 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging
+from typing import Dict, List, Optional, Tuple, Union
+from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES
+from ._Handler import _Handler
+from .Component import ComponentHandler
+from .Interface import InterfaceHandler
+from .InterfaceCounter import InterfaceCounterHandler
+from .NetworkInstance import NetworkInstanceHandler
+from .NetworkInstanceInterface import NetworkInstanceInterfaceHandler
+from .NetworkInstanceStaticRoute import NetworkInstanceStaticRouteHandler
+from .Tools import get_schema
+
+LOGGER = logging.getLogger(__name__)
+
+comph  = ComponentHandler()
+ifaceh = InterfaceHandler()
+ifctrh = InterfaceCounterHandler()
+nih    = NetworkInstanceHandler()
+niifh  = NetworkInstanceInterfaceHandler()
+nisrh  = NetworkInstanceStaticRouteHandler()
+
+ALL_RESOURCE_KEYS = [
+    RESOURCE_ENDPOINTS,
+    RESOURCE_INTERFACES,
+    RESOURCE_NETWORK_INSTANCES,
+]
+
+RESOURCE_KEY_MAPPER = {
+    RESOURCE_ENDPOINTS         : comph.get_resource_key(),
+    RESOURCE_INTERFACES        : ifaceh.get_resource_key(),
+    RESOURCE_NETWORK_INSTANCES : nih.get_resource_key(),
+}
+
+PATH_MAPPER = {
+    '/components'        : comph.get_path(),
+    '/interfaces'        : ifaceh.get_path(),
+    '/network-instances' : nih.get_path(),
+}
+
+RESOURCE_KEY_TO_HANDLER = {
+    comph.get_resource_key()  : comph,
+    ifaceh.get_resource_key() : ifaceh,
+    ifctrh.get_resource_key() : ifctrh,
+    nih.get_resource_key()    : nih,
+    niifh.get_resource_key()  : niifh,
+    nisrh.get_resource_key()  : nisrh,
+}
+
+PATH_TO_HANDLER = {
+    comph.get_path()  : comph,
+    ifaceh.get_path() : ifaceh,
+    ifctrh.get_path() : ifctrh,
+    nih.get_path()    : nih,
+    niifh.get_path()  : niifh,
+    nisrh.get_path()  : nisrh,
+}
+
+def get_handler(
+    resource_key : Optional[str] = None, path : Optional[str] = None, raise_if_not_found=True
+) -> Optional[_Handler]:
+    if (resource_key is None) == (path is None):
+        MSG = 'Exactly one of resource_key({:s}) or path({:s}) must be specified'
+        raise Exception(MSG.format(str(resource_key), str(path))) # pylint: disable=broad-exception-raised
+    if resource_key is not None:
+        resource_key_schema = get_schema(resource_key)
+        resource_key_schema = RESOURCE_KEY_MAPPER.get(resource_key_schema, resource_key_schema)
+        handler = RESOURCE_KEY_TO_HANDLER.get(resource_key_schema)
+        if handler is None and raise_if_not_found:
+            MSG = 'Handler not found: resource_key={:s} resource_key_schema={:s}'
+            # pylint: disable=broad-exception-raised
+            raise Exception(MSG.format(str(resource_key), str(resource_key_schema)))
+    elif path is not None:
+        path_schema = get_schema(path)
+        path_schema = PATH_MAPPER.get(path_schema, path_schema)
+        handler = PATH_TO_HANDLER.get(path_schema)
+        if handler is None and raise_if_not_found:
+            MSG = 'Handler not found: resource_key={:s} resource_key_schema={:s}'
+            # pylint: disable=broad-exception-raised
+            raise Exception(MSG.format(str(resource_key), str(resource_key_schema)))
+    return handler
+
+def get_path(resource_key : str) -> str:
+    return get_handler(resource_key=resource_key).get_path()
+
+def parse(str_path : str, value : Union[Dict, List]):
+    return get_handler(path=str_path).parse(value)
+
+def compose(resource_key : str, resource_value : Union[Dict, List], delete : bool = False) -> Tuple[str, str]:
+    return get_handler(resource_key=resource_key).compose(resource_key, resource_value, delete=delete)
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/old_bgp_handler.txt b/src/device/service/drivers/gnmi_openconfig/handlers/old_bgp_handler.txt
new file mode 100644
index 0000000000000000000000000000000000000000..595a19788bce7ff0990346ef249ad3ce71f55efa
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/old_bgp_handler.txt
@@ -0,0 +1,138 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+
+# WARNING: this handler is work in progress. Use with care!
+
+import logging, json
+from typing import Any, Dict, List, Tuple
+
+LOGGER = logging.getLogger(__name__)
+
+class NetworkInstanceHandler:
+    def get_resource_key(self) -> str: return '/network_instance'
+    def get_path(self) -> str: return '/network-instances/network-instance'
+
+    def compose_set(self, resource_key : str, resource_value : Dict) -> Tuple[str, str]:
+        ni_name = str(resource_value['name'])   # test-svc
+        ni_type = str(resource_value['type'])   # L3VRF / 
+
+        if_name          = str (resource_value['name'                         ])    # ethernet-1/1
+        if_enabled       = bool(resource_value.get('enabled'            , True))    # True/False
+        sif_index        = int (resource_value.get('sub_if_index'       , 0   ))    # 0
+        sif_enabled      = bool(resource_value.get('sub_if_enabled'     , True))    # True/False
+        sif_ipv4_enabled = bool(resource_value.get('sub_if_ipv4_enabled', True))    # True/False
+        sif_ipv4_address = str (resource_value['sub_if_ipv4_address'          ])    # 172.16.0.1
+        sif_ipv4_prefix  = int (resource_value['sub_if_ipv4_prefix'           ])    # 24
+
+        str_path = '/interfaces/interface[name={:s}]'.format(if_name)
+        str_data = json.dumps({
+            "name": if_name,
+            "config": {"name": if_name, "enabled": if_enabled},
+            "subinterfaces": {
+                "subinterface": {
+                    "index": sif_index,
+                    "config": {"index": sif_index, "enabled": sif_enabled},
+                    "ipv4": {
+                        "config": {"enabled": sif_ipv4_enabled},
+                        "addresses": {
+                            "address": {
+                                "ip": sif_ipv4_address,
+                                "config": {"ip": sif_ipv4_address, "prefix_length": sif_ipv4_prefix},
+                            }
+                        }
+                    }
+                }
+            }
+        })
+        return str_path, str_data
+
+
+        #oc_ni = openconfig_network_instance()
+        #ni = oc_ni.network_instances.network_instance.add(name=ni_name)
+        #ni.config.name = ni_name
+
+        #ni_desc = resource_value.get('description')
+        #if ni_desc is not None: ni.config.description = ni_desc
+
+        #if ni_type == 'L3VRF':
+        #    ni.config.type = 'L3VRF'
+        #    #ni_router_id  = resource_value.get('router_id')
+        #    #if ni_router_id is not None: ni.config.router_id = ni_router_id
+
+        #    proto_bgp = ni.protocols.protocol.add(identifier='BGP', name=ni_name)
+        #    proto_bgp.config.identifier = 'BGP'
+        #    proto_bgp.config.name = ni_name
+        #    proto_bgp.config.enabled = True
+        #    proto_bgp.bgp.global_.config.as_ = 65000
+        #    proto_bgp.bgp.global_.config.router_id = '172.0.0.1'
+
+        #    #ni.config.route_distinguisher = resource_value['route_distinguisher']
+        #elif ni_type == 'L3VRF':
+        #    pass
+        #else:
+        #    raise NotImplementedError()
+        
+        #str_path = '/network-instances/network-instance[name={:s}]'.format(ni_name)
+        #str_data = pybindJSON.dumps(ni, mode='default')
+
+        #str_path = '/network-instances/network-instance[name={:s}]/protocols/protocol[identifier=BGP][name=BGP]'.format(ni_name)
+        #str_data = json.dumps({
+        #    "identifier": "BGP",
+        #    "name": "BGP",
+        #    "config": {"identifier": "BGP", "name": "BGP", "enabled": True},
+        #    "bgp": {"global": {"config": {"as": 65000, "router-id": "5.5.5.5"}}}
+        #})
+
+        str_path = '/network-instances/network-instance[name=test-svc]'
+        str_data = json.dumps({
+            "name": "test-svc",
+            "config": {
+                "name": "test-svc",
+                "type": "openconfig-network-instance-types:L3VRF"
+            },
+            "protocols": {
+                "protocol": [
+                    {
+                        "identifier": "DIRECTLY_CONNECTED",
+                        "name": "DIRECTLY-CONNECTED",
+                        "config": {"identifier": "DIRECTLY_CONNECTED", "name": "DIRECTLY-CONNECTED", "enabled": True},
+                    },
+                    {
+                        "identifier": "STATIC",
+                        "name": "static",
+                        "config": {"identifier": "STATIC", "name": "static", "enabled": True},
+                        "static_routes": {
+                            "static": [
+                                {
+                                    "prefix": "172.0.1.0/24",
+                                    "config": {"prefix": "172.0.1.0/24"},
+                                    "next_hops": {
+                                        "next-hop": [{"index": 0, "config": {"index": 0, "next_hop": "172.0.0.1"}}]
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+        })
+
+
+        #str_path = '/network-instances/network-instance[name={:s}]/protocols/protocol[identifier=DIRECTLY_CONNECTED][name=DIR]'.format(ni_name)
+        #str_data = json.dumps({
+        #    "identifier": "DIRECTLY_CONNECTED",
+        #    "name": "DIR",
+        #    "config": {"identifier": "DIRECTLY_CONNECTED", "name": "DIR", "enabled": True},
+        #})
diff --git a/src/device/service/drivers/gnmi_openconfig/tools/Capabilities.py b/src/device/service/drivers/gnmi_openconfig/tools/Capabilities.py
new file mode 100644
index 0000000000000000000000000000000000000000..b90bf3db887874d3c9015336cc105b3429c8e64e
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/tools/Capabilities.py
@@ -0,0 +1,36 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from typing import Optional, Set, Union
+from common.tools.grpc.Tools import grpc_message_to_json
+from ..gnmi.gnmi_pb2 import CapabilityRequest   # pylint: disable=no-name-in-module
+from ..gnmi.gnmi_pb2_grpc import gNMIStub
+
+def get_supported_encodings(
+    stub : gNMIStub, username : str, password : str, timeout : Optional[int] = None
+) -> Set[Union[str, int]]:
+    metadata = [('username', username), ('password', password)]
+    req = CapabilityRequest()
+    reply = stub.Capabilities(req, metadata=metadata, timeout=timeout)
+
+    data = grpc_message_to_json(reply)
+    supported_encodings = {
+        supported_encoding
+        for supported_encoding in data.get('supported_encodings', [])
+        if isinstance(supported_encoding, str)
+    }
+    if len(supported_encodings) == 0:
+        # pylint: disable=broad-exception-raised
+        raise Exception('No supported encodings found')
+    return supported_encodings
diff --git a/src/device/service/drivers/gnmi_openconfig/tools/Channel.py b/src/device/service/drivers/gnmi_openconfig/tools/Channel.py
new file mode 100644
index 0000000000000000000000000000000000000000..264dd032166117873702643e17acb344b408b194
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/tools/Channel.py
@@ -0,0 +1,34 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import grpc, logging, ssl
+
+def get_grpc_channel(address : str, port : int, use_tls : bool, logger : logging.Logger) -> grpc.Channel:
+    endpoint = str(address) + ':' + str(port)
+    logger.info('Connecting gNMI {:s}...'.format(endpoint))
+    if use_tls:
+        logger.debug('Getting server certificate...')
+        str_server_certificate = ssl.get_server_certificate((str(address), int(port)))
+        bytes_server_certificate = str_server_certificate.encode('UTF-8')
+        logger.debug('Using secure SSL channel...')
+        credentials = grpc.ssl_channel_credentials(
+            root_certificates=bytes_server_certificate, private_key=None, certificate_chain=None)
+        options = [
+            #('grpc.ssl_target_name_override', options.altName,)
+        ]
+        channel = grpc.secure_channel(endpoint, credentials, options)
+    else:
+        logger.debug('Using insecure channel...')
+        channel = grpc.insecure_channel(endpoint)
+    return channel
diff --git a/src/device/service/drivers/gnmi_openconfig/tools/Path.py b/src/device/service/drivers/gnmi_openconfig/tools/Path.py
new file mode 100644
index 0000000000000000000000000000000000000000..40ab28dc6bbaf8a65b667804dfe9285f36864e29
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/tools/Path.py
@@ -0,0 +1,98 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import re
+from typing import List
+from ..gnmi.gnmi_pb2 import Path, PathElem
+
+RE_PATH_SPLIT = re.compile(r'/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)')
+RE_PATH_KEYS = re.compile(r'\[(.*?)\]')
+
+def path_from_string(path='/'):
+    if not path: return Path(elem=[])
+
+    if path[0] == '/':
+        if path[-1] == '/':
+            path_list = RE_PATH_SPLIT.split(path)[1:-1]
+        else:
+            path_list = RE_PATH_SPLIT.split(path)[1:]
+    else:
+        if path[-1] == '/':
+            path_list = RE_PATH_SPLIT.split(path)[:-1]
+        else:
+            path_list = RE_PATH_SPLIT.split(path)
+
+    path = []
+    for elem in path_list:
+        elem_name = elem.split('[', 1)[0]
+        elem_keys = RE_PATH_KEYS.findall(elem)
+        dict_keys = dict(x.split('=', 1) for x in elem_keys)
+        path.append(PathElem(name=elem_name, key=dict_keys))
+
+    return Path(elem=path)
+
+def path_to_string(path : Path) -> str:
+    path_parts = list()
+    for elem in path.elem:
+        kv_list = list()
+        for key in elem.key:
+            value = elem.key[key]
+            kv = '{:s}={:s}'.format(key, value)
+            kv_list.append(kv)
+
+        path_part_name = elem.name
+        if len(kv_list) == 0:
+            path_parts.append(path_part_name)
+        else:
+            str_kv = ', '.join(kv_list)
+            path_part = '{:s}[{:s}]'.format(path_part_name, str_kv)
+            path_parts.append(path_part)
+
+    str_path = '/{:s}'.format('/'.join(path_parts))
+    return str_path
+
+def parse_xpath(xpath : str) -> str:
+    xpath = xpath.replace('//', '/')
+    xpath = xpath.replace('oci:interface[', 'interface[')
+    xpath = xpath.replace('/oci', '/openconfig-interfaces')
+    xpath = re.sub(r"\[oci:name='(.*?)'\]", r"[name=\1]", xpath)
+    # Eliminar el contador del final
+    xpath = '/'.join(xpath.split('/')[:-1]) + '/'
+    return xpath
+
+def split_resource_key(path):
+    pattern = r'/state/counters/(.*)'
+    match = re.search(pattern, path)
+    if match is None: return None
+    return match.group(1)
+
+def dict_to_xpath(d: dict) -> str:
+    xpath = '/'
+    for item in d['elem']:
+        name = item.get('name')
+        if name == 'interface':
+            key = item.get('key')
+            interface_name = key.get('name')
+            xpath += f"/oci:interface[oci:name='{interface_name}']"
+        else:
+            xpath += f"/{name}"
+    xpath = xpath.replace('openconfig-interfaces', 'oci')
+    return xpath
+
+def compose_path(base_path : str, path_filters : List[str] = []):
+    new_path = '' if base_path is None else str(base_path)
+    for path_filter in path_filters:
+        if path_filter == '': continue
+        new_path = '{:s}[{:s}]'.format(new_path, path_filter)
+    return new_path
diff --git a/src/device/service/drivers/gnmi_openconfig/tools/Subscriptions.py b/src/device/service/drivers/gnmi_openconfig/tools/Subscriptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..18b6445ae31c00495c4f3a84922c9c8d4198b3f7
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/tools/Subscriptions.py
@@ -0,0 +1,47 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+# Collection of samples through NetConf is very slow and each request collects all the data.
+# Populate a cache periodically (when first interface is interrogated).
+# Evict data after some seconds, when data is considered as outdated
+
+import anytree
+from typing import Any, List
+from device.service.driver_api.AnyTreeTools import TreeNode, get_subnode, set_subnode_value
+
+class Subscriptions:
+    def __init__(self) -> None:
+        self.__resolver = anytree.Resolver(pathattr='name')
+        self.__subscriptions = TreeNode('.')
+    
+    def add(
+        self, resource_path : List[str], sampling_duration : float, sampling_interval : float, value : Any
+    ) -> None:
+        subscription_path = resource_path + ['{:.3f}:{:.3f}'.format(sampling_duration, sampling_interval)]
+        set_subnode_value(self.__resolver, self.__subscriptions, subscription_path, value)
+
+    def get(
+        self, resource_path : List[str], sampling_duration : float, sampling_interval : float
+    ) -> TreeNode:
+        subscription_path = resource_path + ['{:.3f}:{:.3f}'.format(sampling_duration, sampling_interval)]
+        value = get_subnode(self.__resolver, self.__subscriptions, subscription_path)
+        return value
+
+    def delete(
+        self, reference : TreeNode
+    ) -> None:
+        parent : TreeNode = reference.parent
+        children = list(parent.children)
+        children.remove(reference)
+        parent.children = tuple(children)
diff --git a/src/device/service/drivers/gnmi_openconfig/tools/Value.py b/src/device/service/drivers/gnmi_openconfig/tools/Value.py
new file mode 100644
index 0000000000000000000000000000000000000000..4797930a17360d8a780e99ea9ac05c0e3a1f7abc
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/tools/Value.py
@@ -0,0 +1,52 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import base64, json
+from typing import Any
+from ..gnmi.gnmi_pb2 import TypedValue
+
+def decode_value(value : TypedValue) -> Any:
+    encoding = value.WhichOneof('value')
+    if encoding == 'json_val':
+        value = value.json_val
+        #mdl, cls = self._classes[className]
+        #obj = json.loads(strObj)
+        #if isinstance(obj, (list,)):
+        #    obj = map(lambda n: pybindJSON.loads(n, mdl, cls.__name__), obj)
+        #    data = map(lambda n: json.loads(pybindJSON.dumps(n, mode='default')), obj)
+        #else:
+        #    obj = pybindJSON.loads(obj, mdl, cls.__name__)
+        #    data = json.loads(pybindJSON.dumps(obj, mode='default'))
+        raise NotImplementedError()
+        #return value
+    elif encoding == 'json_ietf_val':
+        value : str = value.json_ietf_val
+        try:
+            return json.loads(value)
+        except json.decoder.JSONDecodeError:
+            # Assume is Base64-encoded
+            b_b64_value = value.encode('UTF-8')
+            b_value = base64.b64decode(b_b64_value, validate=True)
+            value = b_value.decode('UTF-8')
+            return json.loads(value)
+    else:
+        MSG = 'Unsupported Encoding({:s}) in Value({:s})'
+        # pylint: disable=broad-exception-raised
+        raise Exception(MSG.format(str(encoding), str(value)))
+
+def value_exists(value) -> bool:
+    if value is None: return False
+    if isinstance(value, Exception): return False
+    if issubclass(type(value), Exception): return False
+    return True
diff --git a/src/device/service/drivers/gnmi_openconfig/tools/__init__.py b/src/device/service/drivers/gnmi_openconfig/tools/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/tools/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
diff --git a/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py b/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py
index 9498dc84cc6991fd2295371842fa8508c961f1bc..c79dde99a4d3c48f2f27ff00451f50aa1af9bee2 100644
--- a/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py
+++ b/src/device/service/drivers/ietf_l2vpn/IetfL2VpnDriver.py
@@ -19,6 +19,7 @@ from common.tools.object_factory.Device import json_device_id
 from common.tools.object_factory.EndPoint import json_endpoint_id
 from common.type_checkers.Checkers import chk_string, chk_type
 from device.service.driver_api._Driver import _Driver, RESOURCE_ENDPOINTS, RESOURCE_SERVICES
+from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum, get_import_topology
 from device.service.drivers.ietf_l2vpn.TfsDebugApiClient import TfsDebugApiClient
 from .Tools import connection_point, wim_mapping
 from .WimconnectorIETFL2VPN import WimconnectorIETFL2VPN
@@ -59,6 +60,14 @@ class IetfL2VpnDriver(_Driver):
         self.wim = WimconnectorIETFL2VPN(wim, wim_account, config=config)
         self.conn_info = {} # internal database emulating OSM storage provided to WIM Connectors
 
+        # Options are:
+        #    disabled --> just import endpoints as usual
+        #    devices  --> imports sub-devices but not links connecting them.
+        #                 (a remotely-controlled transport domain might exist between them)
+        #    topology --> imports sub-devices and links connecting them.
+        #                 (not supported by XR driver)
+        self.__import_topology = get_import_topology(self.settings, default=ImportTopologyEnum.DEVICES)
+
     def Connect(self) -> bool:
         with self.__lock:
             try:
@@ -93,7 +102,7 @@ class IetfL2VpnDriver(_Driver):
                     chk_string(str_resource_name, resource_key, allow_empty=False)
                     if resource_key == RESOURCE_ENDPOINTS:
                         # return endpoints through debug-api and list-devices method
-                        results.extend(self.dac.get_devices_endpoints())
+                        results.extend(self.dac.get_devices_endpoints(self.__import_topology))
                     elif resource_key == RESOURCE_SERVICES:
                         # return all services through 
                         reply = self.wim.get_all_active_connectivity_services()
diff --git a/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py b/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py
index 4bf40af030fda990f96efe0ff8ab2ce54f82c312..19adc31c30e27f141c7c4dac50b1dcc4c047b1cf 100644
--- a/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py
+++ b/src/device/service/drivers/ietf_l2vpn/TfsDebugApiClient.py
@@ -15,8 +15,10 @@
 import logging, requests
 from requests.auth import HTTPBasicAuth
 from typing import Dict, List, Optional
+from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum
 
 GET_DEVICES_URL = '{:s}://{:s}:{:d}/restconf/debug-api/devices'
+GET_LINKS_URL   = '{:s}://{:s}:{:d}/restconf/debug-api/links'
 TIMEOUT = 30
 
 HTTP_OK_CODES = {
@@ -41,6 +43,7 @@ MAPPING_DRIVER = {
     'DEVICEDRIVER_ONF_TR_352'           : 5,
     'DEVICEDRIVER_XR'                   : 6,
     'DEVICEDRIVER_IETF_L2VPN'           : 7,
+    'DEVICEDRIVER_GNMI_OPENCONFIG'      : 8,
 }
 
 MSG_ERROR = 'Could not retrieve devices in remote TeraFlowSDN instance({:s}). status_code={:s} reply={:s}'
@@ -52,16 +55,23 @@ class TfsDebugApiClient:
         self, address : str, port : int, scheme : str = 'http',
         username : Optional[str] = None, password : Optional[str] = None
     ) -> None:
-        self._url = GET_DEVICES_URL.format(scheme, address, port)
+        self._devices_url = GET_DEVICES_URL.format(scheme, address, port)
+        self._links_url = GET_LINKS_URL.format(scheme, address, port)
         self._auth = HTTPBasicAuth(username, password) if username is not None and password is not None else None
 
-    def get_devices_endpoints(self) -> List[Dict]:
-        reply = requests.get(self._url, timeout=TIMEOUT, verify=False, auth=self._auth)
+    def get_devices_endpoints(self, import_topology : ImportTopologyEnum = ImportTopologyEnum.DEVICES) -> List[Dict]:
+        LOGGER.debug('[get_devices_endpoints] begin')
+        LOGGER.debug('[get_devices_endpoints] import_topology={:s}'.format(str(import_topology)))
+
+        reply = requests.get(self._devices_url, timeout=TIMEOUT, verify=False, auth=self._auth)
         if reply.status_code not in HTTP_OK_CODES:
-            msg = MSG_ERROR.format(str(self._url), str(reply.status_code), str(reply))
+            msg = MSG_ERROR.format(str(self._devices_url), str(reply.status_code), str(reply))
             LOGGER.error(msg)
             raise Exception(msg)
 
+        if import_topology == ImportTopologyEnum.DISABLED:
+            raise Exception('Unsupported import_topology mode: {:s}'.format(str(import_topology)))
+
         result = list()
         for json_device in reply.json()['devices']:
             device_uuid : str = json_device['device_id']['device_uuid']['uuid']
@@ -89,4 +99,29 @@ class TfsDebugApiClient:
                 }
                 result.append((endpoint_url, endpoint_data))
 
+        if import_topology == ImportTopologyEnum.DEVICES:
+            LOGGER.debug('[get_devices_endpoints] devices only; returning')
+            return result
+
+        reply = requests.get(self._links_url, timeout=TIMEOUT, verify=False, auth=self._auth)
+        if reply.status_code not in HTTP_OK_CODES:
+            msg = MSG_ERROR.format(str(self._links_url), str(reply.status_code), str(reply))
+            LOGGER.error(msg)
+            raise Exception(msg)
+
+        for json_link in reply.json()['links']:
+            link_uuid : str = json_link['link_id']['link_uuid']['uuid']
+            link_url = '/links/link[{:s}]'.format(link_uuid)
+            link_endpoint_ids = [
+                (json_endpoint_id['device_id']['device_uuid']['uuid'], json_endpoint_id['endpoint_uuid']['uuid'])
+                for json_endpoint_id in json_link['link_endpoint_ids']
+            ]
+            link_data = {
+                'uuid': json_link['link_id']['link_uuid']['uuid'],
+                'name': json_link['name'],
+                'endpoints': link_endpoint_ids,
+            }
+            result.append((link_url, link_data))
+
+        LOGGER.debug('[get_devices_endpoints] topology; returning')
         return result
diff --git a/src/device/service/drivers/openconfig/OpenConfigDriver.py b/src/device/service/drivers/openconfig/OpenConfigDriver.py
index ac67c4ab0d314adb3ce2af0aaffeda18e67334fc..b34efbc8fbcc8e4a340e8c2282268b9f0246fddc 100644
--- a/src/device/service/drivers/openconfig/OpenConfigDriver.py
+++ b/src/device/service/drivers/openconfig/OpenConfigDriver.py
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import json
 import anytree, copy, logging, pytz, queue, re, threading
 #import lxml.etree as ET
 from datetime import datetime, timedelta
@@ -28,7 +29,7 @@ from device.service.driver_api.Exceptions import UnsupportedResourceKeyException
 from device.service.driver_api._Driver import _Driver
 from device.service.driver_api.AnyTreeTools import TreeNode, get_subnode, set_subnode_value #dump_subtree
 #from .Tools import xml_pretty_print, xml_to_dict, xml_to_file
-from .templates import ALL_RESOURCE_KEYS, EMPTY_CONFIG, compose_config, get_filter, parse
+from .templates import ALL_RESOURCE_KEYS, EMPTY_CONFIG, compose_config, get_filter, parse, cli_compose_config
 from .RetryDecorator import retry
 
 DEBUG_MODE = False
@@ -58,18 +59,20 @@ class NetconfSessionHandler:
         self.__connected = threading.Event()
         self.__address = address
         self.__port = int(port)
-        self.__username        = settings.get('username')
-        self.__password        = settings.get('password')
-        self.__vendor          = settings.get('vendor')
-        self.__key_filename    = settings.get('key_filename')
-        self.__hostkey_verify  = settings.get('hostkey_verify', True)
-        self.__look_for_keys   = settings.get('look_for_keys', True)
-        self.__allow_agent     = settings.get('allow_agent', True)
-        self.__force_running   = settings.get('force_running', False)
-        self.__commit_per_rule = settings.get('commit_per_rule', False)
-        self.__device_params   = settings.get('device_params', {})
-        self.__manager_params  = settings.get('manager_params', {})
-        self.__nc_params       = settings.get('nc_params', {})
+        self.__username         = settings.get('username')
+        self.__password         = settings.get('password')
+        self.__vendor           = settings.get('vendor')
+        self.__version          = settings.get('version', "1")
+        self.__key_filename     = settings.get('key_filename')
+        self.__hostkey_verify   = settings.get('hostkey_verify', True)
+        self.__look_for_keys    = settings.get('look_for_keys', True)
+        self.__allow_agent      = settings.get('allow_agent', True)
+        self.__force_running    = settings.get('force_running', False)
+        self.__commit_per_rule  = settings.get('commit_per_rule', False)
+        self.__device_params    = settings.get('device_params', {})
+        self.__manager_params   = settings.get('manager_params', {})
+        self.__nc_params        = settings.get('nc_params', {})
+        self.__message_renderer = settings.get('message_renderer','jinja')
         self.__manager : Manager   = None
         self.__candidate_supported = False
 
@@ -96,6 +99,12 @@ class NetconfSessionHandler:
 
     @property
     def vendor(self): return self.__vendor
+    
+    @property
+    def version(self): return self.__version
+    
+    @property
+    def message_renderer(self): return self.__message_renderer
 
     @RETRY_DECORATOR
     def get(self, filter=None, with_defaults=None): # pylint: disable=redefined-builtin
@@ -192,47 +201,57 @@ def do_sampling(
     except: # pylint: disable=bare-except
         logger.exception('Error retrieving samples')
 
-def edit_config(
+def edit_config(                                                                                                            # edit the configuration of openconfig devices
     netconf_handler : NetconfSessionHandler, logger : logging.Logger, resources : List[Tuple[str, Any]], delete=False,
     commit_per_rule=False, target='running', default_operation='merge', test_option=None, error_option=None,
     format='xml' # pylint: disable=redefined-builtin
 ):
     str_method = 'DeleteConfig' if delete else 'SetConfig'
-    #logger.debug('[{:s}] resources = {:s}'.format(str_method, str(resources)))
-    results = [None for _ in resources]
-    for i,resource in enumerate(resources):
-        str_resource_name = 'resources[#{:d}]'.format(i)
-        try:
-            logger.debug('[{:s}] resource = {:s}'.format(str_method, str(resource)))
-            chk_type(str_resource_name, resource, (list, tuple))
-            chk_length(str_resource_name, resource, min_length=2, max_length=2)
-            resource_key,resource_value = resource
-            chk_string(str_resource_name + '.key', resource_key, allow_empty=False)
-            str_config_message = compose_config(
-                resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor)
-            if str_config_message is None: raise UnsupportedResourceKeyException(resource_key)
-            logger.debug('[{:s}] str_config_message[{:d}] = {:s}'.format(
-                str_method, len(str_config_message), str(str_config_message)))
-            netconf_handler.edit_config(
-                config=str_config_message, target=target, default_operation=default_operation,
-                test_option=test_option, error_option=error_option, format=format)
-            if commit_per_rule:
+    results = []
+    if "L2VSI" in resources[0][1] and netconf_handler.vendor == "CISCO":
+        #Configure by CLI
+        logger.warning("CLI Configuration")
+        cli_compose_config(resources, delete=delete, host= netconf_handler._NetconfSessionHandler__address, user=netconf_handler._NetconfSessionHandler__username, passw=netconf_handler._NetconfSessionHandler__password)        
+        for i,resource in enumerate(resources):
+            results.append(True)
+    else:
+        for i,resource in enumerate(resources):
+            str_resource_name = 'resources[#{:d}]'.format(i)
+            try:
+                logger.debug('[{:s}] resource = {:s}'.format(str_method, str(resource)))
+                chk_type(str_resource_name, resource, (list, tuple))
+                chk_length(str_resource_name, resource, min_length=2, max_length=2)
+                resource_key,resource_value = resource
+                chk_string(str_resource_name + '.key', resource_key, allow_empty=False)
+                str_config_messages = compose_config(                                                                          # get template for configuration
+                    resource_key, resource_value, delete=delete, vendor=netconf_handler.vendor, message_renderer=netconf_handler.message_renderer)
+                for str_config_message in str_config_messages:                                                                 # configuration of the received templates 
+                    if str_config_message is None: raise UnsupportedResourceKeyException(resource_key)
+                    logger.debug('[{:s}] str_config_message[{:d}] = {:s}'.format(
+                    str_method, len(str_config_message), str(str_config_message)))
+                    netconf_handler.edit_config(                                                                               # configure the device
+                        config=str_config_message, target=target, default_operation=default_operation,
+                        test_option=test_option, error_option=error_option, format=format)
+                    if commit_per_rule:
+                        netconf_handler.commit()                                                                               # configuration commit
+                
+                #results[i] = True
+                results.append(True)
+            except Exception as e: # pylint: disable=broad-except
+                str_operation = 'preparing' if target == 'candidate' else ('deleting' if delete else 'setting')
+                msg = '[{:s}] Exception {:s} {:s}: {:s}'
+                logger.exception(msg.format(str_method, str_operation, str_resource_name, str(resource)))
+                #results[i] = e # if validation fails, store the exception
+                results.append(e)
+
+        if not commit_per_rule:
+            try:
                 netconf_handler.commit()
-            results[i] = True
-        except Exception as e: # pylint: disable=broad-except
-            str_operation = 'preparing' if target == 'candidate' else ('deleting' if delete else 'setting')
-            msg = '[{:s}] Exception {:s} {:s}: {:s}'
-            logger.exception(msg.format(str_method, str_operation, str_resource_name, str(resource)))
-            results[i] = e # if validation fails, store the exception
-
-    if not commit_per_rule:
-        try:
-            netconf_handler.commit()
-        except Exception as e: # pylint: disable=broad-except
-            msg = '[{:s}] Exception committing: {:s}'
-            str_operation = 'preparing' if target == 'candidate' else ('deleting' if delete else 'setting')
-            logger.exception(msg.format(str_method, str_operation, str(resources)))
-            results = [e for _ in resources] # if commit fails, set exception in each resource
+            except Exception as e: # pylint: disable=broad-except
+                msg = '[{:s}] Exception committing: {:s}'
+                str_operation = 'preparing' if target == 'candidate' else ('deleting' if delete else 'setting')
+                logger.exception(msg.format(str_method, str_operation, str(resources)))
+                results = [e for _ in resources] # if commit fails, set exception in each resource
     return results
 
 DRIVER_NAME = 'openconfig'
diff --git a/src/device/service/drivers/openconfig/templates/ACL/ACL_multivendor.py b/src/device/service/drivers/openconfig/templates/ACL/ACL_multivendor.py
new file mode 100755
index 0000000000000000000000000000000000000000..91d05d3d18f1b19374a38f9149dc7bd6b7c518b6
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/ACL/ACL_multivendor.py
@@ -0,0 +1,321 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from yattag import Doc, indent
+
+RULE_TYPE_MAPPING = {
+    'ACLRULETYPE_UNDEFINED': 'ACL_UNDEFINED',
+    'ACLRULETYPE_IPV4'     : 'ACL_IPV4',
+    'ACLRULETYPE_IPV6'     : 'ACL_IPV6',
+    'ACLRULETYPE_L2'       : 'ACL_L2',
+    'ACLRULETYPE_MPLS'     : 'ACL_MPLS',
+    'ACLRULETYPE_MIXED'    : 'ACL_MIXED',
+}
+
+FORWARDING_ACTION_MAPPING = {
+    'ACLFORWARDINGACTION_UNDEFINED': 'UNDEFINED',
+    'ACLFORWARDINGACTION_DROP'     : 'DROP',
+    'ACLFORWARDINGACTION_ACCEPT'   : 'ACCEPT',
+    'ACLFORWARDINGACTION_REJECT'   : 'REJECT',
+}
+
+LOG_ACTION_MAPPING = {
+    'ACLLOGACTION_UNDEFINED': 'UNDEFINED',
+    'ACLLOGACTION_NOLOG'    : 'LOG_NONE',
+    'ACLLOGACTION_SYSLOG'   : 'LOG_SYSLOG',
+}
+
+def acl_set_mng(data,vendor, delete):
+    doc, tag, text = Doc().tagtext()
+
+    Acl_data    = data["rule_set"]
+    Acl_name    = Acl_data['name']
+    Acl_type    = RULE_TYPE_MAPPING[Acl_data['type']]
+    Acl_desc    = Acl_data['description']
+    Acl_entries = Acl_data['entries']
+    with tag('acl', xmlns="http://openconfig.net/yang/acl"):
+        if delete:
+            with tag('acl-sets' ,'xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                with tag('acl-set'):
+                    with tag('name'):text(Acl_name)
+                    with tag('type'):text(Acl_type)
+                    with tag('acl-entries'):
+                            for entry in Acl_entries:
+                                ID     = entry['sequence_id']
+                                desc   = entry['description']
+                                match  = entry['match']
+                                action = entry['action']
+                                with tag('acl-entry'): 
+                                    with tag('sequence-id'):text(ID)
+        else:
+            with tag('acl-sets'):
+                with tag('acl-set'):
+                    with tag('name'):text(Acl_name)
+                    with tag('type'):text(Acl_type)
+                    with tag('config'):
+                        with tag('name'): text(Acl_name)
+                        with tag('type'): text(Acl_type)
+                        with tag('description'):text(Acl_desc)
+                    with tag('acl-entries'):
+                        for entry in Acl_entries:
+                            ID     = entry['sequence_id']
+                            desc   = entry['description']
+                            match  = entry['match']
+                            action = entry['action']
+                            with tag('acl-entry'): 
+                                with tag('sequence-id'):text(ID)
+                                with tag('config'):
+                                    with tag('sequence-id'):   text(ID)
+                                    with tag('description'): text(desc)
+                                # Configuration per type
+                                if "L2" in Acl_type:
+                                    with tag('l2'):
+                                        with tag('config'):
+                                            for key, value in match.items():
+                                                if   "src_address"     in key and len(value) != 0: 
+                                                    with tag('source-mac'):text(value)
+                                                elif "dst_address"     in key and len(value) != 0:
+                                                    with tag('destination-mac'):text(value)   
+                                elif "IPV4" in Acl_type:
+                                    with tag('ipv4'):
+                                        with tag('config'):
+                                            for key, value in match.items():
+                                                if   "src_address"       in key and len(value) != 0:
+                                                    with tag('source-address'):text(value)
+                                                elif "dst_address"       in key and len(value) != 0:
+                                                    with tag('destination-address'):text(value)
+                                                elif "protocol"          in key                    :
+                                                    with tag('protocol'):text(value)
+                                                elif "hop_limit"         in key                    : 
+                                                    with tag('hop-limit'):text(value)
+                                                elif "dscp"              in key                    : 
+                                                    with tag('dscp'):text(value)
+                                    with tag('transport'):
+                                        with tag('config'):
+                                            for key, value in match.items():
+                                                if   "src_port"     in key : 
+                                                    with tag('source-port'):text(value)
+                                                elif "dst_port"     in key : 
+                                                    with tag('destination-port'):text(value)
+                                                elif "tcp_flags"    in key : 
+                                                    with tag('tcp-flags'):text(value)        
+                                elif "IPV6" in Acl_type:
+                                    with tag('ipv6'):
+                                        with tag('config'):
+                                            for key, value in match.items():
+                                                if   "src_address"       in key and len(value) != 0:
+                                                    with tag('source-address'):text(value)
+                                                elif "dst_address"       in key and len(value) != 0:
+                                                    with tag('destination-address'):text(value)
+                                                elif "protocol"          in key                    :
+                                                    with tag('protocol'):text(value)
+                                                elif "hop_limit"         in key                    : 
+                                                    with tag('hop-limit'):text(value)
+                                                elif "dscp"              in key                    : 
+                                                    with tag('dscp'):text(value)
+                                with tag('actions'):
+                                    with tag('config'):
+                                        for key, value in action.items():
+                                            if "forward_action" in key : 
+                                                with tag('forwarding-action'):text(FORWARDING_ACTION_MAPPING[value])
+                                            elif "log_action"     in key :
+                                                with tag('log-action'):text(LOG_ACTION_MAPPING[value])
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+
+def acl_interface(data,vendor, delete):
+    doc, tag, text = Doc().tagtext()
+
+    ID        = data['endpoint_id']['endpoint_uuid']['uuid']
+    Acl_data  = data["rule_set"]
+    Acl_name  = Acl_data['name']
+    Acl_type  = RULE_TYPE_MAPPING[Acl_data['type']]
+
+    with tag('acl', xmlns="http://openconfig.net/yang/acl"):
+            with tag('interfaces'):
+                with tag('interface'):
+                    with tag('id'):text(ID)
+                    with tag('config'):
+                        with tag('id'):text(ID)
+                    with tag('interface-ref'):
+                        with tag('config'):
+                            with tag('interface'):text(ID)
+                            if vendor == 'ADVA': 
+                                with tag('subinterface'): text(0)
+                            else:
+                                with tag('subinterface'): text('subinterface')
+                    with tag('ingress-acl-sets'):
+                        with tag('ingress-acl-set'):
+                            with tag('set-name'):text(Acl_name)
+                            with tag('type'):text(Acl_type)
+                            with tag('config'):
+                                with tag('set-name'):text(Acl_name)
+                                with tag('type'):text(Acl_type)
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+
+def acl_mgmt(parameters,vendor,delete):
+    acl   = []
+    acl.append(acl_set_mng(  parameters,vendor,delete))
+    acl.append(acl_interface(parameters,vendor,delete))
+    return acl
+
+# TESTING
+'''
+data = {'endpoint_id':{'device_id': {'device_uuid': {'uuid': 'R155'}},'endpoint_uuid':{'uuid':'eth-1/0/21.999'}},
+        'rule_set':{'name':"ACL_L4",'type':1,'description':'acl ipv4','entries':[{'sequence_id': 1, 'description': 'IPv4_ACL', 'match': {'dst_address': '172.16.4.4', 'dscp': 0, 'protocol': 6, 'src_address': '172.16.5.5', 'src_port': 0, 'dst_port': 0, 'start_mpls_label': 0, 'end_mpls_label': 0}, 'action': {'forward_action': 1, 'log_action': 1}},
+                                                                                 {'sequence_id': 2, 'description': 'L2_ACL', 'match': {'dst_address': '', 'dscp': 0, 'protocol': 0, 'src_address': '', 'src_port': 52, 'dst_port': 950, 'start_mpls_label': 0, 'end_mpls_label': 0}, 'action': {'forward_action': 1, 'log_action': 1}}]}}
+
+print('\t\tACL')
+print(acl_set_mng(data, False))
+print('\t\tACL')
+print(acl_set_mng(data, True))
+
+print('\n\n\t\tInterfaz')
+print(acl_interface(data,'ADVA', False))
+print('\n\n\t\tInterfaz')
+print(acl_interface(data,'ADVA', True))
+
+'''
+'''
+OLD - VERSION
+
+from .openconfig_acl import openconfig_acl
+from pyangbind.lib.serialise import pybindIETFXMLEncoder
+from common.tools.grpc.Tools import grpc_message_to_json
+import logging
+def acl_mgmt(parameters,vendor):                                                                                       # acl templates management
+    acl   = []    
+    data = grpc_message_to_json(parameters,use_integers_for_enums=True)                                         # acl rule parameters management
+    acl.append(acl_set_mgmt(data,vendor))                                                                              # acl_set template
+    acl.append(acl_interface(data,vendor))                                                                             # acl interface template
+    return acl
+    
+def acl_set_mgmt(parameters,vendor):
+    type     = ["ACL_UNDEFINED", "ACL_IPV4","ACL_IPV6","ACL_L2","ACL_MPLS","ACL_MIXED"]
+    f_action = ["UNDEFINED", "DROP","ACCEPT","REJECT"]
+    l_action = ["UNDEFINED", "LOG_NONE","LOG_SYSLOG"]
+    
+    Acl_data    = parameters["rule_set"]
+    Acl_name    = Acl_data['name']
+    Acl_type    = type[Acl_data['type']]
+    Acl_desc    = Acl_data['description']
+    Acl_entries = Acl_data['entries']
+
+    # Create an instance of the YANG model
+    acl_instance = openconfig_acl()
+
+    # Access the entry container
+    acl_set                    = acl_instance.acl.acl_sets.acl_set.add(name = Acl_name, type=Acl_type)
+    acl_set.config.name        = Acl_name
+    acl_set.config.type        = Acl_type
+    acl_set.config.description = Acl_desc
+    LOGGER = logging.getLogger(__name__)
+
+    LOGGER.warning("VALORES DE ENTRIES",Acl_entries)
+
+    for entry in Acl_entries:
+        ID     = entry['sequence_id']
+        desc   = entry['description']
+        match  = entry['match']
+        action = entry['action']
+
+        acl_entrie = acl_set.acl_entries.acl_entry.add(ID)
+        acl_entrie.config.sequence_id = ID
+        acl_entrie.config.description= desc
+        
+        # Configuration per type
+        if "L2" in Acl_type:
+            for key, value in match.items():
+                if   "src_address"     in key and len(value) != 0: acl_entrie.l2.config.source_mac = value
+                elif "dst_address"     in key and len(value) != 0: acl_entrie.l2.config.destination_mac = value
+                
+        elif "IPV4" in Acl_type:
+            for key, value in match.items():
+                if   "src_address"       in key and len(value) != 0: acl_entrie.ipv4.config.source_address = value
+                elif "dst_address"       in key and len(value) != 0: acl_entrie.ipv4.config.destination_address = value
+                elif "protocol"          in key                    : acl_entrie.ipv4.config.protocol = value
+                elif "hop_limit"         in key                    : acl_entrie.ipv4.config.hop_limit = value
+                elif "dscp"              in key                    : acl_entrie.ipv4.config.dscp = value
+                    
+            for key, value in match.items():
+                if   "src_port"     in key : acl_entrie.transport.config.source_port = value
+                elif "dst_port"     in key : acl_entrie.transport.config.destination_port = value
+                elif "tcp_flags"    in key : acl_entrie.transport.config.tcp_flags = value
+                
+        elif "IPV6" in Acl_type:
+            for key, value in match.items():
+                if   "src_address"       in key and len(value) != 0: acl_entrie.ipv6.config.source_address = value
+                elif "dst_address"       in key and len(value) != 0: acl_entrie.ipv6.config.destination_address = value
+                elif "protocol"          in key                    : acl_entrie.ipv6.config.protocol = value
+                elif "hop_limit"         in key                    : acl_entrie.ipv6.config.hop_limit = value
+                elif "dscp"              in key                    : acl_entrie.ipv6.config.dscp = value
+        
+        for key, value in action.items():
+            if   "forward_action"        in key : acl_entrie.actions.config.forwarding_action = f_action[value]
+            elif "log_action"            in key : acl_entrie.actions.config.log_action = l_action[value]
+            
+    # Dump the entire instance as RFC 7950 XML
+    acl_set = pybindIETFXMLEncoder.serialise(acl_instance)
+    acl_set = acl_set.replace('<openconfig-acl xmlns="http://openconfig.net/yang/acl">',"")
+    acl_set = acl_set.replace('<acl>','<acl xmlns="http://openconfig.net/yang/acl">')
+    acl_set = acl_set.replace('</openconfig-acl>','')
+
+    return(acl_set)
+
+def acl_interface(parameters,vendor):
+    type      = ["ACL_UNDEFINED", "ACL_IPV4","ACL_IPV6","ACL_L2","ACL_MPLS","ACL_MIXED"]
+    ID        = parameters['endpoint_id']['endpoint_uuid']['uuid']
+    Acl_data  = parameters["rule_set"]
+    Acl_name  = Acl_data['name']
+    Acl_type  = type[Acl_data['type']]
+
+    # Create an instance of the YANG model
+    acl_instance = openconfig_acl()
+
+    # Access the entry container
+    interface = acl_instance.acl.interfaces.interface.add(id = ID)
+
+    #Config - Interface
+    interface.config.id = ID
+    
+    #If the Interface parameter is defined [OPTIONAL-PARAMETER]
+    interface.interface_ref.config.interface = ID        # Interface parameter 
+    
+    #TODO: add subinterface management
+    if   vendor == "ADVA"   : interface.interface_ref.config.subinterface = '0'    # Subinterface parameter
+    elif vendor == "Juniper": interface.interface_ref.config.subinterface = '0'
+    else:                     interface.interface_ref.config.subinterface = Acl_data['subinterface']
+    # Configuration ingress type
+    ingress= interface.ingress_acl_sets.ingress_acl_set.add(set_name = Acl_name, type = Acl_type)
+    ingress.config.set_name = Acl_name
+    ingress.config.type     = Acl_type
+
+    # Dump the entire instance as RFC 7950 XML
+    acl_set = pybindIETFXMLEncoder.serialise(acl_instance)                                      
+    acl_set = acl_set.replace('<openconfig-acl xmlns="http://openconfig.net/yang/acl">',"")     
+    acl_set = acl_set.replace('<acl>','<acl xmlns="http://openconfig.net/yang/acl">')           
+    acl_set = acl_set.replace('</openconfig-acl>','')                                           
+    return(acl_set)
+'''
diff --git a/src/device/service/drivers/openconfig/templates/ACL/__init__.py b/src/device/service/drivers/openconfig/templates/ACL/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/ACL/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
diff --git a/src/device/service/drivers/openconfig/templates/ACL/openconfig_acl.py b/src/device/service/drivers/openconfig/templates/ACL/openconfig_acl.py
new file mode 100755
index 0000000000000000000000000000000000000000..2006faf400a48d7a430ae0258fd70aa52f4eb961
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/ACL/openconfig_acl.py
@@ -0,0 +1,9903 @@
+# -*- coding: utf-8 -*-
+from operator import attrgetter
+from pyangbind.lib.yangtypes import RestrictedPrecisionDecimalType
+from pyangbind.lib.yangtypes import RestrictedClassType
+from pyangbind.lib.yangtypes import TypedListType
+from pyangbind.lib.yangtypes import YANGBool
+from pyangbind.lib.yangtypes import YANGListType
+from pyangbind.lib.yangtypes import YANGDynClass
+from pyangbind.lib.yangtypes import ReferenceType
+from pyangbind.lib.base import PybindBase
+from collections import OrderedDict
+from decimal import Decimal
+from bitarray import bitarray
+import six
+
+# PY3 support of some PY2 keywords (needs improved)
+if six.PY3:
+  import builtins as __builtin__
+  long = int
+elif six.PY2:
+  import builtins as __builtin__
+class yc_state_openconfig_acl__acl_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Global operational state data for ACLs
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__counter_capability',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__counter_capability = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'state']
+
+  def _get_counter_capability(self):
+    """
+    Getter method for counter_capability, mapped from YANG variable /acl/state/counter_capability (identityref)
+
+    YANG Description: System reported indication of how ACL counters are reported
+by the target
+    """
+    return self.__counter_capability
+      
+  def _set_counter_capability(self, v, load=False):
+    """
+    Setter method for counter_capability, mapped from YANG variable /acl/state/counter_capability (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_counter_capability is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_counter_capability() directly.
+
+    YANG Description: System reported indication of how ACL counters are reported
+by the target
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """counter_capability must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__counter_capability = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_counter_capability(self):
+    self.__counter_capability = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:AGGREGATE_ONLY': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:INTERFACE_AGGREGATE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="counter-capability", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+  counter_capability = __builtin__.property(_get_counter_capability)
+
+
+  _pyangbind_elements = OrderedDict([('counter_capability', counter_capability), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Access list config
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__type','__description',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /acl/acl_sets/acl_set/config/name (string)
+
+    YANG Description: The name of the access-list set
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /acl/acl_sets/acl_set/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: The name of the access-list set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/acl_sets/acl_set/config/type (identityref)
+
+    YANG Description: The type determines the fields allowed in the ACL entries
+belonging to the ACL set (e.g., IPv4, IPv6, etc.)
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/acl_sets/acl_set/config/type (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: The type determines the fields allowed in the ACL entries
+belonging to the ACL set (e.g., IPv4, IPv6, etc.)
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/config/description (string)
+
+    YANG Description: Description, or comment, for the ACL set
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/config/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: Description, or comment, for the ACL set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  type = __builtin__.property(_get_type, _set_type)
+  description = __builtin__.property(_get_description, _set_description)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('type', type), ('description', description), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Access list state information
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__type','__description',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /acl/acl_sets/acl_set/state/name (string)
+
+    YANG Description: The name of the access-list set
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /acl/acl_sets/acl_set/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: The name of the access-list set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/acl_sets/acl_set/state/type (identityref)
+
+    YANG Description: The type determines the fields allowed in the ACL entries
+belonging to the ACL set (e.g., IPv4, IPv6, etc.)
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/acl_sets/acl_set/state/type (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: The type determines the fields allowed in the ACL entries
+belonging to the ACL set (e.g., IPv4, IPv6, etc.)
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV4': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_IPV6': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_L2': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MIXED': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACL_MPLS': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/state/description (string)
+
+    YANG Description: Description, or comment, for the ACL set
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/state/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: Description, or comment, for the ACL set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+
+  name = __builtin__.property(_get_name)
+  type = __builtin__.property(_get_type)
+  description = __builtin__.property(_get_description)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('type', type), ('description', description), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Access list entries config
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__description',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'config']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/sequence_id (uint32)
+
+    YANG Description: The sequence id determines the order in which ACL entries
+are applied.  The sequence id must be unique for each entry
+in an ACL set.  Target devices should apply the ACL entry
+rules in ascending order determined by sequence id (low to
+high), rather than the relying only on order in the list.
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/sequence_id (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: The sequence id determines the order in which ACL entries
+are applied.  The sequence id must be unique for each entry
+in an ACL set.  Target devices should apply the ACL entry
+rules in ascending order determined by sequence id (low to
+high), rather than the relying only on order in the list.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=True)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/description (string)
+
+    YANG Description: A user-defined description, or comment, for this Access List
+Entry.
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: A user-defined description, or comment, for this Access List
+Entry.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=True)
+
+  sequence_id = __builtin__.property(_get_sequence_id, _set_sequence_id)
+  description = __builtin__.property(_get_description, _set_description)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('description', description), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: State information for ACL entries
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__description','__matched_packets','__matched_octets',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+    self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'state']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/sequence_id (uint32)
+
+    YANG Description: The sequence id determines the order in which ACL entries
+are applied.  The sequence id must be unique for each entry
+in an ACL set.  Target devices should apply the ACL entry
+rules in ascending order determined by sequence id (low to
+high), rather than the relying only on order in the list.
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/sequence_id (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: The sequence id determines the order in which ACL entries
+are applied.  The sequence id must be unique for each entry
+in an ACL set.  Target devices should apply the ACL entry
+rules in ascending order determined by sequence id (low to
+high), rather than the relying only on order in the list.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint32', is_config=False)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/description (string)
+
+    YANG Description: A user-defined description, or comment, for this Access List
+Entry.
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: A user-defined description, or comment, for this Access List
+Entry.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='string', is_config=False)
+
+
+  def _get_matched_packets(self):
+    """
+    Getter method for matched_packets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_packets (oc-yang:counter64)
+
+    YANG Description: Count of the number of packets matching the current ACL
+entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    return self.__matched_packets
+      
+  def _set_matched_packets(self, v, load=False):
+    """
+    Setter method for matched_packets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_packets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_matched_packets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_matched_packets() directly.
+
+    YANG Description: Count of the number of packets matching the current ACL
+entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """matched_packets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__matched_packets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_matched_packets(self):
+    self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_matched_octets(self):
+    """
+    Getter method for matched_octets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_octets (oc-yang:counter64)
+
+    YANG Description: Count of the number of octets (bytes) matching the current
+ACL entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    return self.__matched_octets
+      
+  def _set_matched_octets(self, v, load=False):
+    """
+    Setter method for matched_octets, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state/matched_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_matched_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_matched_octets() directly.
+
+    YANG Description: Count of the number of octets (bytes) matching the current
+ACL entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """matched_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__matched_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_matched_octets(self):
+    self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+  sequence_id = __builtin__.property(_get_sequence_id)
+  description = __builtin__.property(_get_description)
+  matched_packets = __builtin__.property(_get_matched_packets)
+  matched_octets = __builtin__.property(_get_matched_octets)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('description', description), ('matched_packets', matched_packets), ('matched_octets', matched_octets), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/l2/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_mac','__source_mac_mask','__destination_mac','__destination_mac_mask','__ethertype',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'l2', 'config']
+
+  def _get_source_mac(self):
+    """
+    Getter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac (oc-yang:mac-address)
+
+    YANG Description: Source IEEE 802 MAC address.
+    """
+    return self.__source_mac
+      
+  def _set_source_mac(self, v, load=False):
+    """
+    Setter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_mac is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_mac() directly.
+
+    YANG Description: Source IEEE 802 MAC address.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_mac must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)""",
+        })
+
+    self.__source_mac = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_mac(self):
+    self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+
+
+  def _get_source_mac_mask(self):
+    """
+    Getter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac_mask (oc-yang:mac-address)
+
+    YANG Description: Source IEEE 802 MAC address mask.
+    """
+    return self.__source_mac_mask
+      
+  def _set_source_mac_mask(self, v, load=False):
+    """
+    Setter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/source_mac_mask (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_mac_mask is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_mac_mask() directly.
+
+    YANG Description: Source IEEE 802 MAC address mask.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_mac_mask must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)""",
+        })
+
+    self.__source_mac_mask = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_mac_mask(self):
+    self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+
+
+  def _get_destination_mac(self):
+    """
+    Getter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac (oc-yang:mac-address)
+
+    YANG Description: Destination IEEE 802 MAC address.
+    """
+    return self.__destination_mac
+      
+  def _set_destination_mac(self, v, load=False):
+    """
+    Setter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_mac is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_mac() directly.
+
+    YANG Description: Destination IEEE 802 MAC address.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_mac must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)""",
+        })
+
+    self.__destination_mac = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_mac(self):
+    self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+
+
+  def _get_destination_mac_mask(self):
+    """
+    Getter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac_mask (oc-yang:mac-address)
+
+    YANG Description: Destination IEEE 802 MAC address mask.
+    """
+    return self.__destination_mac_mask
+      
+  def _set_destination_mac_mask(self, v, load=False):
+    """
+    Setter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/destination_mac_mask (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_mac_mask is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_mac_mask() directly.
+
+    YANG Description: Destination IEEE 802 MAC address mask.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_mac_mask must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)""",
+        })
+
+    self.__destination_mac_mask = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_mac_mask(self):
+    self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=True)
+
+
+  def _get_ethertype(self):
+    """
+    Getter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/ethertype (oc-pkt-match-types:ethertype-type)
+
+    YANG Description: Ethertype field to match in Ethernet packets
+    """
+    return self.__ethertype
+      
+  def _set_ethertype(self, v, load=False):
+    """
+    Setter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config/ethertype (oc-pkt-match-types:ethertype-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ethertype is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ethertype() directly.
+
+    YANG Description: Ethertype field to match in Ethernet packets
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ethertype must be of a type compatible with oc-pkt-match-types:ethertype-type""",
+          'defined-type': "oc-pkt-match-types:ethertype-type",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True)""",
+        })
+
+    self.__ethertype = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ethertype(self):
+    self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=True)
+
+  source_mac = __builtin__.property(_get_source_mac, _set_source_mac)
+  source_mac_mask = __builtin__.property(_get_source_mac_mask, _set_source_mac_mask)
+  destination_mac = __builtin__.property(_get_destination_mac, _set_destination_mac)
+  destination_mac_mask = __builtin__.property(_get_destination_mac_mask, _set_destination_mac_mask)
+  ethertype = __builtin__.property(_get_ethertype, _set_ethertype)
+
+
+  _pyangbind_elements = OrderedDict([('source_mac', source_mac), ('source_mac_mask', source_mac_mask), ('destination_mac', destination_mac), ('destination_mac_mask', destination_mac_mask), ('ethertype', ethertype), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/l2/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: State Information.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_mac','__source_mac_mask','__destination_mac','__destination_mac_mask','__ethertype',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'l2', 'state']
+
+  def _get_source_mac(self):
+    """
+    Getter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac (oc-yang:mac-address)
+
+    YANG Description: Source IEEE 802 MAC address.
+    """
+    return self.__source_mac
+      
+  def _set_source_mac(self, v, load=False):
+    """
+    Setter method for source_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_mac is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_mac() directly.
+
+    YANG Description: Source IEEE 802 MAC address.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_mac must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)""",
+        })
+
+    self.__source_mac = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_mac(self):
+    self.__source_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+
+
+  def _get_source_mac_mask(self):
+    """
+    Getter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac_mask (oc-yang:mac-address)
+
+    YANG Description: Source IEEE 802 MAC address mask.
+    """
+    return self.__source_mac_mask
+      
+  def _set_source_mac_mask(self, v, load=False):
+    """
+    Setter method for source_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/source_mac_mask (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_mac_mask is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_mac_mask() directly.
+
+    YANG Description: Source IEEE 802 MAC address mask.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_mac_mask must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)""",
+        })
+
+    self.__source_mac_mask = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_mac_mask(self):
+    self.__source_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="source-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+
+
+  def _get_destination_mac(self):
+    """
+    Getter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac (oc-yang:mac-address)
+
+    YANG Description: Destination IEEE 802 MAC address.
+    """
+    return self.__destination_mac
+      
+  def _set_destination_mac(self, v, load=False):
+    """
+    Setter method for destination_mac, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_mac is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_mac() directly.
+
+    YANG Description: Destination IEEE 802 MAC address.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_mac must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)""",
+        })
+
+    self.__destination_mac = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_mac(self):
+    self.__destination_mac = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+
+
+  def _get_destination_mac_mask(self):
+    """
+    Getter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac_mask (oc-yang:mac-address)
+
+    YANG Description: Destination IEEE 802 MAC address mask.
+    """
+    return self.__destination_mac_mask
+      
+  def _set_destination_mac_mask(self, v, load=False):
+    """
+    Setter method for destination_mac_mask, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/destination_mac_mask (oc-yang:mac-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_mac_mask is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_mac_mask() directly.
+
+    YANG Description: Destination IEEE 802 MAC address mask.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_mac_mask must be of a type compatible with oc-yang:mac-address""",
+          'defined-type': "oc-yang:mac-address",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)""",
+        })
+
+    self.__destination_mac_mask = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_mac_mask(self):
+    self.__destination_mac_mask = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'}), is_leaf=True, yang_name="destination-mac-mask", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:mac-address', is_config=False)
+
+
+  def _get_ethertype(self):
+    """
+    Getter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/ethertype (oc-pkt-match-types:ethertype-type)
+
+    YANG Description: Ethertype field to match in Ethernet packets
+    """
+    return self.__ethertype
+      
+  def _set_ethertype(self, v, load=False):
+    """
+    Setter method for ethertype, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state/ethertype (oc-pkt-match-types:ethertype-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ethertype is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ethertype() directly.
+
+    YANG Description: Ethertype field to match in Ethernet packets
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ethertype must be of a type compatible with oc-pkt-match-types:ethertype-type""",
+          'defined-type': "oc-pkt-match-types:ethertype-type",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False)""",
+        })
+
+    self.__ethertype = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ethertype(self):
+    self.__ethertype = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), restriction_dict={'range': ['1536..65535']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV4': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ARP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_VLAN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_IPV6': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_MPLS': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_LLDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:ETHERTYPE_ROCE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="ethertype", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ethertype-type', is_config=False)
+
+  source_mac = __builtin__.property(_get_source_mac)
+  source_mac_mask = __builtin__.property(_get_source_mac_mask)
+  destination_mac = __builtin__.property(_get_destination_mac)
+  destination_mac_mask = __builtin__.property(_get_destination_mac_mask)
+  ethertype = __builtin__.property(_get_ethertype)
+
+
+  _pyangbind_elements = OrderedDict([('source_mac', source_mac), ('source_mac_mask', source_mac_mask), ('destination_mac', destination_mac), ('destination_mac_mask', destination_mac_mask), ('ethertype', ethertype), ])
+
+
+class yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/l2. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Ethernet header fields
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'l2'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'l2']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config (container)
+
+    YANG Description: Configuration data
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state (container)
+
+    YANG Description: State Information.
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: State Information.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ipv4/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for IPv4 match fields
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_address','__source_address_prefix_set','__destination_address','__destination_address_prefix_set','__dscp','__dscp_set','__protocol','__hop_limit',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'ipv4', 'config']
+
+  def _get_source_address(self):
+    """
+    Getter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/source_address (oc-inet:ipv4-prefix)
+
+    YANG Description: Source IPv4 address prefix.
+    """
+    return self.__source_address
+      
+  def _set_source_address(self, v, load=False):
+    """
+    Setter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/source_address (oc-inet:ipv4-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address() directly.
+
+    YANG Description: Source IPv4 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address must be of a type compatible with oc-inet:ipv4-prefix""",
+          'defined-type': "oc-inet:ipv4-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)""",
+        })
+
+    self.__source_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address(self):
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)
+
+
+  def _get_source_address_prefix_set(self):
+    """
+    Getter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/source_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv4 address prefix Set
+to match the source address
+    """
+    return self.__source_address_prefix_set
+      
+  def _set_source_address_prefix_set(self, v, load=False):
+    """
+    Setter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/source_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv4 address prefix Set
+to match the source address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__source_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address_prefix_set(self):
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_destination_address(self):
+    """
+    Getter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/destination_address (oc-inet:ipv4-prefix)
+
+    YANG Description: Destination IPv4 address prefix.
+    """
+    return self.__destination_address
+      
+  def _set_destination_address(self, v, load=False):
+    """
+    Setter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/destination_address (oc-inet:ipv4-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address() directly.
+
+    YANG Description: Destination IPv4 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address must be of a type compatible with oc-inet:ipv4-prefix""",
+          'defined-type': "oc-inet:ipv4-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)""",
+        })
+
+    self.__destination_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address(self):
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=True)
+
+
+  def _get_destination_address_prefix_set(self):
+    """
+    Getter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/destination_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv4 address prefix set
+to match the destination address
+    """
+    return self.__destination_address_prefix_set
+      
+  def _set_destination_address_prefix_set(self, v, load=False):
+    """
+    Setter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/destination_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv4 address prefix set
+to match the destination address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__destination_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address_prefix_set(self):
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_dscp(self):
+    """
+    Getter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/dscp (oc-inet:dscp)
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    return self.__dscp
+      
+  def _set_dscp(self, v, load=False):
+    """
+    Setter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/dscp (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp() directly.
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)""",
+        })
+
+    self.__dscp = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp(self):
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+
+
+  def _get_dscp_set(self):
+    """
+    Getter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/dscp_set (oc-inet:dscp)
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    return self.__dscp_set
+      
+  def _set_dscp_set(self, v, load=False):
+    """
+    Setter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/dscp_set (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp_set() directly.
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp_set must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)""",
+        })
+
+    self.__dscp_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp_set(self):
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+
+
+  def _get_protocol(self):
+    """
+    Getter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/protocol (oc-pkt-match-types:ip-protocol-type)
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    return self.__protocol
+      
+  def _set_protocol(self, v, load=False):
+    """
+    Setter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/protocol (oc-pkt-match-types:ip-protocol-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_protocol is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_protocol() directly.
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """protocol must be of a type compatible with oc-pkt-match-types:ip-protocol-type""",
+          'defined-type': "oc-pkt-match-types:ip-protocol-type",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)""",
+        })
+
+    self.__protocol = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_protocol(self):
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)
+
+
+  def _get_hop_limit(self):
+    """
+    Getter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/hop_limit (uint8)
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    return self.__hop_limit
+      
+  def _set_hop_limit(self, v, load=False):
+    """
+    Setter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config/hop_limit (uint8)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_hop_limit is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_hop_limit() directly.
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """hop_limit must be of a type compatible with uint8""",
+          'defined-type': "uint8",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)""",
+        })
+
+    self.__hop_limit = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_hop_limit(self):
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+
+  source_address = __builtin__.property(_get_source_address, _set_source_address)
+  source_address_prefix_set = __builtin__.property(_get_source_address_prefix_set, _set_source_address_prefix_set)
+  destination_address = __builtin__.property(_get_destination_address, _set_destination_address)
+  destination_address_prefix_set = __builtin__.property(_get_destination_address_prefix_set, _set_destination_address_prefix_set)
+  dscp = __builtin__.property(_get_dscp, _set_dscp)
+  dscp_set = __builtin__.property(_get_dscp_set, _set_dscp_set)
+  protocol = __builtin__.property(_get_protocol, _set_protocol)
+  hop_limit = __builtin__.property(_get_hop_limit, _set_hop_limit)
+
+
+  _pyangbind_elements = OrderedDict([('source_address', source_address), ('source_address_prefix_set', source_address_prefix_set), ('destination_address', destination_address), ('destination_address_prefix_set', destination_address_prefix_set), ('dscp', dscp), ('dscp_set', dscp_set), ('protocol', protocol), ('hop_limit', hop_limit), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ipv4/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: State information for IPv4 match fields
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_address','__source_address_prefix_set','__destination_address','__destination_address_prefix_set','__dscp','__dscp_set','__protocol','__hop_limit',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'ipv4', 'state']
+
+  def _get_source_address(self):
+    """
+    Getter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/source_address (oc-inet:ipv4-prefix)
+
+    YANG Description: Source IPv4 address prefix.
+    """
+    return self.__source_address
+      
+  def _set_source_address(self, v, load=False):
+    """
+    Setter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/source_address (oc-inet:ipv4-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address() directly.
+
+    YANG Description: Source IPv4 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address must be of a type compatible with oc-inet:ipv4-prefix""",
+          'defined-type': "oc-inet:ipv4-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)""",
+        })
+
+    self.__source_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address(self):
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)
+
+
+  def _get_source_address_prefix_set(self):
+    """
+    Getter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/source_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv4 address prefix Set
+to match the source address
+    """
+    return self.__source_address_prefix_set
+      
+  def _set_source_address_prefix_set(self, v, load=False):
+    """
+    Setter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/source_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv4 address prefix Set
+to match the source address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__source_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address_prefix_set(self):
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_destination_address(self):
+    """
+    Getter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/destination_address (oc-inet:ipv4-prefix)
+
+    YANG Description: Destination IPv4 address prefix.
+    """
+    return self.__destination_address
+      
+  def _set_destination_address(self, v, load=False):
+    """
+    Setter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/destination_address (oc-inet:ipv4-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address() directly.
+
+    YANG Description: Destination IPv4 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address must be of a type compatible with oc-inet:ipv4-prefix""",
+          'defined-type': "oc-inet:ipv4-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)""",
+        })
+
+    self.__destination_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address(self):
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv4-prefix', is_config=False)
+
+
+  def _get_destination_address_prefix_set(self):
+    """
+    Getter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/destination_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv4 address prefix set
+to match the destination address
+    """
+    return self.__destination_address_prefix_set
+      
+  def _set_destination_address_prefix_set(self, v, load=False):
+    """
+    Setter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/destination_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv4 address prefix set
+to match the destination address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__destination_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address_prefix_set(self):
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_dscp(self):
+    """
+    Getter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/dscp (oc-inet:dscp)
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    return self.__dscp
+      
+  def _set_dscp(self, v, load=False):
+    """
+    Setter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/dscp (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp() directly.
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)""",
+        })
+
+    self.__dscp = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp(self):
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+
+
+  def _get_dscp_set(self):
+    """
+    Getter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/dscp_set (oc-inet:dscp)
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    return self.__dscp_set
+      
+  def _set_dscp_set(self, v, load=False):
+    """
+    Setter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/dscp_set (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp_set() directly.
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp_set must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)""",
+        })
+
+    self.__dscp_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp_set(self):
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+
+
+  def _get_protocol(self):
+    """
+    Getter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/protocol (oc-pkt-match-types:ip-protocol-type)
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    return self.__protocol
+      
+  def _set_protocol(self, v, load=False):
+    """
+    Setter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/protocol (oc-pkt-match-types:ip-protocol-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_protocol is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_protocol() directly.
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """protocol must be of a type compatible with oc-pkt-match-types:ip-protocol-type""",
+          'defined-type': "oc-pkt-match-types:ip-protocol-type",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)""",
+        })
+
+    self.__protocol = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_protocol(self):
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)
+
+
+  def _get_hop_limit(self):
+    """
+    Getter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/hop_limit (uint8)
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    return self.__hop_limit
+      
+  def _set_hop_limit(self, v, load=False):
+    """
+    Setter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state/hop_limit (uint8)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_hop_limit is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_hop_limit() directly.
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """hop_limit must be of a type compatible with uint8""",
+          'defined-type': "uint8",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)""",
+        })
+
+    self.__hop_limit = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_hop_limit(self):
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+
+  source_address = __builtin__.property(_get_source_address)
+  source_address_prefix_set = __builtin__.property(_get_source_address_prefix_set)
+  destination_address = __builtin__.property(_get_destination_address)
+  destination_address_prefix_set = __builtin__.property(_get_destination_address_prefix_set)
+  dscp = __builtin__.property(_get_dscp)
+  dscp_set = __builtin__.property(_get_dscp_set)
+  protocol = __builtin__.property(_get_protocol)
+  hop_limit = __builtin__.property(_get_hop_limit)
+
+
+  _pyangbind_elements = OrderedDict([('source_address', source_address), ('source_address_prefix_set', source_address_prefix_set), ('destination_address', destination_address), ('destination_address_prefix_set', destination_address_prefix_set), ('dscp', dscp), ('dscp_set', dscp_set), ('protocol', protocol), ('hop_limit', hop_limit), ])
+
+
+class yc_ipv4_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ipv4. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top level container for IPv4 match field data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'ipv4'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'ipv4']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config (container)
+
+    YANG Description: Configuration data for IPv4 match fields
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for IPv4 match fields
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state (container)
+
+    YANG Description: State information for IPv4 match fields
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: State information for IPv4 match fields
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/mpls/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration parameters relating to fields within
+the MPLS header.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__traffic_class','__start_label_value','__end_label_value','__ttl_value',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__traffic_class = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=True)
+    self.__start_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)
+    self.__end_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)
+    self.__ttl_value = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'mpls', 'config']
+
+  def _get_traffic_class(self):
+    """
+    Getter method for traffic_class, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/traffic_class (oc-mpls:mpls-tc)
+
+    YANG Description: The value of the MPLS traffic class (TC) bits,
+formerly known as the EXP bits.
+    """
+    return self.__traffic_class
+      
+  def _set_traffic_class(self, v, load=False):
+    """
+    Setter method for traffic_class, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/traffic_class (oc-mpls:mpls-tc)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_traffic_class is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_traffic_class() directly.
+
+    YANG Description: The value of the MPLS traffic class (TC) bits,
+formerly known as the EXP bits.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """traffic_class must be of a type compatible with oc-mpls:mpls-tc""",
+          'defined-type': "oc-mpls:mpls-tc",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=True)""",
+        })
+
+    self.__traffic_class = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_traffic_class(self):
+    self.__traffic_class = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=True)
+
+
+  def _get_start_label_value(self):
+    """
+    Getter method for start_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/start_label_value (oc-mpls:mpls-label)
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    return self.__start_label_value
+      
+  def _set_start_label_value(self, v, load=False):
+    """
+    Setter method for start_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/start_label_value (oc-mpls:mpls-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_start_label_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_start_label_value() directly.
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """start_label_value must be of a type compatible with oc-mpls:mpls-label""",
+          'defined-type': "oc-mpls:mpls-label",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)""",
+        })
+
+    self.__start_label_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_start_label_value(self):
+    self.__start_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)
+
+
+  def _get_end_label_value(self):
+    """
+    Getter method for end_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/end_label_value (oc-mpls:mpls-label)
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    return self.__end_label_value
+      
+  def _set_end_label_value(self, v, load=False):
+    """
+    Setter method for end_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/end_label_value (oc-mpls:mpls-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_end_label_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_end_label_value() directly.
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """end_label_value must be of a type compatible with oc-mpls:mpls-label""",
+          'defined-type': "oc-mpls:mpls-label",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)""",
+        })
+
+    self.__end_label_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_end_label_value(self):
+    self.__end_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=True)
+
+
+  def _get_ttl_value(self):
+    """
+    Getter method for ttl_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/ttl_value (uint8)
+
+    YANG Description: Time-to-live MPLS packet value match.
+    """
+    return self.__ttl_value
+      
+  def _set_ttl_value(self, v, load=False):
+    """
+    Setter method for ttl_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config/ttl_value (uint8)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ttl_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ttl_value() directly.
+
+    YANG Description: Time-to-live MPLS packet value match.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ttl_value must be of a type compatible with uint8""",
+          'defined-type': "uint8",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)""",
+        })
+
+    self.__ttl_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ttl_value(self):
+    self.__ttl_value = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+
+  traffic_class = __builtin__.property(_get_traffic_class, _set_traffic_class)
+  start_label_value = __builtin__.property(_get_start_label_value, _set_start_label_value)
+  end_label_value = __builtin__.property(_get_end_label_value, _set_end_label_value)
+  ttl_value = __builtin__.property(_get_ttl_value, _set_ttl_value)
+
+
+  _pyangbind_elements = OrderedDict([('traffic_class', traffic_class), ('start_label_value', start_label_value), ('end_label_value', end_label_value), ('ttl_value', ttl_value), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/mpls/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state parameters relating to fields
+within the MPLS header
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__traffic_class','__start_label_value','__end_label_value','__ttl_value',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__traffic_class = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=False)
+    self.__start_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)
+    self.__end_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)
+    self.__ttl_value = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'mpls', 'state']
+
+  def _get_traffic_class(self):
+    """
+    Getter method for traffic_class, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/traffic_class (oc-mpls:mpls-tc)
+
+    YANG Description: The value of the MPLS traffic class (TC) bits,
+formerly known as the EXP bits.
+    """
+    return self.__traffic_class
+      
+  def _set_traffic_class(self, v, load=False):
+    """
+    Setter method for traffic_class, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/traffic_class (oc-mpls:mpls-tc)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_traffic_class is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_traffic_class() directly.
+
+    YANG Description: The value of the MPLS traffic class (TC) bits,
+formerly known as the EXP bits.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """traffic_class must be of a type compatible with oc-mpls:mpls-tc""",
+          'defined-type': "oc-mpls:mpls-tc",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=False)""",
+        })
+
+    self.__traffic_class = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_traffic_class(self):
+    self.__traffic_class = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..7']}), is_leaf=True, yang_name="traffic-class", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-tc', is_config=False)
+
+
+  def _get_start_label_value(self):
+    """
+    Getter method for start_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/start_label_value (oc-mpls:mpls-label)
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    return self.__start_label_value
+      
+  def _set_start_label_value(self, v, load=False):
+    """
+    Setter method for start_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/start_label_value (oc-mpls:mpls-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_start_label_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_start_label_value() directly.
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """start_label_value must be of a type compatible with oc-mpls:mpls-label""",
+          'defined-type': "oc-mpls:mpls-label",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)""",
+        })
+
+    self.__start_label_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_start_label_value(self):
+    self.__start_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="start-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)
+
+
+  def _get_end_label_value(self):
+    """
+    Getter method for end_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/end_label_value (oc-mpls:mpls-label)
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    return self.__end_label_value
+      
+  def _set_end_label_value(self, v, load=False):
+    """
+    Setter method for end_label_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/end_label_value (oc-mpls:mpls-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_end_label_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_end_label_value() directly.
+
+    YANG Description: Match MPLS label value on the MPLS header.
+The usage of this field indicated the upper
+range value in the top of the stack.
+The range that is used is inclusive. The match that
+is done for a particular received pkt_label is:
+start-label-value <= pkt_label <= end-label-value.
+The 20-bit label value in an MPLS label
+stack as specified in RFC 3032.
+This label value does not include the
+encodings of Traffic Class and TTL.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """end_label_value must be of a type compatible with oc-mpls:mpls-label""",
+          'defined-type': "oc-mpls:mpls-label",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)""",
+        })
+
+    self.__end_label_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_end_label_value(self):
+    self.__end_label_value = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['16..1048575']}),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4_EXPLICIT_NULL': {'value': 0}, 'ROUTER_ALERT': {'value': 1}, 'IPV6_EXPLICIT_NULL': {'value': 2}, 'IMPLICIT_NULL': {'value': 3}, 'ENTROPY_LABEL_INDICATOR': {'value': 7}, 'NO_LABEL': {}},),], is_leaf=True, yang_name="end-label-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-mpls:mpls-label', is_config=False)
+
+
+  def _get_ttl_value(self):
+    """
+    Getter method for ttl_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/ttl_value (uint8)
+
+    YANG Description: Time-to-live MPLS packet value match.
+    """
+    return self.__ttl_value
+      
+  def _set_ttl_value(self, v, load=False):
+    """
+    Setter method for ttl_value, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state/ttl_value (uint8)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ttl_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ttl_value() directly.
+
+    YANG Description: Time-to-live MPLS packet value match.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ttl_value must be of a type compatible with uint8""",
+          'defined-type': "uint8",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)""",
+        })
+
+    self.__ttl_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ttl_value(self):
+    self.__ttl_value = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), is_leaf=True, yang_name="ttl-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+
+  traffic_class = __builtin__.property(_get_traffic_class)
+  start_label_value = __builtin__.property(_get_start_label_value)
+  end_label_value = __builtin__.property(_get_end_label_value)
+  ttl_value = __builtin__.property(_get_ttl_value)
+
+
+  _pyangbind_elements = OrderedDict([('traffic_class', traffic_class), ('start_label_value', start_label_value), ('end_label_value', end_label_value), ('ttl_value', ttl_value), ])
+
+
+class yc_mpls_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/mpls. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: MPLS header fields
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'mpls'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'mpls']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config (container)
+
+    YANG Description: Configuration parameters relating to fields within
+the MPLS header.
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration parameters relating to fields within
+the MPLS header.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state (container)
+
+    YANG Description: Operational state parameters relating to fields
+within the MPLS header
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state parameters relating to fields
+within the MPLS header
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ipv6/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for IPv6 match fields
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_address','__source_address_prefix_set','__source_flow_label','__destination_address','__destination_address_prefix_set','__destination_flow_label','__dscp','__dscp_set','__protocol','__hop_limit',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__source_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__destination_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'ipv6', 'config']
+
+  def _get_source_address(self):
+    """
+    Getter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/source_address (oc-inet:ipv6-prefix)
+
+    YANG Description: Source IPv6 address prefix.
+    """
+    return self.__source_address
+      
+  def _set_source_address(self, v, load=False):
+    """
+    Setter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/source_address (oc-inet:ipv6-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address() directly.
+
+    YANG Description: Source IPv6 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address must be of a type compatible with oc-inet:ipv6-prefix""",
+          'defined-type': "oc-inet:ipv6-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)""",
+        })
+
+    self.__source_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address(self):
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)
+
+
+  def _get_source_address_prefix_set(self):
+    """
+    Getter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/source_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the source address
+    """
+    return self.__source_address_prefix_set
+      
+  def _set_source_address_prefix_set(self, v, load=False):
+    """
+    Setter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/source_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the source address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__source_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address_prefix_set(self):
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_source_flow_label(self):
+    """
+    Getter method for source_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/source_flow_label (oc-inet:ipv6-flow-label)
+
+    YANG Description: Source IPv6 Flow label.
+    """
+    return self.__source_flow_label
+      
+  def _set_source_flow_label(self, v, load=False):
+    """
+    Setter method for source_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/source_flow_label (oc-inet:ipv6-flow-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_flow_label is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_flow_label() directly.
+
+    YANG Description: Source IPv6 Flow label.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_flow_label must be of a type compatible with oc-inet:ipv6-flow-label""",
+          'defined-type': "oc-inet:ipv6-flow-label",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)""",
+        })
+
+    self.__source_flow_label = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_flow_label(self):
+    self.__source_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)
+
+
+  def _get_destination_address(self):
+    """
+    Getter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/destination_address (oc-inet:ipv6-prefix)
+
+    YANG Description: Destination IPv6 address prefix.
+    """
+    return self.__destination_address
+      
+  def _set_destination_address(self, v, load=False):
+    """
+    Setter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/destination_address (oc-inet:ipv6-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address() directly.
+
+    YANG Description: Destination IPv6 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address must be of a type compatible with oc-inet:ipv6-prefix""",
+          'defined-type': "oc-inet:ipv6-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)""",
+        })
+
+    self.__destination_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address(self):
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=True)
+
+
+  def _get_destination_address_prefix_set(self):
+    """
+    Getter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/destination_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the destination address
+    """
+    return self.__destination_address_prefix_set
+      
+  def _set_destination_address_prefix_set(self, v, load=False):
+    """
+    Setter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/destination_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the destination address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__destination_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address_prefix_set(self):
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_destination_flow_label(self):
+    """
+    Getter method for destination_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/destination_flow_label (oc-inet:ipv6-flow-label)
+
+    YANG Description: Destination IPv6 Flow label.
+    """
+    return self.__destination_flow_label
+      
+  def _set_destination_flow_label(self, v, load=False):
+    """
+    Setter method for destination_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/destination_flow_label (oc-inet:ipv6-flow-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_flow_label is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_flow_label() directly.
+
+    YANG Description: Destination IPv6 Flow label.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_flow_label must be of a type compatible with oc-inet:ipv6-flow-label""",
+          'defined-type': "oc-inet:ipv6-flow-label",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)""",
+        })
+
+    self.__destination_flow_label = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_flow_label(self):
+    self.__destination_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=True)
+
+
+  def _get_dscp(self):
+    """
+    Getter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/dscp (oc-inet:dscp)
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    return self.__dscp
+      
+  def _set_dscp(self, v, load=False):
+    """
+    Setter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/dscp (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp() directly.
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)""",
+        })
+
+    self.__dscp = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp(self):
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+
+
+  def _get_dscp_set(self):
+    """
+    Getter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/dscp_set (oc-inet:dscp)
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    return self.__dscp_set
+      
+  def _set_dscp_set(self, v, load=False):
+    """
+    Setter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/dscp_set (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp_set() directly.
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp_set must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)""",
+        })
+
+    self.__dscp_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp_set(self):
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=True)
+
+
+  def _get_protocol(self):
+    """
+    Getter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/protocol (oc-pkt-match-types:ip-protocol-type)
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    return self.__protocol
+      
+  def _set_protocol(self, v, load=False):
+    """
+    Setter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/protocol (oc-pkt-match-types:ip-protocol-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_protocol is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_protocol() directly.
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """protocol must be of a type compatible with oc-pkt-match-types:ip-protocol-type""",
+          'defined-type': "oc-pkt-match-types:ip-protocol-type",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)""",
+        })
+
+    self.__protocol = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_protocol(self):
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=True)
+
+
+  def _get_hop_limit(self):
+    """
+    Getter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/hop_limit (uint8)
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    return self.__hop_limit
+      
+  def _set_hop_limit(self, v, load=False):
+    """
+    Setter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config/hop_limit (uint8)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_hop_limit is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_hop_limit() directly.
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """hop_limit must be of a type compatible with uint8""",
+          'defined-type': "uint8",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)""",
+        })
+
+    self.__hop_limit = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_hop_limit(self):
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=True)
+
+  source_address = __builtin__.property(_get_source_address, _set_source_address)
+  source_address_prefix_set = __builtin__.property(_get_source_address_prefix_set, _set_source_address_prefix_set)
+  source_flow_label = __builtin__.property(_get_source_flow_label, _set_source_flow_label)
+  destination_address = __builtin__.property(_get_destination_address, _set_destination_address)
+  destination_address_prefix_set = __builtin__.property(_get_destination_address_prefix_set, _set_destination_address_prefix_set)
+  destination_flow_label = __builtin__.property(_get_destination_flow_label, _set_destination_flow_label)
+  dscp = __builtin__.property(_get_dscp, _set_dscp)
+  dscp_set = __builtin__.property(_get_dscp_set, _set_dscp_set)
+  protocol = __builtin__.property(_get_protocol, _set_protocol)
+  hop_limit = __builtin__.property(_get_hop_limit, _set_hop_limit)
+
+
+  _pyangbind_elements = OrderedDict([('source_address', source_address), ('source_address_prefix_set', source_address_prefix_set), ('source_flow_label', source_flow_label), ('destination_address', destination_address), ('destination_address_prefix_set', destination_address_prefix_set), ('destination_flow_label', destination_flow_label), ('dscp', dscp), ('dscp_set', dscp_set), ('protocol', protocol), ('hop_limit', hop_limit), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ipv6/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for IPv6 match fields
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_address','__source_address_prefix_set','__source_flow_label','__destination_address','__destination_address_prefix_set','__destination_flow_label','__dscp','__dscp_set','__protocol','__hop_limit',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__source_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__destination_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'ipv6', 'state']
+
+  def _get_source_address(self):
+    """
+    Getter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/source_address (oc-inet:ipv6-prefix)
+
+    YANG Description: Source IPv6 address prefix.
+    """
+    return self.__source_address
+      
+  def _set_source_address(self, v, load=False):
+    """
+    Setter method for source_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/source_address (oc-inet:ipv6-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address() directly.
+
+    YANG Description: Source IPv6 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address must be of a type compatible with oc-inet:ipv6-prefix""",
+          'defined-type': "oc-inet:ipv6-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)""",
+        })
+
+    self.__source_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address(self):
+    self.__source_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="source-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)
+
+
+  def _get_source_address_prefix_set(self):
+    """
+    Getter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/source_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the source address
+    """
+    return self.__source_address_prefix_set
+      
+  def _set_source_address_prefix_set(self, v, load=False):
+    """
+    Setter method for source_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/source_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the source address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__source_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_address_prefix_set(self):
+    self.__source_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_source_flow_label(self):
+    """
+    Getter method for source_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/source_flow_label (oc-inet:ipv6-flow-label)
+
+    YANG Description: Source IPv6 Flow label.
+    """
+    return self.__source_flow_label
+      
+  def _set_source_flow_label(self, v, load=False):
+    """
+    Setter method for source_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/source_flow_label (oc-inet:ipv6-flow-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_flow_label is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_flow_label() directly.
+
+    YANG Description: Source IPv6 Flow label.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_flow_label must be of a type compatible with oc-inet:ipv6-flow-label""",
+          'defined-type': "oc-inet:ipv6-flow-label",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)""",
+        })
+
+    self.__source_flow_label = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_flow_label(self):
+    self.__source_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="source-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)
+
+
+  def _get_destination_address(self):
+    """
+    Getter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/destination_address (oc-inet:ipv6-prefix)
+
+    YANG Description: Destination IPv6 address prefix.
+    """
+    return self.__destination_address
+      
+  def _set_destination_address(self, v, load=False):
+    """
+    Setter method for destination_address, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/destination_address (oc-inet:ipv6-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address() directly.
+
+    YANG Description: Destination IPv6 address prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address must be of a type compatible with oc-inet:ipv6-prefix""",
+          'defined-type': "oc-inet:ipv6-prefix",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)""",
+        })
+
+    self.__destination_address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address(self):
+    self.__destination_address = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}), is_leaf=True, yang_name="destination-address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-prefix', is_config=False)
+
+
+  def _get_destination_address_prefix_set(self):
+    """
+    Getter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/destination_address_prefix_set (leafref)
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the destination address
+    """
+    return self.__destination_address_prefix_set
+      
+  def _set_destination_address_prefix_set(self, v, load=False):
+    """
+    Setter method for destination_address_prefix_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/destination_address_prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_address_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_address_prefix_set() directly.
+
+    YANG Description: Reference to a IPv6 address prefix set
+to match the destination address
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_address_prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__destination_address_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_address_prefix_set(self):
+    self.__destination_address_prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-address-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_destination_flow_label(self):
+    """
+    Getter method for destination_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/destination_flow_label (oc-inet:ipv6-flow-label)
+
+    YANG Description: Destination IPv6 Flow label.
+    """
+    return self.__destination_flow_label
+      
+  def _set_destination_flow_label(self, v, load=False):
+    """
+    Setter method for destination_flow_label, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/destination_flow_label (oc-inet:ipv6-flow-label)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_flow_label is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_flow_label() directly.
+
+    YANG Description: Destination IPv6 Flow label.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_flow_label must be of a type compatible with oc-inet:ipv6-flow-label""",
+          'defined-type': "oc-inet:ipv6-flow-label",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)""",
+        })
+
+    self.__destination_flow_label = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_flow_label(self):
+    self.__destination_flow_label = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), restriction_dict={'range': ['0..1048575']}), is_leaf=True, yang_name="destination-flow-label", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:ipv6-flow-label', is_config=False)
+
+
+  def _get_dscp(self):
+    """
+    Getter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/dscp (oc-inet:dscp)
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    return self.__dscp
+      
+  def _set_dscp(self, v, load=False):
+    """
+    Setter method for dscp, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/dscp (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp() directly.
+
+    YANG Description: Value of diffserv codepoint.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)""",
+        })
+
+    self.__dscp = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp(self):
+    self.__dscp = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']}), is_leaf=True, yang_name="dscp", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+
+
+  def _get_dscp_set(self):
+    """
+    Getter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/dscp_set (oc-inet:dscp)
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    return self.__dscp_set
+      
+  def _set_dscp_set(self, v, load=False):
+    """
+    Setter method for dscp_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/dscp_set (oc-inet:dscp)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_dscp_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_dscp_set() directly.
+
+    YANG Description: A list of DSCP values to be matched for incoming packets. AN OR match should
+be performed, such that a packet must match one of the values defined in this
+list. If the field is left empty then any DSCP value matches unless the 'dscp'
+leaf is specified. It is not valid to specify both 'dscp' and 'dscp-set together.'
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """dscp_set must be of a type compatible with oc-inet:dscp""",
+          'defined-type': "oc-inet:dscp",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)""",
+        })
+
+    self.__dscp_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_dscp_set(self):
+    self.__dscp_set = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..63']})), is_leaf=False, yang_name="dscp-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-inet:dscp', is_config=False)
+
+
+  def _get_protocol(self):
+    """
+    Getter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/protocol (oc-pkt-match-types:ip-protocol-type)
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    return self.__protocol
+      
+  def _set_protocol(self, v, load=False):
+    """
+    Setter method for protocol, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/protocol (oc-pkt-match-types:ip-protocol-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_protocol is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_protocol() directly.
+
+    YANG Description: The protocol carried in the IP packet, expressed either
+as its IP protocol number, or by a defined identity.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """protocol must be of a type compatible with oc-pkt-match-types:ip-protocol-type""",
+          'defined-type': "oc-pkt-match-types:ip-protocol-type",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)""",
+        })
+
+    self.__protocol = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_protocol(self):
+    self.__protocol = YANGDynClass(base=[RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..254']}),RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_TCP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_UDP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_ICMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IGMP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_PIM': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_RSVP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_GRE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_AUTH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_L2TP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:IP_IN_IP': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},),], is_leaf=True, yang_name="protocol", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:ip-protocol-type', is_config=False)
+
+
+  def _get_hop_limit(self):
+    """
+    Getter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/hop_limit (uint8)
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    return self.__hop_limit
+      
+  def _set_hop_limit(self, v, load=False):
+    """
+    Setter method for hop_limit, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state/hop_limit (uint8)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_hop_limit is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_hop_limit() directly.
+
+    YANG Description: The IP packet's hop limit -- known as TTL (in hops) in
+IPv4 packets, and hop limit in IPv6
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """hop_limit must be of a type compatible with uint8""",
+          'defined-type': "uint8",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)""",
+        })
+
+    self.__hop_limit = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_hop_limit(self):
+    self.__hop_limit = YANGDynClass(base=RestrictedClassType(base_type=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..255']}, int_size=8), restriction_dict={'range': ['0..255']}), is_leaf=True, yang_name="hop-limit", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='uint8', is_config=False)
+
+  source_address = __builtin__.property(_get_source_address)
+  source_address_prefix_set = __builtin__.property(_get_source_address_prefix_set)
+  source_flow_label = __builtin__.property(_get_source_flow_label)
+  destination_address = __builtin__.property(_get_destination_address)
+  destination_address_prefix_set = __builtin__.property(_get_destination_address_prefix_set)
+  destination_flow_label = __builtin__.property(_get_destination_flow_label)
+  dscp = __builtin__.property(_get_dscp)
+  dscp_set = __builtin__.property(_get_dscp_set)
+  protocol = __builtin__.property(_get_protocol)
+  hop_limit = __builtin__.property(_get_hop_limit)
+
+
+  _pyangbind_elements = OrderedDict([('source_address', source_address), ('source_address_prefix_set', source_address_prefix_set), ('source_flow_label', source_flow_label), ('destination_address', destination_address), ('destination_address_prefix_set', destination_address_prefix_set), ('destination_flow_label', destination_flow_label), ('dscp', dscp), ('dscp_set', dscp_set), ('protocol', protocol), ('hop_limit', hop_limit), ])
+
+
+class yc_ipv6_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/ipv6. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top-level container for IPv6 match field data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'ipv6'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'ipv6']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config (container)
+
+    YANG Description: Configuration data for IPv6 match fields
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for IPv6 match fields
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state (container)
+
+    YANG Description: Operational state data for IPv6 match fields
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for IPv6 match fields
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/transport/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_port','__source_port_set','__destination_port','__destination_port_set','__tcp_flags',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)
+    self.__source_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)
+    self.__destination_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__tcp_flags = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'transport', 'config']
+
+  def _get_source_port(self):
+    """
+    Getter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/source_port (oc-pkt-match-types:port-num-range)
+
+    YANG Description: Source port or range
+    """
+    return self.__source_port
+      
+  def _set_source_port(self, v, load=False):
+    """
+    Setter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/source_port (oc-pkt-match-types:port-num-range)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_port is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_port() directly.
+
+    YANG Description: Source port or range
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_port must be of a type compatible with oc-pkt-match-types:port-num-range""",
+          'defined-type': "oc-pkt-match-types:port-num-range",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)""",
+        })
+
+    self.__source_port = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_port(self):
+    self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)
+
+
+  def _get_source_port_set(self):
+    """
+    Getter method for source_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/source_port_set (leafref)
+
+    YANG Description: Reference to a port set
+to match the source port
+    """
+    return self.__source_port_set
+      
+  def _set_source_port_set(self, v, load=False):
+    """
+    Setter method for source_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/source_port_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_port_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_port_set() directly.
+
+    YANG Description: Reference to a port set
+to match the source port
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_port_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__source_port_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_port_set(self):
+    self.__source_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_destination_port(self):
+    """
+    Getter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/destination_port (oc-pkt-match-types:port-num-range)
+
+    YANG Description: Destination port or range
+    """
+    return self.__destination_port
+      
+  def _set_destination_port(self, v, load=False):
+    """
+    Setter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/destination_port (oc-pkt-match-types:port-num-range)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_port is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_port() directly.
+
+    YANG Description: Destination port or range
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_port must be of a type compatible with oc-pkt-match-types:port-num-range""",
+          'defined-type': "oc-pkt-match-types:port-num-range",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)""",
+        })
+
+    self.__destination_port = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_port(self):
+    self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=True)
+
+
+  def _get_destination_port_set(self):
+    """
+    Getter method for destination_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/destination_port_set (leafref)
+
+    YANG Description: Reference to a port set
+to match the destination port
+    """
+    return self.__destination_port_set
+      
+  def _set_destination_port_set(self, v, load=False):
+    """
+    Setter method for destination_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/destination_port_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_port_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_port_set() directly.
+
+    YANG Description: Reference to a port set
+to match the destination port
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_port_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__destination_port_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_port_set(self):
+    self.__destination_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_tcp_flags(self):
+    """
+    Getter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/tcp_flags (identityref)
+
+    YANG Description: List of TCP flags to match
+    """
+    return self.__tcp_flags
+      
+  def _set_tcp_flags(self, v, load=False):
+    """
+    Setter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config/tcp_flags (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tcp_flags is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tcp_flags() directly.
+
+    YANG Description: List of TCP flags to match
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tcp_flags must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""",
+        })
+
+    self.__tcp_flags = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tcp_flags(self):
+    self.__tcp_flags = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+
+  source_port = __builtin__.property(_get_source_port, _set_source_port)
+  source_port_set = __builtin__.property(_get_source_port_set, _set_source_port_set)
+  destination_port = __builtin__.property(_get_destination_port, _set_destination_port)
+  destination_port_set = __builtin__.property(_get_destination_port_set, _set_destination_port_set)
+  tcp_flags = __builtin__.property(_get_tcp_flags, _set_tcp_flags)
+
+
+  _pyangbind_elements = OrderedDict([('source_port', source_port), ('source_port_set', source_port_set), ('destination_port', destination_port), ('destination_port_set', destination_port_set), ('tcp_flags', tcp_flags), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/transport/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: State data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__source_port','__source_port_set','__destination_port','__destination_port_set','__tcp_flags',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)
+    self.__source_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)
+    self.__destination_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__tcp_flags = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'transport', 'state']
+
+  def _get_source_port(self):
+    """
+    Getter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/source_port (oc-pkt-match-types:port-num-range)
+
+    YANG Description: Source port or range
+    """
+    return self.__source_port
+      
+  def _set_source_port(self, v, load=False):
+    """
+    Setter method for source_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/source_port (oc-pkt-match-types:port-num-range)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_port is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_port() directly.
+
+    YANG Description: Source port or range
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_port must be of a type compatible with oc-pkt-match-types:port-num-range""",
+          'defined-type': "oc-pkt-match-types:port-num-range",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)""",
+        })
+
+    self.__source_port = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_port(self):
+    self.__source_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="source-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)
+
+
+  def _get_source_port_set(self):
+    """
+    Getter method for source_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/source_port_set (leafref)
+
+    YANG Description: Reference to a port set
+to match the source port
+    """
+    return self.__source_port_set
+      
+  def _set_source_port_set(self, v, load=False):
+    """
+    Setter method for source_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/source_port_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_source_port_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_source_port_set() directly.
+
+    YANG Description: Reference to a port set
+to match the source port
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """source_port_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__source_port_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_source_port_set(self):
+    self.__source_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="source-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_destination_port(self):
+    """
+    Getter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/destination_port (oc-pkt-match-types:port-num-range)
+
+    YANG Description: Destination port or range
+    """
+    return self.__destination_port
+      
+  def _set_destination_port(self, v, load=False):
+    """
+    Setter method for destination_port, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/destination_port (oc-pkt-match-types:port-num-range)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_port is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_port() directly.
+
+    YANG Description: Destination port or range
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_port must be of a type compatible with oc-pkt-match-types:port-num-range""",
+          'defined-type': "oc-pkt-match-types:port-num-range",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)""",
+        })
+
+    self.__destination_port = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_port(self):
+    self.__destination_port = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\\.\\.(0{0,4}[0-9]|0{0,3}[1-9][0-9]|0{0,2}[1-9][0-9]{2}|0?[1-9][0-9]{3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])'}),RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16),RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}},),], is_leaf=True, yang_name="destination-port", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-pkt-match-types:port-num-range', is_config=False)
+
+
+  def _get_destination_port_set(self):
+    """
+    Getter method for destination_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/destination_port_set (leafref)
+
+    YANG Description: Reference to a port set
+to match the destination port
+    """
+    return self.__destination_port_set
+      
+  def _set_destination_port_set(self, v, load=False):
+    """
+    Setter method for destination_port_set, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/destination_port_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_destination_port_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_destination_port_set() directly.
+
+    YANG Description: Reference to a port set
+to match the destination port
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """destination_port_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__destination_port_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_destination_port_set(self):
+    self.__destination_port_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="destination-port-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_tcp_flags(self):
+    """
+    Getter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/tcp_flags (identityref)
+
+    YANG Description: List of TCP flags to match
+    """
+    return self.__tcp_flags
+      
+  def _set_tcp_flags(self, v, load=False):
+    """
+    Setter method for tcp_flags, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state/tcp_flags (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tcp_flags is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tcp_flags() directly.
+
+    YANG Description: List of TCP flags to match
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tcp_flags must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__tcp_flags = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tcp_flags(self):
+    self.__tcp_flags = YANGDynClass(unique=True, base=TypedListType(allowed_type=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_SYN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_FIN': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_RST': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_PSH': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ACK': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_URG': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_ECE': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}, 'oc-pkt-match-types:TCP_CWR': {'@module': 'openconfig-packet-match-types', '@namespace': 'http://openconfig.net/yang/packet-match-types'}},)), is_leaf=False, yang_name="tcp-flags", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+  source_port = __builtin__.property(_get_source_port)
+  source_port_set = __builtin__.property(_get_source_port_set)
+  destination_port = __builtin__.property(_get_destination_port)
+  destination_port_set = __builtin__.property(_get_destination_port_set)
+  tcp_flags = __builtin__.property(_get_tcp_flags)
+
+
+  _pyangbind_elements = OrderedDict([('source_port', source_port), ('source_port_set', source_port_set), ('destination_port', destination_port), ('destination_port_set', destination_port_set), ('tcp_flags', tcp_flags), ])
+
+
+class yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/transport. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Transport fields container
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'transport'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'transport']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config (container)
+
+    YANG Description: Configuration data
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state (container)
+
+    YANG Description: State data
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: State data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface/interface-ref/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configured reference to interface / subinterface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface','__subinterface',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'input-interface', 'interface-ref', 'config']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/interface (leafref)
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/interface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/subinterface (leafref)
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config/subinterface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+  interface = __builtin__.property(_get_interface, _set_interface)
+  subinterface = __builtin__.property(_get_subinterface, _set_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ('subinterface', subinterface), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface/interface-ref/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state for interface-ref
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface','__subinterface',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'input-interface', 'interface-ref', 'state']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/interface (leafref)
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/interface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/subinterface (leafref)
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state/subinterface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+  interface = __builtin__.property(_get_interface)
+  subinterface = __builtin__.property(_get_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ('subinterface', subinterface), ])
+
+
+class yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface/interface-ref. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Reference to an interface or subinterface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'interface-ref'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'input-interface', 'interface-ref']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config (container)
+
+    YANG Description: Configured reference to interface / subinterface
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configured reference to interface / subinterface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state (container)
+
+    YANG Description: Operational state for interface-ref
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state for interface-ref
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/input-interface. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Input interface container
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface_ref',)
+
+  _yang_name = 'input-interface'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'input-interface']
+
+  def _get_interface_ref(self):
+    """
+    Getter method for interface_ref, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref (container)
+
+    YANG Description: Reference to an interface or subinterface
+    """
+    return self.__interface_ref
+      
+  def _set_interface_ref(self, v, load=False):
+    """
+    Setter method for interface_ref, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface/interface_ref (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface_ref is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface_ref() directly.
+
+    YANG Description: Reference to an interface or subinterface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface_ref must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__interface_ref = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface_ref(self):
+    self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  interface_ref = __builtin__.property(_get_interface_ref, _set_interface_ref)
+
+
+  _pyangbind_elements = OrderedDict([('interface_ref', interface_ref), ])
+
+
+class yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/actions/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Config data for ACL actions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__forwarding_action','__log_action',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+    self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'actions', 'config']
+
+  def _get_forwarding_action(self):
+    """
+    Getter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/forwarding_action (identityref)
+
+    YANG Description: Specifies the forwarding action.  One forwarding action
+must be specified for each ACL entry
+    """
+    return self.__forwarding_action
+      
+  def _set_forwarding_action(self, v, load=False):
+    """
+    Setter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/forwarding_action (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_forwarding_action is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_forwarding_action() directly.
+
+    YANG Description: Specifies the forwarding action.  One forwarding action
+must be specified for each ACL entry
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """forwarding_action must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""",
+        })
+
+    self.__forwarding_action = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_forwarding_action(self):
+    self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+
+
+  def _get_log_action(self):
+    """
+    Getter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/log_action (identityref)
+
+    YANG Description: Specifies the log action and destination for
+matched packets.  The default is not to log the
+packet.
+    """
+    return self.__log_action
+      
+  def _set_log_action(self, v, load=False):
+    """
+    Setter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config/log_action (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_log_action is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_log_action() directly.
+
+    YANG Description: Specifies the log action and destination for
+matched packets.  The default is not to log the
+packet.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """log_action must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)""",
+        })
+
+    self.__log_action = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_log_action(self):
+    self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=True)
+
+  forwarding_action = __builtin__.property(_get_forwarding_action, _set_forwarding_action)
+  log_action = __builtin__.property(_get_log_action, _set_log_action)
+
+
+  _pyangbind_elements = OrderedDict([('forwarding_action', forwarding_action), ('log_action', log_action), ])
+
+
+class yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/actions/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: State information for ACL actions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__forwarding_action','__log_action',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'actions', 'state']
+
+  def _get_forwarding_action(self):
+    """
+    Getter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/forwarding_action (identityref)
+
+    YANG Description: Specifies the forwarding action.  One forwarding action
+must be specified for each ACL entry
+    """
+    return self.__forwarding_action
+      
+  def _set_forwarding_action(self, v, load=False):
+    """
+    Setter method for forwarding_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/forwarding_action (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_forwarding_action is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_forwarding_action() directly.
+
+    YANG Description: Specifies the forwarding action.  One forwarding action
+must be specified for each ACL entry
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """forwarding_action must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__forwarding_action = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_forwarding_action(self):
+    self.__forwarding_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:ACCEPT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:DROP': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:REJECT': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), is_leaf=True, yang_name="forwarding-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+
+  def _get_log_action(self):
+    """
+    Getter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/log_action (identityref)
+
+    YANG Description: Specifies the log action and destination for
+matched packets.  The default is not to log the
+packet.
+    """
+    return self.__log_action
+      
+  def _set_log_action(self, v, load=False):
+    """
+    Setter method for log_action, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state/log_action (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_log_action is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_log_action() directly.
+
+    YANG Description: Specifies the log action and destination for
+matched packets.  The default is not to log the
+packet.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """log_action must be of a type compatible with identityref""",
+          'defined-type': "openconfig-acl:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__log_action = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_log_action(self):
+    self.__log_action = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_SYSLOG': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}, 'oc-acl:LOG_NONE': {'@module': 'openconfig-acl', '@namespace': 'http://openconfig.net/yang/acl'}},), default=six.text_type("LOG_NONE"), is_leaf=True, yang_name="log-action", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='identityref', is_config=False)
+
+  forwarding_action = __builtin__.property(_get_forwarding_action)
+  log_action = __builtin__.property(_get_log_action)
+
+
+  _pyangbind_elements = OrderedDict([('forwarding_action', forwarding_action), ('log_action', log_action), ])
+
+
+class yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry/actions. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for list of ACL actions associated
+with an entry
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'actions'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry', 'actions']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config (container)
+
+    YANG Description: Config data for ACL actions
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Config data for ACL actions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state (container)
+
+    YANG Description: State information for ACL actions
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: State information for ACL actions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries/acl-entry. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of ACL entries comprising an ACL set
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__config','__state','__l2','__ipv4','__mpls','__ipv6','__transport','__input_interface','__actions',)
+
+  _yang_name = 'acl-entry'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__l2 = YANGDynClass(base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__ipv4 = YANGDynClass(base=yc_ipv4_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4, is_container='container', yang_name="ipv4", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__mpls = YANGDynClass(base=yc_mpls_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls, is_container='container', yang_name="mpls", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__ipv6 = YANGDynClass(base=yc_ipv6_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6, is_container='container', yang_name="ipv6", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__transport = YANGDynClass(base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__input_interface = YANGDynClass(base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__actions = YANGDynClass(base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries', 'acl-entry']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/sequence_id (leafref)
+
+    YANG Description: references the list key
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/sequence_id (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: references the list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config (container)
+
+    YANG Description: Access list entries config
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Access list entries config
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state (container)
+
+    YANG Description: State information for ACL entries
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: State information for ACL entries
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_l2(self):
+    """
+    Getter method for l2, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2 (container)
+
+    YANG Description: Ethernet header fields
+    """
+    return self.__l2
+      
+  def _set_l2(self, v, load=False):
+    """
+    Setter method for l2, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/l2 (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_l2 is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_l2() directly.
+
+    YANG Description: Ethernet header fields
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """l2 must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__l2 = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_l2(self):
+    self.__l2 = YANGDynClass(base=yc_l2_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_l2, is_container='container', yang_name="l2", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_ipv4(self):
+    """
+    Getter method for ipv4, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4 (container)
+
+    YANG Description: Top level container for IPv4 match field data
+    """
+    return self.__ipv4
+      
+  def _set_ipv4(self, v, load=False):
+    """
+    Setter method for ipv4, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv4 (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ipv4 is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ipv4() directly.
+
+    YANG Description: Top level container for IPv4 match field data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_ipv4_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4, is_container='container', yang_name="ipv4", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ipv4 must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_ipv4_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4, is_container='container', yang_name="ipv4", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__ipv4 = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ipv4(self):
+    self.__ipv4 = YANGDynClass(base=yc_ipv4_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv4, is_container='container', yang_name="ipv4", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_mpls(self):
+    """
+    Getter method for mpls, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls (container)
+
+    YANG Description: MPLS header fields
+    """
+    return self.__mpls
+      
+  def _set_mpls(self, v, load=False):
+    """
+    Setter method for mpls, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/mpls (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mpls is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mpls() directly.
+
+    YANG Description: MPLS header fields
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_mpls_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls, is_container='container', yang_name="mpls", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mpls must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_mpls_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls, is_container='container', yang_name="mpls", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__mpls = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mpls(self):
+    self.__mpls = YANGDynClass(base=yc_mpls_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_mpls, is_container='container', yang_name="mpls", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_ipv6(self):
+    """
+    Getter method for ipv6, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6 (container)
+
+    YANG Description: Top-level container for IPv6 match field data
+    """
+    return self.__ipv6
+      
+  def _set_ipv6(self, v, load=False):
+    """
+    Setter method for ipv6, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/ipv6 (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ipv6 is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ipv6() directly.
+
+    YANG Description: Top-level container for IPv6 match field data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_ipv6_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6, is_container='container', yang_name="ipv6", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ipv6 must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_ipv6_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6, is_container='container', yang_name="ipv6", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__ipv6 = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ipv6(self):
+    self.__ipv6 = YANGDynClass(base=yc_ipv6_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_ipv6, is_container='container', yang_name="ipv6", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_transport(self):
+    """
+    Getter method for transport, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport (container)
+
+    YANG Description: Transport fields container
+    """
+    return self.__transport
+      
+  def _set_transport(self, v, load=False):
+    """
+    Setter method for transport, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/transport (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_transport is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_transport() directly.
+
+    YANG Description: Transport fields container
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """transport must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__transport = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_transport(self):
+    self.__transport = YANGDynClass(base=yc_transport_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_transport, is_container='container', yang_name="transport", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_input_interface(self):
+    """
+    Getter method for input_interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface (container)
+
+    YANG Description: Input interface container
+    """
+    return self.__input_interface
+      
+  def _set_input_interface(self, v, load=False):
+    """
+    Setter method for input_interface, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/input_interface (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_input_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_input_interface() directly.
+
+    YANG Description: Input interface container
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """input_interface must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__input_interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_input_interface(self):
+    self.__input_interface = YANGDynClass(base=yc_input_interface_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_input_interface, is_container='container', yang_name="input-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_actions(self):
+    """
+    Getter method for actions, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions (container)
+
+    YANG Description: Enclosing container for list of ACL actions associated
+with an entry
+    """
+    return self.__actions
+      
+  def _set_actions(self, v, load=False):
+    """
+    Setter method for actions, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry/actions (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_actions is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_actions() directly.
+
+    YANG Description: Enclosing container for list of ACL actions associated
+with an entry
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """actions must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__actions = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_actions(self):
+    self.__actions = YANGDynClass(base=yc_actions_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  sequence_id = __builtin__.property(_get_sequence_id, _set_sequence_id)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  l2 = __builtin__.property(_get_l2, _set_l2)
+  ipv4 = __builtin__.property(_get_ipv4, _set_ipv4)
+  mpls = __builtin__.property(_get_mpls, _set_mpls)
+  ipv6 = __builtin__.property(_get_ipv6, _set_ipv6)
+  transport = __builtin__.property(_get_transport, _set_transport)
+  input_interface = __builtin__.property(_get_input_interface, _set_input_interface)
+  actions = __builtin__.property(_get_actions, _set_actions)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('config', config), ('state', state), ('l2', l2), ('ipv4', ipv4), ('mpls', mpls), ('ipv6', ipv6), ('transport', transport), ('input_interface', input_interface), ('actions', actions), ])
+
+
+class yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set/acl-entries. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Access list entries container
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__acl_entry',)
+
+  _yang_name = 'acl-entries'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set', 'acl-entries']
+
+  def _get_acl_entry(self):
+    """
+    Getter method for acl_entry, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry (list)
+
+    YANG Description: List of ACL entries comprising an ACL set
+    """
+    return self.__acl_entry
+      
+  def _set_acl_entry(self, v, load=False):
+    """
+    Setter method for acl_entry, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries/acl_entry (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_entry is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_entry() directly.
+
+    YANG Description: List of ACL entries comprising an ACL set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_entry must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""",
+        })
+
+    self.__acl_entry = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_entry(self):
+    self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_acl_sets_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+  acl_entry = __builtin__.property(_get_acl_entry, _set_acl_entry)
+
+
+  _pyangbind_elements = OrderedDict([('acl_entry', acl_entry), ])
+
+
+class yc_acl_set_openconfig_acl__acl_acl_sets_acl_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets/acl-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of ACL sets, each comprising of a list of ACL
+entries
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__type','__config','__state','__acl_entries',)
+
+  _yang_name = 'acl-set'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets', 'acl-set']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /acl/acl_sets/acl_set/name (leafref)
+
+    YANG Description: Reference to the name list key
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /acl/acl_sets/acl_set/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Reference to the name list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/acl_sets/acl_set/type (leafref)
+
+    YANG Description: Reference to the type list key
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/acl_sets/acl_set/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to the type list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/acl_sets/acl_set/config (container)
+
+    YANG Description: Access list config
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/acl_sets/acl_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Access list config
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_acl_sets_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/acl_sets/acl_set/state (container)
+
+    YANG Description: Access list state information
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/acl_sets/acl_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Access list state information
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_acl_sets_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_acl_entries(self):
+    """
+    Getter method for acl_entries, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries (container)
+
+    YANG Description: Access list entries container
+    """
+    return self.__acl_entries
+      
+  def _set_acl_entries(self, v, load=False):
+    """
+    Setter method for acl_entries, mapped from YANG variable /acl/acl_sets/acl_set/acl_entries (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_entries is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_entries() directly.
+
+    YANG Description: Access list entries container
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_entries must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__acl_entries = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_entries(self):
+    self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_acl_sets_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  type = __builtin__.property(_get_type, _set_type)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  acl_entries = __builtin__.property(_get_acl_entries, _set_acl_entries)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('type', type), ('config', config), ('state', state), ('acl_entries', acl_entries), ])
+
+
+class yc_acl_sets_openconfig_acl__acl_acl_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/acl-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Access list entries variables enclosing container
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__acl_set',)
+
+  _yang_name = 'acl-sets'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__acl_set = YANGDynClass(base=YANGListType("name type",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name type', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'acl-sets']
+
+  def _get_acl_set(self):
+    """
+    Getter method for acl_set, mapped from YANG variable /acl/acl_sets/acl_set (list)
+
+    YANG Description: List of ACL sets, each comprising of a list of ACL
+entries
+    """
+    return self.__acl_set
+      
+  def _set_acl_set(self, v, load=False):
+    """
+    Setter method for acl_set, mapped from YANG variable /acl/acl_sets/acl_set (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_set() directly.
+
+    YANG Description: List of ACL sets, each comprising of a list of ACL
+entries
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name type",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name type', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_set must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name type",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name type', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""",
+        })
+
+    self.__acl_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_set(self):
+    self.__acl_set = YANGDynClass(base=YANGListType("name type",yc_acl_set_openconfig_acl__acl_acl_sets_acl_set, yang_name="acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name type', extensions=None), is_container='list', yang_name="acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+  acl_set = __builtin__.property(_get_acl_set, _set_acl_set)
+
+
+  _pyangbind_elements = OrderedDict([('acl_set', acl_set), ])
+
+
+class yc_config_openconfig_acl__acl_interfaces_interface_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration for ACL per-interface data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__id',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'config']
+
+  def _get_id(self):
+    """
+    Getter method for id, mapped from YANG variable /acl/interfaces/interface/config/id (oc-if:interface-id)
+
+    YANG Description: User-defined identifier for the interface -- a common
+convention could be '<if name>.<subif index>'
+    """
+    return self.__id
+      
+  def _set_id(self, v, load=False):
+    """
+    Setter method for id, mapped from YANG variable /acl/interfaces/interface/config/id (oc-if:interface-id)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_id() directly.
+
+    YANG Description: User-defined identifier for the interface -- a common
+convention could be '<if name>.<subif index>'
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """id must be of a type compatible with oc-if:interface-id""",
+          'defined-type': "oc-if:interface-id",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True)""",
+        })
+
+    self.__id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_id(self):
+    self.__id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=True)
+
+  id = __builtin__.property(_get_id, _set_id)
+
+
+  _pyangbind_elements = OrderedDict([('id', id), ])
+
+
+class yc_state_openconfig_acl__acl_interfaces_interface_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state for ACL per-interface data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__id',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'state']
+
+  def _get_id(self):
+    """
+    Getter method for id, mapped from YANG variable /acl/interfaces/interface/state/id (oc-if:interface-id)
+
+    YANG Description: User-defined identifier for the interface -- a common
+convention could be '<if name>.<subif index>'
+    """
+    return self.__id
+      
+  def _set_id(self, v, load=False):
+    """
+    Setter method for id, mapped from YANG variable /acl/interfaces/interface/state/id (oc-if:interface-id)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_id() directly.
+
+    YANG Description: User-defined identifier for the interface -- a common
+convention could be '<if name>.<subif index>'
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """id must be of a type compatible with oc-if:interface-id""",
+          'defined-type': "oc-if:interface-id",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False)""",
+        })
+
+    self.__id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_id(self):
+    self.__id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-if:interface-id', is_config=False)
+
+  id = __builtin__.property(_get_id)
+
+
+  _pyangbind_elements = OrderedDict([('id', id), ])
+
+
+class yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/interface-ref/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configured reference to interface / subinterface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface','__subinterface',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'interface-ref', 'config']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/interface (leafref)
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/interface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/subinterface (leafref)
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/config/subinterface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+  interface = __builtin__.property(_get_interface, _set_interface)
+  subinterface = __builtin__.property(_get_subinterface, _set_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ('subinterface', subinterface), ])
+
+
+class yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/interface-ref/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state for interface-ref
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface','__subinterface',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'interface-ref', 'state']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/interface (leafref)
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/interface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/subinterface (leafref)
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /acl/interfaces/interface/interface_ref/state/subinterface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+  interface = __builtin__.property(_get_interface)
+  subinterface = __builtin__.property(_get_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ('subinterface', subinterface), ])
+
+
+class yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/interface-ref. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Reference to an interface or subinterface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'interface-ref'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'interface-ref']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/interfaces/interface/interface_ref/config (container)
+
+    YANG Description: Configured reference to interface / subinterface
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/interfaces/interface/interface_ref/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configured reference to interface / subinterface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_interface_ref_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/interfaces/interface/interface_ref/state (container)
+
+    YANG Description: Operational state for interface-ref
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/interfaces/interface/interface_ref/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state for interface-ref
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_interface_ref_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data 
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__set_name','__type',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets', 'ingress-acl-set', 'config']
+
+  def _get_set_name(self):
+    """
+    Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config/set_name (leafref)
+
+    YANG Description: Reference to the ACL set name applied on ingress
+    """
+    return self.__set_name
+      
+  def _set_set_name(self, v, load=False):
+    """
+    Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config/set_name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_name() directly.
+
+    YANG Description: Reference to the ACL set name applied on ingress
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__set_name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_name(self):
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config/type (leafref)
+
+    YANG Description: Reference to the ACL set type applied on ingress
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to the ACL set type applied on ingress
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+  set_name = __builtin__.property(_get_set_name, _set_set_name)
+  type = __builtin__.property(_get_type, _set_type)
+
+
+  _pyangbind_elements = OrderedDict([('set_name', set_name), ('type', type), ])
+
+
+class yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for interface ingress ACLs
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__set_name','__type',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets', 'ingress-acl-set', 'state']
+
+  def _get_set_name(self):
+    """
+    Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state/set_name (leafref)
+
+    YANG Description: Reference to the ACL set name applied on ingress
+    """
+    return self.__set_name
+      
+  def _set_set_name(self, v, load=False):
+    """
+    Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state/set_name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_name() directly.
+
+    YANG Description: Reference to the ACL set name applied on ingress
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__set_name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_name(self):
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state/type (leafref)
+
+    YANG Description: Reference to the ACL set type applied on ingress
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to the ACL set type applied on ingress
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+  set_name = __builtin__.property(_get_set_name)
+  type = __builtin__.property(_get_type)
+
+
+  _pyangbind_elements = OrderedDict([('set_name', set_name), ('type', type), ])
+
+
+class yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/acl-entries/acl-entry/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for per-interface ACL entries
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__matched_packets','__matched_octets',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets', 'ingress-acl-set', 'acl-entries', 'acl-entry', 'state']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref)
+
+    YANG Description: Reference to an entry in the ACL set applied to an
+interface
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: Reference to an entry in the ACL set applied to an
+interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_matched_packets(self):
+    """
+    Getter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_packets (oc-yang:counter64)
+
+    YANG Description: Count of the number of packets matching the current ACL
+entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    return self.__matched_packets
+      
+  def _set_matched_packets(self, v, load=False):
+    """
+    Setter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_packets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_matched_packets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_matched_packets() directly.
+
+    YANG Description: Count of the number of packets matching the current ACL
+entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """matched_packets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__matched_packets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_matched_packets(self):
+    self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_matched_octets(self):
+    """
+    Getter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_octets (oc-yang:counter64)
+
+    YANG Description: Count of the number of octets (bytes) matching the current
+ACL entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    return self.__matched_octets
+      
+  def _set_matched_octets(self, v, load=False):
+    """
+    Setter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state/matched_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_matched_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_matched_octets() directly.
+
+    YANG Description: Count of the number of octets (bytes) matching the current
+ACL entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """matched_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__matched_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_matched_octets(self):
+    self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+  sequence_id = __builtin__.property(_get_sequence_id)
+  matched_packets = __builtin__.property(_get_matched_packets)
+  matched_octets = __builtin__.property(_get_matched_octets)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('matched_packets', matched_packets), ('matched_octets', matched_octets), ])
+
+
+class yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/acl-entries/acl-entry. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of ACL entries assigned to an interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__state',)
+
+  _yang_name = 'acl-entry'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets', 'ingress-acl-set', 'acl-entries', 'acl-entry']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/sequence_id (leafref)
+
+    YANG Description: Reference to per-interface acl entry key
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/sequence_id (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: Reference to per-interface acl entry key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state (container)
+
+    YANG Description: Operational state data for per-interface ACL entries
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for per-interface ACL entries
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)
+
+  sequence_id = __builtin__.property(_get_sequence_id)
+  state = __builtin__.property(_get_state)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('state', state), ])
+
+
+class yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set/acl-entries. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for list of references to ACLs
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__acl_entry',)
+
+  _yang_name = 'acl-entries'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets', 'ingress-acl-set', 'acl-entries']
+
+  def _get_acl_entry(self):
+    """
+    Getter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry (list)
+
+    YANG Description: List of ACL entries assigned to an interface
+    """
+    return self.__acl_entry
+      
+  def _set_acl_entry(self, v, load=False):
+    """
+    Setter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries/acl_entry (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_entry is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_entry() directly.
+
+    YANG Description: List of ACL entries assigned to an interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_entry must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)""",
+        })
+
+    self.__acl_entry = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_entry(self):
+    self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)
+
+  acl_entry = __builtin__.property(_get_acl_entry)
+
+
+  _pyangbind_elements = OrderedDict([('acl_entry', acl_entry), ])
+
+
+class yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets/ingress-acl-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of ingress ACLs on the interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__set_name','__type','__config','__state','__acl_entries',)
+
+  _yang_name = 'ingress-acl-set'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets', 'ingress-acl-set']
+
+  def _get_set_name(self):
+    """
+    Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/set_name (leafref)
+
+    YANG Description: Reference to set name list key
+    """
+    return self.__set_name
+      
+  def _set_set_name(self, v, load=False):
+    """
+    Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/set_name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_name() directly.
+
+    YANG Description: Reference to set name list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__set_name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_name(self):
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/type (leafref)
+
+    YANG Description: Reference to type list key
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to type list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config (container)
+
+    YANG Description: Configuration data 
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data 
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state (container)
+
+    YANG Description: Operational state data for interface ingress ACLs
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for interface ingress ACLs
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_acl_entries(self):
+    """
+    Getter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries (container)
+
+    YANG Description: Enclosing container for list of references to ACLs
+    """
+    return self.__acl_entries
+      
+  def _set_acl_entries(self, v, load=False):
+    """
+    Setter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set/acl_entries (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_entries is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_entries() directly.
+
+    YANG Description: Enclosing container for list of references to ACLs
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_entries must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__acl_entries = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_entries(self):
+    self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  set_name = __builtin__.property(_get_set_name, _set_set_name)
+  type = __builtin__.property(_get_type, _set_type)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  acl_entries = __builtin__.property(_get_acl_entries, _set_acl_entries)
+
+
+  _pyangbind_elements = OrderedDict([('set_name', set_name), ('type', type), ('config', config), ('state', state), ('acl_entries', acl_entries), ])
+
+
+class yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/ingress-acl-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container the list of ingress ACLs on the
+interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__ingress_acl_set',)
+
+  _yang_name = 'ingress-acl-sets'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__ingress_acl_set = YANGDynClass(base=YANGListType("set_name type",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'ingress-acl-sets']
+
+  def _get_ingress_acl_set(self):
+    """
+    Getter method for ingress_acl_set, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set (list)
+
+    YANG Description: List of ingress ACLs on the interface
+    """
+    return self.__ingress_acl_set
+      
+  def _set_ingress_acl_set(self, v, load=False):
+    """
+    Setter method for ingress_acl_set, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets/ingress_acl_set (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ingress_acl_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ingress_acl_set() directly.
+
+    YANG Description: List of ingress ACLs on the interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("set_name type",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ingress_acl_set must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("set_name type",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""",
+        })
+
+    self.__ingress_acl_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ingress_acl_set(self):
+    self.__ingress_acl_set = YANGDynClass(base=YANGListType("set_name type",yc_ingress_acl_set_openconfig_acl__acl_interfaces_interface_ingress_acl_sets_ingress_acl_set, yang_name="ingress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="ingress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+  ingress_acl_set = __builtin__.property(_get_ingress_acl_set, _set_ingress_acl_set)
+
+
+  _pyangbind_elements = OrderedDict([('ingress_acl_set', ingress_acl_set), ])
+
+
+class yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data 
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__set_name','__type',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets', 'egress-acl-set', 'config']
+
+  def _get_set_name(self):
+    """
+    Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config/set_name (leafref)
+
+    YANG Description: Reference to the ACL set name applied on egress
+    """
+    return self.__set_name
+      
+  def _set_set_name(self, v, load=False):
+    """
+    Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config/set_name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_name() directly.
+
+    YANG Description: Reference to the ACL set name applied on egress
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__set_name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_name(self):
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config/type (leafref)
+
+    YANG Description: Reference to the ACL set type applied on egress.
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to the ACL set type applied on egress.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+  set_name = __builtin__.property(_get_set_name, _set_set_name)
+  type = __builtin__.property(_get_type, _set_type)
+
+
+  _pyangbind_elements = OrderedDict([('set_name', set_name), ('type', type), ])
+
+
+class yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for interface egress ACLs
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__set_name','__type',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets', 'egress-acl-set', 'state']
+
+  def _get_set_name(self):
+    """
+    Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state/set_name (leafref)
+
+    YANG Description: Reference to the ACL set name applied on egress
+    """
+    return self.__set_name
+      
+  def _set_set_name(self, v, load=False):
+    """
+    Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state/set_name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_name() directly.
+
+    YANG Description: Reference to the ACL set name applied on egress
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__set_name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_name(self):
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state/type (leafref)
+
+    YANG Description: Reference to the ACL set type applied on egress.
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to the ACL set type applied on egress.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+  set_name = __builtin__.property(_get_set_name)
+  type = __builtin__.property(_get_type)
+
+
+  _pyangbind_elements = OrderedDict([('set_name', set_name), ('type', type), ])
+
+
+class yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/acl-entries/acl-entry/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for per-interface ACL entries
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__matched_packets','__matched_octets',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets', 'egress-acl-set', 'acl-entries', 'acl-entry', 'state']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref)
+
+    YANG Description: Reference to an entry in the ACL set applied to an
+interface
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/sequence_id (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: Reference to an entry in the ACL set applied to an
+interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_matched_packets(self):
+    """
+    Getter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_packets (oc-yang:counter64)
+
+    YANG Description: Count of the number of packets matching the current ACL
+entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    return self.__matched_packets
+      
+  def _set_matched_packets(self, v, load=False):
+    """
+    Setter method for matched_packets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_packets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_matched_packets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_matched_packets() directly.
+
+    YANG Description: Count of the number of packets matching the current ACL
+entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """matched_packets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__matched_packets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_matched_packets(self):
+    self.__matched_packets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-packets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_matched_octets(self):
+    """
+    Getter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_octets (oc-yang:counter64)
+
+    YANG Description: Count of the number of octets (bytes) matching the current
+ACL entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    return self.__matched_octets
+      
+  def _set_matched_octets(self, v, load=False):
+    """
+    Setter method for matched_octets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state/matched_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_matched_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_matched_octets() directly.
+
+    YANG Description: Count of the number of octets (bytes) matching the current
+ACL entry.
+
+An implementation should provide this counter on a
+per-interface per-ACL-entry if possible.
+
+If an implementation only supports ACL counters per entry
+(i.e., not broken out per interface), then the value
+should be equal to the aggregate count across all interfaces.
+
+An implementation that provides counters per entry per
+interface is not required to also provide an aggregate count,
+e.g., per entry -- the user is expected to be able implement
+the required aggregation if such a count is needed.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """matched_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__matched_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_matched_octets(self):
+    self.__matched_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="matched-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='oc-yang:counter64', is_config=False)
+
+  sequence_id = __builtin__.property(_get_sequence_id)
+  matched_packets = __builtin__.property(_get_matched_packets)
+  matched_octets = __builtin__.property(_get_matched_octets)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('matched_packets', matched_packets), ('matched_octets', matched_octets), ])
+
+
+class yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/acl-entries/acl-entry. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of ACL entries assigned to an interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__sequence_id','__state',)
+
+  _yang_name = 'acl-entry'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets', 'egress-acl-set', 'acl-entries', 'acl-entry']
+
+  def _get_sequence_id(self):
+    """
+    Getter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/sequence_id (leafref)
+
+    YANG Description: Reference to per-interface acl entry key
+    """
+    return self.__sequence_id
+      
+  def _set_sequence_id(self, v, load=False):
+    """
+    Setter method for sequence_id, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/sequence_id (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_sequence_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_sequence_id() directly.
+
+    YANG Description: Reference to per-interface acl entry key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """sequence_id must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__sequence_id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_sequence_id(self):
+    self.__sequence_id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="sequence-id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=False)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state (container)
+
+    YANG Description: Operational state data for per-interface ACL entries
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for per-interface ACL entries
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=False)
+
+  sequence_id = __builtin__.property(_get_sequence_id)
+  state = __builtin__.property(_get_state)
+
+
+  _pyangbind_elements = OrderedDict([('sequence_id', sequence_id), ('state', state), ])
+
+
+class yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set/acl-entries. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for list of references to ACLs
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__acl_entry',)
+
+  _yang_name = 'acl-entries'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets', 'egress-acl-set', 'acl-entries']
+
+  def _get_acl_entry(self):
+    """
+    Getter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry (list)
+
+    YANG Description: List of ACL entries assigned to an interface
+    """
+    return self.__acl_entry
+      
+  def _set_acl_entry(self, v, load=False):
+    """
+    Setter method for acl_entry, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries/acl_entry (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_entry is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_entry() directly.
+
+    YANG Description: List of ACL entries assigned to an interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_entry must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)""",
+        })
+
+    self.__acl_entry = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_entry(self):
+    self.__acl_entry = YANGDynClass(base=YANGListType("sequence_id",yc_acl_entry_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries_acl_entry, yang_name="acl-entry", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='sequence-id', extensions=None), is_container='list', yang_name="acl-entry", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=False)
+
+  acl_entry = __builtin__.property(_get_acl_entry)
+
+
+  _pyangbind_elements = OrderedDict([('acl_entry', acl_entry), ])
+
+
+class yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets/egress-acl-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of egress ACLs on the interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__set_name','__type','__config','__state','__acl_entries',)
+
+  _yang_name = 'egress-acl-set'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets', 'egress-acl-set']
+
+  def _get_set_name(self):
+    """
+    Getter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/set_name (leafref)
+
+    YANG Description: Reference to set name list key
+    """
+    return self.__set_name
+      
+  def _set_set_name(self, v, load=False):
+    """
+    Setter method for set_name, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/set_name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_name() directly.
+
+    YANG Description: Reference to set name list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__set_name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_name(self):
+    self.__set_name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="set-name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/type (leafref)
+
+    YANG Description: Reference to type list key
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/type (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: Reference to type list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config (container)
+
+    YANG Description: Configuration data 
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data 
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state (container)
+
+    YANG Description: Operational state data for interface egress ACLs
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for interface egress ACLs
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_acl_entries(self):
+    """
+    Getter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries (container)
+
+    YANG Description: Enclosing container for list of references to ACLs
+    """
+    return self.__acl_entries
+      
+  def _set_acl_entries(self, v, load=False):
+    """
+    Setter method for acl_entries, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set/acl_entries (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_entries is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_entries() directly.
+
+    YANG Description: Enclosing container for list of references to ACLs
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_entries must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__acl_entries = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_entries(self):
+    self.__acl_entries = YANGDynClass(base=yc_acl_entries_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set_acl_entries, is_container='container', yang_name="acl-entries", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  set_name = __builtin__.property(_get_set_name, _set_set_name)
+  type = __builtin__.property(_get_type, _set_type)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  acl_entries = __builtin__.property(_get_acl_entries, _set_acl_entries)
+
+
+  _pyangbind_elements = OrderedDict([('set_name', set_name), ('type', type), ('config', config), ('state', state), ('acl_entries', acl_entries), ])
+
+
+class yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface/egress-acl-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container the list of egress ACLs on the
+interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__egress_acl_set',)
+
+  _yang_name = 'egress-acl-sets'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__egress_acl_set = YANGDynClass(base=YANGListType("set_name type",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface', 'egress-acl-sets']
+
+  def _get_egress_acl_set(self):
+    """
+    Getter method for egress_acl_set, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set (list)
+
+    YANG Description: List of egress ACLs on the interface
+    """
+    return self.__egress_acl_set
+      
+  def _set_egress_acl_set(self, v, load=False):
+    """
+    Setter method for egress_acl_set, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets/egress_acl_set (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_egress_acl_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_egress_acl_set() directly.
+
+    YANG Description: List of egress ACLs on the interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("set_name type",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """egress_acl_set must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("set_name type",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""",
+        })
+
+    self.__egress_acl_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_egress_acl_set(self):
+    self.__egress_acl_set = YANGDynClass(base=YANGListType("set_name type",yc_egress_acl_set_openconfig_acl__acl_interfaces_interface_egress_acl_sets_egress_acl_set, yang_name="egress-acl-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='set-name type', extensions=None), is_container='list', yang_name="egress-acl-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+  egress_acl_set = __builtin__.property(_get_egress_acl_set, _set_egress_acl_set)
+
+
+  _pyangbind_elements = OrderedDict([('egress_acl_set', egress_acl_set), ])
+
+
+class yc_interface_openconfig_acl__acl_interfaces_interface(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces/interface. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of interfaces on which ACLs are set
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__id','__config','__state','__interface_ref','__ingress_acl_sets','__egress_acl_sets',)
+
+  _yang_name = 'interface'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__ingress_acl_sets = YANGDynClass(base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__egress_acl_sets = YANGDynClass(base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces', 'interface']
+
+  def _get_id(self):
+    """
+    Getter method for id, mapped from YANG variable /acl/interfaces/interface/id (leafref)
+
+    YANG Description: Reference to the interface id list key
+    """
+    return self.__id
+      
+  def _set_id(self, v, load=False):
+    """
+    Setter method for id, mapped from YANG variable /acl/interfaces/interface/id (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_id is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_id() directly.
+
+    YANG Description: Reference to the interface id list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """id must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__id = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_id(self):
+    self.__id = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="id", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /acl/interfaces/interface/config (container)
+
+    YANG Description: Configuration for ACL per-interface data
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /acl/interfaces/interface/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration for ACL per-interface data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_acl__acl_interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/interfaces/interface/state (container)
+
+    YANG Description: Operational state for ACL per-interface data
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/interfaces/interface/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state for ACL per-interface data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_interface_ref(self):
+    """
+    Getter method for interface_ref, mapped from YANG variable /acl/interfaces/interface/interface_ref (container)
+
+    YANG Description: Reference to an interface or subinterface
+    """
+    return self.__interface_ref
+      
+  def _set_interface_ref(self, v, load=False):
+    """
+    Setter method for interface_ref, mapped from YANG variable /acl/interfaces/interface/interface_ref (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface_ref is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface_ref() directly.
+
+    YANG Description: Reference to an interface or subinterface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface_ref must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__interface_ref = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface_ref(self):
+    self.__interface_ref = YANGDynClass(base=yc_interface_ref_openconfig_acl__acl_interfaces_interface_interface_ref, is_container='container', yang_name="interface-ref", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_ingress_acl_sets(self):
+    """
+    Getter method for ingress_acl_sets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets (container)
+
+    YANG Description: Enclosing container the list of ingress ACLs on the
+interface
+    """
+    return self.__ingress_acl_sets
+      
+  def _set_ingress_acl_sets(self, v, load=False):
+    """
+    Setter method for ingress_acl_sets, mapped from YANG variable /acl/interfaces/interface/ingress_acl_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ingress_acl_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ingress_acl_sets() directly.
+
+    YANG Description: Enclosing container the list of ingress ACLs on the
+interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ingress_acl_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__ingress_acl_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ingress_acl_sets(self):
+    self.__ingress_acl_sets = YANGDynClass(base=yc_ingress_acl_sets_openconfig_acl__acl_interfaces_interface_ingress_acl_sets, is_container='container', yang_name="ingress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_egress_acl_sets(self):
+    """
+    Getter method for egress_acl_sets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets (container)
+
+    YANG Description: Enclosing container the list of egress ACLs on the
+interface
+    """
+    return self.__egress_acl_sets
+      
+  def _set_egress_acl_sets(self, v, load=False):
+    """
+    Setter method for egress_acl_sets, mapped from YANG variable /acl/interfaces/interface/egress_acl_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_egress_acl_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_egress_acl_sets() directly.
+
+    YANG Description: Enclosing container the list of egress ACLs on the
+interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """egress_acl_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__egress_acl_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_egress_acl_sets(self):
+    self.__egress_acl_sets = YANGDynClass(base=yc_egress_acl_sets_openconfig_acl__acl_interfaces_interface_egress_acl_sets, is_container='container', yang_name="egress-acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  id = __builtin__.property(_get_id, _set_id)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  interface_ref = __builtin__.property(_get_interface_ref, _set_interface_ref)
+  ingress_acl_sets = __builtin__.property(_get_ingress_acl_sets, _set_ingress_acl_sets)
+  egress_acl_sets = __builtin__.property(_get_egress_acl_sets, _set_egress_acl_sets)
+
+
+  _pyangbind_elements = OrderedDict([('id', id), ('config', config), ('state', state), ('interface_ref', interface_ref), ('ingress_acl_sets', ingress_acl_sets), ('egress_acl_sets', egress_acl_sets), ])
+
+
+class yc_interfaces_openconfig_acl__acl_interfaces(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl/interfaces. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for the list of interfaces on which
+ACLs are set
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface',)
+
+  _yang_name = 'interfaces'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl', 'interfaces']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /acl/interfaces/interface (list)
+
+    YANG Description: List of interfaces on which ACLs are set
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /acl/interfaces/interface (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: List of interfaces on which ACLs are set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=YANGListType("id",yc_interface_openconfig_acl__acl_interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='id', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='list', is_config=True)
+
+  interface = __builtin__.property(_get_interface, _set_interface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ])
+
+
+class yc_acl_openconfig_acl__acl(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /acl. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top level enclosing container for ACL model config
+and operational state data
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__state','__acl_sets','__interfaces',)
+
+  _yang_name = 'acl'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__acl_sets = YANGDynClass(base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    self.__interfaces = YANGDynClass(base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['acl']
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /acl/state (container)
+
+    YANG Description: Global operational state data for ACLs
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /acl/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Global operational state data for ACLs
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_acl__acl_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_acl_sets(self):
+    """
+    Getter method for acl_sets, mapped from YANG variable /acl/acl_sets (container)
+
+    YANG Description: Access list entries variables enclosing container
+    """
+    return self.__acl_sets
+      
+  def _set_acl_sets(self, v, load=False):
+    """
+    Setter method for acl_sets, mapped from YANG variable /acl/acl_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl_sets() directly.
+
+    YANG Description: Access list entries variables enclosing container
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__acl_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl_sets(self):
+    self.__acl_sets = YANGDynClass(base=yc_acl_sets_openconfig_acl__acl_acl_sets, is_container='container', yang_name="acl-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+
+  def _get_interfaces(self):
+    """
+    Getter method for interfaces, mapped from YANG variable /acl/interfaces (container)
+
+    YANG Description: Enclosing container for the list of interfaces on which
+ACLs are set
+    """
+    return self.__interfaces
+      
+  def _set_interfaces(self, v, load=False):
+    """
+    Setter method for interfaces, mapped from YANG variable /acl/interfaces (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interfaces is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interfaces() directly.
+
+    YANG Description: Enclosing container for the list of interfaces on which
+ACLs are set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interfaces must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__interfaces = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interfaces(self):
+    self.__interfaces = YANGDynClass(base=yc_interfaces_openconfig_acl__acl_interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  state = __builtin__.property(_get_state, _set_state)
+  acl_sets = __builtin__.property(_get_acl_sets, _set_acl_sets)
+  interfaces = __builtin__.property(_get_interfaces, _set_interfaces)
+
+
+  _pyangbind_elements = OrderedDict([('state', state), ('acl_sets', acl_sets), ('interfaces', interfaces), ])
+
+
+class openconfig_acl(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-acl - based on the path /openconfig-acl. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: This module defines configuration and operational state
+data for network access control lists (i.e., filters, rules,
+etc.).  ACLs are organized into ACL sets, with each set
+containing one or more ACL entries.  ACL sets are identified
+by a unique name, while each entry within a set is assigned
+a sequence-id that determines the order in which the ACL
+rules are applied to a packet.  Note that ACLs are evaluated
+in ascending order based on the sequence-id (low to high).
+
+Individual ACL rules specify match criteria based on fields in
+the packet, along with an action that defines how matching
+packets should be handled. Entries have a type that indicates
+the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__acl',)
+
+  _yang_name = 'openconfig-acl'
+  _yang_namespace = 'http://openconfig.net/yang/acl'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__acl = YANGDynClass(base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return []
+
+  def _get_acl(self):
+    """
+    Getter method for acl, mapped from YANG variable /acl (container)
+
+    YANG Description: Top level enclosing container for ACL model config
+and operational state data
+    """
+    return self.__acl
+      
+  def _set_acl(self, v, load=False):
+    """
+    Setter method for acl, mapped from YANG variable /acl (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_acl is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_acl() directly.
+
+    YANG Description: Top level enclosing container for ACL model config
+and operational state data
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """acl must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)""",
+        })
+
+    self.__acl = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_acl(self):
+    self.__acl = YANGDynClass(base=yc_acl_openconfig_acl__acl, is_container='container', yang_name="acl", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/acl', defining_module='openconfig-acl', yang_type='container', is_config=True)
+
+  acl = __builtin__.property(_get_acl, _set_acl)
+
+
+  _pyangbind_elements = OrderedDict([('acl', acl), ])
+
+
diff --git a/src/device/service/drivers/openconfig/templates/EndPoints.py b/src/device/service/drivers/openconfig/templates/EndPoints.py
index f16f0ffcd09a07f6c109328b1c5f0ee101af545a..0e86af7af012131561388b15377c831ce5ad1959 100644
--- a/src/device/service/drivers/openconfig/templates/EndPoints.py
+++ b/src/device/service/drivers/openconfig/templates/EndPoints.py
@@ -31,7 +31,7 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]:
         component_type = xml_component.find('ocp:state/ocp:type', namespaces=NAMESPACES)
         if component_type is None or component_type.text is None: continue
         component_type = component_type.text
-        if component_type not in {'PORT', 'oc-platform-types:PORT'}: continue
+        if component_type not in {'PORT', 'oc-platform-types:PORT', 'idx:PORT'}: continue
 
         LOGGER.info('PORT xml_component = {:s}'.format(str(ET.tostring(xml_component))))
 
diff --git a/src/device/service/drivers/openconfig/templates/Interfaces.py b/src/device/service/drivers/openconfig/templates/Interfaces.py
index fbe5cfd22eb29131a601aa360ca82ef88c144d8e..3855db17b45505d4131089b2b9abd995fa221419 100644
--- a/src/device/service/drivers/openconfig/templates/Interfaces.py
+++ b/src/device/service/drivers/openconfig/templates/Interfaces.py
@@ -13,9 +13,9 @@
 # limitations under the License.
 
 import logging, lxml.etree as ET
-from typing import Any, Dict, List, Tuple
+from typing     import Any, Dict, List, Tuple
 from .Namespace import NAMESPACES
-from .Tools import add_value_from_collection, add_value_from_tag
+from .Tools     import add_value_from_tag
 
 LOGGER = logging.getLogger(__name__)
 
@@ -37,8 +37,18 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]:
         #interface_type = xml_interface.find('oci:config/oci:type', namespaces=NAMESPACES)
         #add_value_from_tag(interface, 'type', interface_type)
 
-        interface_type = xml_interface.find('oci:config/oci:type', namespaces=NAMESPACES)
-        interface_type.text = interface_type.text.replace('ianaift:','')
+        if xml_interface.find('oci:config/oci:type', namespaces=NAMESPACES) is not None:
+            interface_type = xml_interface.find('oci:config/oci:type', namespaces=NAMESPACES)
+        elif xml_interface.find('oci:state/oci:type', namespaces=NAMESPACES) is not None:
+            interface_type = xml_interface.find('oci:state/oci:type', namespaces=NAMESPACES)
+        else:
+            interface_type = ''
+            
+        # Get the type of interface according to the vendor's type
+        if 'ianaift:' in interface_type.text:
+            interface_type.text = interface_type.text.replace('ianaift:', '')                       #ADVA
+        elif 'idx'in interface_type.text:
+            interface_type.text = interface_type.text.replace('idx:', '')                           #CISCO
         add_value_from_tag(interface, 'type', interface_type)
 
         interface_mtu = xml_interface.find('oci:config/oci:mtu', namespaces=NAMESPACES)
diff --git a/src/device/service/drivers/openconfig/templates/NetworkInstances.py b/src/device/service/drivers/openconfig/templates/NetworkInstances.py
index a5ba0de23612b69ef5e3d33fa1a89573c7c63e97..c00995b3aa4060363113f5743e2687ca6d1e7fd9 100644
--- a/src/device/service/drivers/openconfig/templates/NetworkInstances.py
+++ b/src/device/service/drivers/openconfig/templates/NetworkInstances.py
@@ -41,10 +41,24 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]:
         if ni_name is None or ni_name.text is None: continue
         add_value_from_tag(network_instance, 'name', ni_name)
 
+        '''
         ni_type = xml_network_instance.find('ocni:config/ocni:type', namespaces=NAMESPACES)
         ni_type.text = ni_type.text.replace('oc-ni-types:','')
         add_value_from_tag(network_instance, 'type', ni_type)
-
+        '''
+        
+        if xml_network_instance.find('ocni:config/ocni:type', namespaces=NAMESPACES) is not None:
+            ni_type = xml_network_instance.find('ocni:config/ocni:type', namespaces=NAMESPACES)
+        elif xml_network_instance.find('oci:state/oci:type', namespaces=NAMESPACES) is not None:
+            ni_type = xml_network_instance.find('oci:state/oci:type', namespaces=NAMESPACES)
+        else:
+            continue
+        if 'oc-ni-types:' in ni_type.text:
+            ni_type.text = ni_type.text.replace('oc-ni-types:', '')                 #ADVA
+        elif 'idx'in ni_type.text:
+            ni_type.text = ni_type.text.replace('idx:', '')                         #CISCO
+        add_value_from_tag(network_instance, 'type', ni_type)
+        
         ni_router_id = xml_network_instance.find('ocni:config/ocni:router-id', namespaces=NAMESPACES)
         add_value_from_tag(network_instance, 'router_id', ni_router_id)
 
diff --git a/src/device/service/drivers/openconfig/templates/RoutingPolicy.py b/src/device/service/drivers/openconfig/templates/RoutingPolicy.py
index 1c2efa6122b617243de26b009b0c890fad80cf19..acafa021824f94f929e849117824e8120974d0b1 100644
--- a/src/device/service/drivers/openconfig/templates/RoutingPolicy.py
+++ b/src/device/service/drivers/openconfig/templates/RoutingPolicy.py
@@ -45,7 +45,8 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]:
 
         for xml_statement in xml_policy_definition.xpath(XPATH_PD_STATEMENTS, namespaces=NAMESPACES):
             statement_name = xml_statement.find('ocrp:name', namespaces=NAMESPACES)
-            add_value_from_tag(policy_definition, 'statement_name', statement_name)
+            if len(statement_name) != 0:                                                                        #FIX: In case there is a route policy defined without a statement name
+                add_value_from_tag(policy_definition, 'statement_name', statement_name)
 
             for xml_condition in xml_statement.xpath(XPATH_PD_ST_CONDITIONS, namespaces=NAMESPACES):
                 ext_community_set_name = xml_condition.find('ocbp:config/ocbp:ext-community-set', namespaces=NAMESPACES)
@@ -58,9 +59,10 @@ def parse(xml_data : ET.Element) -> List[Tuple[str, Dict[str, Any]]]:
                 policy_result = xml_action.find('ocbp:config/ocbp:policy-result', namespaces=NAMESPACES)
                 add_value_from_tag(policy_definition, 'policy_result', policy_result)
 
-        resource_key = '/routing_policy/policy_definition[{:s}]/statement[{:s}]'.format(
-            policy_definition['policy_name'], policy_definition['statement_name'])
-        response.append((resource_key, copy.deepcopy(policy_definition)))
+        if len(statement_name) != 0:                                                                            #FIX: In case there is a route policy defined without a statement name
+            resource_key = '/routing_policy/policy_definition[{:s}]/statement[{:s}]'.format(
+                policy_definition['policy_name'], policy_definition['statement_name'])
+            response.append((resource_key, copy.deepcopy(policy_definition)))
 
     for xml_bgp_ext_community_set in xml_data.xpath(XPATH_BGP_EXT_COMMUN_SET, namespaces=NAMESPACES):
         #LOGGER.info('xml_bgp_ext_community_set = {:s}'.format(str(ET.tostring(xml_bgp_ext_community_set))))
diff --git a/src/device/service/drivers/openconfig/templates/Tools.py b/src/device/service/drivers/openconfig/templates/Tools.py
index 67d267b7d8c0b773f818052e01c3f2720f071902..79bebef5179b3464c33ce7fa0663b0cd35a51fc0 100644
--- a/src/device/service/drivers/openconfig/templates/Tools.py
+++ b/src/device/service/drivers/openconfig/templates/Tools.py
@@ -12,8 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import json
 import lxml.etree as ET
-from typing import Collection, Dict
+from typing import Collection, Dict, Any
+from .ACL.ACL_multivendor              import acl_mgmt        
+from .VPN.Network_instance_multivendor import create_NI, associate_virtual_circuit, associate_RP_to_NI, add_protocol_NI, create_table_conns, associate_If_to_NI
+from .VPN.Interfaces_multivendor       import create_If_SubIf  
+from .VPN.Routing_policy               import create_rp_def, create_rp_statement
 
 def add_value_from_tag(target : Dict, field_name: str, field_value : ET.Element, cast=None) -> None:
     if field_value is None or field_value.text is None: return
@@ -24,3 +29,61 @@ def add_value_from_tag(target : Dict, field_name: str, field_value : ET.Element,
 def add_value_from_collection(target : Dict, field_name: str, field_value : Collection) -> None:
     if field_value is None or len(field_value) == 0: return
     target[field_name] = field_value
+
+"""
+# Method Name: generate_templates
+  
+# Parameters:
+  - resource_key:   [str]  Variable to identify the rule to be executed.
+  - resource_value: [str]  Variable with the configuration parameters of the rule to be executed.
+  - delete:         [bool] Variable to identify whether to create or delete the rule.
+  - vendor:         [str]  Variable to identify the vendor of the equipment to be configured.
+  
+# Functionality:
+  This method generates the template to configure the equipment using pyangbind. 
+  To generate the template the following steps are performed:
+  1) Get the first parameter of the variable "resource_key" to identify the main path of the rule.
+  2) Search for the specific configuration path
+  3) Call the method with the configuration parameters (resource_data variable). 
+  
+# Return:
+  [dict] Set of templates generated according to the configuration rule
+"""
+def generate_templates(resource_key: str, resource_value: str, delete: bool,vendor:str) -> str:    # template management to be configured
+
+    result_templates = []
+    list_resource_key = resource_key.split("/")                                         # the rule resource key management
+    if "network_instance" in list_resource_key[1]:                                      # network instance rules management
+        data: Dict[str, Any] = json.loads(resource_value)
+        #data['DEL'] = delete
+        if "connection_point" in resource_key:
+            result_templates.append(associate_virtual_circuit(data))
+        elif "inter_instance_policies" in resource_key:
+            result_templates.append(associate_RP_to_NI(data))
+        elif "protocols" in resource_key:
+            if vendor == "ADVA": result_templates.append(add_protocol_NI(data, vendor, delete))
+        elif "table_connections" in resource_key:
+            result_templates.append(create_table_conns(data, delete))
+        elif "interface" in resource_key:
+            result_templates.append(associate_If_to_NI(data,delete))
+        else:
+            result_templates.append(create_NI(data,vendor,delete))
+
+    if "interface" in list_resource_key[1]:                                           # interface rules management
+        data: Dict[str, Any] = json.loads(resource_value)
+        #data['DEL'] = delete
+        if "subinterface" in resource_key:
+            result_templates.append(create_If_SubIf(data, vendor, delete))
+
+    elif "routing_policy" in list_resource_key[1]:                                      # routing policy rules management
+        data: Dict[str, Any] = json.loads(resource_value)
+        #data['DEL'] = delete
+        if "bgp_defined_set" in resource_key:
+            result_templates.append(create_rp_def(data, delete))
+        else:
+            result_templates.append(create_rp_statement(data, delete))
+    else:
+        if "acl_ruleset" in resource_key:                                               # acl rules management
+            result_templates.extend(acl_mgmt(resource_value,vendor, delete))
+
+    return result_templates
\ No newline at end of file
diff --git a/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py
new file mode 100644
index 0000000000000000000000000000000000000000..d6f72ee6556fd5ca5dc08c5349a41e0db736bd4d
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/VPN/Interfaces_multivendor.py
@@ -0,0 +1,246 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from yattag import Doc, indent
+"""
+# Method Name: create_If_SubIf
+  
+# Parameters:
+  - Interface_name:     [str]  Variable to set the name of the Interface that will be configured. [Mandatory parameter in all cases].
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - Interface_type:     [str]  Variable that specifies the type of interface, can take the value "l2vlan" or "l3ipvlan" [Only mandatory if DEL = False].
+  - SubInterface_Index: [int]  Variable to set the index of the subinterface.[Only mandatory if DEL = False].
+  - Description:        [str]  Variable for adding a description to the Interface   [Only mandatory if DEL = False].
+
+# Functionality:
+  This method generates the template of an Interface with subinterface, used both for L2 and L3 VPNs.
+  This template will be generated for configuring a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a existent Interface or) or false (Template for creating a new Interface with Subinterface).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_If_SubIf(data,vendor, DEL):
+    doc, tag, text = Doc().tagtext()
+
+    with tag('interfaces', xmlns="http://openconfig.net/yang/interfaces"):
+        if DEL == True: 
+            with tag('interface' ,'xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                with tag('name'):text(data['name'])
+        else:
+            with tag('interface'):
+                with tag('name'):text(data['name'])
+                with tag('config'):
+                    with tag('name'):text(data['name'])
+                    with tag('type', 'xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type"'):text('ianaift:',data['type'])
+                    if 'description' in data:
+                        with tag('description'):text(data['description'])
+                    if 'mtu' in data:
+                        with tag('mtu'):text(data['mtu'])
+                    with tag('enabled'):text('true')    
+                with tag('subinterfaces'):
+                    with tag('subinterface'):
+                        if vendor == 'ADVA':
+                            with tag('index'): text('0')
+                        with tag('config'):
+                            with tag('index'): text('0')
+                            if vendor == 'ADVA' and not 'vlan_id'in data: 
+                                with tag('untagged-allowed', 'xmlns="http://www.advaoptical.com/cim/adva-dnos-oc-interfaces"'):text('true')
+                        with tag('vlan',  xmlns="http://openconfig.net/yang/vlan"):
+                            with tag('match'):
+                                with tag('single-tagged'):
+                                    with tag('config'):
+                                        with tag('vlan-id'):text(data['vlan_id'])
+                        if "l3ipvlan" in data['type']: 
+                            with tag('ipv4',  xmlns="http://openconfig.net/yang/interfaces/ip"):
+                                with tag('addresses'):
+                                    with tag('address'):
+                                        with tag('ip'):text(data['address_ip'])
+                                        with tag('config'):
+                                            with tag('ip'):text(data['address_ip'])
+                                            with tag('prefix-length'):text(data['address_prefix'])
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+#TESTING
+'''
+data = {'name'          : 'eth-1/0/22.222',
+        'type'          : 'l3ipvlan',
+        'mtu'           : '3000',
+        'index'         : '0',
+        'description'   : 'Interfaz con subinterfaz', 
+        'vlan_id'       : '222',
+        'address_ip'    : '172.16.55.55', 
+        'address_prefix': '24'}
+
+print('\n\t\tINTERFAZ - Create')
+print(create_If_SubIf(data,'ADVA', False))
+print('\n\t\tINTERFAZ - Delete')
+print(create_If_SubIf(data,'ADVA', True))
+'''
+
+
+'''
+from .openconfig_interfaces import openconfig_interfaces
+from pyangbind.lib.serialise import pybindIETFXMLEncoder
+
+"""
+# Method Name: set_vlan
+  
+# Parameters:
+  - vendor:     [str]  Variable to set the name of the vendor of the device to be configured. Depending on the vendor, the generated template may vary.
+  - vlan_id:    [int]  Variable to set the value of the parameter "vlan id". 
+# Functionality:
+  This is an auxiliary method that helps in the creation of the Interface template. This method generates the correspondent configuration of the vlan for the interface.
+  The method first checks if the parameters vendor and vlan_id are defined. If the vendor is ADVA and vlan_id = 0, an special configuration line is created. 
+  Based on the values of the given parameters, the method generates the vlan configuration string.
+  
+# Return:
+  [str] The method returns the generated vlan configuration string, that can be later used in the generation of the Interface template.
+"""
+def set_vlan(OptionalParams):                                   #[L2/L3] Sets a VLANID and a VENDOR that will be requested for executing the following methods
+    verify = str(OptionalParams)                                #Verify transforms the received parameters into a string format for later making verifications and modifications
+    
+    #If the Vendor parameter is defined [OPTIONAL-PARAMETER]
+    if verify.find('vendor')>0:
+        Vendor = OptionalParams['vendor']  
+
+    #If the VlanID parameter is defined [OPTIONAL-PARAMETER]
+    if verify.find('vlan_id')>0:
+        VlanID = OptionalParams['vlan_id'] 
+        if VlanID == 0 and "ADVA" in Vendor: vlan = '  <untagged-allowed xmlns="http://www.advaoptical.com/cim/adva-dnos-oc-interfaces">true</untagged-allowed></config> \n          </config>\n        </subinterface>'
+        elif VlanID != 0:                    vlan = '</config>\n          <vlan xmlns="http://openconfig.net/yang/vlan"> \n\t    <match> \n\t      <single-tagged> \n \t\t<config>\n \t\t  <vlan-id>'+str(VlanID)+'</vlan-id> \n \t\t</config> \n \t      </single-tagged> \n \t    </match> \n \t  </vlan> \n         </subinterface>'
+        else:                                vlan = '</subinterface>\n          </config>'
+    else:                                    vlan = '</subinterface>\n          </config>'   
+    return vlan
+
+"""
+# Method Name: set_ip
+  
+# Parameters:
+  - address_ip:     [str]  Variable that sets the value of the ip address.
+  - address_prefix: [int]  Variable that specifies the prefix of the given ip address. 
+# Functionality:
+  This is an auxiliary method that helps in the creation of the Interface template. This method generates the correspondent configuration of the ip address for the interface.
+  The method first checks if the parameter address_ip is defined. If it is defined, then it creates the configuration string that will be used later in the Interface template.
+  
+# Return:
+  [str] The method returns the generated ip configuration string, that can be later used in the generation of the Interface template.
+"""
+def set_ip(OptionalParams):                                         #[L3] Sets a IPAddress that will be requested for executing the following L3VPN methods
+    verify = str(OptionalParams)                                    # Verify transforms the received parameters into a string format for later making verifications and modifications
+    
+    #If the Address_ip parameter is defined [OPTIONAL-PARAMETER]
+    if verify.find('address_ip')>0:
+        IP      = OptionalParams['address_ip']  
+        Prefix  = OptionalParams['address_prefix']
+        address = '  <ipv4 xmlns="http://openconfig.net/yang/interfaces/ip"> \n\t    <addresses> \n\t      <address> \n \t\t<ip>'+IP+'</ip> \n \t\t<config>\n \t\t  <ip>'+IP+'</ip> \n \t\t  <prefix-length>'+str(Prefix)+'</prefix-length> \n \t\t</config> \n \t      </address> \n \t    </addresses> \n \t  </ipv4>  \n \t</subinterface>'
+    else:
+        address ='</subinterface>'
+    return address
+
+"""
+# Method Name: create_If_SubIf
+  
+# Parameters:
+  - Interface_name:     [str]  Variable to set the name of the Interface that will be configured. [Mandatory parameter in all cases].
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - Interface_type:     [str]  Variable that specifies the type of interface, can take the value "l2vlan" or "l3ipvlan" [Only mandatory if DEL = False].
+  - SubInterface_Index: [int]  Variable to set the index of the subinterface.[Only mandatory if DEL = False].
+  - Description:        [str]  Variable for adding a description to the Interface   [Only mandatory if DEL = False].
+
+# Functionality:
+  This method generates the template of an Interface with subinterface, used both for L2 and L3 VPNs.
+  This template will be generated for configuring a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a existent Interface or) or false (Template for creating a new Interface with Subinterface).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_If_SubIf(parameters):                                #[L2/L3] Creates a Interface with a Subinterface as described in /interface[{:s}]/subinterface[{:d}]
+    Interface_name     = parameters['name']
+    DEL                = parameters['DEL']                      # If the parameters DEL is set to "TRUE" that will mean that is for making a DELETE, ELSE is for creating
+    verify             = str(parameters)                        # Verify transforms the received parameters into a string format for later making verifications and modifications
+
+    #Create an instance of the YANG model
+    InterfaceInstance = openconfig_interfaces()
+
+    if DEL==True:                                               #DELETE OPERATION
+        # Access the entry container
+        InterfaceInstance_set = InterfaceInstance.interfaces.interface.add(name = Interface_name)
+        
+        # Dump the entire instance as RFC 7950 XML
+        InterfaceInstance_set = pybindIETFXMLEncoder.serialise(InterfaceInstance)
+
+        #Replace for setting the "Delete" Operation
+        InterfaceInstance_set = InterfaceInstance_set.replace('<interface>','<interface xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete">')
+
+        #Generic Replaces
+        InterfaceInstance_set = InterfaceInstance_set.replace('<openconfig-interfaces xmlns="http://openconfig.net/yang/interfaces">',"")
+        InterfaceInstance_set = InterfaceInstance_set.replace('<interfaces>','<interfaces xmlns="http://openconfig.net/yang/interfaces">')
+        InterfaceInstance_set = InterfaceInstance_set.replace('</openconfig-interfaces>','')
+
+    else:                                                       #MERGE OPERATION
+        Interface_type     = parameters['type']
+        SubInterface_Index = parameters["index"]
+
+        #Access the entry container
+        InterfaceInstance_set = InterfaceInstance.interfaces.interface.add(name = Interface_name)
+        InterfaceInstance_set.config.name = Interface_name
+        InterfaceInstance_set.config.enabled = True
+
+        #SubIntefaces-Config
+        SubInterfaceInstance              = InterfaceInstance_set.subinterfaces.subinterface.add(index = SubInterface_Index)
+        SubInterfaceInstance.config.index = SubInterface_Index
+
+        #If the description parameter is defined [OPTIONAL-PARAMETER]
+        if verify.find('description')>0:
+            Description = parameters['description']   
+            if  len(Description) != 0: SubInterfaceInstance.config.description = Description   #If description parameter has a value
+
+        #If the MTU parameter is defined [OPTIONAL-PARAMETER]
+        if verify.find('mtu')>0:
+            MTU = parameters['mtu']    
+            if  MTU != 0: InterfaceInstance_set.config.mtu = MTU                       #If MTU parameter has a value
+
+        #Dump the entire instance as RFC 750 XML
+        InterfaceInstance_set = pybindIETFXMLEncoder.serialise(InterfaceInstance)
+
+        #Replaces for adding the Interface Type
+        InterfaceInstance_set = InterfaceInstance_set.replace('</config>\n      <subinterfaces>','  <type xmlns:ianaift="urn:ietf:params:xml:ns:yang:iana-if-type">ianaift:'+Interface_type+'</type>\n      </config>\n      <subinterfaces>')
+        vlan = set_vlan(parameters)
+        InterfaceInstance_set = InterfaceInstance_set.replace('</config>\n        </subinterface>',vlan)
+        
+        if "l3ipvlan" in Interface_type: 
+            ip = set_ip(parameters)
+            InterfaceInstance_set = InterfaceInstance_set.replace('</subinterface>',ip)
+
+        #Generic Replaces
+        InterfaceInstance_set = InterfaceInstance_set.replace('<openconfig-interfaces xmlns="http://openconfig.net/yang/interfaces">',"")
+        InterfaceInstance_set = InterfaceInstance_set.replace('<interfaces>','<interfaces xmlns="http://openconfig.net/yang/interfaces">')
+        InterfaceInstance_set = InterfaceInstance_set.replace('</openconfig-interfaces>','')
+
+    return (InterfaceInstance_set) 
+  
+'''
diff --git a/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py
new file mode 100644
index 0000000000000000000000000000000000000000..c4d494ea61a307fbb5a53780f4ab37af2e7091a4
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/VPN/Network_instance_multivendor.py
@@ -0,0 +1,839 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from yattag import Doc, indent
+
+"""
+# Method Name: create_network_instance
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable to set the name of the Network Instance . [Mandatory parameter in all cases].
+  - DEL:                        [bool]Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - NetInstance_type:           [str] Variable that sets the type of the Network Instance, it can take the value L2VSI for L2VPN or L3VRF for L3VPN .
+  - NetInstance_description     [int] Variable for adding a description to the Network Instance  .
+  - NetInstance_MTU             [str] Variable that sets the value of the MTU for the network instance.     [L2VPN]
+  - NetInstance_Route_disting   [str] Variable to set the route distinguisher value .                       [L3VPN]
+
+# Functionality:
+  This method generates the template for creating a Network Instance. This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a existent Network Instance) or false (Template for creating a new Network Instance).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+""" 
+def create_NI(parameters,vendor,DEL):
+    doc, tag, text = Doc().tagtext()
+
+    with tag('network-instances',xmlns="http://openconfig.net/yang/network-instance"):
+        if DEL == True: 
+            with tag('network-instance' ,'xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                with tag('name'):text(parameters['name'])
+        else:
+            with tag('network-instance'):
+                with tag('name'):text(parameters['name'])
+                if   "L2VSI" in parameters['type']: 
+                    with tag('config'):
+                        with tag('name'):text(parameters['name'])
+                        if vendor == "ADVA": 
+                            with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'):text('oc-ni-types:',parameters['type'])
+                            with tag('mtu'):text('1500')
+                    if vendor == "ADVA": 
+                        with tag('fdb'):
+                            with tag('config'):
+                                with tag('mac-learning')   :text('true')
+                                with tag('mac-aging-time') :text('300')
+                                with tag('maximum-entries'):text('1000')
+                        with tag('encapsulation'):
+                            with tag('config'):
+                                with tag('encapsulation-type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"')  :text('oc-ni-types:', 'MPLS')
+
+                elif "L3VRF" in parameters['type']: 
+                    with tag('config'):
+                        with tag('name'):text(parameters['name'])
+                        if vendor == "ADVA": 
+                            with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'):text('oc-ni-types:',parameters['type'])
+                            with tag('route-distinguisher'):text(parameters['route_distinguisher'])
+                    if vendor == "ADVA": 
+                        with tag('encapsulation'):
+                            with tag('config'):
+                                with tag('encapsulation-type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"')  :text('oc-ni-types:MPLS')
+                                with tag('label-allocation-mode','xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'):text('oc-ni-types:INSTANCE_LABEL')
+
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+"""
+# Method Name: add_protocol_NI [Only for L3-VPN]
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable that specifies the name of Network Instance that is going to be used.
+  - DEL:                        [bool]Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - Protocol_name:              [str] Variable that sets the type of protocol that is going to be added to the NI. It can be STATIC, DIRECTLY_CONNECTED or BGP.
+  - Identifier:                 [str] Variable that sets the identifier of the protocol that will be added to the NI. It can be STATIC, DIRECTLY_CONNECTED or BGP.
+  - AS:                         [int] Variable that specifies the AS (Autonomous System) parameter. To be defined only in case the protocol used is BGP 
+  - Router_ID:                  [int] Variable that specifies the identifier of the router to be configured. To be defined only in case the protocol used is BGP 
+
+# Functionality:
+  This method generates the template that associates a routing protocol with a Network instance.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a routing policy defined set) or false (Template for creating a routing policy defined set).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def add_protocol_NI(parameters,vendor, DEL):
+    doc, tag, text = Doc().tagtext()
+
+    with tag('network-instances',xmlns="http://openconfig.net/yang/network-instance"):
+        if DEL == True: 
+            with tag('network-instance'):
+                with tag('name'):text(parameters['name'])
+                with tag('protocols'):
+                    with tag('protocol','xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                        with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier'])
+                        with tag('name')      :text(parameters['protocol_name'])
+        else:
+            with tag('network-instance'):
+                with tag('name'):text(parameters['name'])
+                with tag('protocols'):
+                    with tag('protocol'):
+                        with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier'])
+                        with tag('name')      :text(parameters['protocol_name'])
+                        with tag('config'):
+                            with tag('identifier', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier'])
+                            with tag('name')      :text(parameters['protocol_name'])
+                        if "BGP" in parameters['identifier']:
+                            with tag('bgp'):
+                                with tag('global'):
+                                    with tag('config'):
+                                        with tag('as')       :text(parameters['as'])
+                                        if "router-id" in parameters: 
+                                            with tag('router-id'):text(parameters['router-id'])
+                if vendor == "ADVA": 
+                    with tag('tables'):
+                      with tag('table'):
+                          with tag('protocol', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier'])
+                          with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:IPV4')
+                          with tag('config'):
+                              with tag('protocol', 'xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):text('oc-pol-types:',parameters['identifier'])
+                              with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:IPV4')
+
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+"""
+# Method Name: associate_If_to_NI
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable that specifies the name of Network Instance that is going to be used.
+  - NetInstance_ID:             [str] Variable to set the ID of the Interface that is going to be associated to the Network Instance.
+  - NetInstance_Interface:      [str] Variable that specifies the name of the Interface that is going to be associated to the Network Instance.
+  - NetInstance_SubInterface:   [int] Variable that specifies the index of the subinterface that is going to be associated to the Network Instance.
+
+# Functionality:
+  This method generates the template for associating an Interface to an existent Network Instance. This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  2) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def associate_If_to_NI(parameters, DEL):
+    doc, tag, text = Doc().tagtext()
+
+    with tag('network-instances',xmlns="http://openconfig.net/yang/network-instance"):
+        if DEL == True: 
+            with tag('network-instance'):
+                with tag('name'):text(parameters['name'])
+                with tag('interfaces'):
+                    with tag('interface','xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                        with tag('id'):text(parameters['id'])
+        else:
+            with tag('network-instance'):
+                with tag('name'):text(parameters['name'])
+                with tag('interfaces'):
+                    with tag('interface'):
+                        with tag('id'):text(parameters['id'])
+                        with tag('config'):
+                            with tag('id')          :text(parameters['id'])
+                            with tag('interface')   :text(parameters['interface'])
+                            with tag('subinterface'):text(parameters['subinterface'])
+                            
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+"""
+# Method Name: associate_virtual_circuit [Only for L2-VPN]
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable that specifies the name of Network Instance that is going to be used.
+  - ConnectionPoint_ID:         [str] Variable that defines the Identifier of the Connection Point of within the Network Instance .
+  - VirtualCircuit_ID:          [int] Variable that sets the Identifier of the Virtual Circuit (VC_ID).
+  - RemoteSystem:               [str] Variable to specify the remote system (device) in which the virtual circuit is created. It should be an IP address.
+
+# Functionality:
+  This method will generate the template to associate a virtual circuit, used for L2VPN, with a Network Instance.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a Virtual Circuit from the NI) or false (Template for associating a Virtual Circuit to the NI).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def associate_virtual_circuit(parameters):
+
+    doc, tag, text = Doc().tagtext()
+
+    with tag('network-instances',xmlns="http://openconfig.net/yang/network-instance"):
+        with tag('network-instance'):
+            with tag('name'):text(parameters['name'])
+            with tag('connection-points'):
+                with tag('connection-point'):
+                    with tag('connection-point-id'):text(parameters['connection_point'])
+                    with tag('config'):
+                        with tag('connection-point-id'):text(parameters['connection_point'])
+                    with tag('endpoints'):
+                        with tag('endpoint'):
+                            with tag('endpoint-id'):text(parameters['connection_point'])
+                            with tag('config'):
+                                with tag('endpoint-id'):text(parameters['connection_point'])
+                                with tag('precedence'):text('1')
+                                with tag('type', 'xmlns:oc-ni-types="http://openconfig.net/yang/network-instance-types"'):text('oc-ni-types:REMOTE')
+                            with tag('remote'):
+                                with tag('config'):
+                                    with tag('virtual-circuit-identifier'):text(parameters['VC_ID'])
+                                    with tag('remote-system'):text(parameters['remote_system'])
+
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+"""
+# Method Name: associate_RP_to_NI [Only for L3-VPN]
+  
+# Parameters:
+  - NetInstance_name:   [str] Variable that specifies the name of Network Instance that is going to be used.
+  - Import_policy:      [str] Variable that specifies the name of the Import Routing Policy to be set.
+  - Export_policy:      [str] Variable that specifies the name of the Export Routing Policy to be set.
+
+# Functionality:
+  This method generates the template to associate a Routing Policy (Import or Export) to an existent Network Instance.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a RP from a Network Instance) or false (Template for associating a RP to a Network Instance).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def associate_RP_to_NI(parameters):
+    doc, tag, text = Doc().tagtext()
+    with tag('network-instances',xmlns="http://openconfig.net/yang/network-instance"):
+      with tag('network-instance'):
+          with tag('name'):text(parameters['name'])
+          with tag('inter-instance-policies'):
+              with tag('apply-policy'):
+                  with tag('config'):
+                      if'import_policy' in parameters :
+                          with tag('import-policy'):text(parameters['import_policy'])
+                      elif 'export_policy' in parameters:
+                          with tag('export-policy'):text(parameters['export_policy'])
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+"""
+# Method Name: create_table_conns [Only for L3-VPN]
+  
+# Parameters:
+  - NetInstance_name:   [str] Variable that specifies the name of Network Instance that is going to be used.
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - SourceProtocol:     [str]  Variable to specify the protocol used in the Source for the table connection.
+  - DestProtocol        [str]  Variable to specify the protocol used in the Destination for the table connection..
+  - AddrFamily          [str]  Variable to specify the Address Family that is going to be used for the table connection. It can take the value 'IPV4'or 'IPV6'
+  - Def_ImportPolicy    [str]  Variable to specify a Routing Policy, that will be used as Default for the table connections. 
+
+# Functionality:
+  This method generates the template for creating (or deleting) a table connection.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a table connection) or false (Template for creating a table connection).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_table_conns(parameters,DEL): 
+    
+    doc, tag, text = Doc().tagtext()
+
+    with tag('network-instances',xmlns="http://openconfig.net/yang/network-instance"):
+        with tag('network-instance'):
+            with tag('name'):text(parameters['name'])
+            if DEL == True: 
+                with tag('table-connections'):
+                    with tag('table-connection','xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                      with tag('src-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):   text('oc-pol-types:',parameters['src_protocol'])
+                      with tag('dst-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):   text('oc-pol-types:',parameters['dst_protocol'])
+                      with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:',parameters['dst_protocol'])     
+            else:
+                with tag('table-connections'):
+                    with tag('table-connection'):
+                      with tag('src-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):   text('oc-pol-types:',parameters['src_protocol'])
+                      with tag('dst-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):   text('oc-pol-types:',parameters['dst_protocol'])
+                      with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:',parameters['address_family'])
+                      with tag('config'):
+                        with tag('src-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):   text('oc-pol-types:',parameters['src_protocol'])
+                        with tag('dst-protocol','xmlns:oc-pol-types="http://openconfig.net/yang/policy-types"'):   text('oc-pol-types:',parameters['dst_protocol'])
+                        with tag('address-family', 'xmlns:oc-types="http://openconfig.net/yang/openconfig-types"'):text('oc-types:',parameters['address_family'])    
+                        if len(parameters['default_import_policy']) != 0:
+                            with tag('default-import-policy'):text(parameters['default_import_policy'])
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+#TESTING
+'''
+parameters1 = {'name'               : 'TEST DE VPN',
+               'description        ': 'Test VPN ', 
+               'type'               : 'L3VRF',
+               'route_distinguisher': '65000:101'}
+
+parameters2 = {'name'               : 'TEST DE VPN',
+               'protocol_name'      : 'BGP', 
+               'identifier'         : 'BGP',
+               'as'                 : '65000',
+               'router-id'          :'5.5.5.5'}
+
+parameters2_1 = {'name'             : 'TEST DE VPN',
+               'protocol_name'      : 'STATIC', 
+               'identifier'         : 'STATIC',
+               'as'                 : '',
+               'router-id'          :''}
+parameters3 = {'name'               : 'TEST DE VPN',
+               'id'                 : 'eth-1/0/23.123', 
+               'interface'          : 'eth-1/0/23.123',
+               'subinterface'       : '0'}
+
+parameters4 = {'name'               : 'TEST DE VPN',
+               'connection_point'   : 'VC-1', 
+               'VC_ID'              : '100',
+               'remote_system'      : '5.5.5.1'}
+
+parameters5a = {'name'               : 'TEST DE VPN',
+               'import_policy'      : 'srv_101_a'}
+
+parameters5b = {'name'               : 'TEST DE VPN',
+               'export_policy'      : 'srv_101_a'}
+
+parameters6 = {'name'                 : 'TEST DE VPN',
+               'src_protocol'         : 'STATIC', 
+               'dst_protocol'         : 'BGP',
+               'address_family'       : 'IPV4',
+               'default_import_policy':'ACCEPT_ROUTE'}
+
+operation = False
+
+#STEP 1
+print('\t\tNetwork Instance - CREATE')
+print(create_NI(parameters1,'ADVA',False))
+print('\n')
+print('\t\tNetwork Instance - DELETE')
+print(create_NI(parameters1,'ADVA',True))
+
+#STEP 2 option A
+print('\n\n')
+print('\t\tProtocol - ADD')
+print(add_protocol_NI(parameters2,'ADVA',False))
+print('\n\n')
+print('\t\tProtocol - DELETE')
+print(add_protocol_NI(parameters2,'ADVA',True))
+
+#STEP 2 option B
+print('\n\n')
+print('\t\tProtocol - ADD')
+print(add_protocol_NI(parameters2_1,'ADVA',False))
+print('\n\n')
+print('\t\tProtocol - DELETE')
+print(add_protocol_NI(parameters2_1,'ADVA',True))
+
+#STEP 3
+print('\n\n')
+print('\t\tInterface - ADD')
+print(associate_If_to_NI(parameters3,False))
+print('\n\n')
+print('\t\tInterface - DELETE')
+print(associate_If_to_NI(parameters3,True))
+
+#STEP 4
+print('\n\n')
+print('\t\tADD Virtual Circuit')
+print(associate_virtual_circuit(parameters4))
+
+#STEP 5 option A
+print('\n\n')
+print('\t\tAssociate RP to NI')
+print(associate_RP_to_NI(parameters5a))
+
+#STEP 5 option B
+print('\n\n')
+print('\t\tAssociate RP to NI')
+print(associate_RP_to_NI(parameters5b))
+
+#STEP 6
+print('\n\n')
+print('\t\tTables Connections - ADD')
+print(create_table_conns(parameters6,False))
+print('\n\n')
+print('\t\tTables Connections - DELETE')
+print(create_table_conns(parameters6,True))
+'''
+
+
+'''
+from .openconfig_network_instance import openconfig_network_instance
+from pyangbind.lib.serialise     import pybindIETFXMLEncoder
+
+"""
+# Method Name: create_network_instance
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable to set the name of the Network Instance . [Mandatory parameter in all cases].
+  - DEL:                        [bool]Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - NetInstance_type:           [str] Variable that sets the type of the Network Instance, it can take the value L2VSI for L2VPN or L3VRF for L3VPN .
+  - NetInstance_description     [int] Variable for adding a description to the Network Instance  .
+  - NetInstance_MTU             [str] Variable that sets the value of the MTU for the network instance.     [L2VPN]
+  - NetInstance_Route_disting   [str] Variable to set the route distinguisher value .                       [L3VPN]
+
+# Functionality:
+  This method generates the template for creating a Network Instance. This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a existent Network Instance) or false (Template for creating a new Network Instance).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_network_instance(parameters,vendor):             #[L2/L3] Creates a Network Instance as described in: /network_instance[{:s}] 
+    NetInstance_name        = parameters['name']           #Retrieves the Name parameter of the NetInstance
+    DEL                     = parameters['DEL']            #If the parameter DEL is set to "TRUE" that will mean that is for making a DELETE, ELSE is for creating
+    verify = str(parameters)                               #Verify transforms the received parameters into a string format for later making verifications and modifications
+
+    #Create an instance of the YANG model
+    Network_Instance = openconfig_network_instance()
+
+    if DEL == True:                                         #DELETE OPERATION
+        #Access the entry container
+        NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)
+
+        #Dump the entire instance as RFC 750 XML
+        NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+        #Generic Replaces
+        NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+        NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+        NetInstance_set = NetInstance_set.replace('<network-instance>','<network-instance xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete">')   
+        NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','') 
+
+    else:                                                   #MERGE OPERATION
+        NetInstance_type = parameters['type']                                                                    #Retrieves the Type parameter of the NetInstance
+    
+        #Access the entry container
+        NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)      
+        NetInstance_set.config.name = NetInstance_name                                                          
+        if vendor == 'ADVA': NetInstance_set.config.type = NetInstance_type 
+        NetInstance_encapsulation = NetInstance_set.encapsulation.config
+
+        #If the description parameter is defined [OPTIONAL-PARAMETER]
+        if verify.find('description')>0:
+            NetInstance_description = parameters['description']    
+            if  len(NetInstance_description) != 0: NetInstance_set.config.description = NetInstance_description   #If description parameter has a value
+
+        #Configuration for L2VSI
+        if   "L2VSI" in NetInstance_type:
+            if verify.find('mtu')>0:                            #If the MTU parameter is defined with a value
+                NetInstance_MTU = parameters['mtu']    
+            else:
+                NetInstance_MTU = 1500                  #Fixed value of MTU parameter  [Obligatory for L2VSI]
+            #Encapsulation
+            NetInstance_encapsulation.encapsulation_type = "MPLS"
+            #fdb
+            NetInstance_fdb = NetInstance_set.fdb.config
+            NetInstance_fdb.mac_learning    = True
+            NetInstance_fdb.maximum_entries = 1000
+            NetInstance_fdb.mac_aging_time  = 300
+            #Dump the entire instance as RFC 750 XML
+            NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+            #Specific Replace [Addition of the enabled and MTU variables]
+            NetInstance_set = NetInstance_set.replace('</type>','</type>\n        <mtu>'+str(NetInstance_MTU)+'</mtu>\n        <enabled>true</enabled>')   
+
+        #Configuration for L3VRF
+        elif   "L3VRF" in NetInstance_type:
+            NetInstance_Route_disting = parameters['route_distinguisher']                                       #Retrieves the Route-Distinguisher parameter [Obligatory for L3VRF]
+            NetInstance_set.config.route_distinguisher                            = NetInstance_Route_disting
+            
+            #If the router-id parameter is defined [OPTIONAL-PARAMETER]
+            #if verify.find('router_id')>0:
+                #NetInstance_Router_ID = parameters['router_id']    
+                #if  len(NetInstance_Router_ID) != 0: NetInstance_set.config.router_id = NetInstance_Router_ID     #If router-id parameter has a value
+
+            #Encapsulation
+            if vendor == 'ADVA':
+                NetInstance_encapsulation.encapsulation_type = "MPLS"
+                NetInstance_encapsulation.label_allocation_mode = "INSTANCE_LABEL"    
+            #Dump the entire instance as RFC 750 XML
+            NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+            #Specific Replace [Addition of the enabled]
+            NetInstance_set = NetInstance_set.replace('</route-distinguisher>','</route-distinguisher>\n        <enabled>true</enabled>')   
+        
+        #Generic Replaces
+        NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+        NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+        NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')  
+
+    return (NetInstance_set)
+
+"""
+# Method Name: associate_If_to_NI
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable that specifies the name of Network Instance that is going to be used.
+  - NetInstance_ID:             [str] Variable to set the ID of the Interface that is going to be associated to the Network Instance.
+  - NetInstance_Interface:      [str] Variable that specifies the name of the Interface that is going to be associated to the Network Instance.
+  - NetInstance_SubInterface:   [int] Variable that specifies the index of the subinterface that is going to be associated to the Network Instance.
+
+# Functionality:
+  This method generates the template for associating an Interface to an existent Network Instance. This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  2) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def associate_If_to_NI(parameters):                         #[L2/L3] Associates an Interface to a Network Instance as described in: /network_instance[{:s}]/interface[{:s}]
+    NetInstance_name = parameters['name']
+    NetInstance_ID = parameters['id']
+    NetInstance_Interface = parameters['interface']
+    NetInstance_SubInterface = parameters['subinterface']
+
+    #Create an instance of the YANG model
+    Network_Instance = openconfig_network_instance()
+
+    #Access the entry container
+    NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)
+    NetInstance_interface = NetInstance_set.interfaces.interface.add(id = NetInstance_ID)
+    NetInstance_interface.config.id = NetInstance_ID
+    NetInstance_interface.config.interface = NetInstance_Interface
+    NetInstance_interface.config.subinterface = NetInstance_SubInterface
+        
+    #Dump the entire instance as RFC 750 XML
+    NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+    #Generic Replaces
+    NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+    NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+    NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')   
+    return (NetInstance_set)
+
+"""
+# Method Name: add_protocol_NI [Only for L3-VPN]
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable that specifies the name of Network Instance that is going to be used.
+  - DEL:                        [bool]Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - Protocol_name:              [str] Variable that sets the type of protocol that is going to be added to the NI. It can be STATIC, DIRECTLY_CONNECTED or BGP.
+  - Identifier:                 [str] Variable that sets the identifier of the protocol that will be added to the NI. It can be STATIC, DIRECTLY_CONNECTED or BGP.
+  - AS:                         [int] Variable that specifies the AS (Autonomous System) parameter. To be defined only in case the protocol used is BGP 
+  - Router_ID:                  [int] Variable that specifies the identifier of the router to be configured. To be defined only in case the protocol used is BGP 
+
+# Functionality:
+  This method generates the template that associates a routing protocol with a Network instance.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a routing policy defined set) or false (Template for creating a routing policy defined set).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def add_protocol_NI(parameters):                            #[L3]    Adds a Protocol to a Network Instance as described in: /network_instance[{:s}]/protocols
+    NetInstance_name = parameters['name']                        
+    Protocol_name    = parameters['protocol_name']         #Protocol can be [STATIC], [DIRECTLY_CONNECTED] or [BGP]
+    Identifier       = parameters['identifier']            #Identifier can be [STATIC], [DIRECTLY_CONNECTED] or [BGP]
+    DEL              = parameters['DEL']                   #If the parameter DEL is set to "TRUE" that will mean that is for making a DELETE, ELSE is for creating
+
+    if DEL == True:                                        #DELETE OPERATION
+        #Create an instance of the YANG model
+        Network_Instance = openconfig_network_instance()
+
+        #Access the entry container
+        NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)      
+        NetInstance_protocol = NetInstance_set.protocols.protocol.add(name = Protocol_name, identifier = Identifier)    
+
+        #Dump the entire instance as RFC 750 XML
+        NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+        #Delete Replace
+        NetInstance_set = NetInstance_set.replace('<protocol>','<protocol xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete">')
+        #Generic Replaces
+        NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+        NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+        NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')
+    
+    else:                                                   #MERGE OPERATION
+        #Create an instance of the YANG model
+        Network_Instance = openconfig_network_instance()
+
+        #Access the entry container
+        NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)      
+        NetInstance_protocol = NetInstance_set.protocols.protocol.add(name = Protocol_name, identifier = Identifier)    
+        NetInstance_protocol.config.name = Protocol_name      
+        NetInstance_protocol.config.identifier = Identifier
+        if Identifier in 'BGP':
+            AS          = parameters['as']  
+            Router_ID   = parameters['router_id']                        
+
+            NetInstance_protocol.bgp.global_.config.as_=AS 
+            NetInstance_protocol.bgp.global_.config.router_id=Router_ID
+                
+        #Configuration of Table
+        NetInstance_tables = NetInstance_set.tables.table.add(protocol = Protocol_name, address_family = "IPV4")       #What about IPV6?
+        NetInstance_tables.config.protocol = Protocol_name
+        NetInstance_tables.config.address_family = "IPV4"
+
+        #Dump the entire instance as RFC 750 XML
+        NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+        # Specific Replaces
+        NetInstance_set = NetInstance_set.replace('<table>\n          <protocol>'+Identifier+'</protocol>','<table> \n\t  <protocol xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+Identifier+'</protocol>')
+        NetInstance_set = NetInstance_set.replace('<config>\n            <protocol>'+Identifier+'</protocol>','<config> \n\t    <protocol xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+Identifier+'</protocol>')
+        NetInstance_set = NetInstance_set.replace('<address-family>IPV4</address-family>','<address-family xmlns:oc-types="http://openconfig.net/yang/openconfig-types">oc-types:'+"IPV4"+'</address-family>')
+        NetInstance_set = NetInstance_set.replace('<identifier>'+Identifier+'</identifier>','<identifier xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+Identifier+'</identifier>')
+        #Generic Replaces
+        NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+        NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+        NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')  
+
+    return (NetInstance_set)
+
+"""
+# Method Name: associate_virtual_circuit [Only for L2-VPN]
+  
+# Parameters:
+  - NetInstance_name:           [str] Variable that specifies the name of Network Instance that is going to be used.
+  - ConnectionPoint_ID:         [str] Variable that defines the Identifier of the Connection Point of within the Network Instance .
+  - VirtualCircuit_ID:          [int] Variable that sets the Identifier of the Virtual Circuit (VC_ID).
+  - RemoteSystem:               [str] Variable to specify the remote system (device) in which the virtual circuit is created. It should be an IP address.
+
+# Functionality:
+  This method will generate the template to associate a virtual circuit, used for L2VPN, with a Network Instance.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a Virtual Circuit from the NI) or false (Template for associating a Virtual Circuit to the NI).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def associate_virtual_circuit(parameters):                  #[L2]    Associates a Virtual Circuit as described in: /network_instance[{:s}]/connection_point[VC-1]
+    NetInstance_name   = parameters['name']
+    ConnectionPoint_ID = parameters['connection_point']
+    VirtualCircuit_ID  = parameters['VC_ID']
+    RemoteSystem       = parameters['remote_system']
+
+    #Create an instance of the YANG model
+    Network_Instance = openconfig_network_instance()
+
+    #Access the entry container
+    NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)
+    ConnectionPoint_set = NetInstance_set.connection_points.connection_point.add(connection_point_id = ConnectionPoint_ID)
+    ConnectionPoint_set.config.connection_point_id = ConnectionPoint_ID
+    Endpoint_set = ConnectionPoint_set.endpoints.endpoint.add(endpoint_id = ConnectionPoint_ID)
+    Endpoint_set.config.endpoint_id = ConnectionPoint_ID
+    Endpoint_set.config.precedence = 1
+    Endpoint_set.config.type = "REMOTE"
+    Endpoint_set.remote.config.remote_system = RemoteSystem
+    Endpoint_set.remote.config.virtual_circuit_identifier = VirtualCircuit_ID
+
+    #Dump the entire instance as RFC 750 XML
+    NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+    NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+    NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+    NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')   
+    return (NetInstance_set)
+
+"""
+# Method Name: associate_RP_to_NI [Only for L3-VPN]
+  
+# Parameters:
+  - NetInstance_name:   [str] Variable that specifies the name of Network Instance that is going to be used.
+  - Import_policy:      [str] Variable that specifies the name of the Import Routing Policy to be set.
+  - Export_policy:      [str] Variable that specifies the name of the Export Routing Policy to be set.
+
+# Functionality:
+  This method generates the template to associate a Routing Policy (Import or Export) to an existent Network Instance.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a RP from a Network Instance) or false (Template for associating a RP to a Network Instance).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def associate_RP_to_NI(parameters):                         #[L3]    Associates a Routing Policy to a Network Instance as described in: /network_instance[{:s}]/inter_instance_policies[{:s}] 
+    NetInstance_name = parameters['name']
+    verify = str(parameters)                               #Verify transforms the received parameters into a string format for later making verifications and modifications
+
+    #Create an instance of the YANG model
+    Network_Instance = openconfig_network_instance()
+
+    #Access the entry container
+    NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name)
+    Inter_instance = NetInstance_set.inter_instance_policies.apply_policy.config
+
+    #If a Import policy is defined
+    if verify.find('import_policy')>0:
+        Import = parameters['import_policy']    
+        if  len(Import) != 0: Inter_instance.import_policy = Import             #If the import_policy parameter has a value
+
+    #If a Export Policy is defined
+    if verify.find('export_policy')>0:
+        Export = parameters['export_policy']    
+        if  len(Export) != 0: Inter_instance.export_policy = Export             #If the export_policy parameter has a value
+        
+    #Dump the entire instance as RFC 750 XML
+    NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+    #Generic Replaces
+    NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+    NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+    NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')   
+    return (NetInstance_set)
+
+"""
+# Method Name: create_table_conns [Only for L3-VPN]
+  
+# Parameters:
+  - NetInstance_name:   [str] Variable that specifies the name of Network Instance that is going to be used.
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - SourceProtocol:     [str]  Variable to specify the protocol used in the Source for the table connection.
+  - DestProtocol        [str]  Variable to specify the protocol used in the Destination for the table connection..
+  - AddrFamily          [str]  Variable to specify the Address Family that is going to be used for the table connection. It can take the value 'IPV4'or 'IPV6'
+  - Def_ImportPolicy    [str]  Variable to specify a Routing Policy, that will be used as Default for the table connections. 
+
+# Functionality:
+  This method generates the template for creating (or deleting) a table connection.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a table connection) or false (Template for creating a table connection).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_table_conns(parameters):                         #[L3]    Creates Table Connections as described in: /network_instance[{:s}]/table_connections
+    NetInstance_name = parameters['name']
+    SourceProtocol   = parameters['src_protocol']
+    DestProtocol     = parameters['dst_protocol']
+    AddrFamily       = parameters['address_family']
+    DEL              = parameters['DEL']                   #If the parameter DEL is set to "TRUE" that will mean that is for making a DELETE, ELSE is for creating
+    
+    #Create an instance of the YANG model
+    Network_Instance = openconfig_network_instance()
+
+    if DEL == True:                                         #DELETE OPERATION
+        #Access the entry container
+        NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name) 
+
+        #Configuration of Table-Connections
+        Set_TableConns = NetInstance_set.table_connections.table_connection.add(src_protocol = SourceProtocol, dst_protocol = DestProtocol, address_family = AddrFamily)
+
+        #Dump the entire instance as RFC 750 XML
+        NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+
+        #Specific Replaces
+        NetInstance_set = NetInstance_set.replace('<src-protocol>'+SourceProtocol+'</src-protocol>','<src-protocol xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+SourceProtocol+'</src-protocol>')
+        NetInstance_set = NetInstance_set.replace('<dst-protocol>'+DestProtocol+'</dst-protocol>','<dst-protocol xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+DestProtocol+'</dst-protocol>')
+        NetInstance_set = NetInstance_set.replace('<address-family>'+AddrFamily+'</address-family>','<address-family xmlns:oc-types="http://openconfig.net/yang/openconfig-types">oc-types:'+AddrFamily+'</address-family>')
+        #Generic Replaces
+        NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+        NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+        NetInstance_set = NetInstance_set.replace('<table-connection>','<table-connection xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete">')
+        NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')
+
+    else:                                                    #MERGE OPERATION
+        verify = str(parameters)                             #Verify transforms the received parameters into a string format for later making verifications and modifications
+
+        #Access the entry container
+        NetInstance_set = Network_Instance.network_instances.network_instance.add(name = NetInstance_name) 
+
+        #Configuration of Table-Connections
+        Set_TableConns = NetInstance_set.table_connections.table_connection.add(src_protocol = "", dst_protocol = "", address_family = "")
+        
+        Set_TableConns.config.src_protocol   = ""
+        Set_TableConns.config.dst_protocol   = ""
+        Set_TableConns.config.address_family = ""
+
+        # Default Import Policy (If is defined)
+        if verify.find('default_import_policy')>0:
+            Def_ImportPolicy = parameters['default_import_policy']    
+            if  len(Def_ImportPolicy) != 0: Set_TableConns.config.default_import_policy = Def_ImportPolicy             #If the default_import_policy parameter has a value
+
+        #Dump the entire instance as RFC 750 XML
+        NetInstance_set = pybindIETFXMLEncoder.serialise(Network_Instance)
+
+        #Specific Replaces
+        NetInstance_set = NetInstance_set.replace('<src-protocol></src-protocol>','<src-protocol xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+SourceProtocol+'</src-protocol>')
+        NetInstance_set = NetInstance_set.replace('<dst-protocol></dst-protocol>','<dst-protocol xmlns:oc-pol-types="http://openconfig.net/yang/policy-types">oc-pol-types:'+DestProtocol+'</dst-protocol>')
+        NetInstance_set = NetInstance_set.replace('<address-family></address-family>','<address-family xmlns:oc-types="http://openconfig.net/yang/openconfig-types">oc-types:'+AddrFamily+'</address-family>')
+        #Generic Replaces
+        NetInstance_set = NetInstance_set.replace('<openconfig-network-instance xmlns="http://openconfig.net/yang/network-instance">',"")
+        NetInstance_set = NetInstance_set.replace('<network-instances>','<network-instances xmlns="http://openconfig.net/yang/network-instance">')
+        NetInstance_set = NetInstance_set.replace('</openconfig-network-instance>','')   
+
+    return (NetInstance_set)
+'''
\ No newline at end of file
diff --git a/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py b/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py
new file mode 100644
index 0000000000000000000000000000000000000000..54e6c1c013fe0b0c84af0483def8dc944b4568a8
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/VPN/Routing_policy.py
@@ -0,0 +1,274 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from yattag import Doc, indent
+"""
+# Method Name: create_rp_statement
+  
+# Parameters:
+  - Policy_Name:        [str]  Variable that determines the name of the Routing Policy [Mandatory parameter in all cases].
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - Statement_Name:     [str]  Variable that determines the name of the Routing Policy Statement, which is a unique statement within the policy [Only mandatory if DEL = False].
+  - Policy_Result:      [str]  Variable to set if the policy is for accepting (ACCEPT ROUTE) or rejecting (REJECT ROUTE). [Only mandatory if DEL = False].
+  - ExtCommSetName:     [str]  Variable to set the name of the extended community set in the context of BGP policy conditions. [Only mandatory if DEL = False].
+  
+# Functionality:
+  This method generates the template of a routing policy statement to configure in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a policy statement) or false (Template for creating a policy statement).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_rp_statement(data, DEL):
+    doc, tag, text = Doc().tagtext()
+
+    RP_policy_name          = data['policy_name']
+    RP_statement_name       = data['statement_name']
+    RP_policy_result        = data['policy_result']
+    RP_ext_comm_set_name    = data['ext_community_set_name']
+    
+
+    with tag('routing-policy', xmlns="http://openconfig.net/yang/routing-policy"):
+        if DEL == True: 
+            with tag('policy-definitions'):
+                with tag('policy-definition' ,'xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                    with tag('name'):text(RP_policy_name)
+        else:
+            with tag('policy-definitions'):
+                with tag('policy-definition'):
+                    with tag('name'):text(RP_policy_name)
+                    with tag('config'):
+                        with tag('name'):text(RP_policy_name)
+                    with tag('statements'):
+                        with tag('statement'):
+                            with tag('name'):text(RP_statement_name)
+                            with tag('config'):
+                                with tag('name'):text(RP_statement_name)
+                            with tag('conditions'):
+                                with tag('config'):
+                                    with tag('install-protocol-eq', **{'xmlns:openconfig-policy-types': 'http://openconfig.net/yang/policy-types'}):text('openconfig-policy-types:DIRECTLY_CONNECTED')
+                                with tag('bgp-conditions', xmlns="http://openconfig.net/yang/bgp-policy"):
+                                    with tag('config'):
+                                        with tag('ext-community-set'):text(RP_ext_comm_set_name)
+                            with tag('actions'):
+                                with tag('config'):
+                                    with tag('policy-result'):text(RP_policy_result)
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+"""
+# Method Name: create_rp_def
+  
+# Parameters:
+  - ExtCommSetName:     [str]  Variable to set the name of the extended community set in the context of BGP policy conditions. [Mandatory parameter in all cases].
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - ExtCommMember:      [str]  Variable that represents an individual member or value within an Extended Community [Only mandatory if DEL = False].
+   
+# Functionality:
+  This method generates the template of a routing policy defined sets, which are objects defined and used within a routing policy statement.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a routing policy defined set) or false (Template for creating a routing policy defined set).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_rp_def(data, DEL):
+    doc, tag, text = Doc().tagtext()
+   
+    RP_ext_comm_set_name    = data['ext_community_set_name']
+    RP_ext_comm_member      = data['ext_community_member']
+    
+    with tag('routing-policy', xmlns="http://openconfig.net/yang/routing-policy"):
+        if DEL == True: 
+            with tag('defined-sets'):
+                with tag('bgp-defined-sets', xmlns="http://openconfig.net/yang/bgp-policy"):
+                    with tag('ext-community-sets'):
+                        with tag('ext-community-set' ,'xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"'):
+                            with tag('ext-community-set-name'):text(RP_ext_comm_set_name)
+        else:
+            with tag('defined-sets'):
+                with tag('bgp-defined-sets', xmlns="http://openconfig.net/yang/bgp-policy"):
+                    with tag('ext-community-sets'):
+                        with tag('ext-community-set'):
+                            with tag('ext-community-set-name'):text(RP_ext_comm_set_name)
+                            with tag('config'):
+                                with tag('ext-community-set-name'):text(RP_ext_comm_set_name)
+                                with tag('ext-community-member'):text(RP_ext_comm_member)
+    result = indent(
+        doc.getvalue(),
+        indentation = ' '*2,
+        newline = '\r\n'
+    )
+    return result
+
+#TESTING
+'''
+data_1 =    {"ext_community_set_name"   : "set_srv_101_a", 
+             "policy_name"              : "srv_101_a", 
+             "policy_result"            : "ACCEPT_ROUTE", 
+             "statement_name"           : "stm_srv_101_a"}
+
+data_2 =    {'ext_community_member'     : '65001:101', 
+            'ext_community_set_name'    : 'set_srv_101_a'}
+
+print('\nRouting Policy Statement - CREATE\n')
+print(rp_statement(data_1, False))
+print('\nRouting Policy Statement - DELETE\n')
+print(rp_statement(data_1, True))
+
+print('\nRouting Policy Defined Set - CREATE\n')
+print(rp_defined_set(data_2, False))
+print('\nRouting Policy Defined Set - DELETE\n')
+print(rp_defined_set(data_2, True))
+'''
+
+'''
+from .openconfig_routing_policy import openconfig_routing_policy
+from pyangbind.lib.serialise import pybindIETFXMLEncoder
+
+"""
+# Method Name: create_rp_statement
+  
+# Parameters:
+  - Policy_Name:        [str]  Variable that determines the name of the Routing Policy [Mandatory parameter in all cases].
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - Statement_Name:     [str]  Variable that determines the name of the Routing Policy Statement, which is a unique statement within the policy [Only mandatory if DEL = False].
+  - Policy_Result:      [str]  Variable to set if the policy is for accepting (ACCEPT ROUTE) or rejecting (REJECT ROUTE). [Only mandatory if DEL = False].
+  - ExtCommSetName:     [str]  Variable to set the name of the extended community set in the context of BGP policy conditions. [Only mandatory if DEL = False].
+  
+# Functionality:
+  This method generates the template of a routing policy statement to configure in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a policy statement) or false (Template for creating a policy statement).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_rp_statement(parameters):                        #[L3] Creates a Routing Policy Statement
+    Policy_Name      = parameters['policy_name']   
+    DEL              = parameters['DEL']                            #If the parameter DEL is set to "TRUE" that will mean that is for making a DELETE, ELSE is for creating
+           
+    #Create an instance of the YANG model
+    RoutingPolicy_Instance = openconfig_routing_policy()
+
+    if DEL == True:
+        #Set the Name of the Routing Policy
+        Set_RoutingPolicy = RoutingPolicy_Instance.routing_policy.policy_definitions.policy_definition.add(name=Policy_Name)
+
+        #Dump the entire instance as RFC 750 XML
+        RoutingInstance_set = pybindIETFXMLEncoder.serialise(RoutingPolicy_Instance)
+
+        RoutingInstance_set = RoutingInstance_set.replace('<openconfig-routing-policy xmlns="http://openconfig.net/yang/routing-policy">',"")
+        RoutingInstance_set = RoutingInstance_set.replace('<routing-policy>','<routing-policy xmlns="http://openconfig.net/yang/routing-policy">')
+
+        #Operation Delete [Replace]
+        RoutingInstance_set = RoutingInstance_set.replace('<policy-definition>','<policy-definition xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete">')
+        RoutingInstance_set = RoutingInstance_set.replace('</openconfig-routing-policy>','')   
+
+    else:
+        Statement_Name   = parameters['statement_name']             
+        Policy_Result    = parameters['policy_result']
+        ExtCommSetName   = parameters['ext_community_set_name']
+
+        #Access the entry container
+
+        #Set the Name of the Routing Policy
+        Set_RoutingPolicy = RoutingPolicy_Instance.routing_policy.policy_definitions.policy_definition.add(name=Policy_Name)
+        Set_RoutingPolicy.config.name = Policy_Name
+
+        #Configure the Statement of the Routing Policy 
+        Set_Statement_RoutingPolicy = Set_RoutingPolicy.statements.statement.add(name=Statement_Name)
+        Set_Statement_RoutingPolicy.config.name = Statement_Name
+        Set_Statement_RoutingPolicy.conditions.config.install_protocol_eq = "DIRECTLY_CONNECTED"
+        Set_Statement_RoutingPolicy.actions.config.policy_result = Policy_Result
+        
+        #Dump the entire instance as RFC 750 XML
+        RoutingInstance_set = pybindIETFXMLEncoder.serialise(RoutingPolicy_Instance)
+
+        #Policy-Definition - Statements - BGP-Conditions [Replace]
+        RoutingInstance_set = RoutingInstance_set.replace('</conditions>','  <bgp-conditions xmlns="http://openconfig.net/yang/bgp-policy"> \n\t\t <config> \n\t    \
+        <ext-community-set>'+ ExtCommSetName +'</ext-community-set> \n\t\t </config> \n\t      </bgp-conditions>\n\t    </conditions>')
+
+        #Generic Replaces
+        RoutingInstance_set = RoutingInstance_set.replace('<openconfig-routing-policy xmlns="http://openconfig.net/yang/routing-policy">',"")
+        RoutingInstance_set = RoutingInstance_set.replace('<routing-policy>','<routing-policy xmlns="http://openconfig.net/yang/routing-policy">')
+        RoutingInstance_set = RoutingInstance_set.replace('</openconfig-routing-policy>','') 
+
+    return (RoutingInstance_set)
+
+"""
+# Method Name: create_rp_def
+  
+# Parameters:
+  - ExtCommSetName:     [str]  Variable to set the name of the extended community set in the context of BGP policy conditions. [Mandatory parameter in all cases].
+  - DEL:                [bool] Variable that determines if the template will be for creating (DEL = False) or for deleting (DEL = True) a configuration [Mandatory parameter in all cases].
+  - ExtCommMember:      [str]  Variable that represents an individual member or value within an Extended Community [Only mandatory if DEL = False].
+   
+# Functionality:
+  This method generates the template of a routing policy defined sets, which are objects defined and used within a routing policy statement.
+  This template will be generated for being configured in a device, making use of pyangbind. 
+  To generate the template the following steps are performed:
+  1) Checks if the DEL variable is true (Template for deleting a routing policy defined set) or false (Template for creating a routing policy defined set).
+  2) Create the template correspondent in each case, assigning the correspondent parameters with their value.
+  3) Make the correspondent replaces for the unssuported configurations by pyangbind.
+  
+# Return:
+  [str] The newly generated template according to the specified parameters.
+"""
+def create_rp_def(parameters):                              #[L3] Creates a Routing Policy - Defined Sets [ '/routing_policy/bgp_defined_set[{:s}_rt_export][{:s}]' ]
+    ExtCommSetName   = parameters['ext_community_set_name']
+    DEL              = parameters['DEL']                            #If the parameter DEL is set to "TRUE" that will mean that is for making a DELETE, ELSE is for creating             
+                                                                    
+    #Create an instance of the YANG model
+    RoutingPolicy_Instance = openconfig_routing_policy()
+
+    if DEL == True:                                                                                 #Delete operation
+        #Dump the entire instance as RFC 750 XML
+        RoutingInstance_set = pybindIETFXMLEncoder.serialise(RoutingPolicy_Instance)
+
+        #BGP-Defined-Sets [Replace]
+        RoutingInstance_set = RoutingInstance_set.replace('<openconfig-routing-policy xmlns="http://openconfig.net/yang/routing-policy"/>',
+        '<routing-policy xmlns="http://openconfig.net/yang/routing-policy"> \n   <defined-sets> \n      <bgp-defined-sets xmlns="http://openconfig.net/yang/bgp-policy">\
+        \n\t <ext-community-sets> \n\t   <ext-community-set xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" nc:operation="delete"> \n      \
+        <ext-community-set-name>'+ExtCommSetName+'</ext-community-set-name> \n\t   </ext-community-set> \n\t </ext-community-sets> \
+         \n      </bgp-defined-sets> \n   </defined-sets> \n </routing-policy>')
+
+    else:                                                                                            #Merge operation
+        #Add new requested parameter - ext_community_member
+        ExtCommMember    = parameters['ext_community_member'] 
+
+        #Dump the entire instance as RFC 750 XML
+        RoutingInstance_set = pybindIETFXMLEncoder.serialise(RoutingPolicy_Instance)
+
+        #BGP-Defined-Sets [Replace]
+        RoutingInstance_set = RoutingInstance_set.replace('<openconfig-routing-policy xmlns="http://openconfig.net/yang/routing-policy"/>',
+        '<routing-policy xmlns="http://openconfig.net/yang/routing-policy"> \n   <defined-sets> \n     <bgp-defined-sets xmlns="http://openconfig.net/yang/bgp-policy">\
+        \n\t<ext-community-sets> \n\t  <ext-community-set> \n\t   <ext-community-set-name>'+ExtCommSetName+'</ext-community-set-name> \n\t     <config>     \
+        \n\t\t<ext-community-set-name>'+ ExtCommSetName +'</ext-community-set-name> \n\t\t<ext-community-member>'+ExtCommMember+'</ext-community-member> \n     \
+        </config>  \n\t   </ext-community-set> \n\t </ext-community-sets> \n      </bgp-defined-sets> \n   </defined-sets> \n </routing-policy>')
+
+    return (RoutingInstance_set)
+'''
diff --git a/src/device/service/drivers/openconfig/templates/VPN/__init__.py b/src/device/service/drivers/openconfig/templates/VPN/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/VPN/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
diff --git a/src/device/service/drivers/openconfig/templates/VPN/openconfig_interfaces.py b/src/device/service/drivers/openconfig/templates/VPN/openconfig_interfaces.py
new file mode 100644
index 0000000000000000000000000000000000000000..583d164ba7b99ebcc825007fde6bddc6c4928bc5
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/VPN/openconfig_interfaces.py
@@ -0,0 +1,5352 @@
+# -*- coding: utf-8 -*-
+from operator import attrgetter
+from pyangbind.lib.yangtypes import RestrictedPrecisionDecimalType
+from pyangbind.lib.yangtypes import RestrictedClassType
+from pyangbind.lib.yangtypes import TypedListType
+from pyangbind.lib.yangtypes import YANGBool
+from pyangbind.lib.yangtypes import YANGListType
+from pyangbind.lib.yangtypes import YANGDynClass
+from pyangbind.lib.yangtypes import ReferenceType
+from pyangbind.lib.base import PybindBase
+from collections import OrderedDict
+from decimal import Decimal
+from bitarray import bitarray
+import six
+
+# PY3 support of some PY2 keywords (needs improved)
+if six.PY3:
+  import builtins as __builtin__
+  long = int
+elif six.PY2:
+  import __builtin__
+
+class yc_config_openconfig_interfaces__interfaces_interface_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configurable items at the global, physical interface
+level
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__type','__mtu','__loopback_mode','__description','__enabled',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=True)
+    self.__mtu = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=True)
+    self.__loopback_mode = YANGDynClass(base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /interfaces/interface/config/name (string)
+
+    YANG Description: The name of the interface.
+
+A device MAY restrict the allowed values for this leaf,
+possibly depending on the type of the interface.
+For system-controlled interfaces, this leaf is the
+device-specific name of the interface.  The 'config false'
+list interfaces/interface[name]/state contains the currently
+existing interfaces on the device.
+
+If a client tries to create configuration for a
+system-controlled interface that is not present in the
+corresponding state list, the server MAY reject
+the request if the implementation does not support
+pre-provisioning of interfaces or if the name refers to
+an interface that can never exist in the system.  A
+NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+
+The IETF model in RFC 7223 provides YANG features for the
+following (i.e., pre-provisioning and arbitrary-names),
+however they are omitted here:
+
+ If the device supports pre-provisioning of interface
+ configuration, the 'pre-provisioning' feature is
+ advertised.
+
+ If the device allows arbitrarily named user-controlled
+ interfaces, the 'arbitrary-names' feature is advertised.
+
+When a configured user-controlled interface is created by
+the system, it is instantiated with the same name in the
+/interfaces/interface[name]/state list.
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /interfaces/interface/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: The name of the interface.
+
+A device MAY restrict the allowed values for this leaf,
+possibly depending on the type of the interface.
+For system-controlled interfaces, this leaf is the
+device-specific name of the interface.  The 'config false'
+list interfaces/interface[name]/state contains the currently
+existing interfaces on the device.
+
+If a client tries to create configuration for a
+system-controlled interface that is not present in the
+corresponding state list, the server MAY reject
+the request if the implementation does not support
+pre-provisioning of interfaces or if the name refers to
+an interface that can never exist in the system.  A
+NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+
+The IETF model in RFC 7223 provides YANG features for the
+following (i.e., pre-provisioning and arbitrary-names),
+however they are omitted here:
+
+ If the device supports pre-provisioning of interface
+ configuration, the 'pre-provisioning' feature is
+ advertised.
+
+ If the device allows arbitrarily named user-controlled
+ interfaces, the 'arbitrary-names' feature is advertised.
+
+When a configured user-controlled interface is created by
+the system, it is instantiated with the same name in the
+/interfaces/interface[name]/state list.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /interfaces/interface/config/type (identityref)
+
+    YANG Description: The type of the interface.
+
+When an interface entry is created, a server MAY
+initialize the type leaf with a valid value, e.g., if it
+is possible to derive the type from the name of the
+interface.
+
+If a client tries to set the type of an interface to a
+value that can never be used by the system, e.g., if the
+type is not supported or if the type does not match the
+name of the interface, the server MUST reject the request.
+A NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /interfaces/interface/config/type (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: The type of the interface.
+
+When an interface entry is created, a server MAY
+initialize the type leaf with a valid value, e.g., if it
+is possible to derive the type from the name of the
+interface.
+
+If a client tries to set the type of an interface to a
+value that can never be used by the system, e.g., if the
+type is not supported or if the type does not match the
+name of the interface, the server MUST reject the request.
+A NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with identityref""",
+          'defined-type': "openconfig-interfaces:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=True)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=True)
+
+
+  def _get_mtu(self):
+    """
+    Getter method for mtu, mapped from YANG variable /interfaces/interface/config/mtu (uint16)
+
+    YANG Description: Set the max transmission unit size in octets
+for the physical interface.  If this is not set, the mtu is
+set to the operational default -- e.g., 1514 bytes on an
+Ethernet interface.
+    """
+    return self.__mtu
+      
+  def _set_mtu(self, v, load=False):
+    """
+    Setter method for mtu, mapped from YANG variable /interfaces/interface/config/mtu (uint16)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mtu is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mtu() directly.
+
+    YANG Description: Set the max transmission unit size in octets
+for the physical interface.  If this is not set, the mtu is
+set to the operational default -- e.g., 1514 bytes on an
+Ethernet interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mtu must be of a type compatible with uint16""",
+          'defined-type': "uint16",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=True)""",
+        })
+
+    self.__mtu = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mtu(self):
+    self.__mtu = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=True)
+
+
+  def _get_loopback_mode(self):
+    """
+    Getter method for loopback_mode, mapped from YANG variable /interfaces/interface/config/loopback_mode (boolean)
+
+    YANG Description: When set to true, the interface is logically looped back,
+such that packets that are forwarded via the interface
+are received on the same interface.
+    """
+    return self.__loopback_mode
+      
+  def _set_loopback_mode(self, v, load=False):
+    """
+    Setter method for loopback_mode, mapped from YANG variable /interfaces/interface/config/loopback_mode (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_loopback_mode is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_loopback_mode() directly.
+
+    YANG Description: When set to true, the interface is logically looped back,
+such that packets that are forwarded via the interface
+are received on the same interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """loopback_mode must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)""",
+        })
+
+    self.__loopback_mode = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_loopback_mode(self):
+    self.__loopback_mode = YANGDynClass(base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /interfaces/interface/config/description (string)
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /interfaces/interface/config/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+
+
+  def _get_enabled(self):
+    """
+    Getter method for enabled, mapped from YANG variable /interfaces/interface/config/enabled (boolean)
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    return self.__enabled
+      
+  def _set_enabled(self, v, load=False):
+    """
+    Setter method for enabled, mapped from YANG variable /interfaces/interface/config/enabled (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_enabled is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_enabled() directly.
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """enabled must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)""",
+        })
+
+    self.__enabled = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_enabled(self):
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  type = __builtin__.property(_get_type, _set_type)
+  mtu = __builtin__.property(_get_mtu, _set_mtu)
+  loopback_mode = __builtin__.property(_get_loopback_mode, _set_loopback_mode)
+  description = __builtin__.property(_get_description, _set_description)
+  enabled = __builtin__.property(_get_enabled, _set_enabled)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('type', type), ('mtu', mtu), ('loopback_mode', loopback_mode), ('description', description), ('enabled', enabled), ])
+
+
+class yc_counters_openconfig_interfaces__interfaces_interface_state_counters(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/state/counters. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: A collection of interface-related statistics objects.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__in_octets','__in_pkts','__in_unicast_pkts','__in_broadcast_pkts','__in_multicast_pkts','__in_discards','__in_errors','__in_unknown_protos','__in_fcs_errors','__out_octets','__out_pkts','__out_unicast_pkts','__out_broadcast_pkts','__out_multicast_pkts','__out_discards','__out_errors','__carrier_transitions','__last_clear',)
+
+  _yang_name = 'counters'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__in_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_unknown_protos = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_fcs_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__carrier_transitions = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__last_clear = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'state', 'counters']
+
+  def _get_in_octets(self):
+    """
+    Getter method for in_octets, mapped from YANG variable /interfaces/interface/state/counters/in_octets (oc-yang:counter64)
+
+    YANG Description: The total number of octets received on the interface,
+including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_octets
+      
+  def _set_in_octets(self, v, load=False):
+    """
+    Setter method for in_octets, mapped from YANG variable /interfaces/interface/state/counters/in_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_octets() directly.
+
+    YANG Description: The total number of octets received on the interface,
+including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_octets(self):
+    self.__in_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_pkts(self):
+    """
+    Getter method for in_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets received on the interface,
+including all unicast, multicast, broadcast and bad packets
+etc.
+    """
+    return self.__in_pkts
+      
+  def _set_in_pkts(self, v, load=False):
+    """
+    Setter method for in_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_pkts() directly.
+
+    YANG Description: The total number of packets received on the interface,
+including all unicast, multicast, broadcast and bad packets
+etc.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_pkts(self):
+    self.__in_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_unicast_pkts(self):
+    """
+    Getter method for in_unicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_unicast_pkts (oc-yang:counter64)
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were not addressed to a
+multicast or broadcast address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_unicast_pkts
+      
+  def _set_in_unicast_pkts(self, v, load=False):
+    """
+    Setter method for in_unicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_unicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_unicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_unicast_pkts() directly.
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were not addressed to a
+multicast or broadcast address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_unicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_unicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_unicast_pkts(self):
+    self.__in_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_broadcast_pkts(self):
+    """
+    Getter method for in_broadcast_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_broadcast_pkts (oc-yang:counter64)
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a broadcast
+address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_broadcast_pkts
+      
+  def _set_in_broadcast_pkts(self, v, load=False):
+    """
+    Setter method for in_broadcast_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_broadcast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_broadcast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_broadcast_pkts() directly.
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a broadcast
+address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_broadcast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_broadcast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_broadcast_pkts(self):
+    self.__in_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_multicast_pkts(self):
+    """
+    Getter method for in_multicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_multicast_pkts (oc-yang:counter64)
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a multicast
+address at this sub-layer.  For a MAC-layer protocol,
+this includes both Group and Functional addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_multicast_pkts
+      
+  def _set_in_multicast_pkts(self, v, load=False):
+    """
+    Setter method for in_multicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/in_multicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_multicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_multicast_pkts() directly.
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a multicast
+address at this sub-layer.  For a MAC-layer protocol,
+this includes both Group and Functional addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_multicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_multicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_multicast_pkts(self):
+    self.__in_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_discards(self):
+    """
+    Getter method for in_discards, mapped from YANG variable /interfaces/interface/state/counters/in_discards (oc-yang:counter64)
+
+    YANG Description: The number of inbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being deliverable to a higher-layer
+protocol.  One possible reason for discarding such a
+packet could be to free up buffer space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_discards
+      
+  def _set_in_discards(self, v, load=False):
+    """
+    Setter method for in_discards, mapped from YANG variable /interfaces/interface/state/counters/in_discards (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_discards is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_discards() directly.
+
+    YANG Description: The number of inbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being deliverable to a higher-layer
+protocol.  One possible reason for discarding such a
+packet could be to free up buffer space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_discards must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_discards = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_discards(self):
+    self.__in_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_errors(self):
+    """
+    Getter method for in_errors, mapped from YANG variable /interfaces/interface/state/counters/in_errors (oc-yang:counter64)
+
+    YANG Description: For packet-oriented interfaces, the number of inbound
+packets that contained errors preventing them from being
+deliverable to a higher-layer protocol.  For character-
+oriented or fixed-length interfaces, the number of
+inbound transmission units that contained errors
+preventing them from being deliverable to a higher-layer
+protocol.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_errors
+      
+  def _set_in_errors(self, v, load=False):
+    """
+    Setter method for in_errors, mapped from YANG variable /interfaces/interface/state/counters/in_errors (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_errors is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_errors() directly.
+
+    YANG Description: For packet-oriented interfaces, the number of inbound
+packets that contained errors preventing them from being
+deliverable to a higher-layer protocol.  For character-
+oriented or fixed-length interfaces, the number of
+inbound transmission units that contained errors
+preventing them from being deliverable to a higher-layer
+protocol.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_errors must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_errors = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_errors(self):
+    self.__in_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_unknown_protos(self):
+    """
+    Getter method for in_unknown_protos, mapped from YANG variable /interfaces/interface/state/counters/in_unknown_protos (oc-yang:counter64)
+
+    YANG Description: For packet-oriented interfaces, the number of packets
+received via the interface that were discarded because
+of an unknown or unsupported protocol.  For
+character-oriented or fixed-length interfaces that
+support protocol multiplexing, the number of
+transmission units received via the interface that were
+discarded because of an unknown or unsupported protocol.
+For any interface that does not support protocol
+multiplexing, this counter is not present.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_unknown_protos
+      
+  def _set_in_unknown_protos(self, v, load=False):
+    """
+    Setter method for in_unknown_protos, mapped from YANG variable /interfaces/interface/state/counters/in_unknown_protos (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_unknown_protos is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_unknown_protos() directly.
+
+    YANG Description: For packet-oriented interfaces, the number of packets
+received via the interface that were discarded because
+of an unknown or unsupported protocol.  For
+character-oriented or fixed-length interfaces that
+support protocol multiplexing, the number of
+transmission units received via the interface that were
+discarded because of an unknown or unsupported protocol.
+For any interface that does not support protocol
+multiplexing, this counter is not present.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_unknown_protos must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_unknown_protos = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_unknown_protos(self):
+    self.__in_unknown_protos = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_fcs_errors(self):
+    """
+    Getter method for in_fcs_errors, mapped from YANG variable /interfaces/interface/state/counters/in_fcs_errors (oc-yang:counter64)
+
+    YANG Description: Number of received packets which had errors in the
+frame check sequence (FCS), i.e., framing errors.
+
+Discontinuities in the value of this counter can occur
+when the device is re-initialization as indicated by the
+value of 'last-clear'.
+    """
+    return self.__in_fcs_errors
+      
+  def _set_in_fcs_errors(self, v, load=False):
+    """
+    Setter method for in_fcs_errors, mapped from YANG variable /interfaces/interface/state/counters/in_fcs_errors (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_fcs_errors is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_fcs_errors() directly.
+
+    YANG Description: Number of received packets which had errors in the
+frame check sequence (FCS), i.e., framing errors.
+
+Discontinuities in the value of this counter can occur
+when the device is re-initialization as indicated by the
+value of 'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_fcs_errors must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_fcs_errors = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_fcs_errors(self):
+    self.__in_fcs_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_octets(self):
+    """
+    Getter method for out_octets, mapped from YANG variable /interfaces/interface/state/counters/out_octets (oc-yang:counter64)
+
+    YANG Description: The total number of octets transmitted out of the
+interface, including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_octets
+      
+  def _set_out_octets(self, v, load=False):
+    """
+    Setter method for out_octets, mapped from YANG variable /interfaces/interface/state/counters/out_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_octets() directly.
+
+    YANG Description: The total number of octets transmitted out of the
+interface, including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_octets(self):
+    self.__out_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_pkts(self):
+    """
+    Getter method for out_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets transmitted out of the
+interface, including all unicast, multicast, broadcast,
+and bad packets etc.
+    """
+    return self.__out_pkts
+      
+  def _set_out_pkts(self, v, load=False):
+    """
+    Setter method for out_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_pkts() directly.
+
+    YANG Description: The total number of packets transmitted out of the
+interface, including all unicast, multicast, broadcast,
+and bad packets etc.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_pkts(self):
+    self.__out_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_unicast_pkts(self):
+    """
+    Getter method for out_unicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_unicast_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were not addressed
+to a multicast or broadcast address at this sub-layer,
+including those that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_unicast_pkts
+      
+  def _set_out_unicast_pkts(self, v, load=False):
+    """
+    Setter method for out_unicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_unicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_unicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_unicast_pkts() directly.
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were not addressed
+to a multicast or broadcast address at this sub-layer,
+including those that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_unicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_unicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_unicast_pkts(self):
+    self.__out_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_broadcast_pkts(self):
+    """
+    Getter method for out_broadcast_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_broadcast_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+broadcast address at this sub-layer, including those
+that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_broadcast_pkts
+      
+  def _set_out_broadcast_pkts(self, v, load=False):
+    """
+    Setter method for out_broadcast_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_broadcast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_broadcast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_broadcast_pkts() directly.
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+broadcast address at this sub-layer, including those
+that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_broadcast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_broadcast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_broadcast_pkts(self):
+    self.__out_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_multicast_pkts(self):
+    """
+    Getter method for out_multicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_multicast_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+multicast address at this sub-layer, including those
+that were discarded or not sent.  For a MAC-layer
+protocol, this includes both Group and Functional
+addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_multicast_pkts
+      
+  def _set_out_multicast_pkts(self, v, load=False):
+    """
+    Setter method for out_multicast_pkts, mapped from YANG variable /interfaces/interface/state/counters/out_multicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_multicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_multicast_pkts() directly.
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+multicast address at this sub-layer, including those
+that were discarded or not sent.  For a MAC-layer
+protocol, this includes both Group and Functional
+addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_multicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_multicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_multicast_pkts(self):
+    self.__out_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_discards(self):
+    """
+    Getter method for out_discards, mapped from YANG variable /interfaces/interface/state/counters/out_discards (oc-yang:counter64)
+
+    YANG Description: The number of outbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being transmitted.  One possible reason
+for discarding such a packet could be to free up buffer
+space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_discards
+      
+  def _set_out_discards(self, v, load=False):
+    """
+    Setter method for out_discards, mapped from YANG variable /interfaces/interface/state/counters/out_discards (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_discards is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_discards() directly.
+
+    YANG Description: The number of outbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being transmitted.  One possible reason
+for discarding such a packet could be to free up buffer
+space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_discards must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_discards = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_discards(self):
+    self.__out_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_errors(self):
+    """
+    Getter method for out_errors, mapped from YANG variable /interfaces/interface/state/counters/out_errors (oc-yang:counter64)
+
+    YANG Description: For packet-oriented interfaces, the number of outbound
+packets that could not be transmitted because of errors.
+For character-oriented or fixed-length interfaces, the
+number of outbound transmission units that could not be
+transmitted because of errors.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_errors
+      
+  def _set_out_errors(self, v, load=False):
+    """
+    Setter method for out_errors, mapped from YANG variable /interfaces/interface/state/counters/out_errors (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_errors is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_errors() directly.
+
+    YANG Description: For packet-oriented interfaces, the number of outbound
+packets that could not be transmitted because of errors.
+For character-oriented or fixed-length interfaces, the
+number of outbound transmission units that could not be
+transmitted because of errors.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_errors must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_errors = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_errors(self):
+    self.__out_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_carrier_transitions(self):
+    """
+    Getter method for carrier_transitions, mapped from YANG variable /interfaces/interface/state/counters/carrier_transitions (oc-yang:counter64)
+
+    YANG Description: Number of times the interface state has transitioned
+between up and down since the time the device restarted
+or the last-clear time, whichever is most recent.
+    """
+    return self.__carrier_transitions
+      
+  def _set_carrier_transitions(self, v, load=False):
+    """
+    Setter method for carrier_transitions, mapped from YANG variable /interfaces/interface/state/counters/carrier_transitions (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_carrier_transitions is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_carrier_transitions() directly.
+
+    YANG Description: Number of times the interface state has transitioned
+between up and down since the time the device restarted
+or the last-clear time, whichever is most recent.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """carrier_transitions must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__carrier_transitions = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_carrier_transitions(self):
+    self.__carrier_transitions = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_last_clear(self):
+    """
+    Getter method for last_clear, mapped from YANG variable /interfaces/interface/state/counters/last_clear (oc-types:timeticks64)
+
+    YANG Description: Timestamp of the last time the interface counters were
+cleared.
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    return self.__last_clear
+      
+  def _set_last_clear(self, v, load=False):
+    """
+    Setter method for last_clear, mapped from YANG variable /interfaces/interface/state/counters/last_clear (oc-types:timeticks64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_last_clear is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_last_clear() directly.
+
+    YANG Description: Timestamp of the last time the interface counters were
+cleared.
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """last_clear must be of a type compatible with oc-types:timeticks64""",
+          'defined-type': "oc-types:timeticks64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)""",
+        })
+
+    self.__last_clear = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_last_clear(self):
+    self.__last_clear = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+
+  in_octets = __builtin__.property(_get_in_octets)
+  in_pkts = __builtin__.property(_get_in_pkts)
+  in_unicast_pkts = __builtin__.property(_get_in_unicast_pkts)
+  in_broadcast_pkts = __builtin__.property(_get_in_broadcast_pkts)
+  in_multicast_pkts = __builtin__.property(_get_in_multicast_pkts)
+  in_discards = __builtin__.property(_get_in_discards)
+  in_errors = __builtin__.property(_get_in_errors)
+  in_unknown_protos = __builtin__.property(_get_in_unknown_protos)
+  in_fcs_errors = __builtin__.property(_get_in_fcs_errors)
+  out_octets = __builtin__.property(_get_out_octets)
+  out_pkts = __builtin__.property(_get_out_pkts)
+  out_unicast_pkts = __builtin__.property(_get_out_unicast_pkts)
+  out_broadcast_pkts = __builtin__.property(_get_out_broadcast_pkts)
+  out_multicast_pkts = __builtin__.property(_get_out_multicast_pkts)
+  out_discards = __builtin__.property(_get_out_discards)
+  out_errors = __builtin__.property(_get_out_errors)
+  carrier_transitions = __builtin__.property(_get_carrier_transitions)
+  last_clear = __builtin__.property(_get_last_clear)
+
+
+  _pyangbind_elements = OrderedDict([('in_octets', in_octets), ('in_pkts', in_pkts), ('in_unicast_pkts', in_unicast_pkts), ('in_broadcast_pkts', in_broadcast_pkts), ('in_multicast_pkts', in_multicast_pkts), ('in_discards', in_discards), ('in_errors', in_errors), ('in_unknown_protos', in_unknown_protos), ('in_fcs_errors', in_fcs_errors), ('out_octets', out_octets), ('out_pkts', out_pkts), ('out_unicast_pkts', out_unicast_pkts), ('out_broadcast_pkts', out_broadcast_pkts), ('out_multicast_pkts', out_multicast_pkts), ('out_discards', out_discards), ('out_errors', out_errors), ('carrier_transitions', carrier_transitions), ('last_clear', last_clear), ])
+
+
+class yc_state_openconfig_interfaces__interfaces_interface_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data at the global interface level
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__type','__mtu','__loopback_mode','__description','__enabled','__ifindex','__admin_status','__oper_status','__last_change','__logical','__management','__cpu','__counters',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=False)
+    self.__mtu = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=False)
+    self.__loopback_mode = YANGDynClass(base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__ifindex = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    self.__admin_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    self.__oper_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    self.__last_change = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+    self.__logical = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__management = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__cpu = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__counters = YANGDynClass(base=yc_counters_openconfig_interfaces__interfaces_interface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /interfaces/interface/state/name (string)
+
+    YANG Description: The name of the interface.
+
+A device MAY restrict the allowed values for this leaf,
+possibly depending on the type of the interface.
+For system-controlled interfaces, this leaf is the
+device-specific name of the interface.  The 'config false'
+list interfaces/interface[name]/state contains the currently
+existing interfaces on the device.
+
+If a client tries to create configuration for a
+system-controlled interface that is not present in the
+corresponding state list, the server MAY reject
+the request if the implementation does not support
+pre-provisioning of interfaces or if the name refers to
+an interface that can never exist in the system.  A
+NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+
+The IETF model in RFC 7223 provides YANG features for the
+following (i.e., pre-provisioning and arbitrary-names),
+however they are omitted here:
+
+ If the device supports pre-provisioning of interface
+ configuration, the 'pre-provisioning' feature is
+ advertised.
+
+ If the device allows arbitrarily named user-controlled
+ interfaces, the 'arbitrary-names' feature is advertised.
+
+When a configured user-controlled interface is created by
+the system, it is instantiated with the same name in the
+/interfaces/interface[name]/state list.
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /interfaces/interface/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: The name of the interface.
+
+A device MAY restrict the allowed values for this leaf,
+possibly depending on the type of the interface.
+For system-controlled interfaces, this leaf is the
+device-specific name of the interface.  The 'config false'
+list interfaces/interface[name]/state contains the currently
+existing interfaces on the device.
+
+If a client tries to create configuration for a
+system-controlled interface that is not present in the
+corresponding state list, the server MAY reject
+the request if the implementation does not support
+pre-provisioning of interfaces or if the name refers to
+an interface that can never exist in the system.  A
+NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+
+The IETF model in RFC 7223 provides YANG features for the
+following (i.e., pre-provisioning and arbitrary-names),
+however they are omitted here:
+
+ If the device supports pre-provisioning of interface
+ configuration, the 'pre-provisioning' feature is
+ advertised.
+
+ If the device allows arbitrarily named user-controlled
+ interfaces, the 'arbitrary-names' feature is advertised.
+
+When a configured user-controlled interface is created by
+the system, it is instantiated with the same name in the
+/interfaces/interface[name]/state list.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+
+
+  def _get_type(self):
+    """
+    Getter method for type, mapped from YANG variable /interfaces/interface/state/type (identityref)
+
+    YANG Description: The type of the interface.
+
+When an interface entry is created, a server MAY
+initialize the type leaf with a valid value, e.g., if it
+is possible to derive the type from the name of the
+interface.
+
+If a client tries to set the type of an interface to a
+value that can never be used by the system, e.g., if the
+type is not supported or if the type does not match the
+name of the interface, the server MUST reject the request.
+A NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+    """
+    return self.__type
+      
+  def _set_type(self, v, load=False):
+    """
+    Setter method for type, mapped from YANG variable /interfaces/interface/state/type (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_type is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_type() directly.
+
+    YANG Description: The type of the interface.
+
+When an interface entry is created, a server MAY
+initialize the type leaf with a valid value, e.g., if it
+is possible to derive the type from the name of the
+interface.
+
+If a client tries to set the type of an interface to a
+value that can never be used by the system, e.g., if the
+type is not supported or if the type does not match the
+name of the interface, the server MUST reject the request.
+A NETCONF server MUST reply with an rpc-error with the
+error-tag 'invalid-value' in this case.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """type must be of a type compatible with identityref""",
+          'defined-type': "openconfig-interfaces:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__type = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_type(self):
+    self.__type = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={},), is_leaf=True, yang_name="type", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='identityref', is_config=False)
+
+
+  def _get_mtu(self):
+    """
+    Getter method for mtu, mapped from YANG variable /interfaces/interface/state/mtu (uint16)
+
+    YANG Description: Set the max transmission unit size in octets
+for the physical interface.  If this is not set, the mtu is
+set to the operational default -- e.g., 1514 bytes on an
+Ethernet interface.
+    """
+    return self.__mtu
+      
+  def _set_mtu(self, v, load=False):
+    """
+    Setter method for mtu, mapped from YANG variable /interfaces/interface/state/mtu (uint16)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mtu is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mtu() directly.
+
+    YANG Description: Set the max transmission unit size in octets
+for the physical interface.  If this is not set, the mtu is
+set to the operational default -- e.g., 1514 bytes on an
+Ethernet interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mtu must be of a type compatible with uint16""",
+          'defined-type': "uint16",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=False)""",
+        })
+
+    self.__mtu = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mtu(self):
+    self.__mtu = YANGDynClass(base=RestrictedClassType(base_type=int, restriction_dict={'range': ['0..65535']},int_size=16), is_leaf=True, yang_name="mtu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint16', is_config=False)
+
+
+  def _get_loopback_mode(self):
+    """
+    Getter method for loopback_mode, mapped from YANG variable /interfaces/interface/state/loopback_mode (boolean)
+
+    YANG Description: When set to true, the interface is logically looped back,
+such that packets that are forwarded via the interface
+are received on the same interface.
+    """
+    return self.__loopback_mode
+      
+  def _set_loopback_mode(self, v, load=False):
+    """
+    Setter method for loopback_mode, mapped from YANG variable /interfaces/interface/state/loopback_mode (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_loopback_mode is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_loopback_mode() directly.
+
+    YANG Description: When set to true, the interface is logically looped back,
+such that packets that are forwarded via the interface
+are received on the same interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """loopback_mode must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__loopback_mode = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_loopback_mode(self):
+    self.__loopback_mode = YANGDynClass(base=YANGBool, default=YANGBool("false"), is_leaf=True, yang_name="loopback-mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /interfaces/interface/state/description (string)
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /interfaces/interface/state/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+
+
+  def _get_enabled(self):
+    """
+    Getter method for enabled, mapped from YANG variable /interfaces/interface/state/enabled (boolean)
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    return self.__enabled
+      
+  def _set_enabled(self, v, load=False):
+    """
+    Setter method for enabled, mapped from YANG variable /interfaces/interface/state/enabled (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_enabled is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_enabled() directly.
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """enabled must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__enabled = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_enabled(self):
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_ifindex(self):
+    """
+    Getter method for ifindex, mapped from YANG variable /interfaces/interface/state/ifindex (uint32)
+
+    YANG Description: System assigned number for each interface.  Corresponds to
+ifIndex object in SNMP Interface MIB
+    """
+    return self.__ifindex
+      
+  def _set_ifindex(self, v, load=False):
+    """
+    Setter method for ifindex, mapped from YANG variable /interfaces/interface/state/ifindex (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ifindex is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ifindex() directly.
+
+    YANG Description: System assigned number for each interface.  Corresponds to
+ifIndex object in SNMP Interface MIB
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ifindex must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)""",
+        })
+
+    self.__ifindex = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ifindex(self):
+    self.__ifindex = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+
+
+  def _get_admin_status(self):
+    """
+    Getter method for admin_status, mapped from YANG variable /interfaces/interface/state/admin_status (enumeration)
+
+    YANG Description: The desired state of the interface.  In RFC 7223 this leaf
+has the same read semantics as ifAdminStatus.  Here, it
+reflects the administrative state as set by enabling or
+disabling the interface.
+    """
+    return self.__admin_status
+      
+  def _set_admin_status(self, v, load=False):
+    """
+    Setter method for admin_status, mapped from YANG variable /interfaces/interface/state/admin_status (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_admin_status is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_admin_status() directly.
+
+    YANG Description: The desired state of the interface.  In RFC 7223 this leaf
+has the same read semantics as ifAdminStatus.  Here, it
+reflects the administrative state as set by enabling or
+disabling the interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """admin_status must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-interfaces:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)""",
+        })
+
+    self.__admin_status = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_admin_status(self):
+    self.__admin_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+
+
+  def _get_oper_status(self):
+    """
+    Getter method for oper_status, mapped from YANG variable /interfaces/interface/state/oper_status (enumeration)
+
+    YANG Description: The current operational state of the interface.
+
+This leaf has the same semantics as ifOperStatus.
+    """
+    return self.__oper_status
+      
+  def _set_oper_status(self, v, load=False):
+    """
+    Setter method for oper_status, mapped from YANG variable /interfaces/interface/state/oper_status (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_oper_status is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_oper_status() directly.
+
+    YANG Description: The current operational state of the interface.
+
+This leaf has the same semantics as ifOperStatus.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """oper_status must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-interfaces:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)""",
+        })
+
+    self.__oper_status = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_oper_status(self):
+    self.__oper_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+
+
+  def _get_last_change(self):
+    """
+    Getter method for last_change, mapped from YANG variable /interfaces/interface/state/last_change (oc-types:timeticks64)
+
+    YANG Description: This timestamp indicates the absolute time of the last
+state change of the interface (e.g., up-to-down transition).
+This is different than the SNMP ifLastChange object in the
+standard interface MIB in that it is not relative to the
+system boot time (i.e,. sysUpTime).
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    return self.__last_change
+      
+  def _set_last_change(self, v, load=False):
+    """
+    Setter method for last_change, mapped from YANG variable /interfaces/interface/state/last_change (oc-types:timeticks64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_last_change is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_last_change() directly.
+
+    YANG Description: This timestamp indicates the absolute time of the last
+state change of the interface (e.g., up-to-down transition).
+This is different than the SNMP ifLastChange object in the
+standard interface MIB in that it is not relative to the
+system boot time (i.e,. sysUpTime).
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """last_change must be of a type compatible with oc-types:timeticks64""",
+          'defined-type': "oc-types:timeticks64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)""",
+        })
+
+    self.__last_change = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_last_change(self):
+    self.__last_change = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+
+
+  def _get_logical(self):
+    """
+    Getter method for logical, mapped from YANG variable /interfaces/interface/state/logical (boolean)
+
+    YANG Description: When set to true, the interface is a logical interface
+which does not have an associated physical port or
+channel on the system.
+    """
+    return self.__logical
+      
+  def _set_logical(self, v, load=False):
+    """
+    Setter method for logical, mapped from YANG variable /interfaces/interface/state/logical (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_logical is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_logical() directly.
+
+    YANG Description: When set to true, the interface is a logical interface
+which does not have an associated physical port or
+channel on the system.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """logical must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__logical = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_logical(self):
+    self.__logical = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_management(self):
+    """
+    Getter method for management, mapped from YANG variable /interfaces/interface/state/management (boolean)
+
+    YANG Description: When set to true, the interface is a dedicated
+management interface that is not connected to dataplane
+interfaces.  It may be used to connect the system to an
+out-of-band management network, for example.
+    """
+    return self.__management
+      
+  def _set_management(self, v, load=False):
+    """
+    Setter method for management, mapped from YANG variable /interfaces/interface/state/management (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_management is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_management() directly.
+
+    YANG Description: When set to true, the interface is a dedicated
+management interface that is not connected to dataplane
+interfaces.  It may be used to connect the system to an
+out-of-band management network, for example.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """management must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__management = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_management(self):
+    self.__management = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_cpu(self):
+    """
+    Getter method for cpu, mapped from YANG variable /interfaces/interface/state/cpu (boolean)
+
+    YANG Description: When set to true, the interface is for traffic
+that is handled by the system CPU, sometimes also called the
+control plane interface.  On systems that represent the CPU
+interface as an Ethernet interface, for example, this leaf
+should be used to distinguish the CPU interface from dataplane
+interfaces.
+    """
+    return self.__cpu
+      
+  def _set_cpu(self, v, load=False):
+    """
+    Setter method for cpu, mapped from YANG variable /interfaces/interface/state/cpu (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_cpu is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_cpu() directly.
+
+    YANG Description: When set to true, the interface is for traffic
+that is handled by the system CPU, sometimes also called the
+control plane interface.  On systems that represent the CPU
+interface as an Ethernet interface, for example, this leaf
+should be used to distinguish the CPU interface from dataplane
+interfaces.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """cpu must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__cpu = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_cpu(self):
+    self.__cpu = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_counters(self):
+    """
+    Getter method for counters, mapped from YANG variable /interfaces/interface/state/counters (container)
+
+    YANG Description: A collection of interface-related statistics objects.
+    """
+    return self.__counters
+      
+  def _set_counters(self, v, load=False):
+    """
+    Setter method for counters, mapped from YANG variable /interfaces/interface/state/counters (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_counters is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_counters() directly.
+
+    YANG Description: A collection of interface-related statistics objects.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_counters_openconfig_interfaces__interfaces_interface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """counters must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_counters_openconfig_interfaces__interfaces_interface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)""",
+        })
+
+    self.__counters = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_counters(self):
+    self.__counters = YANGDynClass(base=yc_counters_openconfig_interfaces__interfaces_interface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)
+
+  name = __builtin__.property(_get_name)
+  type = __builtin__.property(_get_type)
+  mtu = __builtin__.property(_get_mtu)
+  loopback_mode = __builtin__.property(_get_loopback_mode)
+  description = __builtin__.property(_get_description)
+  enabled = __builtin__.property(_get_enabled)
+  ifindex = __builtin__.property(_get_ifindex)
+  admin_status = __builtin__.property(_get_admin_status)
+  oper_status = __builtin__.property(_get_oper_status)
+  last_change = __builtin__.property(_get_last_change)
+  logical = __builtin__.property(_get_logical)
+  management = __builtin__.property(_get_management)
+  cpu = __builtin__.property(_get_cpu)
+  counters = __builtin__.property(_get_counters)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('type', type), ('mtu', mtu), ('loopback_mode', loopback_mode), ('description', description), ('enabled', enabled), ('ifindex', ifindex), ('admin_status', admin_status), ('oper_status', oper_status), ('last_change', last_change), ('logical', logical), ('management', management), ('cpu', cpu), ('counters', counters), ])
+
+
+class yc_config_openconfig_interfaces__interfaces_interface_hold_time_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/hold-time/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for interface hold-time settings.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__up','__down',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__up = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+    self.__down = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'hold-time', 'config']
+
+  def _get_up(self):
+    """
+    Getter method for up, mapped from YANG variable /interfaces/interface/hold_time/config/up (uint32)
+
+    YANG Description: Dampens advertisement when the interface
+transitions from down to up.  A zero value means dampening
+is turned off, i.e., immediate notification.
+    """
+    return self.__up
+      
+  def _set_up(self, v, load=False):
+    """
+    Setter method for up, mapped from YANG variable /interfaces/interface/hold_time/config/up (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_up is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_up() directly.
+
+    YANG Description: Dampens advertisement when the interface
+transitions from down to up.  A zero value means dampening
+is turned off, i.e., immediate notification.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """up must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)""",
+        })
+
+    self.__up = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_up(self):
+    self.__up = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+
+
+  def _get_down(self):
+    """
+    Getter method for down, mapped from YANG variable /interfaces/interface/hold_time/config/down (uint32)
+
+    YANG Description: Dampens advertisement when the interface transitions from
+up to down.  A zero value means dampening is turned off,
+i.e., immediate notification.
+    """
+    return self.__down
+      
+  def _set_down(self, v, load=False):
+    """
+    Setter method for down, mapped from YANG variable /interfaces/interface/hold_time/config/down (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_down is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_down() directly.
+
+    YANG Description: Dampens advertisement when the interface transitions from
+up to down.  A zero value means dampening is turned off,
+i.e., immediate notification.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """down must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)""",
+        })
+
+    self.__down = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_down(self):
+    self.__down = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+
+  up = __builtin__.property(_get_up, _set_up)
+  down = __builtin__.property(_get_down, _set_down)
+
+
+  _pyangbind_elements = OrderedDict([('up', up), ('down', down), ])
+
+
+class yc_state_openconfig_interfaces__interfaces_interface_hold_time_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/hold-time/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for interface hold-time.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__up','__down',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__up = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    self.__down = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'hold-time', 'state']
+
+  def _get_up(self):
+    """
+    Getter method for up, mapped from YANG variable /interfaces/interface/hold_time/state/up (uint32)
+
+    YANG Description: Dampens advertisement when the interface
+transitions from down to up.  A zero value means dampening
+is turned off, i.e., immediate notification.
+    """
+    return self.__up
+      
+  def _set_up(self, v, load=False):
+    """
+    Setter method for up, mapped from YANG variable /interfaces/interface/hold_time/state/up (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_up is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_up() directly.
+
+    YANG Description: Dampens advertisement when the interface
+transitions from down to up.  A zero value means dampening
+is turned off, i.e., immediate notification.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """up must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)""",
+        })
+
+    self.__up = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_up(self):
+    self.__up = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="up", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+
+
+  def _get_down(self):
+    """
+    Getter method for down, mapped from YANG variable /interfaces/interface/hold_time/state/down (uint32)
+
+    YANG Description: Dampens advertisement when the interface transitions from
+up to down.  A zero value means dampening is turned off,
+i.e., immediate notification.
+    """
+    return self.__down
+      
+  def _set_down(self, v, load=False):
+    """
+    Setter method for down, mapped from YANG variable /interfaces/interface/hold_time/state/down (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_down is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_down() directly.
+
+    YANG Description: Dampens advertisement when the interface transitions from
+up to down.  A zero value means dampening is turned off,
+i.e., immediate notification.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """down must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)""",
+        })
+
+    self.__down = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_down(self):
+    self.__down = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="down", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+
+  up = __builtin__.property(_get_up)
+  down = __builtin__.property(_get_down)
+
+
+  _pyangbind_elements = OrderedDict([('up', up), ('down', down), ])
+
+
+class yc_hold_time_openconfig_interfaces__interfaces_interface_hold_time(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/hold-time. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top-level container for hold-time settings to enable
+dampening advertisements of interface transitions.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'hold-time'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_hold_time_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_hold_time_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'hold-time']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /interfaces/interface/hold_time/config (container)
+
+    YANG Description: Configuration data for interface hold-time settings.
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /interfaces/interface/hold_time/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for interface hold-time settings.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_interfaces__interfaces_interface_hold_time_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_hold_time_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_hold_time_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /interfaces/interface/hold_time/state (container)
+
+    YANG Description: Operational state data for interface hold-time.
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /interfaces/interface/hold_time/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for interface hold-time.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_interfaces__interfaces_interface_hold_time_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_hold_time_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_hold_time_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/subinterfaces/subinterface/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configurable items at the subinterface level
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__index','__description','__enabled',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__index = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'subinterfaces', 'subinterface', 'config']
+
+  def _get_index(self):
+    """
+    Getter method for index, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config/index (uint32)
+
+    YANG Description: The index of the subinterface, or logical interface number.
+On systems with no support for subinterfaces, or not using
+subinterfaces, this value should default to 0, i.e., the
+default subinterface.
+    """
+    return self.__index
+      
+  def _set_index(self, v, load=False):
+    """
+    Setter method for index, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config/index (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_index is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_index() directly.
+
+    YANG Description: The index of the subinterface, or logical interface number.
+On systems with no support for subinterfaces, or not using
+subinterfaces, this value should default to 0, i.e., the
+default subinterface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """index must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)""",
+        })
+
+    self.__index = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_index(self):
+    self.__index = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=True)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config/description (string)
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=True)
+
+
+  def _get_enabled(self):
+    """
+    Getter method for enabled, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config/enabled (boolean)
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    return self.__enabled
+      
+  def _set_enabled(self, v, load=False):
+    """
+    Setter method for enabled, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config/enabled (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_enabled is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_enabled() directly.
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """enabled must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)""",
+        })
+
+    self.__enabled = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_enabled(self):
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=True)
+
+  index = __builtin__.property(_get_index, _set_index)
+  description = __builtin__.property(_get_description, _set_description)
+  enabled = __builtin__.property(_get_enabled, _set_enabled)
+
+
+  _pyangbind_elements = OrderedDict([('index', index), ('description', description), ('enabled', enabled), ])
+
+
+class yc_counters_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state_counters(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/subinterfaces/subinterface/state/counters. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: A collection of interface-related statistics objects.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__in_octets','__in_pkts','__in_unicast_pkts','__in_broadcast_pkts','__in_multicast_pkts','__in_discards','__in_errors','__in_unknown_protos','__in_fcs_errors','__out_octets','__out_pkts','__out_unicast_pkts','__out_broadcast_pkts','__out_multicast_pkts','__out_discards','__out_errors','__carrier_transitions','__last_clear',)
+
+  _yang_name = 'counters'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__in_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_unknown_protos = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__in_fcs_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__out_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__carrier_transitions = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    self.__last_clear = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'subinterfaces', 'subinterface', 'state', 'counters']
+
+  def _get_in_octets(self):
+    """
+    Getter method for in_octets, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_octets (oc-yang:counter64)
+
+    YANG Description: The total number of octets received on the interface,
+including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_octets
+      
+  def _set_in_octets(self, v, load=False):
+    """
+    Setter method for in_octets, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_octets() directly.
+
+    YANG Description: The total number of octets received on the interface,
+including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_octets(self):
+    self.__in_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_pkts(self):
+    """
+    Getter method for in_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets received on the interface,
+including all unicast, multicast, broadcast and bad packets
+etc.
+    """
+    return self.__in_pkts
+      
+  def _set_in_pkts(self, v, load=False):
+    """
+    Setter method for in_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_pkts() directly.
+
+    YANG Description: The total number of packets received on the interface,
+including all unicast, multicast, broadcast and bad packets
+etc.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_pkts(self):
+    self.__in_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_unicast_pkts(self):
+    """
+    Getter method for in_unicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_unicast_pkts (oc-yang:counter64)
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were not addressed to a
+multicast or broadcast address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_unicast_pkts
+      
+  def _set_in_unicast_pkts(self, v, load=False):
+    """
+    Setter method for in_unicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_unicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_unicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_unicast_pkts() directly.
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were not addressed to a
+multicast or broadcast address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_unicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_unicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_unicast_pkts(self):
+    self.__in_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_broadcast_pkts(self):
+    """
+    Getter method for in_broadcast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_broadcast_pkts (oc-yang:counter64)
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a broadcast
+address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_broadcast_pkts
+      
+  def _set_in_broadcast_pkts(self, v, load=False):
+    """
+    Setter method for in_broadcast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_broadcast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_broadcast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_broadcast_pkts() directly.
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a broadcast
+address at this sub-layer.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_broadcast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_broadcast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_broadcast_pkts(self):
+    self.__in_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_multicast_pkts(self):
+    """
+    Getter method for in_multicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_multicast_pkts (oc-yang:counter64)
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a multicast
+address at this sub-layer.  For a MAC-layer protocol,
+this includes both Group and Functional addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_multicast_pkts
+      
+  def _set_in_multicast_pkts(self, v, load=False):
+    """
+    Setter method for in_multicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_multicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_multicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_multicast_pkts() directly.
+
+    YANG Description: The number of packets, delivered by this sub-layer to a
+higher (sub-)layer, that were addressed to a multicast
+address at this sub-layer.  For a MAC-layer protocol,
+this includes both Group and Functional addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_multicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_multicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_multicast_pkts(self):
+    self.__in_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_discards(self):
+    """
+    Getter method for in_discards, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_discards (oc-yang:counter64)
+
+    YANG Description: The number of inbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being deliverable to a higher-layer
+protocol.  One possible reason for discarding such a
+packet could be to free up buffer space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_discards
+      
+  def _set_in_discards(self, v, load=False):
+    """
+    Setter method for in_discards, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_discards (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_discards is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_discards() directly.
+
+    YANG Description: The number of inbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being deliverable to a higher-layer
+protocol.  One possible reason for discarding such a
+packet could be to free up buffer space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_discards must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_discards = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_discards(self):
+    self.__in_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_errors(self):
+    """
+    Getter method for in_errors, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_errors (oc-yang:counter64)
+
+    YANG Description: For packet-oriented interfaces, the number of inbound
+packets that contained errors preventing them from being
+deliverable to a higher-layer protocol.  For character-
+oriented or fixed-length interfaces, the number of
+inbound transmission units that contained errors
+preventing them from being deliverable to a higher-layer
+protocol.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_errors
+      
+  def _set_in_errors(self, v, load=False):
+    """
+    Setter method for in_errors, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_errors (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_errors is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_errors() directly.
+
+    YANG Description: For packet-oriented interfaces, the number of inbound
+packets that contained errors preventing them from being
+deliverable to a higher-layer protocol.  For character-
+oriented or fixed-length interfaces, the number of
+inbound transmission units that contained errors
+preventing them from being deliverable to a higher-layer
+protocol.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_errors must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_errors = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_errors(self):
+    self.__in_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_unknown_protos(self):
+    """
+    Getter method for in_unknown_protos, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_unknown_protos (oc-yang:counter64)
+
+    YANG Description: For packet-oriented interfaces, the number of packets
+received via the interface that were discarded because
+of an unknown or unsupported protocol.  For
+character-oriented or fixed-length interfaces that
+support protocol multiplexing, the number of
+transmission units received via the interface that were
+discarded because of an unknown or unsupported protocol.
+For any interface that does not support protocol
+multiplexing, this counter is not present.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__in_unknown_protos
+      
+  def _set_in_unknown_protos(self, v, load=False):
+    """
+    Setter method for in_unknown_protos, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_unknown_protos (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_unknown_protos is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_unknown_protos() directly.
+
+    YANG Description: For packet-oriented interfaces, the number of packets
+received via the interface that were discarded because
+of an unknown or unsupported protocol.  For
+character-oriented or fixed-length interfaces that
+support protocol multiplexing, the number of
+transmission units received via the interface that were
+discarded because of an unknown or unsupported protocol.
+For any interface that does not support protocol
+multiplexing, this counter is not present.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_unknown_protos must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_unknown_protos = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_unknown_protos(self):
+    self.__in_unknown_protos = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-unknown-protos", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_in_fcs_errors(self):
+    """
+    Getter method for in_fcs_errors, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_fcs_errors (oc-yang:counter64)
+
+    YANG Description: Number of received packets which had errors in the
+frame check sequence (FCS), i.e., framing errors.
+
+Discontinuities in the value of this counter can occur
+when the device is re-initialization as indicated by the
+value of 'last-clear'.
+    """
+    return self.__in_fcs_errors
+      
+  def _set_in_fcs_errors(self, v, load=False):
+    """
+    Setter method for in_fcs_errors, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/in_fcs_errors (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_in_fcs_errors is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_in_fcs_errors() directly.
+
+    YANG Description: Number of received packets which had errors in the
+frame check sequence (FCS), i.e., framing errors.
+
+Discontinuities in the value of this counter can occur
+when the device is re-initialization as indicated by the
+value of 'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """in_fcs_errors must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__in_fcs_errors = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_in_fcs_errors(self):
+    self.__in_fcs_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="in-fcs-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_octets(self):
+    """
+    Getter method for out_octets, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_octets (oc-yang:counter64)
+
+    YANG Description: The total number of octets transmitted out of the
+interface, including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_octets
+      
+  def _set_out_octets(self, v, load=False):
+    """
+    Setter method for out_octets, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_octets (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_octets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_octets() directly.
+
+    YANG Description: The total number of octets transmitted out of the
+interface, including framing characters.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_octets must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_octets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_octets(self):
+    self.__out_octets = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-octets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_pkts(self):
+    """
+    Getter method for out_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets transmitted out of the
+interface, including all unicast, multicast, broadcast,
+and bad packets etc.
+    """
+    return self.__out_pkts
+      
+  def _set_out_pkts(self, v, load=False):
+    """
+    Setter method for out_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_pkts() directly.
+
+    YANG Description: The total number of packets transmitted out of the
+interface, including all unicast, multicast, broadcast,
+and bad packets etc.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_pkts(self):
+    self.__out_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_unicast_pkts(self):
+    """
+    Getter method for out_unicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_unicast_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were not addressed
+to a multicast or broadcast address at this sub-layer,
+including those that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_unicast_pkts
+      
+  def _set_out_unicast_pkts(self, v, load=False):
+    """
+    Setter method for out_unicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_unicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_unicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_unicast_pkts() directly.
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were not addressed
+to a multicast or broadcast address at this sub-layer,
+including those that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_unicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_unicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_unicast_pkts(self):
+    self.__out_unicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-unicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_broadcast_pkts(self):
+    """
+    Getter method for out_broadcast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_broadcast_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+broadcast address at this sub-layer, including those
+that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_broadcast_pkts
+      
+  def _set_out_broadcast_pkts(self, v, load=False):
+    """
+    Setter method for out_broadcast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_broadcast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_broadcast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_broadcast_pkts() directly.
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+broadcast address at this sub-layer, including those
+that were discarded or not sent.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_broadcast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_broadcast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_broadcast_pkts(self):
+    self.__out_broadcast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-broadcast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_multicast_pkts(self):
+    """
+    Getter method for out_multicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_multicast_pkts (oc-yang:counter64)
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+multicast address at this sub-layer, including those
+that were discarded or not sent.  For a MAC-layer
+protocol, this includes both Group and Functional
+addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_multicast_pkts
+      
+  def _set_out_multicast_pkts(self, v, load=False):
+    """
+    Setter method for out_multicast_pkts, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_multicast_pkts (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_multicast_pkts is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_multicast_pkts() directly.
+
+    YANG Description: The total number of packets that higher-level protocols
+requested be transmitted, and that were addressed to a
+multicast address at this sub-layer, including those
+that were discarded or not sent.  For a MAC-layer
+protocol, this includes both Group and Functional
+addresses.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_multicast_pkts must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_multicast_pkts = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_multicast_pkts(self):
+    self.__out_multicast_pkts = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-multicast-pkts", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_discards(self):
+    """
+    Getter method for out_discards, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_discards (oc-yang:counter64)
+
+    YANG Description: The number of outbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being transmitted.  One possible reason
+for discarding such a packet could be to free up buffer
+space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_discards
+      
+  def _set_out_discards(self, v, load=False):
+    """
+    Setter method for out_discards, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_discards (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_discards is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_discards() directly.
+
+    YANG Description: The number of outbound packets that were chosen to be
+discarded even though no errors had been detected to
+prevent their being transmitted.  One possible reason
+for discarding such a packet could be to free up buffer
+space.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_discards must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_discards = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_discards(self):
+    self.__out_discards = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-discards", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_out_errors(self):
+    """
+    Getter method for out_errors, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_errors (oc-yang:counter64)
+
+    YANG Description: For packet-oriented interfaces, the number of outbound
+packets that could not be transmitted because of errors.
+For character-oriented or fixed-length interfaces, the
+number of outbound transmission units that could not be
+transmitted because of errors.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    return self.__out_errors
+      
+  def _set_out_errors(self, v, load=False):
+    """
+    Setter method for out_errors, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/out_errors (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_out_errors is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_out_errors() directly.
+
+    YANG Description: For packet-oriented interfaces, the number of outbound
+packets that could not be transmitted because of errors.
+For character-oriented or fixed-length interfaces, the
+number of outbound transmission units that could not be
+transmitted because of errors.
+
+Discontinuities in the value of this counter can occur
+at re-initialization of the management system, and at
+other times as indicated by the value of
+'last-clear'.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """out_errors must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__out_errors = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_out_errors(self):
+    self.__out_errors = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="out-errors", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_carrier_transitions(self):
+    """
+    Getter method for carrier_transitions, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/carrier_transitions (oc-yang:counter64)
+
+    YANG Description: Number of times the interface state has transitioned
+between up and down since the time the device restarted
+or the last-clear time, whichever is most recent.
+    """
+    return self.__carrier_transitions
+      
+  def _set_carrier_transitions(self, v, load=False):
+    """
+    Setter method for carrier_transitions, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/carrier_transitions (oc-yang:counter64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_carrier_transitions is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_carrier_transitions() directly.
+
+    YANG Description: Number of times the interface state has transitioned
+between up and down since the time the device restarted
+or the last-clear time, whichever is most recent.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """carrier_transitions must be of a type compatible with oc-yang:counter64""",
+          'defined-type': "oc-yang:counter64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)""",
+        })
+
+    self.__carrier_transitions = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_carrier_transitions(self):
+    self.__carrier_transitions = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="carrier-transitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-yang:counter64', is_config=False)
+
+
+  def _get_last_clear(self):
+    """
+    Getter method for last_clear, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/last_clear (oc-types:timeticks64)
+
+    YANG Description: Timestamp of the last time the interface counters were
+cleared.
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    return self.__last_clear
+      
+  def _set_last_clear(self, v, load=False):
+    """
+    Setter method for last_clear, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters/last_clear (oc-types:timeticks64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_last_clear is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_last_clear() directly.
+
+    YANG Description: Timestamp of the last time the interface counters were
+cleared.
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """last_clear must be of a type compatible with oc-types:timeticks64""",
+          'defined-type': "oc-types:timeticks64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)""",
+        })
+
+    self.__last_clear = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_last_clear(self):
+    self.__last_clear = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-clear", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+
+  in_octets = __builtin__.property(_get_in_octets)
+  in_pkts = __builtin__.property(_get_in_pkts)
+  in_unicast_pkts = __builtin__.property(_get_in_unicast_pkts)
+  in_broadcast_pkts = __builtin__.property(_get_in_broadcast_pkts)
+  in_multicast_pkts = __builtin__.property(_get_in_multicast_pkts)
+  in_discards = __builtin__.property(_get_in_discards)
+  in_errors = __builtin__.property(_get_in_errors)
+  in_unknown_protos = __builtin__.property(_get_in_unknown_protos)
+  in_fcs_errors = __builtin__.property(_get_in_fcs_errors)
+  out_octets = __builtin__.property(_get_out_octets)
+  out_pkts = __builtin__.property(_get_out_pkts)
+  out_unicast_pkts = __builtin__.property(_get_out_unicast_pkts)
+  out_broadcast_pkts = __builtin__.property(_get_out_broadcast_pkts)
+  out_multicast_pkts = __builtin__.property(_get_out_multicast_pkts)
+  out_discards = __builtin__.property(_get_out_discards)
+  out_errors = __builtin__.property(_get_out_errors)
+  carrier_transitions = __builtin__.property(_get_carrier_transitions)
+  last_clear = __builtin__.property(_get_last_clear)
+
+
+  _pyangbind_elements = OrderedDict([('in_octets', in_octets), ('in_pkts', in_pkts), ('in_unicast_pkts', in_unicast_pkts), ('in_broadcast_pkts', in_broadcast_pkts), ('in_multicast_pkts', in_multicast_pkts), ('in_discards', in_discards), ('in_errors', in_errors), ('in_unknown_protos', in_unknown_protos), ('in_fcs_errors', in_fcs_errors), ('out_octets', out_octets), ('out_pkts', out_pkts), ('out_unicast_pkts', out_unicast_pkts), ('out_broadcast_pkts', out_broadcast_pkts), ('out_multicast_pkts', out_multicast_pkts), ('out_discards', out_discards), ('out_errors', out_errors), ('carrier_transitions', carrier_transitions), ('last_clear', last_clear), ])
+
+
+class yc_state_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/subinterfaces/subinterface/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for logical interfaces
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__index','__description','__enabled','__name','__ifindex','__admin_status','__oper_status','__last_change','__logical','__management','__cpu','__counters',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__index = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    self.__ifindex = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    self.__admin_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    self.__oper_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    self.__last_change = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+    self.__logical = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__management = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__cpu = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    self.__counters = YANGDynClass(base=yc_counters_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'subinterfaces', 'subinterface', 'state']
+
+  def _get_index(self):
+    """
+    Getter method for index, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/index (uint32)
+
+    YANG Description: The index of the subinterface, or logical interface number.
+On systems with no support for subinterfaces, or not using
+subinterfaces, this value should default to 0, i.e., the
+default subinterface.
+    """
+    return self.__index
+      
+  def _set_index(self, v, load=False):
+    """
+    Setter method for index, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/index (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_index is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_index() directly.
+
+    YANG Description: The index of the subinterface, or logical interface number.
+On systems with no support for subinterfaces, or not using
+subinterfaces, this value should default to 0, i.e., the
+default subinterface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """index must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)""",
+        })
+
+    self.__index = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_index(self):
+    self.__index = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), default=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32)(0), is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+
+
+  def _get_description(self):
+    """
+    Getter method for description, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/description (string)
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    return self.__description
+      
+  def _set_description(self, v, load=False):
+    """
+    Setter method for description, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/description (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_description is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_description() directly.
+
+    YANG Description: A textual description of the interface.
+
+A server implementation MAY map this leaf to the ifAlias
+MIB object.  Such an implementation needs to use some
+mechanism to handle the differences in size and characters
+allowed between this leaf and ifAlias.  The definition of
+such a mechanism is outside the scope of this document.
+
+Since ifAlias is defined to be stored in non-volatile
+storage, the MIB implementation MUST map ifAlias to the
+value of 'description' in the persistently stored
+datastore.
+
+Specifically, if the device supports ':startup', when
+ifAlias is read the device MUST return the value of
+'description' in the 'startup' datastore, and when it is
+written, it MUST be written to the 'running' and 'startup'
+datastores.  Note that it is up to the implementation to
+
+decide whether to modify this single leaf in 'startup' or
+perform an implicit copy-config from 'running' to
+'startup'.
+
+If the device does not support ':startup', ifAlias MUST
+be mapped to the 'description' leaf in the 'running'
+datastore.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """description must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)""",
+        })
+
+    self.__description = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_description(self):
+    self.__description = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="description", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+
+
+  def _get_enabled(self):
+    """
+    Getter method for enabled, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/enabled (boolean)
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    return self.__enabled
+      
+  def _set_enabled(self, v, load=False):
+    """
+    Setter method for enabled, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/enabled (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_enabled is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_enabled() directly.
+
+    YANG Description: This leaf contains the configured, desired state of the
+interface.
+
+Systems that implement the IF-MIB use the value of this
+leaf in the 'running' datastore to set
+IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+has been initialized, as described in RFC 2863.
+
+Changes in this leaf in the 'running' datastore are
+reflected in ifAdminStatus, but if ifAdminStatus is
+changed over SNMP, this leaf is not affected.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """enabled must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__enabled = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_enabled(self):
+    self.__enabled = YANGDynClass(base=YANGBool, default=YANGBool("true"), is_leaf=True, yang_name="enabled", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/name (string)
+
+    YANG Description: The system-assigned name for the sub-interface.  This MAY
+be a combination of the base interface name and the
+subinterface index, or some other convention used by the
+system.
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: The system-assigned name for the sub-interface.  This MAY
+be a combination of the base interface name and the
+subinterface index, or some other convention used by the
+system.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='string', is_config=False)
+
+
+  def _get_ifindex(self):
+    """
+    Getter method for ifindex, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/ifindex (uint32)
+
+    YANG Description: System assigned number for each interface.  Corresponds to
+ifIndex object in SNMP Interface MIB
+    """
+    return self.__ifindex
+      
+  def _set_ifindex(self, v, load=False):
+    """
+    Setter method for ifindex, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/ifindex (uint32)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ifindex is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ifindex() directly.
+
+    YANG Description: System assigned number for each interface.  Corresponds to
+ifIndex object in SNMP Interface MIB
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ifindex must be of a type compatible with uint32""",
+          'defined-type': "uint32",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)""",
+        })
+
+    self.__ifindex = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ifindex(self):
+    self.__ifindex = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32), is_leaf=True, yang_name="ifindex", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='uint32', is_config=False)
+
+
+  def _get_admin_status(self):
+    """
+    Getter method for admin_status, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/admin_status (enumeration)
+
+    YANG Description: The desired state of the interface.  In RFC 7223 this leaf
+has the same read semantics as ifAdminStatus.  Here, it
+reflects the administrative state as set by enabling or
+disabling the interface.
+    """
+    return self.__admin_status
+      
+  def _set_admin_status(self, v, load=False):
+    """
+    Setter method for admin_status, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/admin_status (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_admin_status is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_admin_status() directly.
+
+    YANG Description: The desired state of the interface.  In RFC 7223 this leaf
+has the same read semantics as ifAdminStatus.  Here, it
+reflects the administrative state as set by enabling or
+disabling the interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """admin_status must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-interfaces:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)""",
+        })
+
+    self.__admin_status = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_admin_status(self):
+    self.__admin_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {}, 'DOWN': {}, 'TESTING': {}},), is_leaf=True, yang_name="admin-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+
+
+  def _get_oper_status(self):
+    """
+    Getter method for oper_status, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/oper_status (enumeration)
+
+    YANG Description: The current operational state of the interface.
+
+This leaf has the same semantics as ifOperStatus.
+    """
+    return self.__oper_status
+      
+  def _set_oper_status(self, v, load=False):
+    """
+    Setter method for oper_status, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/oper_status (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_oper_status is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_oper_status() directly.
+
+    YANG Description: The current operational state of the interface.
+
+This leaf has the same semantics as ifOperStatus.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """oper_status must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-interfaces:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)""",
+        })
+
+    self.__oper_status = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_oper_status(self):
+    self.__oper_status = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'UP': {'value': 1}, 'DOWN': {'value': 2}, 'TESTING': {'value': 3}, 'UNKNOWN': {'value': 4}, 'DORMANT': {'value': 5}, 'NOT_PRESENT': {'value': 6}, 'LOWER_LAYER_DOWN': {'value': 7}},), is_leaf=True, yang_name="oper-status", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='enumeration', is_config=False)
+
+
+  def _get_last_change(self):
+    """
+    Getter method for last_change, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/last_change (oc-types:timeticks64)
+
+    YANG Description: This timestamp indicates the absolute time of the last
+state change of the interface (e.g., up-to-down transition).
+This is different than the SNMP ifLastChange object in the
+standard interface MIB in that it is not relative to the
+system boot time (i.e,. sysUpTime).
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    return self.__last_change
+      
+  def _set_last_change(self, v, load=False):
+    """
+    Setter method for last_change, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/last_change (oc-types:timeticks64)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_last_change is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_last_change() directly.
+
+    YANG Description: This timestamp indicates the absolute time of the last
+state change of the interface (e.g., up-to-down transition).
+This is different than the SNMP ifLastChange object in the
+standard interface MIB in that it is not relative to the
+system boot time (i.e,. sysUpTime).
+
+The value is the timestamp in nanoseconds relative to
+the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """last_change must be of a type compatible with oc-types:timeticks64""",
+          'defined-type': "oc-types:timeticks64",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)""",
+        })
+
+    self.__last_change = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_last_change(self):
+    self.__last_change = YANGDynClass(base=RestrictedClassType(base_type=long, restriction_dict={'range':  ['0..18446744073709551615']}, int_size=64), is_leaf=True, yang_name="last-change", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='oc-types:timeticks64', is_config=False)
+
+
+  def _get_logical(self):
+    """
+    Getter method for logical, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/logical (boolean)
+
+    YANG Description: When set to true, the interface is a logical interface
+which does not have an associated physical port or
+channel on the system.
+    """
+    return self.__logical
+      
+  def _set_logical(self, v, load=False):
+    """
+    Setter method for logical, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/logical (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_logical is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_logical() directly.
+
+    YANG Description: When set to true, the interface is a logical interface
+which does not have an associated physical port or
+channel on the system.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """logical must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__logical = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_logical(self):
+    self.__logical = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="logical", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_management(self):
+    """
+    Getter method for management, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/management (boolean)
+
+    YANG Description: When set to true, the interface is a dedicated
+management interface that is not connected to dataplane
+interfaces.  It may be used to connect the system to an
+out-of-band management network, for example.
+    """
+    return self.__management
+      
+  def _set_management(self, v, load=False):
+    """
+    Setter method for management, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/management (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_management is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_management() directly.
+
+    YANG Description: When set to true, the interface is a dedicated
+management interface that is not connected to dataplane
+interfaces.  It may be used to connect the system to an
+out-of-band management network, for example.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """management must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__management = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_management(self):
+    self.__management = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="management", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_cpu(self):
+    """
+    Getter method for cpu, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/cpu (boolean)
+
+    YANG Description: When set to true, the interface is for traffic
+that is handled by the system CPU, sometimes also called the
+control plane interface.  On systems that represent the CPU
+interface as an Ethernet interface, for example, this leaf
+should be used to distinguish the CPU interface from dataplane
+interfaces.
+    """
+    return self.__cpu
+      
+  def _set_cpu(self, v, load=False):
+    """
+    Setter method for cpu, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/cpu (boolean)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_cpu is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_cpu() directly.
+
+    YANG Description: When set to true, the interface is for traffic
+that is handled by the system CPU, sometimes also called the
+control plane interface.  On systems that represent the CPU
+interface as an Ethernet interface, for example, this leaf
+should be used to distinguish the CPU interface from dataplane
+interfaces.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """cpu must be of a type compatible with boolean""",
+          'defined-type': "boolean",
+          'generated-type': """YANGDynClass(base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)""",
+        })
+
+    self.__cpu = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_cpu(self):
+    self.__cpu = YANGDynClass(base=YANGBool, is_leaf=True, yang_name="cpu", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='boolean', is_config=False)
+
+
+  def _get_counters(self):
+    """
+    Getter method for counters, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters (container)
+
+    YANG Description: A collection of interface-related statistics objects.
+    """
+    return self.__counters
+      
+  def _set_counters(self, v, load=False):
+    """
+    Setter method for counters, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state/counters (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_counters is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_counters() directly.
+
+    YANG Description: A collection of interface-related statistics objects.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_counters_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """counters must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_counters_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)""",
+        })
+
+    self.__counters = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_counters(self):
+    self.__counters = YANGDynClass(base=yc_counters_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state_counters, is_container='container', yang_name="counters", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=False)
+
+  index = __builtin__.property(_get_index)
+  description = __builtin__.property(_get_description)
+  enabled = __builtin__.property(_get_enabled)
+  name = __builtin__.property(_get_name)
+  ifindex = __builtin__.property(_get_ifindex)
+  admin_status = __builtin__.property(_get_admin_status)
+  oper_status = __builtin__.property(_get_oper_status)
+  last_change = __builtin__.property(_get_last_change)
+  logical = __builtin__.property(_get_logical)
+  management = __builtin__.property(_get_management)
+  cpu = __builtin__.property(_get_cpu)
+  counters = __builtin__.property(_get_counters)
+
+
+  _pyangbind_elements = OrderedDict([('index', index), ('description', description), ('enabled', enabled), ('name', name), ('ifindex', ifindex), ('admin_status', admin_status), ('oper_status', oper_status), ('last_change', last_change), ('logical', logical), ('management', management), ('cpu', cpu), ('counters', counters), ])
+
+
+class yc_subinterface_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/subinterfaces/subinterface. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: The list of subinterfaces (logical interfaces) associated
+with a physical interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__index','__config','__state',)
+
+  _yang_name = 'subinterface'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__index = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'subinterfaces', 'subinterface']
+
+  def _get_index(self):
+    """
+    Getter method for index, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/index (leafref)
+
+    YANG Description: The index number of the subinterface -- used to address
+the logical interface
+    """
+    return self.__index
+      
+  def _set_index(self, v, load=False):
+    """
+    Setter method for index, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/index (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_index is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_index() directly.
+
+    YANG Description: The index number of the subinterface -- used to address
+the logical interface
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """index must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__index = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_index(self):
+    self.__index = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="index", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config (container)
+
+    YANG Description: Configurable items at the subinterface level
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configurable items at the subinterface level
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state (container)
+
+    YANG Description: Operational state data for logical interfaces
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for logical interfaces
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+  index = __builtin__.property(_get_index, _set_index)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('index', index), ('config', config), ('state', state), ])
+
+
+class yc_subinterfaces_openconfig_interfaces__interfaces_interface_subinterfaces(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface/subinterfaces. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for the list of subinterfaces associated
+with a physical interface
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__subinterface',)
+
+  _yang_name = 'subinterfaces'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__subinterface = YANGDynClass(base=YANGListType("index",yc_subinterface_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface, yang_name="subinterface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='index', extensions=None), is_container='list', yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface', 'subinterfaces']
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface (list)
+
+    YANG Description: The list of subinterfaces (logical interfaces) associated
+with a physical interface
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /interfaces/interface/subinterfaces/subinterface (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: The list of subinterfaces (logical interfaces) associated
+with a physical interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("index",yc_subinterface_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface, yang_name="subinterface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='index', extensions=None), is_container='list', yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("index",yc_subinterface_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface, yang_name="subinterface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='index', extensions=None), is_container='list', yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=YANGListType("index",yc_subinterface_openconfig_interfaces__interfaces_interface_subinterfaces_subinterface, yang_name="subinterface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='index', extensions=None), is_container='list', yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)
+
+  subinterface = __builtin__.property(_get_subinterface, _set_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('subinterface', subinterface), ])
+
+
+class yc_interface_openconfig_interfaces__interfaces_interface(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces/interface. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: The list of named interfaces on the device.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__config','__state','__hold_time','__subinterfaces',)
+
+  _yang_name = 'interface'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    self.__hold_time = YANGDynClass(base=yc_hold_time_openconfig_interfaces__interfaces_interface_hold_time, is_container='container', yang_name="hold-time", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    self.__subinterfaces = YANGDynClass(base=yc_subinterfaces_openconfig_interfaces__interfaces_interface_subinterfaces, is_container='container', yang_name="subinterfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces', 'interface']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /interfaces/interface/name (leafref)
+
+    YANG Description: References the name of the interface
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /interfaces/interface/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: References the name of the interface
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /interfaces/interface/config (container)
+
+    YANG Description: Configurable items at the global, physical interface
+level
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /interfaces/interface/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configurable items at the global, physical interface
+level
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_interfaces__interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_interfaces__interfaces_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /interfaces/interface/state (container)
+
+    YANG Description: Operational state data at the global interface level
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /interfaces/interface/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data at the global interface level
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_interfaces__interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_interfaces__interfaces_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+
+  def _get_hold_time(self):
+    """
+    Getter method for hold_time, mapped from YANG variable /interfaces/interface/hold_time (container)
+
+    YANG Description: Top-level container for hold-time settings to enable
+dampening advertisements of interface transitions.
+    """
+    return self.__hold_time
+      
+  def _set_hold_time(self, v, load=False):
+    """
+    Setter method for hold_time, mapped from YANG variable /interfaces/interface/hold_time (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_hold_time is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_hold_time() directly.
+
+    YANG Description: Top-level container for hold-time settings to enable
+dampening advertisements of interface transitions.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_hold_time_openconfig_interfaces__interfaces_interface_hold_time, is_container='container', yang_name="hold-time", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """hold_time must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_hold_time_openconfig_interfaces__interfaces_interface_hold_time, is_container='container', yang_name="hold-time", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__hold_time = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_hold_time(self):
+    self.__hold_time = YANGDynClass(base=yc_hold_time_openconfig_interfaces__interfaces_interface_hold_time, is_container='container', yang_name="hold-time", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+
+  def _get_subinterfaces(self):
+    """
+    Getter method for subinterfaces, mapped from YANG variable /interfaces/interface/subinterfaces (container)
+
+    YANG Description: Enclosing container for the list of subinterfaces associated
+with a physical interface
+    """
+    return self.__subinterfaces
+      
+  def _set_subinterfaces(self, v, load=False):
+    """
+    Setter method for subinterfaces, mapped from YANG variable /interfaces/interface/subinterfaces (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterfaces is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterfaces() directly.
+
+    YANG Description: Enclosing container for the list of subinterfaces associated
+with a physical interface
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_subinterfaces_openconfig_interfaces__interfaces_interface_subinterfaces, is_container='container', yang_name="subinterfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterfaces must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_subinterfaces_openconfig_interfaces__interfaces_interface_subinterfaces, is_container='container', yang_name="subinterfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__subinterfaces = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterfaces(self):
+    self.__subinterfaces = YANGDynClass(base=yc_subinterfaces_openconfig_interfaces__interfaces_interface_subinterfaces, is_container='container', yang_name="subinterfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  hold_time = __builtin__.property(_get_hold_time, _set_hold_time)
+  subinterfaces = __builtin__.property(_get_subinterfaces, _set_subinterfaces)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('config', config), ('state', state), ('hold_time', hold_time), ('subinterfaces', subinterfaces), ])
+
+
+class yc_interfaces_openconfig_interfaces__interfaces(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /interfaces. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top level container for interfaces, including configuration
+and state data.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface',)
+
+  _yang_name = 'interfaces'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=YANGListType("name",yc_interface_openconfig_interfaces__interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['interfaces']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /interfaces/interface (list)
+
+    YANG Description: The list of named interfaces on the device.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /interfaces/interface (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: The list of named interfaces on the device.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name",yc_interface_openconfig_interfaces__interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name",yc_interface_openconfig_interfaces__interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=YANGListType("name",yc_interface_openconfig_interfaces__interfaces_interface, yang_name="interface", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='list', is_config=True)
+
+  interface = __builtin__.property(_get_interface, _set_interface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ])
+
+
+class openconfig_interfaces(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-interfaces - based on the path /openconfig-interfaces. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Model for managing network interfaces and subinterfaces.  This
+module also defines convenience types / groupings for other
+models to create references to interfaces:
+
+ base-interface-ref (type) -  reference to a base interface
+ interface-ref (grouping) -  container for reference to a
+   interface + subinterface
+ interface-ref-state (grouping) - container for read-only
+   (opstate) reference to interface + subinterface
+
+This model reuses data items defined in the IETF YANG model for
+interfaces described by RFC 7223 with an alternate structure
+(particularly for operational state data) and with
+additional configuration items.
+
+Portions of this code were derived from IETF RFC 7223.
+Please reproduce this note if possible.
+
+IETF code is subject to the following copyright and license:
+Copyright (c) IETF Trust and the persons identified as authors of
+the code.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted pursuant to, and subject to the license
+terms contained in, the Simplified BSD License set forth in
+Section 4.c of the IETF Trust's Legal Provisions Relating
+to IETF Documents (http://trustee.ietf.org/license-info).
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interfaces',)
+
+  _yang_name = 'openconfig-interfaces'
+  _yang_namespace = 'http://openconfig.net/yang/interfaces'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interfaces = YANGDynClass(base=yc_interfaces_openconfig_interfaces__interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return []
+
+  def _get_interfaces(self):
+    """
+    Getter method for interfaces, mapped from YANG variable /interfaces (container)
+
+    YANG Description: Top level container for interfaces, including configuration
+and state data.
+    """
+    return self.__interfaces
+      
+  def _set_interfaces(self, v, load=False):
+    """
+    Setter method for interfaces, mapped from YANG variable /interfaces (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interfaces is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interfaces() directly.
+
+    YANG Description: Top level container for interfaces, including configuration
+and state data.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_interfaces_openconfig_interfaces__interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interfaces must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_interfaces_openconfig_interfaces__interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)""",
+        })
+
+    self.__interfaces = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interfaces(self):
+    self.__interfaces = YANGDynClass(base=yc_interfaces_openconfig_interfaces__interfaces, is_container='container', yang_name="interfaces", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/interfaces', defining_module='openconfig-interfaces', yang_type='container', is_config=True)
+
+  interfaces = __builtin__.property(_get_interfaces, _set_interfaces)
+
+
+  _pyangbind_elements = OrderedDict([('interfaces', interfaces), ])
+
+
diff --git a/src/device/service/drivers/openconfig/templates/VPN/openconfig_network_instance.py b/src/device/service/drivers/openconfig/templates/VPN/openconfig_network_instance.py
new file mode 100644
index 0000000000000000000000000000000000000000..e50da01d286fa4af706c564475b7113311e1bbc8
Binary files /dev/null and b/src/device/service/drivers/openconfig/templates/VPN/openconfig_network_instance.py differ
diff --git a/src/device/service/drivers/openconfig/templates/VPN/openconfig_routing_policy.py b/src/device/service/drivers/openconfig/templates/VPN/openconfig_routing_policy.py
new file mode 100644
index 0000000000000000000000000000000000000000..c72a0a80e234fbe303b14d0e509b6c70923f9883
--- /dev/null
+++ b/src/device/service/drivers/openconfig/templates/VPN/openconfig_routing_policy.py
@@ -0,0 +1,7499 @@
+# -*- coding: utf-8 -*-
+from operator import attrgetter
+from pyangbind.lib.yangtypes import RestrictedPrecisionDecimalType
+from pyangbind.lib.yangtypes import RestrictedClassType
+from pyangbind.lib.yangtypes import TypedListType
+from pyangbind.lib.yangtypes import YANGBool
+from pyangbind.lib.yangtypes import YANGListType
+from pyangbind.lib.yangtypes import YANGDynClass
+from pyangbind.lib.yangtypes import ReferenceType
+from pyangbind.lib.base import PybindBase
+from collections import OrderedDict
+from decimal import Decimal
+from bitarray import bitarray
+import six
+
+# PY3 support of some PY2 keywords (needs improved)
+if six.PY3:
+  import builtins as __builtin__
+  long = int
+elif six.PY2:
+  import builtins as __builtin__
+
+class yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for prefix sets
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__mode',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/config/name (string)
+
+    YANG Description: name / label of the prefix set -- this is used to
+reference the set in match conditions
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name / label of the prefix set -- this is used to
+reference the set in match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+
+  def _get_mode(self):
+    """
+    Getter method for mode, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/config/mode (enumeration)
+
+    YANG Description: Indicates the mode of the prefix set, in terms of which
+address families (IPv4, IPv6, or both) are present.  The
+mode provides a hint, but the device must validate that all
+prefixes are of the indicated type, and is expected to
+reject the configuration if there is a discrepancy.  The
+MIXED mode may not be supported on devices that require
+prefix sets to be of only one address family.
+    """
+    return self.__mode
+      
+  def _set_mode(self, v, load=False):
+    """
+    Setter method for mode, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/config/mode (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mode is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mode() directly.
+
+    YANG Description: Indicates the mode of the prefix set, in terms of which
+address families (IPv4, IPv6, or both) are present.  The
+mode provides a hint, but the device must validate that all
+prefixes are of the indicated type, and is expected to
+reject the configuration if there is a discrepancy.  The
+MIXED mode may not be supported on devices that require
+prefix sets to be of only one address family.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mode must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-routing-policy:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)""",
+        })
+
+    self.__mode = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mode(self):
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  mode = __builtin__.property(_get_mode, _set_mode)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('mode', mode), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data 
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__mode',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/state/name (string)
+
+    YANG Description: name / label of the prefix set -- this is used to
+reference the set in match conditions
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name / label of the prefix set -- this is used to
+reference the set in match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+
+  def _get_mode(self):
+    """
+    Getter method for mode, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/state/mode (enumeration)
+
+    YANG Description: Indicates the mode of the prefix set, in terms of which
+address families (IPv4, IPv6, or both) are present.  The
+mode provides a hint, but the device must validate that all
+prefixes are of the indicated type, and is expected to
+reject the configuration if there is a discrepancy.  The
+MIXED mode may not be supported on devices that require
+prefix sets to be of only one address family.
+    """
+    return self.__mode
+      
+  def _set_mode(self, v, load=False):
+    """
+    Setter method for mode, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/state/mode (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mode is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mode() directly.
+
+    YANG Description: Indicates the mode of the prefix set, in terms of which
+address families (IPv4, IPv6, or both) are present.  The
+mode provides a hint, but the device must validate that all
+prefixes are of the indicated type, and is expected to
+reject the configuration if there is a discrepancy.  The
+MIXED mode may not be supported on devices that require
+prefix sets to be of only one address family.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mode must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-routing-policy:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)""",
+        })
+
+    self.__mode = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mode(self):
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'IPV4': {}, 'IPV6': {}, 'MIXED': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)
+
+  name = __builtin__.property(_get_name)
+  mode = __builtin__.property(_get_mode)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('mode', mode), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set/prefixes/prefix/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for prefix definition
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__ip_prefix','__masklength_range',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__ip_prefix = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=True)
+    self.__masklength_range = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set', 'prefixes', 'prefix', 'config']
+
+  def _get_ip_prefix(self):
+    """
+    Getter method for ip_prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/config/ip_prefix (oc-inet:ip-prefix)
+
+    YANG Description: The prefix member in CIDR notation -- while the
+prefix may be either IPv4 or IPv6, most
+implementations require all members of the prefix set
+to be the same address family.  Mixing address types in
+the same prefix set is likely to cause an error.
+    """
+    return self.__ip_prefix
+      
+  def _set_ip_prefix(self, v, load=False):
+    """
+    Setter method for ip_prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/config/ip_prefix (oc-inet:ip-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ip_prefix is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ip_prefix() directly.
+
+    YANG Description: The prefix member in CIDR notation -- while the
+prefix may be either IPv4 or IPv6, most
+implementations require all members of the prefix set
+to be the same address family.  Mixing address types in
+the same prefix set is likely to cause an error.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ip_prefix must be of a type compatible with oc-inet:ip-prefix""",
+          'defined-type': "oc-inet:ip-prefix",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=True)""",
+        })
+
+    self.__ip_prefix = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ip_prefix(self):
+    self.__ip_prefix = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=True)
+
+
+  def _get_masklength_range(self):
+    """
+    Getter method for masklength_range, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/config/masklength_range (string)
+
+    YANG Description: Defines a range for the masklength, or 'exact' if
+the prefix has an exact length.
+
+Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+expressed as prefix: 10.3.192.0/21,
+masklength-range: 21..24.
+
+Example: 10.3.192.0/21 would be expressed as
+prefix: 10.3.192.0/21,
+masklength-range: exact
+    """
+    return self.__masklength_range
+      
+  def _set_masklength_range(self, v, load=False):
+    """
+    Setter method for masklength_range, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/config/masklength_range (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_masklength_range is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_masklength_range() directly.
+
+    YANG Description: Defines a range for the masklength, or 'exact' if
+the prefix has an exact length.
+
+Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+expressed as prefix: 10.3.192.0/21,
+masklength-range: 21..24.
+
+Example: 10.3.192.0/21 would be expressed as
+prefix: 10.3.192.0/21,
+masklength-range: exact
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """masklength_range must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)""",
+        })
+
+    self.__masklength_range = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_masklength_range(self):
+    self.__masklength_range = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+  ip_prefix = __builtin__.property(_get_ip_prefix, _set_ip_prefix)
+  masklength_range = __builtin__.property(_get_masklength_range, _set_masklength_range)
+
+
+  _pyangbind_elements = OrderedDict([('ip_prefix', ip_prefix), ('masklength_range', masklength_range), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set/prefixes/prefix/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for prefix definition
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__ip_prefix','__masklength_range',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__ip_prefix = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=False)
+    self.__masklength_range = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set', 'prefixes', 'prefix', 'state']
+
+  def _get_ip_prefix(self):
+    """
+    Getter method for ip_prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/state/ip_prefix (oc-inet:ip-prefix)
+
+    YANG Description: The prefix member in CIDR notation -- while the
+prefix may be either IPv4 or IPv6, most
+implementations require all members of the prefix set
+to be the same address family.  Mixing address types in
+the same prefix set is likely to cause an error.
+    """
+    return self.__ip_prefix
+      
+  def _set_ip_prefix(self, v, load=False):
+    """
+    Setter method for ip_prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/state/ip_prefix (oc-inet:ip-prefix)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ip_prefix is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ip_prefix() directly.
+
+    YANG Description: The prefix member in CIDR notation -- while the
+prefix may be either IPv4 or IPv6, most
+implementations require all members of the prefix set
+to be the same address family.  Mixing address types in
+the same prefix set is likely to cause an error.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ip_prefix must be of a type compatible with oc-inet:ip-prefix""",
+          'defined-type': "oc-inet:ip-prefix",
+          'generated-type': """YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=False)""",
+        })
+
+    self.__ip_prefix = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ip_prefix(self):
+    self.__ip_prefix = YANGDynClass(base=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}/([0-9]|[12][0-9]|3[0-2])'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])'}),], is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-prefix', is_config=False)
+
+
+  def _get_masklength_range(self):
+    """
+    Getter method for masklength_range, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/state/masklength_range (string)
+
+    YANG Description: Defines a range for the masklength, or 'exact' if
+the prefix has an exact length.
+
+Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+expressed as prefix: 10.3.192.0/21,
+masklength-range: 21..24.
+
+Example: 10.3.192.0/21 would be expressed as
+prefix: 10.3.192.0/21,
+masklength-range: exact
+    """
+    return self.__masklength_range
+      
+  def _set_masklength_range(self, v, load=False):
+    """
+    Setter method for masklength_range, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/state/masklength_range (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_masklength_range is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_masklength_range() directly.
+
+    YANG Description: Defines a range for the masklength, or 'exact' if
+the prefix has an exact length.
+
+Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+expressed as prefix: 10.3.192.0/21,
+masklength-range: 21..24.
+
+Example: 10.3.192.0/21 would be expressed as
+prefix: 10.3.192.0/21,
+masklength-range: exact
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """masklength_range must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)""",
+        })
+
+    self.__masklength_range = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_masklength_range(self):
+    self.__masklength_range = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9]+\\.\\.[0-9]+)|exact)'}), is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+  ip_prefix = __builtin__.property(_get_ip_prefix)
+  masklength_range = __builtin__.property(_get_masklength_range)
+
+
+  _pyangbind_elements = OrderedDict([('ip_prefix', ip_prefix), ('masklength_range', masklength_range), ])
+
+
+class yc_prefix_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set/prefixes/prefix. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of prefixes in the prefix set
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__ip_prefix','__masklength_range','__config','__state',)
+
+  _yang_name = 'prefix'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__ip_prefix = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__masklength_range = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set', 'prefixes', 'prefix']
+
+  def _get_ip_prefix(self):
+    """
+    Getter method for ip_prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/ip_prefix (leafref)
+
+    YANG Description: Reference to the ip-prefix list key.
+    """
+    return self.__ip_prefix
+      
+  def _set_ip_prefix(self, v, load=False):
+    """
+    Setter method for ip_prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/ip_prefix (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_ip_prefix is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_ip_prefix() directly.
+
+    YANG Description: Reference to the ip-prefix list key.
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """ip_prefix must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__ip_prefix = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_ip_prefix(self):
+    self.__ip_prefix = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="ip-prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_masklength_range(self):
+    """
+    Getter method for masklength_range, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/masklength_range (leafref)
+
+    YANG Description: Reference to the masklength-range list key
+    """
+    return self.__masklength_range
+      
+  def _set_masklength_range(self, v, load=False):
+    """
+    Setter method for masklength_range, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/masklength_range (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_masklength_range is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_masklength_range() directly.
+
+    YANG Description: Reference to the masklength-range list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """masklength_range must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__masklength_range = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_masklength_range(self):
+    self.__masklength_range = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="masklength-range", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/config (container)
+
+    YANG Description: Configuration data for prefix definition
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for prefix definition
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/state (container)
+
+    YANG Description: Operational state data for prefix definition
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for prefix definition
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  ip_prefix = __builtin__.property(_get_ip_prefix, _set_ip_prefix)
+  masklength_range = __builtin__.property(_get_masklength_range, _set_masklength_range)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('ip_prefix', ip_prefix), ('masklength_range', masklength_range), ('config', config), ('state', state), ])
+
+
+class yc_prefixes_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set/prefixes. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for the list of prefixes in a policy
+prefix list
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__prefix',)
+
+  _yang_name = 'prefixes'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__prefix = YANGDynClass(base=YANGListType("ip_prefix masklength_range",yc_prefix_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix, yang_name="prefix", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='ip-prefix masklength-range', extensions=None), is_container='list', yang_name="prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set', 'prefixes']
+
+  def _get_prefix(self):
+    """
+    Getter method for prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix (list)
+
+    YANG Description: List of prefixes in the prefix set
+    """
+    return self.__prefix
+      
+  def _set_prefix(self, v, load=False):
+    """
+    Setter method for prefix, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes/prefix (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_prefix is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_prefix() directly.
+
+    YANG Description: List of prefixes in the prefix set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("ip_prefix masklength_range",yc_prefix_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix, yang_name="prefix", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='ip-prefix masklength-range', extensions=None), is_container='list', yang_name="prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """prefix must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("ip_prefix masklength_range",yc_prefix_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix, yang_name="prefix", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='ip-prefix masklength-range', extensions=None), is_container='list', yang_name="prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)""",
+        })
+
+    self.__prefix = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_prefix(self):
+    self.__prefix = YANGDynClass(base=YANGListType("ip_prefix masklength_range",yc_prefix_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes_prefix, yang_name="prefix", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='ip-prefix masklength-range', extensions=None), is_container='list', yang_name="prefix", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+  prefix = __builtin__.property(_get_prefix, _set_prefix)
+
+
+  _pyangbind_elements = OrderedDict([('prefix', prefix), ])
+
+
+class yc_prefix_set_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets/prefix-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of the defined prefix sets
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__config','__state','__prefixes',)
+
+  _yang_name = 'prefix-set'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__prefixes = YANGDynClass(base=yc_prefixes_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes, is_container='container', yang_name="prefixes", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets', 'prefix-set']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/name (leafref)
+
+    YANG Description: Reference to prefix name list key
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Reference to prefix name list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/config (container)
+
+    YANG Description: Configuration data for prefix sets
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for prefix sets
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/state (container)
+
+    YANG Description: Operational state data 
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data 
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_prefixes(self):
+    """
+    Getter method for prefixes, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes (container)
+
+    YANG Description: Enclosing container for the list of prefixes in a policy
+prefix list
+    """
+    return self.__prefixes
+      
+  def _set_prefixes(self, v, load=False):
+    """
+    Setter method for prefixes, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set/prefixes (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_prefixes is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_prefixes() directly.
+
+    YANG Description: Enclosing container for the list of prefixes in a policy
+prefix list
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_prefixes_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes, is_container='container', yang_name="prefixes", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """prefixes must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_prefixes_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes, is_container='container', yang_name="prefixes", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__prefixes = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_prefixes(self):
+    self.__prefixes = YANGDynClass(base=yc_prefixes_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set_prefixes, is_container='container', yang_name="prefixes", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  prefixes = __builtin__.property(_get_prefixes, _set_prefixes)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('config', config), ('state', state), ('prefixes', prefixes), ])
+
+
+class yc_prefix_sets_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/prefix-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container 
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__prefix_set',)
+
+  _yang_name = 'prefix-sets'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__prefix_set = YANGDynClass(base=YANGListType("name",yc_prefix_set_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set, yang_name="prefix-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'prefix-sets']
+
+  def _get_prefix_set(self):
+    """
+    Getter method for prefix_set, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set (list)
+
+    YANG Description: List of the defined prefix sets
+    """
+    return self.__prefix_set
+      
+  def _set_prefix_set(self, v, load=False):
+    """
+    Setter method for prefix_set, mapped from YANG variable /routing_policy/defined_sets/prefix_sets/prefix_set (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_prefix_set() directly.
+
+    YANG Description: List of the defined prefix sets
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name",yc_prefix_set_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set, yang_name="prefix-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """prefix_set must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name",yc_prefix_set_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set, yang_name="prefix-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)""",
+        })
+
+    self.__prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_prefix_set(self):
+    self.__prefix_set = YANGDynClass(base=YANGListType("name",yc_prefix_set_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets_prefix_set, yang_name="prefix-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+  prefix_set = __builtin__.property(_get_prefix_set, _set_prefix_set)
+
+
+  _pyangbind_elements = OrderedDict([('prefix_set', prefix_set), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/neighbor-sets/neighbor-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for neighbor sets.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__address',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    self.__address = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'neighbor-sets', 'neighbor-set', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/config/name (string)
+
+    YANG Description: name / label of the neighbor set -- this is used to
+reference the set in match conditions
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name / label of the neighbor set -- this is used to
+reference the set in match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+
+  def _get_address(self):
+    """
+    Getter method for address, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/config/address (oc-inet:ip-address)
+
+    YANG Description: List of IP addresses in the neighbor set
+    """
+    return self.__address
+      
+  def _set_address(self, v, load=False):
+    """
+    Setter method for address, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/config/address (oc-inet:ip-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_address() directly.
+
+    YANG Description: List of IP addresses in the neighbor set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """address must be of a type compatible with oc-inet:ip-address""",
+          'defined-type': "oc-inet:ip-address",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=True)""",
+        })
+
+    self.__address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_address(self):
+    self.__address = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  address = __builtin__.property(_get_address, _set_address)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('address', address), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/neighbor-sets/neighbor-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for neighbor sets.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__address',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    self.__address = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'neighbor-sets', 'neighbor-set', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/state/name (string)
+
+    YANG Description: name / label of the neighbor set -- this is used to
+reference the set in match conditions
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name / label of the neighbor set -- this is used to
+reference the set in match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+
+  def _get_address(self):
+    """
+    Getter method for address, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/state/address (oc-inet:ip-address)
+
+    YANG Description: List of IP addresses in the neighbor set
+    """
+    return self.__address
+      
+  def _set_address(self, v, load=False):
+    """
+    Setter method for address, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/state/address (oc-inet:ip-address)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_address is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_address() directly.
+
+    YANG Description: List of IP addresses in the neighbor set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """address must be of a type compatible with oc-inet:ip-address""",
+          'defined-type': "oc-inet:ip-address",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=False)""",
+        })
+
+    self.__address = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_address(self):
+    self.__address = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}'}),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))'}),]), is_leaf=False, yang_name="address", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-inet:ip-address', is_config=False)
+
+  name = __builtin__.property(_get_name)
+  address = __builtin__.property(_get_address)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('address', address), ])
+
+
+class yc_neighbor_set_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/neighbor-sets/neighbor-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of defined neighbor sets for use in policies.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__config','__state',)
+
+  _yang_name = 'neighbor-set'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'neighbor-sets', 'neighbor-set']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/name (leafref)
+
+    YANG Description: Reference to the neighbor set name list key.
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Reference to the neighbor set name list key.
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/config (container)
+
+    YANG Description: Configuration data for neighbor sets.
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for neighbor sets.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/state (container)
+
+    YANG Description: Operational state data for neighbor sets.
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for neighbor sets.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('config', config), ('state', state), ])
+
+
+class yc_neighbor_sets_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/neighbor-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for the list of neighbor set
+definitions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__neighbor_set',)
+
+  _yang_name = 'neighbor-sets'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__neighbor_set = YANGDynClass(base=YANGListType("name",yc_neighbor_set_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set, yang_name="neighbor-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'neighbor-sets']
+
+  def _get_neighbor_set(self):
+    """
+    Getter method for neighbor_set, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set (list)
+
+    YANG Description: List of defined neighbor sets for use in policies.
+    """
+    return self.__neighbor_set
+      
+  def _set_neighbor_set(self, v, load=False):
+    """
+    Setter method for neighbor_set, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets/neighbor_set (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_neighbor_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_neighbor_set() directly.
+
+    YANG Description: List of defined neighbor sets for use in policies.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name",yc_neighbor_set_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set, yang_name="neighbor-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """neighbor_set must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name",yc_neighbor_set_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set, yang_name="neighbor-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)""",
+        })
+
+    self.__neighbor_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_neighbor_set(self):
+    self.__neighbor_set = YANGDynClass(base=YANGListType("name",yc_neighbor_set_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets_neighbor_set, yang_name="neighbor-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+  neighbor_set = __builtin__.property(_get_neighbor_set, _set_neighbor_set)
+
+
+  _pyangbind_elements = OrderedDict([('neighbor_set', neighbor_set), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/tag-sets/tag-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for tag sets
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__tag_value',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    self.__tag_value = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'tag-sets', 'tag-set', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/config/name (string)
+
+    YANG Description: name / label of the tag set -- this is used to reference
+the set in match conditions
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name / label of the tag set -- this is used to reference
+the set in match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+
+  def _get_tag_value(self):
+    """
+    Getter method for tag_value, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/config/tag_value (oc-pol-types:tag-type)
+
+    YANG Description: Value of the tag set member
+    """
+    return self.__tag_value
+      
+  def _set_tag_value(self, v, load=False):
+    """
+    Setter method for tag_value, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/config/tag_value (oc-pol-types:tag-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_value() directly.
+
+    YANG Description: Value of the tag set member
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_value must be of a type compatible with oc-pol-types:tag-type""",
+          'defined-type': "oc-pol-types:tag-type",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)""",
+        })
+
+    self.__tag_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_value(self):
+    self.__tag_value = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  tag_value = __builtin__.property(_get_tag_value, _set_tag_value)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('tag_value', tag_value), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/tag-sets/tag-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for tag sets
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__tag_value',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    self.__tag_value = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'tag-sets', 'tag-set', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/state/name (string)
+
+    YANG Description: name / label of the tag set -- this is used to reference
+the set in match conditions
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name / label of the tag set -- this is used to reference
+the set in match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+
+  def _get_tag_value(self):
+    """
+    Getter method for tag_value, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/state/tag_value (oc-pol-types:tag-type)
+
+    YANG Description: Value of the tag set member
+    """
+    return self.__tag_value
+      
+  def _set_tag_value(self, v, load=False):
+    """
+    Setter method for tag_value, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/state/tag_value (oc-pol-types:tag-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_value is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_value() directly.
+
+    YANG Description: Value of the tag set member
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_value must be of a type compatible with oc-pol-types:tag-type""",
+          'defined-type': "oc-pol-types:tag-type",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)""",
+        })
+
+    self.__tag_value = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_value(self):
+    self.__tag_value = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag-value", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)
+
+  name = __builtin__.property(_get_name)
+  tag_value = __builtin__.property(_get_tag_value)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('tag_value', tag_value), ])
+
+
+class yc_tag_set_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/tag-sets/tag-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of tag set definitions.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__config','__state',)
+
+  _yang_name = 'tag-set'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'tag-sets', 'tag-set']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/name (leafref)
+
+    YANG Description: Reference to the tag set name list key
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Reference to the tag set name list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/config (container)
+
+    YANG Description: Configuration data for tag sets
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for tag sets
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/state (container)
+
+    YANG Description: Operational state data for tag sets
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for tag sets
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('config', config), ('state', state), ])
+
+
+class yc_tag_sets_openconfig_routing_policy__routing_policy_defined_sets_tag_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets/tag-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for the list of tag sets.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag_set',)
+
+  _yang_name = 'tag-sets'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag_set = YANGDynClass(base=YANGListType("name",yc_tag_set_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set, yang_name="tag-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets', 'tag-sets']
+
+  def _get_tag_set(self):
+    """
+    Getter method for tag_set, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set (list)
+
+    YANG Description: List of tag set definitions.
+    """
+    return self.__tag_set
+      
+  def _set_tag_set(self, v, load=False):
+    """
+    Setter method for tag_set, mapped from YANG variable /routing_policy/defined_sets/tag_sets/tag_set (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_set() directly.
+
+    YANG Description: List of tag set definitions.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name",yc_tag_set_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set, yang_name="tag-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_set must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name",yc_tag_set_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set, yang_name="tag-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)""",
+        })
+
+    self.__tag_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_set(self):
+    self.__tag_set = YANGDynClass(base=YANGListType("name",yc_tag_set_openconfig_routing_policy__routing_policy_defined_sets_tag_sets_tag_set, yang_name="tag-set", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+  tag_set = __builtin__.property(_get_tag_set, _set_tag_set)
+
+
+  _pyangbind_elements = OrderedDict([('tag_set', tag_set), ])
+
+
+class yc_defined_sets_openconfig_routing_policy__routing_policy_defined_sets(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/defined-sets. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Predefined sets of attributes used in policy match
+statements
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__prefix_sets','__neighbor_sets','__tag_sets',)
+
+  _yang_name = 'defined-sets'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__prefix_sets = YANGDynClass(base=yc_prefix_sets_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets, is_container='container', yang_name="prefix-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__neighbor_sets = YANGDynClass(base=yc_neighbor_sets_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets, is_container='container', yang_name="neighbor-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__tag_sets = YANGDynClass(base=yc_tag_sets_openconfig_routing_policy__routing_policy_defined_sets_tag_sets, is_container='container', yang_name="tag-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'defined-sets']
+
+  def _get_prefix_sets(self):
+    """
+    Getter method for prefix_sets, mapped from YANG variable /routing_policy/defined_sets/prefix_sets (container)
+
+    YANG Description: Enclosing container 
+    """
+    return self.__prefix_sets
+      
+  def _set_prefix_sets(self, v, load=False):
+    """
+    Setter method for prefix_sets, mapped from YANG variable /routing_policy/defined_sets/prefix_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_prefix_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_prefix_sets() directly.
+
+    YANG Description: Enclosing container 
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_prefix_sets_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets, is_container='container', yang_name="prefix-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """prefix_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_prefix_sets_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets, is_container='container', yang_name="prefix-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__prefix_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_prefix_sets(self):
+    self.__prefix_sets = YANGDynClass(base=yc_prefix_sets_openconfig_routing_policy__routing_policy_defined_sets_prefix_sets, is_container='container', yang_name="prefix-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_neighbor_sets(self):
+    """
+    Getter method for neighbor_sets, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets (container)
+
+    YANG Description: Enclosing container for the list of neighbor set
+definitions
+    """
+    return self.__neighbor_sets
+      
+  def _set_neighbor_sets(self, v, load=False):
+    """
+    Setter method for neighbor_sets, mapped from YANG variable /routing_policy/defined_sets/neighbor_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_neighbor_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_neighbor_sets() directly.
+
+    YANG Description: Enclosing container for the list of neighbor set
+definitions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_neighbor_sets_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets, is_container='container', yang_name="neighbor-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """neighbor_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_neighbor_sets_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets, is_container='container', yang_name="neighbor-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__neighbor_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_neighbor_sets(self):
+    self.__neighbor_sets = YANGDynClass(base=yc_neighbor_sets_openconfig_routing_policy__routing_policy_defined_sets_neighbor_sets, is_container='container', yang_name="neighbor-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_tag_sets(self):
+    """
+    Getter method for tag_sets, mapped from YANG variable /routing_policy/defined_sets/tag_sets (container)
+
+    YANG Description: Enclosing container for the list of tag sets.
+    """
+    return self.__tag_sets
+      
+  def _set_tag_sets(self, v, load=False):
+    """
+    Setter method for tag_sets, mapped from YANG variable /routing_policy/defined_sets/tag_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_sets() directly.
+
+    YANG Description: Enclosing container for the list of tag sets.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_tag_sets_openconfig_routing_policy__routing_policy_defined_sets_tag_sets, is_container='container', yang_name="tag-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_tag_sets_openconfig_routing_policy__routing_policy_defined_sets_tag_sets, is_container='container', yang_name="tag-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__tag_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_sets(self):
+    self.__tag_sets = YANGDynClass(base=yc_tag_sets_openconfig_routing_policy__routing_policy_defined_sets_tag_sets, is_container='container', yang_name="tag-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  prefix_sets = __builtin__.property(_get_prefix_sets, _set_prefix_sets)
+  neighbor_sets = __builtin__.property(_get_neighbor_sets, _set_neighbor_sets)
+  tag_sets = __builtin__.property(_get_tag_sets, _set_tag_sets)
+
+
+  _pyangbind_elements = OrderedDict([('prefix_sets', prefix_sets), ('neighbor_sets', neighbor_sets), ('tag_sets', tag_sets), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for policy defintions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/config/name (string)
+
+    YANG Description: Name of the top-level policy definition -- this name
+is used in references to the current policy
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Name of the top-level policy definition -- this name
+is used in references to the current policy
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for policy definitions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/state/name (string)
+
+    YANG Description: Name of the top-level policy definition -- this name
+is used in references to the current policy
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Name of the top-level policy definition -- this name
+is used in references to the current policy
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+  name = __builtin__.property(_get_name)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for policy statements
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'config']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/config/name (string)
+
+    YANG Description: name of the policy statement
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/config/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name of the policy statement
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for policy statements
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'state']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/state/name (string)
+
+    YANG Description: name of the policy statement
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/state/name (string)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: name of the policy statement
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with string""",
+          'defined-type': "string",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='string', is_config=False)
+
+  name = __builtin__.property(_get_name)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for policy conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__call_policy','__install_protocol_eq',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__call_policy = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__install_protocol_eq = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'config']
+
+  def _get_call_policy(self):
+    """
+    Getter method for call_policy, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/config/call_policy (leafref)
+
+    YANG Description: Applies the statements from the specified policy
+definition and then returns control the current
+policy statement. Note that the called policy may
+itself call other policies (subject to
+implementation limitations). This is intended to
+provide a policy 'subroutine' capability.  The
+called policy should contain an explicit or a
+default route disposition that returns an
+effective true (accept-route) or false
+(reject-route), otherwise the behavior may be
+ambiguous and implementation dependent
+    """
+    return self.__call_policy
+      
+  def _set_call_policy(self, v, load=False):
+    """
+    Setter method for call_policy, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/config/call_policy (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_call_policy is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_call_policy() directly.
+
+    YANG Description: Applies the statements from the specified policy
+definition and then returns control the current
+policy statement. Note that the called policy may
+itself call other policies (subject to
+implementation limitations). This is intended to
+provide a policy 'subroutine' capability.  The
+called policy should contain an explicit or a
+default route disposition that returns an
+effective true (accept-route) or false
+(reject-route), otherwise the behavior may be
+ambiguous and implementation dependent
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """call_policy must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__call_policy = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_call_policy(self):
+    self.__call_policy = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_install_protocol_eq(self):
+    """
+    Getter method for install_protocol_eq, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/config/install_protocol_eq (identityref)
+
+    YANG Description: Condition to check the protocol / method used to install
+the route into the local routing table
+    """
+    return self.__install_protocol_eq
+      
+  def _set_install_protocol_eq(self, v, load=False):
+    """
+    Setter method for install_protocol_eq, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/config/install_protocol_eq (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_install_protocol_eq is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_install_protocol_eq() directly.
+
+    YANG Description: Condition to check the protocol / method used to install
+the route into the local routing table
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """install_protocol_eq must be of a type compatible with identityref""",
+          'defined-type': "openconfig-routing-policy:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=True)""",
+        })
+
+    self.__install_protocol_eq = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_install_protocol_eq(self):
+    self.__install_protocol_eq = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=True)
+
+  call_policy = __builtin__.property(_get_call_policy, _set_call_policy)
+  install_protocol_eq = __builtin__.property(_get_install_protocol_eq, _set_install_protocol_eq)
+
+
+  _pyangbind_elements = OrderedDict([('call_policy', call_policy), ('install_protocol_eq', install_protocol_eq), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for policy conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__call_policy','__install_protocol_eq',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__call_policy = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    self.__install_protocol_eq = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'state']
+
+  def _get_call_policy(self):
+    """
+    Getter method for call_policy, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/state/call_policy (leafref)
+
+    YANG Description: Applies the statements from the specified policy
+definition and then returns control the current
+policy statement. Note that the called policy may
+itself call other policies (subject to
+implementation limitations). This is intended to
+provide a policy 'subroutine' capability.  The
+called policy should contain an explicit or a
+default route disposition that returns an
+effective true (accept-route) or false
+(reject-route), otherwise the behavior may be
+ambiguous and implementation dependent
+    """
+    return self.__call_policy
+      
+  def _set_call_policy(self, v, load=False):
+    """
+    Setter method for call_policy, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/state/call_policy (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_call_policy is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_call_policy() directly.
+
+    YANG Description: Applies the statements from the specified policy
+definition and then returns control the current
+policy statement. Note that the called policy may
+itself call other policies (subject to
+implementation limitations). This is intended to
+provide a policy 'subroutine' capability.  The
+called policy should contain an explicit or a
+default route disposition that returns an
+effective true (accept-route) or false
+(reject-route), otherwise the behavior may be
+ambiguous and implementation dependent
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """call_policy must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__call_policy = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_call_policy(self):
+    self.__call_policy = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="call-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+
+  def _get_install_protocol_eq(self):
+    """
+    Getter method for install_protocol_eq, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/state/install_protocol_eq (identityref)
+
+    YANG Description: Condition to check the protocol / method used to install
+the route into the local routing table
+    """
+    return self.__install_protocol_eq
+      
+  def _set_install_protocol_eq(self, v, load=False):
+    """
+    Setter method for install_protocol_eq, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/state/install_protocol_eq (identityref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_install_protocol_eq is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_install_protocol_eq() directly.
+
+    YANG Description: Condition to check the protocol / method used to install
+the route into the local routing table
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """install_protocol_eq must be of a type compatible with identityref""",
+          'defined-type': "openconfig-routing-policy:identityref",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=False)""",
+        })
+
+    self.__install_protocol_eq = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_install_protocol_eq(self):
+    self.__install_protocol_eq = YANGDynClass(base=RestrictedClassType(base_type=six.text_type, restriction_type="dict_key", restriction_arg={'BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:BGP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:ISIS': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:OSPF3': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:STATIC': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:DIRECTLY_CONNECTED': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL_AGGREGATE': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PIM': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:IGMP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:GRIBI': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:PCEP': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}, 'oc-pol-types:LOCAL': {'@module': 'openconfig-policy-types', '@namespace': 'http://openconfig.net/yang/policy-types'}},), is_leaf=True, yang_name="install-protocol-eq", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='identityref', is_config=False)
+
+  call_policy = __builtin__.property(_get_call_policy)
+  install_protocol_eq = __builtin__.property(_get_install_protocol_eq)
+
+
+  _pyangbind_elements = OrderedDict([('call_policy', call_policy), ('install_protocol_eq', install_protocol_eq), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-interface/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for interface match conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface','__subinterface',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-interface', 'config']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/config/interface (leafref)
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/config/interface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/config/subinterface (leafref)
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/config/subinterface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+  interface = __builtin__.property(_get_interface, _set_interface)
+  subinterface = __builtin__.property(_get_subinterface, _set_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ('subinterface', subinterface), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-interface/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for interface match conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__interface','__subinterface',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-interface', 'state']
+
+  def _get_interface(self):
+    """
+    Getter method for interface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/state/interface (leafref)
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    return self.__interface
+      
+  def _set_interface(self, v, load=False):
+    """
+    Setter method for interface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/state/interface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_interface() directly.
+
+    YANG Description: Reference to a base interface.  If a reference to a
+subinterface is required, this leaf must be specified
+to indicate the base interface.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """interface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_interface(self):
+    self.__interface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+
+  def _get_subinterface(self):
+    """
+    Getter method for subinterface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/state/subinterface (leafref)
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    return self.__subinterface
+      
+  def _set_subinterface(self, v, load=False):
+    """
+    Setter method for subinterface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/state/subinterface (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_subinterface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_subinterface() directly.
+
+    YANG Description: Reference to a subinterface -- this requires the base
+interface to be specified using the interface leaf in
+this container.  If only a reference to a base interface
+is requuired, this leaf should not be set.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """subinterface must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__subinterface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_subinterface(self):
+    self.__subinterface = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="subinterface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+  interface = __builtin__.property(_get_interface)
+  subinterface = __builtin__.property(_get_subinterface)
+
+
+  _pyangbind_elements = OrderedDict([('interface', interface), ('subinterface', subinterface), ])
+
+
+class yc_match_interface_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-interface. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top-level container for interface match conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'match-interface'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-interface']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/config (container)
+
+    YANG Description: Configuration data for interface match conditions
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for interface match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/state (container)
+
+    YANG Description: Operational state data for interface match conditions
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for interface match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-prefix-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for a prefix-set condition
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__prefix_set','__match_set_options',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-prefix-set', 'config']
+
+  def _get_prefix_set(self):
+    """
+    Getter method for prefix_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/config/prefix_set (leafref)
+
+    YANG Description: References a defined prefix set
+    """
+    return self.__prefix_set
+      
+  def _set_prefix_set(self, v, load=False):
+    """
+    Setter method for prefix_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/config/prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_prefix_set() directly.
+
+    YANG Description: References a defined prefix set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_prefix_set(self):
+    self.__prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_match_set_options(self):
+    """
+    Getter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/config/match_set_options (oc-pol-types:match-set-options-restricted-type)
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    return self.__match_set_options
+      
+  def _set_match_set_options(self, v, load=False):
+    """
+    Setter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/config/match_set_options (oc-pol-types:match-set-options-restricted-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_set_options is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_set_options() directly.
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_set_options must be of a type compatible with oc-pol-types:match-set-options-restricted-type""",
+          'defined-type': "oc-pol-types:match-set-options-restricted-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)""",
+        })
+
+    self.__match_set_options = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_set_options(self):
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+
+  prefix_set = __builtin__.property(_get_prefix_set, _set_prefix_set)
+  match_set_options = __builtin__.property(_get_match_set_options, _set_match_set_options)
+
+
+  _pyangbind_elements = OrderedDict([('prefix_set', prefix_set), ('match_set_options', match_set_options), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-prefix-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for a prefix-set condition
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__prefix_set','__match_set_options',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-prefix-set', 'state']
+
+  def _get_prefix_set(self):
+    """
+    Getter method for prefix_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/state/prefix_set (leafref)
+
+    YANG Description: References a defined prefix set
+    """
+    return self.__prefix_set
+      
+  def _set_prefix_set(self, v, load=False):
+    """
+    Setter method for prefix_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/state/prefix_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_prefix_set() directly.
+
+    YANG Description: References a defined prefix set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """prefix_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_prefix_set(self):
+    self.__prefix_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+
+  def _get_match_set_options(self):
+    """
+    Getter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/state/match_set_options (oc-pol-types:match-set-options-restricted-type)
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    return self.__match_set_options
+      
+  def _set_match_set_options(self, v, load=False):
+    """
+    Setter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/state/match_set_options (oc-pol-types:match-set-options-restricted-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_set_options is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_set_options() directly.
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_set_options must be of a type compatible with oc-pol-types:match-set-options-restricted-type""",
+          'defined-type': "oc-pol-types:match-set-options-restricted-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)""",
+        })
+
+    self.__match_set_options = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_set_options(self):
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+
+  prefix_set = __builtin__.property(_get_prefix_set)
+  match_set_options = __builtin__.property(_get_match_set_options)
+
+
+  _pyangbind_elements = OrderedDict([('prefix_set', prefix_set), ('match_set_options', match_set_options), ])
+
+
+class yc_match_prefix_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-prefix-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Match a referenced prefix-set according to the logic
+defined in the match-set-options leaf
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'match-prefix-set'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-prefix-set']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/config (container)
+
+    YANG Description: Configuration data for a prefix-set condition
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for a prefix-set condition
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/state (container)
+
+    YANG Description: Operational state data for a prefix-set condition
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for a prefix-set condition
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-neighbor-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data 
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__neighbor_set','__match_set_options',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__neighbor_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-neighbor-set', 'config']
+
+  def _get_neighbor_set(self):
+    """
+    Getter method for neighbor_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/config/neighbor_set (leafref)
+
+    YANG Description: References a defined neighbor set
+    """
+    return self.__neighbor_set
+      
+  def _set_neighbor_set(self, v, load=False):
+    """
+    Setter method for neighbor_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/config/neighbor_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_neighbor_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_neighbor_set() directly.
+
+    YANG Description: References a defined neighbor set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """neighbor_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__neighbor_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_neighbor_set(self):
+    self.__neighbor_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_match_set_options(self):
+    """
+    Getter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/config/match_set_options (oc-pol-types:match-set-options-restricted-type)
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    return self.__match_set_options
+      
+  def _set_match_set_options(self, v, load=False):
+    """
+    Setter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/config/match_set_options (oc-pol-types:match-set-options-restricted-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_set_options is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_set_options() directly.
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_set_options must be of a type compatible with oc-pol-types:match-set-options-restricted-type""",
+          'defined-type': "oc-pol-types:match-set-options-restricted-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)""",
+        })
+
+    self.__match_set_options = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_set_options(self):
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+
+  neighbor_set = __builtin__.property(_get_neighbor_set, _set_neighbor_set)
+  match_set_options = __builtin__.property(_get_match_set_options, _set_match_set_options)
+
+
+  _pyangbind_elements = OrderedDict([('neighbor_set', neighbor_set), ('match_set_options', match_set_options), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-neighbor-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data 
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__neighbor_set','__match_set_options',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__neighbor_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-neighbor-set', 'state']
+
+  def _get_neighbor_set(self):
+    """
+    Getter method for neighbor_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/state/neighbor_set (leafref)
+
+    YANG Description: References a defined neighbor set
+    """
+    return self.__neighbor_set
+      
+  def _set_neighbor_set(self, v, load=False):
+    """
+    Setter method for neighbor_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/state/neighbor_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_neighbor_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_neighbor_set() directly.
+
+    YANG Description: References a defined neighbor set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """neighbor_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__neighbor_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_neighbor_set(self):
+    self.__neighbor_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+
+  def _get_match_set_options(self):
+    """
+    Getter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/state/match_set_options (oc-pol-types:match-set-options-restricted-type)
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    return self.__match_set_options
+      
+  def _set_match_set_options(self, v, load=False):
+    """
+    Setter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/state/match_set_options (oc-pol-types:match-set-options-restricted-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_set_options is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_set_options() directly.
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_set_options must be of a type compatible with oc-pol-types:match-set-options-restricted-type""",
+          'defined-type': "oc-pol-types:match-set-options-restricted-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)""",
+        })
+
+    self.__match_set_options = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_set_options(self):
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+
+  neighbor_set = __builtin__.property(_get_neighbor_set)
+  match_set_options = __builtin__.property(_get_match_set_options)
+
+
+  _pyangbind_elements = OrderedDict([('neighbor_set', neighbor_set), ('match_set_options', match_set_options), ])
+
+
+class yc_match_neighbor_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-neighbor-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Match a referenced neighbor set according to the logic
+defined in the match-set-options-leaf
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'match-neighbor-set'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-neighbor-set']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/config (container)
+
+    YANG Description: Configuration data 
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data 
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/state (container)
+
+    YANG Description: Operational state data 
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data 
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-tag-set/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for tag-set conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag_set','__match_set_options',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-tag-set', 'config']
+
+  def _get_tag_set(self):
+    """
+    Getter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/config/tag_set (leafref)
+
+    YANG Description: References a defined tag set
+    """
+    return self.__tag_set
+      
+  def _set_tag_set(self, v, load=False):
+    """
+    Setter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/config/tag_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_set() directly.
+
+    YANG Description: References a defined tag set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__tag_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_set(self):
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_match_set_options(self):
+    """
+    Getter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/config/match_set_options (oc-pol-types:match-set-options-restricted-type)
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    return self.__match_set_options
+      
+  def _set_match_set_options(self, v, load=False):
+    """
+    Setter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/config/match_set_options (oc-pol-types:match-set-options-restricted-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_set_options is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_set_options() directly.
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_set_options must be of a type compatible with oc-pol-types:match-set-options-restricted-type""",
+          'defined-type': "oc-pol-types:match-set-options-restricted-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)""",
+        })
+
+    self.__match_set_options = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_set_options(self):
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=True)
+
+  tag_set = __builtin__.property(_get_tag_set, _set_tag_set)
+  match_set_options = __builtin__.property(_get_match_set_options, _set_match_set_options)
+
+
+  _pyangbind_elements = OrderedDict([('tag_set', tag_set), ('match_set_options', match_set_options), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-tag-set/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data tag-set conditions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag_set','__match_set_options',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-tag-set', 'state']
+
+  def _get_tag_set(self):
+    """
+    Getter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/state/tag_set (leafref)
+
+    YANG Description: References a defined tag set
+    """
+    return self.__tag_set
+      
+  def _set_tag_set(self, v, load=False):
+    """
+    Setter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/state/tag_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_set() directly.
+
+    YANG Description: References a defined tag set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__tag_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_set(self):
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+
+  def _get_match_set_options(self):
+    """
+    Getter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/state/match_set_options (oc-pol-types:match-set-options-restricted-type)
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    return self.__match_set_options
+      
+  def _set_match_set_options(self, v, load=False):
+    """
+    Setter method for match_set_options, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/state/match_set_options (oc-pol-types:match-set-options-restricted-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_set_options is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_set_options() directly.
+
+    YANG Description: Optional parameter that governs the behaviour of the
+match operation.  This leaf only supports matching on ANY
+member of the set or inverting the match.  Matching on ALL is
+not supported
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_set_options must be of a type compatible with oc-pol-types:match-set-options-restricted-type""",
+          'defined-type': "oc-pol-types:match-set-options-restricted-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)""",
+        })
+
+    self.__match_set_options = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_set_options(self):
+    self.__match_set_options = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ANY': {}, 'INVERT': {}},), default=six.text_type("ANY"), is_leaf=True, yang_name="match-set-options", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:match-set-options-restricted-type', is_config=False)
+
+  tag_set = __builtin__.property(_get_tag_set)
+  match_set_options = __builtin__.property(_get_match_set_options)
+
+
+  _pyangbind_elements = OrderedDict([('tag_set', tag_set), ('match_set_options', match_set_options), ])
+
+
+class yc_match_tag_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions/match-tag-set. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Match a referenced tag set according to the logic defined
+in the match-options-set leaf
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'match-tag-set'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions', 'match-tag-set']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/config (container)
+
+    YANG Description: Configuration data for tag-set conditions
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for tag-set conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/state (container)
+
+    YANG Description: Operational state data tag-set conditions
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data tag-set conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_conditions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/conditions. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Condition statements for the current policy statement
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state','__match_interface','__match_prefix_set','__match_neighbor_set','__match_tag_set',)
+
+  _yang_name = 'conditions'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__match_interface = YANGDynClass(base=yc_match_interface_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface, is_container='container', yang_name="match-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__match_prefix_set = YANGDynClass(base=yc_match_prefix_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set, is_container='container', yang_name="match-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__match_neighbor_set = YANGDynClass(base=yc_match_neighbor_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set, is_container='container', yang_name="match-neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__match_tag_set = YANGDynClass(base=yc_match_tag_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set, is_container='container', yang_name="match-tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'conditions']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/config (container)
+
+    YANG Description: Configuration data for policy conditions
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for policy conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/state (container)
+
+    YANG Description: Operational state data for policy conditions
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for policy conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_match_interface(self):
+    """
+    Getter method for match_interface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface (container)
+
+    YANG Description: Top-level container for interface match conditions
+    """
+    return self.__match_interface
+      
+  def _set_match_interface(self, v, load=False):
+    """
+    Setter method for match_interface, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_interface (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_interface is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_interface() directly.
+
+    YANG Description: Top-level container for interface match conditions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_match_interface_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface, is_container='container', yang_name="match-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_interface must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_match_interface_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface, is_container='container', yang_name="match-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__match_interface = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_interface(self):
+    self.__match_interface = YANGDynClass(base=yc_match_interface_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_interface, is_container='container', yang_name="match-interface", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_match_prefix_set(self):
+    """
+    Getter method for match_prefix_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set (container)
+
+    YANG Description: Match a referenced prefix-set according to the logic
+defined in the match-set-options leaf
+    """
+    return self.__match_prefix_set
+      
+  def _set_match_prefix_set(self, v, load=False):
+    """
+    Setter method for match_prefix_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_prefix_set (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_prefix_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_prefix_set() directly.
+
+    YANG Description: Match a referenced prefix-set according to the logic
+defined in the match-set-options leaf
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_match_prefix_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set, is_container='container', yang_name="match-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_prefix_set must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_match_prefix_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set, is_container='container', yang_name="match-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__match_prefix_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_prefix_set(self):
+    self.__match_prefix_set = YANGDynClass(base=yc_match_prefix_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_prefix_set, is_container='container', yang_name="match-prefix-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_match_neighbor_set(self):
+    """
+    Getter method for match_neighbor_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set (container)
+
+    YANG Description: Match a referenced neighbor set according to the logic
+defined in the match-set-options-leaf
+    """
+    return self.__match_neighbor_set
+      
+  def _set_match_neighbor_set(self, v, load=False):
+    """
+    Setter method for match_neighbor_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_neighbor_set (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_neighbor_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_neighbor_set() directly.
+
+    YANG Description: Match a referenced neighbor set according to the logic
+defined in the match-set-options-leaf
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_match_neighbor_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set, is_container='container', yang_name="match-neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_neighbor_set must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_match_neighbor_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set, is_container='container', yang_name="match-neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__match_neighbor_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_neighbor_set(self):
+    self.__match_neighbor_set = YANGDynClass(base=yc_match_neighbor_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_neighbor_set, is_container='container', yang_name="match-neighbor-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_match_tag_set(self):
+    """
+    Getter method for match_tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set (container)
+
+    YANG Description: Match a referenced tag set according to the logic defined
+in the match-options-set leaf
+    """
+    return self.__match_tag_set
+      
+  def _set_match_tag_set(self, v, load=False):
+    """
+    Setter method for match_tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions/match_tag_set (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_match_tag_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_match_tag_set() directly.
+
+    YANG Description: Match a referenced tag set according to the logic defined
+in the match-options-set leaf
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_match_tag_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set, is_container='container', yang_name="match-tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """match_tag_set must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_match_tag_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set, is_container='container', yang_name="match-tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__match_tag_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_match_tag_set(self):
+    self.__match_tag_set = YANGDynClass(base=yc_match_tag_set_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions_match_tag_set, is_container='container', yang_name="match-tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  match_interface = __builtin__.property(_get_match_interface, _set_match_interface)
+  match_prefix_set = __builtin__.property(_get_match_prefix_set, _set_match_prefix_set)
+  match_neighbor_set = __builtin__.property(_get_match_neighbor_set, _set_match_neighbor_set)
+  match_tag_set = __builtin__.property(_get_match_tag_set, _set_match_tag_set)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ('match_interface', match_interface), ('match_prefix_set', match_prefix_set), ('match_neighbor_set', match_neighbor_set), ('match_tag_set', match_tag_set), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration data for policy actions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__policy_result',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__policy_result = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'config']
+
+  def _get_policy_result(self):
+    """
+    Getter method for policy_result, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/config/policy_result (policy-result-type)
+
+    YANG Description: Select the final disposition for the route, either
+accept or reject.
+    """
+    return self.__policy_result
+      
+  def _set_policy_result(self, v, load=False):
+    """
+    Setter method for policy_result, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/config/policy_result (policy-result-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_policy_result is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_policy_result() directly.
+
+    YANG Description: Select the final disposition for the route, either
+accept or reject.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """policy_result must be of a type compatible with policy-result-type""",
+          'defined-type': "openconfig-routing-policy:policy-result-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=True)""",
+        })
+
+    self.__policy_result = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_policy_result(self):
+    self.__policy_result = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=True)
+
+  policy_result = __builtin__.property(_get_policy_result, _set_policy_result)
+
+
+  _pyangbind_elements = OrderedDict([('policy_result', policy_result), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state data for policy actions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__policy_result',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__policy_result = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'state']
+
+  def _get_policy_result(self):
+    """
+    Getter method for policy_result, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/state/policy_result (policy-result-type)
+
+    YANG Description: Select the final disposition for the route, either
+accept or reject.
+    """
+    return self.__policy_result
+      
+  def _set_policy_result(self, v, load=False):
+    """
+    Setter method for policy_result, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/state/policy_result (policy-result-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_policy_result is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_policy_result() directly.
+
+    YANG Description: Select the final disposition for the route, either
+accept or reject.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """policy_result must be of a type compatible with policy-result-type""",
+          'defined-type': "openconfig-routing-policy:policy-result-type",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=False)""",
+        })
+
+    self.__policy_result = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_policy_result(self):
+    self.__policy_result = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'ACCEPT_ROUTE': {}, 'REJECT_ROUTE': {}},), is_leaf=True, yang_name="policy-result", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='policy-result-type', is_config=False)
+
+  policy_result = __builtin__.property(_get_policy_result)
+
+
+  _pyangbind_elements = OrderedDict([('policy_result', policy_result), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration of tag application
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__mode',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'config']
+
+  def _get_mode(self):
+    """
+    Getter method for mode, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/config/mode (enumeration)
+
+    YANG Description: This leaf controls the source of the tags that are set as a result
+of the action. In the case that the INLINE value is specified, the
+list of tags specified within the action is applied to matching prefixes.
+In the case that the REFERENCE value is specified, a pre-defined set of
+tags is utilised.
+    """
+    return self.__mode
+      
+  def _set_mode(self, v, load=False):
+    """
+    Setter method for mode, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/config/mode (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mode is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mode() directly.
+
+    YANG Description: This leaf controls the source of the tags that are set as a result
+of the action. In the case that the INLINE value is specified, the
+list of tags specified within the action is applied to matching prefixes.
+In the case that the REFERENCE value is specified, a pre-defined set of
+tags is utilised.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mode must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-routing-policy:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)""",
+        })
+
+    self.__mode = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mode(self):
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=True)
+
+  mode = __builtin__.property(_get_mode, _set_mode)
+
+
+  _pyangbind_elements = OrderedDict([('mode', mode), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state related to tag application.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__mode',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'state']
+
+  def _get_mode(self):
+    """
+    Getter method for mode, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/state/mode (enumeration)
+
+    YANG Description: This leaf controls the source of the tags that are set as a result
+of the action. In the case that the INLINE value is specified, the
+list of tags specified within the action is applied to matching prefixes.
+In the case that the REFERENCE value is specified, a pre-defined set of
+tags is utilised.
+    """
+    return self.__mode
+      
+  def _set_mode(self, v, load=False):
+    """
+    Setter method for mode, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/state/mode (enumeration)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_mode is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_mode() directly.
+
+    YANG Description: This leaf controls the source of the tags that are set as a result
+of the action. In the case that the INLINE value is specified, the
+list of tags specified within the action is applied to matching prefixes.
+In the case that the REFERENCE value is specified, a pre-defined set of
+tags is utilised.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """mode must be of a type compatible with enumeration""",
+          'defined-type': "openconfig-routing-policy:enumeration",
+          'generated-type': """YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)""",
+        })
+
+    self.__mode = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_mode(self):
+    self.__mode = YANGDynClass(base=RestrictedClassType(base_type=six.text_type,                                     restriction_type="dict_key",                                     restriction_arg={'INLINE': {}, 'REFERENCE': {}},), is_leaf=True, yang_name="mode", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='enumeration', is_config=False)
+
+  mode = __builtin__.property(_get_mode)
+
+
+  _pyangbind_elements = OrderedDict([('mode', mode), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/inline/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration values related to in-line tag specification.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'inline', 'config']
+
+  def _get_tag(self):
+    """
+    Getter method for tag, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/config/tag (oc-pol-types:tag-type)
+
+    YANG Description: Set one or more tags for prefixes that match the specified condition(s)
+using the specified tag values. When a tag is set it MUST be possible to
+match the value set in subsequent policies on the local device. Where the
+protocol that is carrying the prefix has a tag field (OSPF, and IS-IS in
+particular) the tag MUST be set in the corresponding protocol advertisements
+of the prefix.
+    """
+    return self.__tag
+      
+  def _set_tag(self, v, load=False):
+    """
+    Setter method for tag, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/config/tag (oc-pol-types:tag-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag() directly.
+
+    YANG Description: Set one or more tags for prefixes that match the specified condition(s)
+using the specified tag values. When a tag is set it MUST be possible to
+match the value set in subsequent policies on the local device. Where the
+protocol that is carrying the prefix has a tag field (OSPF, and IS-IS in
+particular) the tag MUST be set in the corresponding protocol advertisements
+of the prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag must be of a type compatible with oc-pol-types:tag-type""",
+          'defined-type': "oc-pol-types:tag-type",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)""",
+        })
+
+    self.__tag = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag(self):
+    self.__tag = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=True)
+
+  tag = __builtin__.property(_get_tag, _set_tag)
+
+
+  _pyangbind_elements = OrderedDict([('tag', tag), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/inline/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state related to in-line tag specification.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'inline', 'state']
+
+  def _get_tag(self):
+    """
+    Getter method for tag, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/state/tag (oc-pol-types:tag-type)
+
+    YANG Description: Set one or more tags for prefixes that match the specified condition(s)
+using the specified tag values. When a tag is set it MUST be possible to
+match the value set in subsequent policies on the local device. Where the
+protocol that is carrying the prefix has a tag field (OSPF, and IS-IS in
+particular) the tag MUST be set in the corresponding protocol advertisements
+of the prefix.
+    """
+    return self.__tag
+      
+  def _set_tag(self, v, load=False):
+    """
+    Setter method for tag, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/state/tag (oc-pol-types:tag-type)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag() directly.
+
+    YANG Description: Set one or more tags for prefixes that match the specified condition(s)
+using the specified tag values. When a tag is set it MUST be possible to
+match the value set in subsequent policies on the local device. Where the
+protocol that is carrying the prefix has a tag field (OSPF, and IS-IS in
+particular) the tag MUST be set in the corresponding protocol advertisements
+of the prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag must be of a type compatible with oc-pol-types:tag-type""",
+          'defined-type': "oc-pol-types:tag-type",
+          'generated-type': """YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)""",
+        })
+
+    self.__tag = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag(self):
+    self.__tag = YANGDynClass(unique=True, base=TypedListType(allowed_type=[RestrictedClassType(base_type=long, restriction_dict={'range': ['0..4294967295']}, int_size=32),RestrictedClassType(base_type=six.text_type, restriction_dict={'pattern': '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?'}),]), is_leaf=False, yang_name="tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='oc-pol-types:tag-type', is_config=False)
+
+  tag = __builtin__.property(_get_tag)
+
+
+  _pyangbind_elements = OrderedDict([('tag', tag), ])
+
+
+class yc_inline_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/inline. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: The tags specified in this container are set on a route using
+the values directly. It is applicable when the mode of application
+is explicitly specified as INLINE.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'inline'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'inline']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/config (container)
+
+    YANG Description: Configuration values related to in-line tag specification.
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration values related to in-line tag specification.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/state (container)
+
+    YANG Description: Operational state related to in-line tag specification.
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state related to in-line tag specification.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_config(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/reference/config. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Configuration values related to specifying a tag-set to be applied to
+a route.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag_set',)
+
+  _yang_name = 'config'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'reference', 'config']
+
+  def _get_tag_set(self):
+    """
+    Getter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/config/tag_set (leafref)
+
+    YANG Description: Use the referenced tag-set to set tags on the prefixes that match the
+specified conditions. When a tag is set it MUST be possible to match the
+value set in subsequent policies on the local device. where the protocol that
+is carrying the prefix has a tag field (OSPF, and IS-IS for in particular)
+the tag MUST be set in the corresponding protocol advertisements of the
+prefix.
+    """
+    return self.__tag_set
+      
+  def _set_tag_set(self, v, load=False):
+    """
+    Setter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/config/tag_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_set() directly.
+
+    YANG Description: Use the referenced tag-set to set tags on the prefixes that match the
+specified conditions. When a tag is set it MUST be possible to match the
+value set in subsequent policies on the local device. where the protocol that
+is carrying the prefix has a tag field (OSPF, and IS-IS for in particular)
+the tag MUST be set in the corresponding protocol advertisements of the
+prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__tag_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_set(self):
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+  tag_set = __builtin__.property(_get_tag_set, _set_tag_set)
+
+
+  _pyangbind_elements = OrderedDict([('tag_set', tag_set), ])
+
+
+class yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_state(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/reference/state. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Operational state related to specifying a tag-set to be applied to a
+route.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__tag_set',)
+
+  _yang_name = 'state'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'reference', 'state']
+
+  def _get_tag_set(self):
+    """
+    Getter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/state/tag_set (leafref)
+
+    YANG Description: Use the referenced tag-set to set tags on the prefixes that match the
+specified conditions. When a tag is set it MUST be possible to match the
+value set in subsequent policies on the local device. where the protocol that
+is carrying the prefix has a tag field (OSPF, and IS-IS for in particular)
+the tag MUST be set in the corresponding protocol advertisements of the
+prefix.
+    """
+    return self.__tag_set
+      
+  def _set_tag_set(self, v, load=False):
+    """
+    Setter method for tag_set, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/state/tag_set (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_tag_set is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_tag_set() directly.
+
+    YANG Description: Use the referenced tag-set to set tags on the prefixes that match the
+specified conditions. When a tag is set it MUST be possible to match the
+value set in subsequent policies on the local device. where the protocol that
+is carrying the prefix has a tag field (OSPF, and IS-IS for in particular)
+the tag MUST be set in the corresponding protocol advertisements of the
+prefix.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """tag_set must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)""",
+        })
+
+    self.__tag_set = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_tag_set(self):
+    self.__tag_set = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="tag-set", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=False)
+
+  tag_set = __builtin__.property(_get_tag_set)
+
+
+  _pyangbind_elements = OrderedDict([('tag_set', tag_set), ])
+
+
+class yc_reference_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag/reference. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: This container is applicable when the mode of application is explicitly
+specified to as REFERENCE. The tags set on a route are those that are
+specified within the tag-set
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state',)
+
+  _yang_name = 'reference'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag', 'reference']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/config (container)
+
+    YANG Description: Configuration values related to specifying a tag-set to be applied to
+a route.
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration values related to specifying a tag-set to be applied to
+a route.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/state (container)
+
+    YANG Description: Operational state related to specifying a tag-set to be applied to a
+route.
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state related to specifying a tag-set to be applied to a
+route.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ])
+
+
+class yc_set_tag_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions/set-tag. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Policy actions associated with setting tags for a particular
+route. A tag is an abstract entity which can be mapped to underlying
+protocol attributes where applicable.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state','__inline','__reference',)
+
+  _yang_name = 'set-tag'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__inline = YANGDynClass(base=yc_inline_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline, is_container='container', yang_name="inline", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__reference = YANGDynClass(base=yc_reference_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference, is_container='container', yang_name="reference", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions', 'set-tag']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/config (container)
+
+    YANG Description: Configuration of tag application
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration of tag application
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/state (container)
+
+    YANG Description: Operational state related to tag application.
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state related to tag application.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_inline(self):
+    """
+    Getter method for inline, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline (container)
+
+    YANG Description: The tags specified in this container are set on a route using
+the values directly. It is applicable when the mode of application
+is explicitly specified as INLINE.
+    """
+    return self.__inline
+      
+  def _set_inline(self, v, load=False):
+    """
+    Setter method for inline, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/inline (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_inline is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_inline() directly.
+
+    YANG Description: The tags specified in this container are set on a route using
+the values directly. It is applicable when the mode of application
+is explicitly specified as INLINE.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_inline_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline, is_container='container', yang_name="inline", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """inline must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_inline_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline, is_container='container', yang_name="inline", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__inline = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_inline(self):
+    self.__inline = YANGDynClass(base=yc_inline_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_inline, is_container='container', yang_name="inline", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_reference(self):
+    """
+    Getter method for reference, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference (container)
+
+    YANG Description: This container is applicable when the mode of application is explicitly
+specified to as REFERENCE. The tags set on a route are those that are
+specified within the tag-set
+    """
+    return self.__reference
+      
+  def _set_reference(self, v, load=False):
+    """
+    Setter method for reference, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag/reference (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_reference is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_reference() directly.
+
+    YANG Description: This container is applicable when the mode of application is explicitly
+specified to as REFERENCE. The tags set on a route are those that are
+specified within the tag-set
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_reference_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference, is_container='container', yang_name="reference", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """reference must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_reference_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference, is_container='container', yang_name="reference", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__reference = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_reference(self):
+    self.__reference = YANGDynClass(base=yc_reference_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag_reference, is_container='container', yang_name="reference", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  inline = __builtin__.property(_get_inline, _set_inline)
+  reference = __builtin__.property(_get_reference, _set_reference)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ('inline', inline), ('reference', reference), ])
+
+
+class yc_actions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement/actions. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top-level container for policy action statements
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__config','__state','__set_tag',)
+
+  _yang_name = 'actions'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__set_tag = YANGDynClass(base=yc_set_tag_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag, is_container='container', yang_name="set-tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement', 'actions']
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/config (container)
+
+    YANG Description: Configuration data for policy actions
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for policy actions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/state (container)
+
+    YANG Description: Operational state data for policy actions
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for policy actions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_set_tag(self):
+    """
+    Getter method for set_tag, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag (container)
+
+    YANG Description: Policy actions associated with setting tags for a particular
+route. A tag is an abstract entity which can be mapped to underlying
+protocol attributes where applicable.
+    """
+    return self.__set_tag
+      
+  def _set_set_tag(self, v, load=False):
+    """
+    Setter method for set_tag, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions/set_tag (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_set_tag is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_set_tag() directly.
+
+    YANG Description: Policy actions associated with setting tags for a particular
+route. A tag is an abstract entity which can be mapped to underlying
+protocol attributes where applicable.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_set_tag_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag, is_container='container', yang_name="set-tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """set_tag must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_set_tag_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag, is_container='container', yang_name="set-tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__set_tag = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_set_tag(self):
+    self.__set_tag = YANGDynClass(base=yc_set_tag_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions_set_tag, is_container='container', yang_name="set-tag", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  set_tag = __builtin__.property(_get_set_tag, _set_set_tag)
+
+
+  _pyangbind_elements = OrderedDict([('config', config), ('state', state), ('set_tag', set_tag), ])
+
+
+class yc_statement_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements/statement. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Policy statements group conditions and actions
+within a policy definition.  They are evaluated in
+the order specified (see the description of policy
+evaluation at the top of this module.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__config','__state','__conditions','__actions',)
+
+  _yang_name = 'statement'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__conditions = YANGDynClass(base=yc_conditions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions, is_container='container', yang_name="conditions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__actions = YANGDynClass(base=yc_actions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements', 'statement']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/name (leafref)
+
+    YANG Description: Reference to list key
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Reference to list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/config (container)
+
+    YANG Description: Configuration data for policy statements
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for policy statements
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/state (container)
+
+    YANG Description: Operational state data for policy statements
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for policy statements
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_conditions(self):
+    """
+    Getter method for conditions, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions (container)
+
+    YANG Description: Condition statements for the current policy statement
+    """
+    return self.__conditions
+      
+  def _set_conditions(self, v, load=False):
+    """
+    Setter method for conditions, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/conditions (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_conditions is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_conditions() directly.
+
+    YANG Description: Condition statements for the current policy statement
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_conditions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions, is_container='container', yang_name="conditions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """conditions must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_conditions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions, is_container='container', yang_name="conditions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__conditions = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_conditions(self):
+    self.__conditions = YANGDynClass(base=yc_conditions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_conditions, is_container='container', yang_name="conditions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_actions(self):
+    """
+    Getter method for actions, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions (container)
+
+    YANG Description: Top-level container for policy action statements
+    """
+    return self.__actions
+      
+  def _set_actions(self, v, load=False):
+    """
+    Setter method for actions, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement/actions (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_actions is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_actions() directly.
+
+    YANG Description: Top-level container for policy action statements
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_actions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """actions must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_actions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__actions = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_actions(self):
+    self.__actions = YANGDynClass(base=yc_actions_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement_actions, is_container='container', yang_name="actions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  conditions = __builtin__.property(_get_conditions, _set_conditions)
+  actions = __builtin__.property(_get_actions, _set_actions)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('config', config), ('state', state), ('conditions', conditions), ('actions', actions), ])
+
+
+class yc_statements_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition/statements. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for policy statements
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__statement',)
+
+  _yang_name = 'statements'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__statement = YANGDynClass(base=YANGListType("name",yc_statement_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement, yang_name="statement", parent=self, is_container='list', user_ordered=True, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="statement", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition', 'statements']
+
+  def _get_statement(self):
+    """
+    Getter method for statement, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement (list)
+
+    YANG Description: Policy statements group conditions and actions
+within a policy definition.  They are evaluated in
+the order specified (see the description of policy
+evaluation at the top of this module.
+    """
+    return self.__statement
+      
+  def _set_statement(self, v, load=False):
+    """
+    Setter method for statement, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements/statement (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_statement is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_statement() directly.
+
+    YANG Description: Policy statements group conditions and actions
+within a policy definition.  They are evaluated in
+the order specified (see the description of policy
+evaluation at the top of this module.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name",yc_statement_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement, yang_name="statement", parent=self, is_container='list', user_ordered=True, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="statement", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """statement must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name",yc_statement_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement, yang_name="statement", parent=self, is_container='list', user_ordered=True, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="statement", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)""",
+        })
+
+    self.__statement = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_statement(self):
+    self.__statement = YANGDynClass(base=YANGListType("name",yc_statement_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements_statement, yang_name="statement", parent=self, is_container='list', user_ordered=True, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="statement", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+  statement = __builtin__.property(_get_statement, _set_statement)
+
+
+  _pyangbind_elements = OrderedDict([('statement', statement), ])
+
+
+class yc_policy_definition_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions/policy-definition. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: List of top-level policy definitions, keyed by unique
+name.  These policy definitions are expected to be
+referenced (by name) in policy chains specified in import
+or export configuration statements.
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__name','__config','__state','__statements',)
+
+  _yang_name = 'policy-definition'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__statements = YANGDynClass(base=yc_statements_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements, is_container='container', yang_name="statements", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions', 'policy-definition']
+
+  def _get_name(self):
+    """
+    Getter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/name (leafref)
+
+    YANG Description: Reference to the list key
+    """
+    return self.__name
+      
+  def _set_name(self, v, load=False):
+    """
+    Setter method for name, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/name (leafref)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_name is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_name() directly.
+
+    YANG Description: Reference to the list key
+    """
+    parent = getattr(self, "_parent", None)
+    if parent is not None and load is False:
+      raise AttributeError("Cannot set keys directly when" +
+                             " within an instantiated list")
+
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """name must be of a type compatible with leafref""",
+          'defined-type': "leafref",
+          'generated-type': """YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)""",
+        })
+
+    self.__name = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_name(self):
+    self.__name = YANGDynClass(base=six.text_type, is_leaf=True, yang_name="name", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, is_keyval=True, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='leafref', is_config=True)
+
+
+  def _get_config(self):
+    """
+    Getter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/config (container)
+
+    YANG Description: Configuration data for policy defintions
+    """
+    return self.__config
+      
+  def _set_config(self, v, load=False):
+    """
+    Setter method for config, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/config (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_config is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_config() directly.
+
+    YANG Description: Configuration data for policy defintions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """config must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__config = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_config(self):
+    self.__config = YANGDynClass(base=yc_config_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_config, is_container='container', yang_name="config", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_state(self):
+    """
+    Getter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/state (container)
+
+    YANG Description: Operational state data for policy definitions
+    """
+    return self.__state
+      
+  def _set_state(self, v, load=False):
+    """
+    Setter method for state, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/state (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_state is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_state() directly.
+
+    YANG Description: Operational state data for policy definitions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """state must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__state = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_state(self):
+    self.__state = YANGDynClass(base=yc_state_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_state, is_container='container', yang_name="state", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_statements(self):
+    """
+    Getter method for statements, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements (container)
+
+    YANG Description: Enclosing container for policy statements
+    """
+    return self.__statements
+      
+  def _set_statements(self, v, load=False):
+    """
+    Setter method for statements, mapped from YANG variable /routing_policy/policy_definitions/policy_definition/statements (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_statements is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_statements() directly.
+
+    YANG Description: Enclosing container for policy statements
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_statements_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements, is_container='container', yang_name="statements", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """statements must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_statements_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements, is_container='container', yang_name="statements", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__statements = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_statements(self):
+    self.__statements = YANGDynClass(base=yc_statements_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition_statements, is_container='container', yang_name="statements", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  name = __builtin__.property(_get_name, _set_name)
+  config = __builtin__.property(_get_config, _set_config)
+  state = __builtin__.property(_get_state, _set_state)
+  statements = __builtin__.property(_get_statements, _set_statements)
+
+
+  _pyangbind_elements = OrderedDict([('name', name), ('config', config), ('state', state), ('statements', statements), ])
+
+
+class yc_policy_definitions_openconfig_routing_policy__routing_policy_policy_definitions(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy/policy-definitions. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Enclosing container for the list of top-level policy
+ definitions
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__policy_definition',)
+
+  _yang_name = 'policy-definitions'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__policy_definition = YANGDynClass(base=YANGListType("name",yc_policy_definition_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition, yang_name="policy-definition", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="policy-definition", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy', 'policy-definitions']
+
+  def _get_policy_definition(self):
+    """
+    Getter method for policy_definition, mapped from YANG variable /routing_policy/policy_definitions/policy_definition (list)
+
+    YANG Description: List of top-level policy definitions, keyed by unique
+name.  These policy definitions are expected to be
+referenced (by name) in policy chains specified in import
+or export configuration statements.
+    """
+    return self.__policy_definition
+      
+  def _set_policy_definition(self, v, load=False):
+    """
+    Setter method for policy_definition, mapped from YANG variable /routing_policy/policy_definitions/policy_definition (list)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_policy_definition is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_policy_definition() directly.
+
+    YANG Description: List of top-level policy definitions, keyed by unique
+name.  These policy definitions are expected to be
+referenced (by name) in policy chains specified in import
+or export configuration statements.
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=YANGListType("name",yc_policy_definition_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition, yang_name="policy-definition", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="policy-definition", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """policy_definition must be of a type compatible with list""",
+          'defined-type': "list",
+          'generated-type': """YANGDynClass(base=YANGListType("name",yc_policy_definition_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition, yang_name="policy-definition", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="policy-definition", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)""",
+        })
+
+    self.__policy_definition = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_policy_definition(self):
+    self.__policy_definition = YANGDynClass(base=YANGListType("name",yc_policy_definition_openconfig_routing_policy__routing_policy_policy_definitions_policy_definition, yang_name="policy-definition", parent=self, is_container='list', user_ordered=False, path_helper=self._path_helper, yang_keys='name', extensions=None), is_container='list', yang_name="policy-definition", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='list', is_config=True)
+
+  policy_definition = __builtin__.property(_get_policy_definition, _set_policy_definition)
+
+
+  _pyangbind_elements = OrderedDict([('policy_definition', policy_definition), ])
+
+
+class yc_routing_policy_openconfig_routing_policy__routing_policy(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /routing-policy. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: Top-level container for all routing policy configuration
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__defined_sets','__policy_definitions',)
+
+  _yang_name = 'routing-policy'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__defined_sets = YANGDynClass(base=yc_defined_sets_openconfig_routing_policy__routing_policy_defined_sets, is_container='container', yang_name="defined-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    self.__policy_definitions = YANGDynClass(base=yc_policy_definitions_openconfig_routing_policy__routing_policy_policy_definitions, is_container='container', yang_name="policy-definitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return ['routing-policy']
+
+  def _get_defined_sets(self):
+    """
+    Getter method for defined_sets, mapped from YANG variable /routing_policy/defined_sets (container)
+
+    YANG Description: Predefined sets of attributes used in policy match
+statements
+    """
+    return self.__defined_sets
+      
+  def _set_defined_sets(self, v, load=False):
+    """
+    Setter method for defined_sets, mapped from YANG variable /routing_policy/defined_sets (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_defined_sets is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_defined_sets() directly.
+
+    YANG Description: Predefined sets of attributes used in policy match
+statements
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_defined_sets_openconfig_routing_policy__routing_policy_defined_sets, is_container='container', yang_name="defined-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """defined_sets must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_defined_sets_openconfig_routing_policy__routing_policy_defined_sets, is_container='container', yang_name="defined-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__defined_sets = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_defined_sets(self):
+    self.__defined_sets = YANGDynClass(base=yc_defined_sets_openconfig_routing_policy__routing_policy_defined_sets, is_container='container', yang_name="defined-sets", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+
+  def _get_policy_definitions(self):
+    """
+    Getter method for policy_definitions, mapped from YANG variable /routing_policy/policy_definitions (container)
+
+    YANG Description: Enclosing container for the list of top-level policy
+ definitions
+    """
+    return self.__policy_definitions
+      
+  def _set_policy_definitions(self, v, load=False):
+    """
+    Setter method for policy_definitions, mapped from YANG variable /routing_policy/policy_definitions (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_policy_definitions is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_policy_definitions() directly.
+
+    YANG Description: Enclosing container for the list of top-level policy
+ definitions
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_policy_definitions_openconfig_routing_policy__routing_policy_policy_definitions, is_container='container', yang_name="policy-definitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """policy_definitions must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_policy_definitions_openconfig_routing_policy__routing_policy_policy_definitions, is_container='container', yang_name="policy-definitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__policy_definitions = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_policy_definitions(self):
+    self.__policy_definitions = YANGDynClass(base=yc_policy_definitions_openconfig_routing_policy__routing_policy_policy_definitions, is_container='container', yang_name="policy-definitions", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  defined_sets = __builtin__.property(_get_defined_sets, _set_defined_sets)
+  policy_definitions = __builtin__.property(_get_policy_definitions, _set_policy_definitions)
+
+
+  _pyangbind_elements = OrderedDict([('defined_sets', defined_sets), ('policy_definitions', policy_definitions), ])
+
+
+class openconfig_routing_policy(PybindBase):
+  """
+  This class was auto-generated by the PythonClass plugin for PYANG
+  from YANG module openconfig-routing-policy - based on the path /openconfig-routing-policy. Each member element of
+  the container is represented as a class variable - with a specific
+  YANG type.
+
+  YANG Description: This module describes a YANG model for routing policy
+configuration. It is a limited subset of all of the policy
+configuration parameters available in the variety of vendor
+implementations, but supports widely used constructs for managing
+how routes are imported, exported, and modified across different
+routing protocols.  This module is intended to be used in
+conjunction with routing protocol configuration models (e.g.,
+BGP) defined in other modules.
+
+Route policy expression:
+
+Policies are expressed as a set of top-level policy definitions,
+each of which consists of a sequence of policy statements. Policy
+statements consist of simple condition-action tuples. Conditions
+may include mutiple match or comparison operations, and similarly
+actions may be multitude of changes to route attributes or a
+final disposition of accepting or rejecting the route.
+
+Route policy evaluation:
+
+Policy definitions are referenced in routing protocol
+configurations using import and export configuration statements.
+The arguments are members of an ordered list of named policy
+definitions which comprise a policy chain, and optionally, an
+explicit default policy action (i.e., reject or accept).
+
+Evaluation of each policy definition proceeds by evaluating its
+corresponding individual policy statements in order.  When a
+condition statement in a policy statement is satisfied, the
+corresponding action statement is executed.  If the action
+statement has either accept-route or reject-route actions, policy
+evaluation of the current policy definition stops, and no further
+policy definitions in the chain are evaluated.
+
+If the condition is not satisfied, then evaluation proceeds to
+the next policy statement.  If none of the policy statement
+conditions are satisfied, then evaluation of the current policy
+definition stops, and the next policy definition in the chain is
+evaluated.  When the end of the policy chain is reached, the
+default route disposition action is performed (i.e., reject-route
+unless an an alternate default action is specified for the
+chain).
+
+Policy 'subroutines' (or nested policies) are supported by
+allowing policy statement conditions to reference another policy
+definition which applies conditions and actions from the
+referenced policy before returning to the calling policy
+statement and resuming evaluation.  If the called policy
+results in an accept-route (either explicit or by default), then
+the subroutine returns an effective true value to the calling
+policy.  Similarly, a reject-route action returns false.  If the
+subroutine returns true, the calling policy continues to evaluate
+the remaining conditions (using a modified route if the
+subroutine performed any changes to the route).
+  """
+  __slots__ = ('_path_helper', '_extmethods', '__routing_policy',)
+
+  _yang_name = 'openconfig-routing-policy'
+  _yang_namespace = 'http://openconfig.net/yang/routing-policy'
+
+  _pybind_generated_by = 'container'
+
+  def __init__(self, *args, **kwargs):
+
+    self._path_helper = False
+
+    self._extmethods = False
+    self.__routing_policy = YANGDynClass(base=yc_routing_policy_openconfig_routing_policy__routing_policy, is_container='container', yang_name="routing-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+    load = kwargs.pop("load", None)
+    if args:
+      if len(args) > 1:
+        raise TypeError("cannot create a YANG container with >1 argument")
+      all_attr = True
+      for e in self._pyangbind_elements:
+        if not hasattr(args[0], e):
+          all_attr = False
+          break
+      if not all_attr:
+        raise ValueError("Supplied object did not have the correct attributes")
+      for e in self._pyangbind_elements:
+        nobj = getattr(args[0], e)
+        if nobj._changed() is False:
+          continue
+        setmethod = getattr(self, "_set_%s" % e)
+        if load is None:
+          setmethod(getattr(args[0], e))
+        else:
+          setmethod(getattr(args[0], e), load=load)
+
+  def _path(self):
+    if hasattr(self, "_parent"):
+      return self._parent._path()+[self._yang_name]
+    else:
+      return []
+
+  def _get_routing_policy(self):
+    """
+    Getter method for routing_policy, mapped from YANG variable /routing_policy (container)
+
+    YANG Description: Top-level container for all routing policy configuration
+    """
+    return self.__routing_policy
+      
+  def _set_routing_policy(self, v, load=False):
+    """
+    Setter method for routing_policy, mapped from YANG variable /routing_policy (container)
+    If this variable is read-only (config: false) in the
+    source YANG file, then _set_routing_policy is considered as a private
+    method. Backends looking to populate this variable should
+    do so via calling thisObj._set_routing_policy() directly.
+
+    YANG Description: Top-level container for all routing policy configuration
+    """
+    if hasattr(v, "_utype"):
+      v = v._utype(v)
+    try:
+      t = YANGDynClass(v,base=yc_routing_policy_openconfig_routing_policy__routing_policy, is_container='container', yang_name="routing-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+    except (TypeError, ValueError):
+      raise ValueError({
+          'error-string': """routing_policy must be of a type compatible with container""",
+          'defined-type': "container",
+          'generated-type': """YANGDynClass(base=yc_routing_policy_openconfig_routing_policy__routing_policy, is_container='container', yang_name="routing-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)""",
+        })
+
+    self.__routing_policy = t
+    if hasattr(self, '_set'):
+      self._set()
+
+  def _unset_routing_policy(self):
+    self.__routing_policy = YANGDynClass(base=yc_routing_policy_openconfig_routing_policy__routing_policy, is_container='container', yang_name="routing-policy", parent=self, path_helper=self._path_helper, extmethods=self._extmethods, register_paths=True, extensions=None, namespace='http://openconfig.net/yang/routing-policy', defining_module='openconfig-routing-policy', yang_type='container', is_config=True)
+
+  routing_policy = __builtin__.property(_get_routing_policy, _set_routing_policy)
+
+
+  _pyangbind_elements = OrderedDict([('routing_policy', routing_policy), ])
+
+
diff --git a/src/device/service/drivers/openconfig/templates/__init__.py b/src/device/service/drivers/openconfig/templates/__init__.py
index c415bfd25725ca950c018e9f0eedfcde6e0df379..1f86b719227f4def0bc18c45997925846defbc56 100644
--- a/src/device/service/drivers/openconfig/templates/__init__.py
+++ b/src/device/service/drivers/openconfig/templates/__init__.py
@@ -12,9 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from ast import List, Tuple
 import json, logging, lxml.etree as ET, re
+import time
 from typing import Any, Dict, Optional
 from jinja2 import Environment, PackageLoader, select_autoescape
+import paramiko
+from .Tools import generate_templates
 from device.service.driver_api._Driver import (
     RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_ACL)
 from .EndPoints import parse as parse_endpoints
@@ -22,6 +26,7 @@ from .Interfaces import parse as parse_interfaces, parse_counters
 from .NetworkInstances import parse as parse_network_instances
 from .RoutingPolicy import parse as parse_routing_policy
 from .Acl import parse as parse_acl
+LOGGER = logging.getLogger(__name__)
 
 ALL_RESOURCE_KEYS = [
     RESOURCE_ENDPOINTS,
@@ -69,19 +74,177 @@ def parse(resource_key : str, xml_data : ET.Element):
     resource_key = RE_REMOVE_FILTERS.sub('', resource_key)
     resource_key = RE_REMOVE_FILTERS_2.sub('/', resource_key)
     resource_key = resource_key.replace('//', '')
-    #resource_key_parts = resource_key.split('/')
-    #if len(resource_key_parts) > 1: resource_key_parts = resource_key_parts[:-1]
-    #resource_key = '/'.join(resource_key_parts)
-    #resource_key = RESOURCE_KEY_MAPPINGS.get(resource_key, resource_key)
     parser = RESOURCE_PARSERS.get(resource_key)
     if parser is None: return [(resource_key, xml_data)]
     return parser(xml_data)
 
-def compose_config(
-    resource_key : str, resource_value : str, delete : bool = False, vendor : Optional[str] = None
+"""
+# Method Name: compose_config
+  
+# Parameters:
+  - resource_key:    [str]  Variable to identify the rule to be executed.
+  - resource_value:  [str]  Variable with the configuration parameters of the rule to be executed.
+  - delete:          [bool] Variable to identify whether to create or delete the rule.
+  - vendor:          [str]  Variable to identify the vendor of the equipment to be configured.
+  - message_renderer [str]  Variable to dientify template generation method. Can be "jinja" or "pyangbind".
+  
+# Functionality:
+  This method calls the function obtains the equipment configuration template according to the value of the variable "message_renderer".
+  Depending on the value of this variable, it gets the template with "jinja" or "pyangbind". 
+  
+# Return:
+  [dict] Set of templates obtained according to the configuration method
+"""
+
+def compose_config( # template generation
+    resource_key : str, resource_value : str, delete : bool = False, vendor : Optional[str] = None, message_renderer = str
 ) -> str:
-    template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key))
-    template = JINJA_ENV.get_template(template_name)
-    data : Dict[str, Any] = json.loads(resource_value)
-    operation = 'delete' if delete else 'merge'
-    return '<config>{:s}</config>'.format(template.render(**data, operation=operation, vendor=vendor).strip())
+
+    if (message_renderer == "pyangbind"):
+        templates = (generate_templates(resource_key, resource_value, delete,vendor))
+        return [
+            '<config>{:s}</config>'.format(template) # format correction
+            for template in templates
+            ]
+
+    elif (message_renderer == "jinja"):
+        templates =[]
+        template_name = '{:s}/edit_config.xml'.format(RE_REMOVE_FILTERS.sub('', resource_key))
+        templates.append(JINJA_ENV.get_template(template_name))
+
+        if "acl_ruleset" in resource_key:                                               # MANAGING ACLs
+            templates =[]
+            templates.append(JINJA_ENV.get_template('acl/acl-set/acl-entry/edit_config.xml'))
+            templates.append(JINJA_ENV.get_template('acl/interfaces/ingress/edit_config.xml'))
+        data : Dict[str, Any] = json.loads(resource_value)
+        operation = 'delete' if delete else 'merge'
+
+        return [
+            '<config>{:s}</config>'.format(
+            template.render(**data, operation=operation, vendor=vendor).strip())
+            for template in templates
+            ]
+        
+    else:
+        raise ValueError('Invalid message_renderer value: {}'.format(message_renderer)) 
+
+"""
+# Method Name: cli_compose_config
+  
+# Parameters:
+  - resource_key:    [str]  Variable to identify the rule to be executed.
+  - resource_value:  [str]  Variable with the configuration parameters of the rule to be executed.
+  - delete:          [bool] Variable to identify whether to create or delete the rule.
+  - vendor:          [str]  Variable to identify the vendor of the equipment to be configured.
+  - message_renderer [str]  Variable to dientify template generation method. Can be "jinja" or "pyangbind".
+  
+# Functionality:
+  This method calls the function obtains the equipment configuration template according to the value of the variable "message_renderer".
+  Depending on the value of this variable, it gets the template with "jinja" or "pyangbind". 
+  
+# Return:
+  [dict] Set of templates obtained according to the configuration method
+"""
+
+def cli_compose_config(resources, delete: bool, host: str, user: str, passw: str):     #Method used for configuring via CLI directly L2VPN in CISCO devices
+      
+    key_value_data = {}
+
+    for path, json_str in resources:
+        key_value_data[path] = json_str
+
+    # Iterate through the resources and extract parameter values dynamically
+    for path, json_str in resources:
+        data = json.loads(json_str)
+        if 'VC_ID' in data:            vc_id = data['VC_ID']
+        if 'connection_point' in data: connection_point = data['connection_point']
+        if 'remote_system' in data:    remote_system = data['remote_system']
+        if 'interface' in data:
+            interface = data['interface']
+            interface = interface.split("-")                       #New Line To Avoid Bad Endpoint Name In CISCO
+            interface = interface[1]
+        if 'vlan_id' in data:          vlan_id = data['vlan_id']
+        if 'name' in data:             ni_name = data['name']
+        if 'type' in data:             ni_type = data['type']
+        if 'index' in data:            subif_index = data['index']
+        if 'description' in data:      description = data['description']
+        else:                          description = " "
+      
+    # initialize the SSH client
+    ssh_client = paramiko.SSHClient()
+    ssh_client.load_system_host_keys()
+    # add to known hosts
+    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+        
+    try:
+        ssh_client.connect(hostname=host, username=user, password=passw, look_for_keys=False)
+        #print("Connection successful")
+        LOGGER.warning("Connection successful")
+    except:
+        #print("[!] Cannot connect to the SSH Server")
+        LOGGER.warning("[!] Cannot connect to the SSH Server")
+        exit()
+        
+    try:
+        # Open an SSH shell
+        channel = ssh_client.invoke_shell()
+        channel.send('enable\n')
+        time.sleep(1)
+        channel.send('conf term\n')
+        time.sleep(0.1)
+        channel.send(f"interface {interface} l2transport\n")
+        time.sleep(0.1)
+        channel.send('description l2vpn_vpws_example\n')
+        time.sleep(0.1)
+        channel.send(f"encapsulation dot1q {vlan_id}\n")
+        time.sleep(0.1)
+        channel.send('mtu 9088\n')
+        time.sleep(0.1)
+        channel.send('commit\n')
+        time.sleep(0.1)
+        
+        channel.send('l2vpn\n')
+        time.sleep(0.1)
+        channel.send('load-balancing flow src-dst-ip\n')
+        time.sleep(0.1)
+        channel.send('pw-class l2vpn_vpws_profile_example\n')
+        time.sleep(0.1)
+        channel.send('encapsulation mpls\n')
+        time.sleep(0.1)
+        channel.send('transport-mode vlan passthrough\n')
+        time.sleep(0.1)
+        channel.send('control-word\n')
+        time.sleep(0.1)
+        channel.send('exit\n')
+        time.sleep(0.1)
+        channel.send('l2vpn\n')
+        time.sleep(0.1)
+        channel.send('xconnect group l2vpn_vpws_group_example\n')
+        time.sleep(0.1)
+        channel.send(f"p2p {ni_name}\n")
+        time.sleep(0.1)
+        channel.send(f"interface {interface}\n")                                #Ignore the VlanID because the interface already includes the vlanid tag
+        time.sleep(0.1)
+        channel.send(f"neighbor ipv4 {remote_system} pw-id {vc_id}\n")
+        time.sleep(0.1)
+        channel.send('pw-class l2vpn_vpws_profile_example\n')
+        time.sleep(0.1)
+        channel.send('exit\n')
+        time.sleep(0.1)
+        channel.send(f"description {description}\n")
+        time.sleep(0.1)
+        channel.send('commit\n')
+        time.sleep(0.1) 
+        # Capturar la salida del comando
+        output = channel.recv(65535).decode('utf-8')
+        #print(output)
+        LOGGER.warning(output)
+        # Close the SSH shell
+        channel.close()
+
+    except Exception as e:
+        LOGGER.exception(f"Error with the CLI configuration: {e}")
+
+    # Close the SSH client
+    ssh_client.close()
+    
\ No newline at end of file
diff --git a/src/device/tests/Device_Emulated.py b/src/device/tests/Device_Emulated.py
index bb5dfa5f39e2e3ec3c07f9f49dc55e03c8e3c88d..0dffd7ad5a1d6da3bb58ca1c874a797c34ca5357 100644
--- a/src/device/tests/Device_Emulated.py
+++ b/src/device/tests/Device_Emulated.py
@@ -16,13 +16,17 @@ from common.proto.kpi_sample_types_pb2 import KpiSampleType
 from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled, json_device_id)
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 from device.tests.CommonObjects import PACKET_PORT_SAMPLE_TYPES
 
 DEVICE_EMU_UUID     = 'R1-EMU'
 DEVICE_EMU_ID       = json_device_id(DEVICE_EMU_UUID)
 DEVICE_EMU          = json_device_emulated_packet_router_disabled(DEVICE_EMU_UUID)
 DEVICE_EMU_EP_UUIDS = ['EP1', 'EP2', 'EP3', 'EP4']
-DEVICE_EMU_EP_DESCS = [(ep_uuid, '10Gbps', PACKET_PORT_SAMPLE_TYPES) for ep_uuid in DEVICE_EMU_EP_UUIDS]
+DEVICE_EMU_EP_DESCS = [
+    json_endpoint_descriptor(ep_uuid, '10Gbps', sample_types=PACKET_PORT_SAMPLE_TYPES)
+    for ep_uuid in DEVICE_EMU_EP_UUIDS
+]
 DEVICE_EMU_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_EMU_EP_DESCS)
 
 RSRC_EP       = '/endpoints/endpoint[{:s}]'
@@ -30,7 +34,10 @@ RSRC_SUBIF    = RSRC_EP    + '/subinterfaces/subinterface[{:d}]'
 RSRC_ADDRIPV4 = RSRC_SUBIF + '/ipv4/address[{:s}]'
 
 DEVICE_EMU_ENDPOINTS_COOKED = []
-for endpoint_uuid,endpoint_type,endpoint_sample_types in DEVICE_EMU_EP_DESCS:
+for endpoint_data in DEVICE_EMU_EP_DESCS:
+    endpoint_uuid = endpoint_data['uuid']
+    endpoint_type = endpoint_data['type']
+    endpoint_sample_types = endpoint_data['sample_types']
     endpoint_resource_key = RSRC_EP.format(str(endpoint_uuid))
     sample_types = {}
     for endpoint_sample_type in endpoint_sample_types:
diff --git a/src/device/tests/test_gnmi.py b/src/device/tests/test_gnmi.py
new file mode 100644
index 0000000000000000000000000000000000000000..50c9155822d5285fda5fc75777363c066ffb215a
--- /dev/null
+++ b/src/device/tests/test_gnmi.py
@@ -0,0 +1,115 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging, os, sys, time
+from typing import Dict, Tuple
+os.environ['DEVICE_EMULATED_ONLY'] = 'YES'
+from device.service.drivers.gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver # pylint: disable=wrong-import-position
+#from device.service.driver_api._Driver import (
+#    RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_SERVICES
+#)
+
+logging.basicConfig(level=logging.DEBUG)
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+# +---+---------------------------+--------------+---------------------------------+-------+---------+--------------------+--------------+
+# | # |           Name            | Container ID |              Image              | Kind  |  State  |    IPv4 Address    | IPv6 Address |
+# +---+---------------------------+--------------+---------------------------------+-------+---------+--------------------+--------------+
+# | 1 | clab-tfs-scenario-client1 | a8d48ec3265a | ghcr.io/hellt/network-multitool | linux | running | 172.100.100.201/24 | N/A          |
+# | 2 | clab-tfs-scenario-client2 | fc88436d2b32 | ghcr.io/hellt/network-multitool | linux | running | 172.100.100.202/24 | N/A          |
+# | 3 | clab-tfs-scenario-srl1    | b995b9bdadda | ghcr.io/nokia/srlinux           | srl   | running | 172.100.100.101/24 | N/A          |
+# | 4 | clab-tfs-scenario-srl2    | aacfc38cc376 | ghcr.io/nokia/srlinux           | srl   | running | 172.100.100.102/24 | N/A          |
+# +---+---------------------------+--------------+---------------------------------+-------+---------+--------------------+--------------+
+
+def interface(if_name, sif_index, ipv4_address, ipv4_prefix, enabled) -> Tuple[str, Dict]:
+    str_path = '/interface[{:s}]'.format(if_name)
+    str_data = {'name': if_name, 'enabled': enabled, 'sub_if_index': sif_index, 'sub_if_enabled': enabled,
+                'sub_if_ipv4_enabled': enabled, 'sub_if_ipv4_address': ipv4_address, 'sub_if_ipv4_prefix': ipv4_prefix}
+    return str_path, str_data
+
+def network_instance(ni_name, ni_type) -> Tuple[str, Dict]:
+    str_path = '/network_instance[{:s}]'.format(ni_name)
+    str_data = {'name': ni_name, 'type': ni_type}
+    return str_path, str_data
+
+def network_instance_static_route(ni_name, prefix, next_hop, next_hop_index=0) -> Tuple[str, Dict]:
+    str_path = '/network_instance[{:s}]/static_route[{:s}]'.format(ni_name, prefix)
+    str_data = {'name': ni_name, 'prefix': prefix, 'next_hop': next_hop, 'next_hop_index': next_hop_index}
+    return str_path, str_data
+
+def network_instance_interface(ni_name, if_name, sif_index) -> Tuple[str, Dict]:
+    str_path = '/network_instance[{:s}]/interface[{:s}.{:d}]'.format(ni_name, if_name, sif_index)
+    str_data = {'name': ni_name, 'if_name': if_name, 'sif_index': sif_index}
+    return str_path, str_data
+
+def main():
+    driver_settings = {
+        'protocol': 'gnmi',
+        'username': 'admin',
+        'password': 'NokiaSrl1!',
+        'use_tls' : True,
+    }
+    driver = GnmiOpenConfigDriver('172.100.100.102', 57400, **driver_settings)
+    driver.Connect()
+
+    #resources_to_get = []
+    #resources_to_get = [RESOURCE_ENDPOINTS]
+    #resources_to_get = [RESOURCE_INTERFACES]
+    #resources_to_get = [RESOURCE_NETWORK_INSTANCES]
+    #resources_to_get = [RESOURCE_ROUTING_POLICIES]
+    #resources_to_get = [RESOURCE_SERVICES]
+    #LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get)))
+    #results_getconfig = driver.GetConfig(resources_to_get)
+    #LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))
+
+    #resources_to_set = [
+    #    network_instance('test-svc', 'L3VRF'),
+    #
+    #    interface('ethernet-1/1', 0, '172.16.0.1', 24, True),
+    #    network_instance_interface('test-svc', 'ethernet-1/1', 0),
+    #
+    #    interface('ethernet-1/2', 0, '172.0.0.1', 24, True),
+    #    network_instance_interface('test-svc', 'ethernet-1/2', 0),
+    #
+    #    network_instance_static_route('test-svc', '172.0.0.0/24', '172.16.0.2'),
+    #    network_instance_static_route('test-svc', '172.2.0.0/24', '172.16.0.3'),
+    #]
+    #LOGGER.info('resources_to_set = {:s}'.format(str(resources_to_set)))
+    #results_setconfig = driver.SetConfig(resources_to_set)
+    #LOGGER.info('results_setconfig = {:s}'.format(str(results_setconfig)))
+
+    resources_to_delete = [
+        #network_instance_static_route('d35fc1d9', '172.0.0.0/24', '172.16.0.2'),
+        #network_instance_static_route('d35fc1d9', '172.2.0.0/24', '172.16.0.3'),
+    
+        #network_instance_interface('d35fc1d9', 'ethernet-1/1', 0),
+        #network_instance_interface('d35fc1d9', 'ethernet-1/2', 0),
+    
+        interface('ethernet-1/1', 0, '172.16.1.1', 24, True),
+        interface('ethernet-1/2', 0, '172.0.0.2', 24, True),
+    
+        network_instance('20f66fb5', 'L3VRF'),
+    ]
+    LOGGER.info('resources_to_delete = {:s}'.format(str(resources_to_delete)))
+    results_deleteconfig = driver.DeleteConfig(resources_to_delete)
+    LOGGER.info('results_deleteconfig = {:s}'.format(str(results_deleteconfig)))
+
+    time.sleep(1)
+
+    driver.Disconnect()
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/src/device/tests/test_netconf.py b/src/device/tests/test_netconf.py
new file mode 100644
index 0000000000000000000000000000000000000000..70551eed759867d26b46d399fba998a2d8007d21
--- /dev/null
+++ b/src/device/tests/test_netconf.py
@@ -0,0 +1,31 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from ncclient.manager import Manager, connect_ssh
+
+str_filter = '''<filter>
+    <components xmlns="http://openconfig.net/yang/platform">
+        <component/>
+    </components>
+</filter>'''
+
+_manager : Manager = connect_ssh(
+    host='10.5.32.3', port=830, username='admin', password='admin',
+    device_params={'name': 'huaweiyang'}, manager_params={'timeout': 120},
+    key_filename=None, hostkey_verify=False, allow_agent=False,
+    look_for_keys=False)
+c = _manager.get(filter=str_filter, with_defaults=None).data_xml
+with open('data.xml', 'w') as f:
+    f.write(c)
+_manager.close_session()
diff --git a/src/dlt/connector/tests/Objects.py b/src/dlt/connector/tests/Objects.py
index 2ff850000a2d20b0556dc6e65a21b7151db849d6..5a7f9f68235eefa93e73d66bb6a2ab3ae210ee14 100644
--- a/src/dlt/connector/tests/Objects.py
+++ b/src/dlt/connector/tests/Objects.py
@@ -14,7 +14,7 @@
 
 from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import json_device_emulated_packet_router_disabled, json_device_id
-from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import compose_link
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 
@@ -22,7 +22,10 @@ def compose_device(
     device_uuid, endpoint_uuids, endpoint_type='copper', endpoint_topology_id=None, endpoint_sample_types=[]
 ):
     device_id = json_device_id(device_uuid)
-    endpoints = [(endpoint_uuid, endpoint_type, endpoint_sample_types) for endpoint_uuid in endpoint_uuids]
+    endpoints = [
+        json_endpoint_descriptor(endpoint_uuid, endpoint_type, endpoint_sample_types)
+        for endpoint_uuid in endpoint_uuids
+    ]
     endpoints = json_endpoints(device_id, endpoints, topology_id=endpoint_topology_id)
     device = json_device_emulated_packet_router_disabled(device_uuid, endpoints=endpoints)
     return device_id, endpoints, device
diff --git a/src/interdomain/Config.py b/src/interdomain/Config.py
index 38d04994fb0fa1951fb465bc127eb72659dc2eaf..f8e81dd2b598e403b032830d9ef7ad1e155d5ae1 100644
--- a/src/interdomain/Config.py
+++ b/src/interdomain/Config.py
@@ -11,3 +11,14 @@
 # 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.
+
+from common.Settings import get_setting
+
+SETTING_NAME_TOPOLOGY_ABSTRACTOR = 'TOPOLOGY_ABSTRACTOR'
+TRUE_VALUES = {'Y', 'YES', 'TRUE', 'T', 'E', 'ENABLE', 'ENABLED'}
+
+def is_topology_abstractor_enabled() -> bool:
+    is_enabled = get_setting(SETTING_NAME_TOPOLOGY_ABSTRACTOR, default=None)
+    if is_enabled is None: return False
+    str_is_enabled = str(is_enabled).upper()
+    return str_is_enabled in TRUE_VALUES
diff --git a/src/interdomain/Dockerfile b/src/interdomain/Dockerfile
index 69fcf3d9c52b9dc6232a2a8f3051acba88987408..66c6e938d7adf5bd985fc0b4f87fe284c1370be4 100644
--- a/src/interdomain/Dockerfile
+++ b/src/interdomain/Dockerfile
@@ -68,7 +68,7 @@ COPY src/dlt/. dlt/
 COPY src/interdomain/. interdomain/
 #COPY src/monitoring/. monitoring/
 COPY src/pathcomp/. pathcomp/
-#COPY src/service/. service/
+COPY src/service/. service/
 COPY src/slice/. slice/
 
 # Start the service
diff --git a/src/interdomain/client/InterdomainClient.py b/src/interdomain/client/InterdomainClient.py
index f5631de61f9df3e35cac7efc1d768b9fbc9d5d7c..ade3ef20779fd4a456c74ed5420ce2855642bdb8 100644
--- a/src/interdomain/client/InterdomainClient.py
+++ b/src/interdomain/client/InterdomainClient.py
@@ -15,7 +15,7 @@
 import grpc, logging
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_host, get_service_port_grpc
-from common.proto.context_pb2 import AuthenticationResult, Slice, SliceId, SliceStatus, TeraFlowController
+from common.proto.context_pb2 import AuthenticationResult, Empty, Slice, SliceId, SliceStatus, TeraFlowController
 from common.proto.interdomain_pb2_grpc import InterdomainServiceStub
 from common.tools.client.RetryDecorator import retry, delay_exponential
 from common.tools.grpc.Tools import grpc_message_to_json_string
@@ -45,13 +45,6 @@ class InterdomainClient:
         self.channel = None
         self.stub = None
 
-    @RETRY_DECORATOR
-    def RequestSlice(self, request : Slice) -> SliceId:
-        LOGGER.debug('RequestSlice request: {:s}'.format(grpc_message_to_json_string(request)))
-        response = self.stub.RequestSlice(request)
-        LOGGER.debug('RequestSlice result: {:s}'.format(grpc_message_to_json_string(response)))
-        return response
-
     @RETRY_DECORATOR
     def Authenticate(self, request : TeraFlowController) -> AuthenticationResult:
         LOGGER.debug('Authenticate request: {:s}'.format(grpc_message_to_json_string(request)))
@@ -59,6 +52,13 @@ class InterdomainClient:
         LOGGER.debug('Authenticate result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
+    @RETRY_DECORATOR
+    def RequestSlice(self, request : Slice) -> SliceId:
+        LOGGER.debug('RequestSlice request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.RequestSlice(request)
+        LOGGER.debug('RequestSlice result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
     @RETRY_DECORATOR
     def LookUpSlice(self, request : Slice) -> SliceId:
         LOGGER.debug('LookUpSlice request: {:s}'.format(grpc_message_to_json_string(request)))
@@ -79,3 +79,24 @@ class InterdomainClient:
         response = self.stub.CreateSliceAndAddToCatalog(request)
         LOGGER.debug('CreateSliceAndAddToCatalog result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
+
+    @RETRY_DECORATOR
+    def OrderSliceWithSLA(self, request : Slice) -> SliceId:
+        LOGGER.debug('OrderSliceWithSLA request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.OrderSliceWithSLA(request)
+        LOGGER.debug('OrderSliceWithSLA result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
+    @RETRY_DECORATOR
+    def UpdateSlice(self, request : Slice) -> Slice:
+        LOGGER.debug('UpdateSlice request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.UpdateSlice(request)
+        LOGGER.debug('UpdateSlice result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
+    @RETRY_DECORATOR
+    def DeleteSlice(self, request : SliceId) -> Empty:
+        LOGGER.debug('DeleteSlice request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.DeleteSlice(request)
+        LOGGER.debug('DeleteSlice result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
diff --git a/src/interdomain/service/InterdomainServiceServicerImpl.py b/src/interdomain/service/InterdomainServiceServicerImpl.py
index 51c8ee39aa0fc70aa96fe8154cbc312043d2c488..fa6bec912413234d225ee1e4662fba0b2cb82b28 100644
--- a/src/interdomain/service/InterdomainServiceServicerImpl.py
+++ b/src/interdomain/service/InterdomainServiceServicerImpl.py
@@ -12,25 +12,35 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from typing import Dict, Tuple
 import grpc, logging, uuid
-from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, ServiceNameEnum
-from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_missing_environment_variables, get_env_var_name
-from common.proto.context_pb2 import AuthenticationResult, Slice, SliceId, SliceStatusEnum, TeraFlowController, TopologyId
+from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum
+from common.Settings import (
+    ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name)
+from common.proto.context_pb2 import (
+    AuthenticationResult, Empty, EndPointId, Slice, SliceId, SliceStatusEnum, TeraFlowController, TopologyId)
 from common.proto.interdomain_pb2_grpc import InterdomainServiceServicer
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
+from common.tools.context_queries.CheckType import endpoint_type_is_border
 from common.tools.context_queries.Context import create_context
+from common.tools.context_queries.Device import get_device
 from common.tools.context_queries.InterDomain import (
-    compute_interdomain_path, compute_traversed_domains, get_local_device_uuids, is_inter_domain)
-from common.tools.context_queries.Topology import create_topology
-from common.tools.grpc.Tools import grpc_message_to_json_string
+    compute_interdomain_sub_slices, get_local_device_uuids, is_inter_domain)
+from common.tools.context_queries.Slice import get_slice_by_id
+from common.tools.context_queries.Topology import create_topology, get_topology
+from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string
+from common.tools.object_factory.Context import json_context_id
+from common.tools.object_factory.Device import json_device_id
+from common.tools.object_factory.EndPoint import json_endpoint_id
 from common.tools.object_factory.Topology import json_topology_id
 from context.client.ContextClient import ContextClient
 from dlt.connector.client.DltConnectorClient import DltConnectorClient
-from interdomain.service.topology_abstractor.DltRecordSender import DltRecordSender
 from pathcomp.frontend.client.PathCompClient import PathCompClient
+from service.client.ServiceClient import ServiceClient
 from slice.client.SliceClient import SliceClient
+from .topology_abstractor.DltRecordSender import DltRecordSender
 from .RemoteDomainClients import RemoteDomainClients
-from .Tools import compose_slice, compute_slice_owner, map_abstract_endpoints_to_real
+from .Tools import compose_slice, compute_slice_owner #, map_abstract_endpoints_to_real
 
 LOGGER = logging.getLogger(__name__)
 
@@ -57,39 +67,26 @@ class InterdomainServiceServicerImpl(InterdomainServiceServicer):
             str_slice = grpc_message_to_json_string(request)
             raise Exception('InterDomain can only handle inter-domain slice requests: {:s}'.format(str_slice))
 
-        interdomain_path = compute_interdomain_path(pathcomp_client, request)
-        str_interdomain_path = [
-            [device_uuid, [
-                (endpoint_id.device_id.device_uuid.uuid, endpoint_id.endpoint_uuid.uuid)
-                for endpoint_id in endpoint_ids
-            ]]
-            for device_uuid, endpoint_ids in interdomain_path
-        ]
-        LOGGER.info('interdomain_path={:s}'.format(str(str_interdomain_path)))
-
-        traversed_domains = compute_traversed_domains(context_client, interdomain_path)
-        str_traversed_domains = [
-            (domain_uuid, is_local_domain, [
-                (endpoint_id.device_id.device_uuid.uuid, endpoint_id.endpoint_uuid.uuid)
-                for endpoint_id in endpoint_ids
-            ])
-            for domain_uuid,is_local_domain,endpoint_ids in traversed_domains
-        ]
-        LOGGER.info('traversed_domains={:s}'.format(str(str_traversed_domains)))
-
-        slice_owner_uuid = compute_slice_owner(context_client, traversed_domains)
-        LOGGER.info('slice_owner_uuid={:s}'.format(str(slice_owner_uuid)))
+        local_slices, remote_slices = compute_interdomain_sub_slices(
+            context_client, pathcomp_client, request)
+
+        traversed_domain_uuids = set()
+        traversed_domain_uuids.update(local_slices.keys())
+        traversed_domain_uuids.update(remote_slices.keys())
+        LOGGER.debug('traversed_domain_uuids={:s}'.format(str(traversed_domain_uuids)))
+        slice_owner_uuid = compute_slice_owner(context_client, traversed_domain_uuids)
+        LOGGER.debug('slice_owner_uuid={:s}'.format(str(slice_owner_uuid)))
         if slice_owner_uuid is None:
             raise Exception('Unable to identify slice owner')
 
         reply = Slice()
         reply.CopyFrom(request)
 
-        missing_env_vars = find_missing_environment_variables([
+        env_vars = find_environment_variables([
             get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST     ),
             get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC),
         ])
-        if len(missing_env_vars) == 0:
+        if len(env_vars) == 2:
             # DLT available
             dlt_connector_client = DltConnectorClient()
             dlt_connector_client.connect()
@@ -98,41 +95,80 @@ class InterdomainServiceServicerImpl(InterdomainServiceServicer):
 
         dlt_record_sender = DltRecordSender(context_client, dlt_connector_client)
 
-        for domain_uuid, is_local_domain, endpoint_ids in traversed_domains:
-            if is_local_domain:
+        for domain_uuid, endpoint_id_groups in local_slices.items():
+            domain_topology = get_topology(context_client, domain_uuid)
+            if domain_topology is None: raise Exception('Topology({:s}) not found'.format(str(domain_uuid)))
+            domain_name = domain_topology.name
+            for endpoint_ids in endpoint_id_groups:
                 slice_uuid = str(uuid.uuid4())
-                LOGGER.info('[loop] [local] domain_uuid={:s} is_local_domain={:s} slice_uuid={:s}'.format(
-                    str(domain_uuid), str(is_local_domain), str(slice_uuid)))
+                MSG = '[loop] [local] domain_uuid={:s} slice_uuid={:s} endpoint_ids={:s}'
+                LOGGER.debug(MSG.format(str(domain_uuid), str(slice_uuid), str([
+                    grpc_message_to_json(ep_id) for ep_id in endpoint_ids
+                ])))
 
                 # local slices always in DEFAULT_CONTEXT_NAME
                 #context_uuid = request.slice_id.context_id.context_uuid.uuid
                 context_uuid = DEFAULT_CONTEXT_NAME
-                endpoint_ids = map_abstract_endpoints_to_real(context_client, domain_uuid, endpoint_ids)
+                #endpoint_ids = map_abstract_endpoints_to_real(context_client, domain_uuid, endpoint_ids)
+                slice_name = '{:s}:local:{:s}'.format(request.name, domain_name)
                 sub_slice = compose_slice(
-                    context_uuid, slice_uuid, endpoint_ids, constraints=request.slice_constraints,
+                    context_uuid, slice_uuid, endpoint_ids, slice_name=slice_name, constraints=request.slice_constraints,
                     config_rules=request.slice_config.config_rules)
-                LOGGER.info('[loop] [local] sub_slice={:s}'.format(grpc_message_to_json_string(sub_slice)))
+                LOGGER.debug('[loop] [local] sub_slice={:s}'.format(grpc_message_to_json_string(sub_slice)))
                 sub_slice_id = slice_client.CreateSlice(sub_slice)
-            else:
-                slice_uuid = request.slice_id.slice_uuid.uuid
-                LOGGER.info('[loop] [remote] domain_uuid={:s} is_local_domain={:s} slice_uuid={:s}'.format(
-                    str(domain_uuid), str(is_local_domain), str(slice_uuid)))
+
+                LOGGER.debug('[loop] adding sub-slice')
+                reply.slice_subslice_ids.add().CopyFrom(sub_slice_id)   # pylint: disable=no-member
+
+        for domain_uuid, endpoint_id_groups in remote_slices.items():
+            domain_topology = get_device(context_client, domain_uuid)
+            if domain_topology is None: raise Exception('Device({:s}) not found'.format(str(domain_uuid)))
+            domain_name = domain_topology.name
+            domain_endpoint_ids_to_names = {
+                endpoint.endpoint_id.endpoint_uuid.uuid : endpoint.name
+                for endpoint in domain_topology.device_endpoints
+                if endpoint_type_is_border(endpoint.endpoint_type)
+            }
+            for endpoint_ids in endpoint_id_groups:
+                slice_uuid = str(uuid.uuid4())
+                MSG = '[loop] [remote] domain_uuid={:s} slice_uuid={:s} endpoint_ids={:s}'
+                LOGGER.debug(MSG.format(str(domain_uuid), str(slice_uuid), str([
+                    grpc_message_to_json(ep_id) for ep_id in endpoint_ids
+                ])))
 
                 # create context/topology for the remote domains where we are creating slices
-                create_context(context_client, domain_uuid)
+                create_context(context_client, domain_uuid, name=domain_name)
                 create_topology(context_client, domain_uuid, DEFAULT_TOPOLOGY_NAME)
+                create_topology(context_client, domain_uuid, INTERDOMAIN_TOPOLOGY_NAME)
+
+                slice_name = '{:s}:remote:{:s}'.format(request.name, domain_name)
+                # convert endpoint ids to names to enable conversion to uuids on the remote domain
+                endpoint_ids = [
+                    EndPointId(**json_endpoint_id(
+                        json_device_id(domain_name),
+                        domain_endpoint_ids_to_names[endpoint_id.endpoint_uuid.uuid],
+                        topology_id=json_topology_id(
+                            INTERDOMAIN_TOPOLOGY_NAME,
+                            context_id=json_context_id(DEFAULT_CONTEXT_NAME)
+                        )
+                    ))
+                    for endpoint_id in endpoint_ids
+                ]
 
                 sub_slice = compose_slice(
-                    domain_uuid, slice_uuid, endpoint_ids, constraints=request.slice_constraints,
-                    config_rules=request.slice_config.config_rules, owner_uuid=slice_owner_uuid)
-                LOGGER.info('[loop] [remote] sub_slice={:s}'.format(grpc_message_to_json_string(sub_slice)))
+                    DEFAULT_CONTEXT_NAME, slice_uuid, endpoint_ids, slice_name=slice_name,
+                    constraints=request.slice_constraints, config_rules=request.slice_config.config_rules,
+                    owner_uuid=slice_owner_uuid, owner_string=domain_uuid)
+                LOGGER.debug('[loop] [remote] sub_slice={:s}'.format(grpc_message_to_json_string(sub_slice)))
                 sub_slice_id = context_client.SetSlice(sub_slice)
 
                 if dlt_connector_client is not None:
                     topology_id = TopologyId(**json_topology_id(domain_uuid))
                     dlt_record_sender.add_slice(topology_id, sub_slice)
                 else:
-                    interdomain_client = self.remote_domain_clients.get_peer('remote-teraflow')
+                    interdomain_client = self.remote_domain_clients.get_peer(domain_uuid)
+                    if interdomain_client is None:
+                        raise Exception('InterDomain Client not found for Domain({:s})'.format(str(domain_uuid)))
                     sub_slice_reply = interdomain_client.LookUpSlice(sub_slice)
                     if sub_slice_reply == sub_slice.slice_id: # pylint: disable=no-member
                         # successful case
@@ -140,20 +176,23 @@ class InterdomainServiceServicerImpl(InterdomainServiceServicer):
                     else:
                         # not in catalog
                         remote_sub_slice = interdomain_client.CreateSliceAndAddToCatalog(sub_slice)
+                    
+                    sub_slice.slice_status.slice_status = remote_sub_slice.slice_status.slice_status
+                    context_client.SetSlice(sub_slice)
                     if remote_sub_slice.slice_status.slice_status != SliceStatusEnum.SLICESTATUS_ACTIVE:
                         raise Exception('Remote Slice creation failed. Wrong Slice status returned')
 
-            LOGGER.info('[loop] adding sub-slice')
-            reply.slice_subslice_ids.add().CopyFrom(sub_slice_id)   # pylint: disable=no-member
+                LOGGER.debug('[loop] adding sub-slice')
+                reply.slice_subslice_ids.add().CopyFrom(sub_slice_id)   # pylint: disable=no-member
 
         if dlt_connector_client is not None:
-            LOGGER.info('Recording Remote Slice requests to DLT')
+            LOGGER.debug('Recording Remote Slice requests to DLT')
             dlt_record_sender.commit()
 
-        LOGGER.info('Activating interdomain slice')
+        LOGGER.debug('Activating interdomain slice')
         reply.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_ACTIVE # pylint: disable=no-member
 
-        LOGGER.info('Updating interdomain slice')
+        LOGGER.debug('Updating interdomain slice')
         slice_id = context_client.SetSlice(reply)
         return slice_id
 
@@ -168,22 +207,133 @@ class InterdomainServiceServicerImpl(InterdomainServiceServicer):
     def LookUpSlice(self, request : Slice, context : grpc.ServicerContext) -> SliceId:
         try:
             context_client = ContextClient()
-            slice_ = context_client.GetSlice(request.slice_id)
+            slice_id = SliceId()
+            slice_id.CopyFrom(request.slice_id)
+            slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
+            slice_ = context_client.GetSlice(slice_id)
             return slice_.slice_id
         except grpc.RpcError:
             #LOGGER.exception('Unable to get slice({:s})'.format(grpc_message_to_json_string(request.slice_id)))
             return SliceId()
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def OrderSliceFromCatalog(self, request : Slice, context : grpc.ServicerContext) -> Slice:
-        raise NotImplementedError('OrderSliceFromCatalog')
-        #return Slice()
+    def CreateSliceAndAddToCatalog(self, request : Slice, context : grpc.ServicerContext) -> Slice:
+        context_client = ContextClient()
+        slice_client = SliceClient()
+        _request = Slice()
+        _request.CopyFrom(request)
+        _request.slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
+
+        #admin_context = context_client.GetContext(ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)))
+        #admin_context_uuid = admin_context.context_id.context_uuid.uuid
+        #admin_context_name = admin_context.name
+
+        #interdomain_topology = context_client.GetTopology(TopologyId(**json_topology_id(
+        #    DEFAULT_TOPOLOGY_NAME, context_id=json_context_id(DEFAULT_CONTEXT_NAME)
+        #)))
+        #interdomain_topology_uuid = interdomain_topology.topology_id.topology_uuid.uuid
+        #interdomain_topology_name = interdomain_topology.name
+
+        devices = context_client.ListDevices(Empty())
+        interdomain_endpoint_map : Dict[str, Tuple[str, str, str, str]] = dict()
+        for device in devices.devices:
+            device_uuid = device.device_id.device_uuid.uuid
+            device_name = device.name
+            for endpoint in device.device_endpoints:
+                if not endpoint_type_is_border(endpoint.endpoint_type): continue
+                #endpoint_context_uuid = endpoint.endpoint_id.topology_id.context_id.context_uuid.uuid
+                #if endpoint_context_uuid not in {admin_context_uuid, admin_context_name}: continue
+                #endpoint_topology_uuid = endpoint.endpoint_id.topology_id.topology_uuid.uuid
+                #if endpoint_topology_uuid not in {interdomain_topology_uuid, interdomain_topology_name}: continue
+                endpoint_uuid = endpoint.endpoint_id.endpoint_uuid.uuid
+                endpoint_name = endpoint.name
+                interdomain_endpoint_map[endpoint_name] = (device_uuid, device_name, endpoint_uuid, endpoint_name)
+        LOGGER.debug('interdomain_endpoint_map={:s}'.format(str(interdomain_endpoint_map)))
+
+        # Map endpoints to local real counterparts
+        del _request.slice_endpoint_ids[:]
+        for endpoint_id in request.slice_endpoint_ids:
+            #endpoint_context_uuid = endpoint_id.topology_id.context_id.context_uuid.uuid
+            #if endpoint_context_uuid not in {admin_context_uuid, admin_context_name}:
+            #    MSG = 'Unexpected ContextId in EndPointId({:s})'
+            #    raise Exception(MSG.format(grpc_message_to_json_string(endpoint_id)))
+
+            #endpoint_topology_uuid = endpoint_id.topology_id.topology_uuid.uuid
+            #if endpoint_topology_uuid not in {admin_topology_uuid, admin_topology_name}:
+            #    MSG = 'Unexpected TopologyId in EndPointId({:s})'
+            #    raise Exception(MSG.format(grpc_message_to_json_string(endpoint_id)))
+
+            endpoint_uuid = endpoint_id.endpoint_uuid.uuid
+            real_endpoint = interdomain_endpoint_map.get(endpoint_uuid)
+            if real_endpoint is None:
+                MSG = 'Unable to map EndPointId({:s}) to real endpoint. interdomain_endpoint_map={:s}'
+                raise Exception(MSG.format(grpc_message_to_json_string(endpoint_id), str(interdomain_endpoint_map)))
+            real_device_uuid, _, real_endpoint_uuid, _ = real_endpoint
+
+            real_endpoint_id = _request.slice_endpoint_ids.add()
+            real_endpoint_id.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
+            real_endpoint_id.topology_id.topology_uuid.uuid = DEFAULT_TOPOLOGY_NAME
+            real_endpoint_id.device_id.device_uuid.uuid = real_device_uuid
+            real_endpoint_id.endpoint_uuid.uuid = real_endpoint_uuid
+
+        slice_id = slice_client.CreateSlice(_request)
+        return context_client.GetSlice(slice_id)
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def CreateSliceAndAddToCatalog(self, request : Slice, context : grpc.ServicerContext) -> Slice:
+    def DeleteSlice(self, request : SliceId, context : grpc.ServicerContext) -> Empty:
         context_client = ContextClient()
+        try:
+            _slice = context_client.GetSlice(request)
+        except: # pylint: disable=bare-except
+            context_client.close()
+            return Empty()
+
+        _slice_rw = Slice()
+        _slice_rw.CopyFrom(_slice)
+        _slice_rw.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_DEINIT # pylint: disable=no-member
+        context_client.SetSlice(_slice_rw)
+
+        local_device_uuids = get_local_device_uuids(context_client)
+        slice_owner_uuid = _slice.slice_owner.owner_uuid.uuid
+        not_inter_domain = not is_inter_domain(context_client, _slice.slice_endpoint_ids)
+        no_slice_owner = len(slice_owner_uuid) == 0
+        is_local_slice_owner = slice_owner_uuid in local_device_uuids
+        if not_inter_domain and (no_slice_owner or is_local_slice_owner):
+            str_slice = grpc_message_to_json_string(_slice)
+            raise Exception('InterDomain can only handle inter-domain slice requests: {:s}'.format(str_slice))
+
         slice_client = SliceClient()
-        reply = slice_client.CreateSlice(request)
-        if reply != request.slice_id:
-            raise Exception('Slice creation failed. Wrong Slice Id was returned')
-        return context_client.GetSlice(request.slice_id)
+        for subslice_id in _slice_rw.slice_subslice_ids:
+            sub_slice = get_slice_by_id(context_client, subslice_id, rw_copy=True)
+            if ':remote:' in sub_slice.name:
+                domain_uuid = sub_slice.slice_owner.owner_string
+                interdomain_client = self.remote_domain_clients.get_peer(domain_uuid)
+                if interdomain_client is None:
+                    raise Exception('InterDomain Client not found for Domain({:s})'.format(str(domain_uuid)))
+                interdomain_client.DeleteSlice(subslice_id)
+
+            tmp_slice = Slice()
+            tmp_slice.slice_id.CopyFrom(_slice_rw.slice_id) # pylint: disable=no-member
+            slice_subslice_id = tmp_slice.slice_subslice_ids.add() # pylint: disable=no-member
+            slice_subslice_id.CopyFrom(subslice_id)
+            context_client.UnsetSlice(tmp_slice)
+
+            if ':remote:' in sub_slice.name:
+                context_client.RemoveSlice(subslice_id)
+            else:
+                slice_client.DeleteSlice(subslice_id)
+
+        service_client = ServiceClient()
+        for service_id in _slice_rw.slice_service_ids:
+            tmp_slice = Slice()
+            tmp_slice.slice_id.CopyFrom(_slice_rw.slice_id) # pylint: disable=no-member
+            slice_service_id = tmp_slice.slice_service_ids.add() # pylint: disable=no-member
+            slice_service_id.CopyFrom(service_id)
+            context_client.UnsetSlice(tmp_slice)
+            service_client.DeleteService(service_id)
+
+        context_client.RemoveSlice(request)
+        slice_client.close()
+        service_client.close()
+        context_client.close()
+        return Empty()
diff --git a/src/interdomain/service/RemoteDomainClients.py b/src/interdomain/service/RemoteDomainClients.py
index e28176ef4fad2d3f2e2c6b1d7f0eb8d24116308a..adc6fe52b554d119db951189abcefe9e58860985 100644
--- a/src/interdomain/service/RemoteDomainClients.py
+++ b/src/interdomain/service/RemoteDomainClients.py
@@ -27,12 +27,13 @@ from interdomain.client.InterdomainClient import InterdomainClient
 
 LOGGER = logging.getLogger(__name__)
 
-def get_domain_data(context_client : ContextClient, event : DeviceEvent) -> Optional[Tuple[str, str, int]]:
+def get_domain_data(context_client : ContextClient, event : DeviceEvent) -> Optional[Tuple[str, str, str, int]]:
     device_uuid = event.device_id.device_uuid.uuid
     device = get_device(
         context_client, device_uuid, include_endpoints=False,
         include_components=False, include_config_rules=True)
     if device.device_type != DeviceTypeEnum.NETWORK.value: return None
+    idc_domain_uuid = device_uuid
     idc_domain_name = device.name
     idc_domain_address = None
     idc_domain_port = None
@@ -45,7 +46,7 @@ def get_domain_data(context_client : ContextClient, event : DeviceEvent) -> Opti
             idc_domain_port = int(config_rule.custom.resource_value)
     if idc_domain_address is None: return None
     if idc_domain_port is None: return None
-    return idc_domain_name, idc_domain_address, idc_domain_port
+    return idc_domain_uuid, idc_domain_name, idc_domain_address, idc_domain_port
 
 class RemoteDomainClients(threading.Thread):
     def __init__(self) -> None:
@@ -67,20 +68,22 @@ class RemoteDomainClients(threading.Thread):
             event = self.context_event_collector.get_event(timeout=0.1)
             if event is None: continue
             if not isinstance(event, DeviceEvent): continue
-            LOGGER.info('Processing Event({:s})...'.format(grpc_message_to_json_string(event)))
+            LOGGER.info('Processing DeviceEvent({:s})...'.format(grpc_message_to_json_string(event)))
             domain_data = get_domain_data(self.context_client, event)
-            domain_name, domain_address, domain_port = domain_data
+            if domain_data is None: continue
+            domain_uuid, domain_name, domain_address, domain_port = domain_data
             try:
-                self.add_peer(domain_name, domain_address, domain_port)
+                self.add_peer(domain_uuid, domain_name, domain_address, domain_port)
             except: # pylint: disable=bare-except
-                MSG = 'Unable to connect to remote domain {:s} ({:s}:{:d})'
-                LOGGER.exception(MSG.format(domain_name, domain_address, domain_port))
+                MSG = 'Unable to connect to remote domain {:s} {:s} ({:s}:{:d})'
+                LOGGER.exception(MSG.format(domain_uuid, domain_name, domain_address, domain_port))
 
         self.context_event_collector.stop()
         self.context_client.close()
 
     def add_peer(
-        self, domain_name : str, domain_address : str, domain_port : int, context_uuid : str = DEFAULT_CONTEXT_NAME
+        self, domain_uuid : str, domain_name : str, domain_address : str, domain_port : int,
+        context_uuid : str = DEFAULT_CONTEXT_NAME
     ) -> None:
         request = TeraFlowController()
         request.context_id.context_uuid.uuid = context_uuid # pylint: disable=no-member
@@ -95,18 +98,22 @@ class RemoteDomainClients(threading.Thread):
         if not reply.authenticated:
             MSG = 'Authentication against {:s}:{:d} with Context({:s}) rejected'
             # pylint: disable=broad-exception-raised
-            raise Exception(MSG.format(domain_address, domain_port, domain_name))
+            raise Exception(MSG.format(domain_address, domain_port, context_uuid))
 
         with self.lock:
+            self.peer_domains[domain_uuid] = interdomain_client
             self.peer_domains[domain_name] = interdomain_client
-            LOGGER.info('Added peer domain {:s} ({:s}:{:d})'.format(domain_name, domain_address, domain_port))
+            MSG = 'Added peer domain {:s} {:s} ({:s}:{:d})'
+            LOGGER.info(MSG.format(domain_uuid, domain_name, domain_address, domain_port))
 
-    def get_peer(self, domain_name : str) -> InterdomainClient:
+    def get_peer(self, domain_uuid_or_name : str) -> Optional[InterdomainClient]:
         with self.lock:
-            LOGGER.warning('peers: {:s}'.format(str(self.peer_domains)))
-            return self.peer_domains.get(domain_name)
+            LOGGER.debug('domain_uuid_or_name: {:s}'.format(str(domain_uuid_or_name)))
+            LOGGER.debug('peers: {:s}'.format(str(self.peer_domains)))
+            return self.peer_domains.get(domain_uuid_or_name)
 
-    def remove_peer(self, domain_name : str) -> None:
+    def remove_peer(self, domain_uuid_or_name : str) -> None:
         with self.lock:
-            self.peer_domains.pop(domain_name, None)
-            LOGGER.info('Removed peer domain {:s}'.format(domain_name))
+            LOGGER.debug('domain_uuid_or_name: {:s}'.format(str(domain_uuid_or_name)))
+            self.peer_domains.pop(domain_uuid_or_name, None)
+            LOGGER.info('Removed peer domain {:s}'.format(domain_uuid_or_name))
diff --git a/src/interdomain/service/Tools.py b/src/interdomain/service/Tools.py
index 609dc6e07815de80d6d18f7464ce164ea3e14332..1c8fd90f1b983e66eca04143c3cf94164cdda425 100644
--- a/src/interdomain/service/Tools.py
+++ b/src/interdomain/service/Tools.py
@@ -13,10 +13,11 @@
 # limitations under the License.
 
 import json, logging
-from typing import List, Optional, Tuple
+from typing import List, Optional, Set
 from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME
+from common.DeviceTypes import DeviceTypeEnum
 from common.proto.context_pb2 import (
-    ConfigRule, Constraint, ContextId, Device, Empty, EndPointId, Slice, SliceStatusEnum)
+    ConfigRule, Constraint, ContextId, Empty, EndPointId, Slice, SliceStatusEnum)
 from common.tools.context_queries.CheckType import device_type_is_network, endpoint_type_is_border
 from common.tools.context_queries.InterDomain import get_local_device_uuids
 from common.tools.grpc.ConfigRules import copy_config_rules
@@ -28,23 +29,32 @@ from context.client.ContextClient import ContextClient
 LOGGER = logging.getLogger(__name__)
 
 def compute_slice_owner(
-    context_client : ContextClient, traversed_domains : List[Tuple[str, Device, bool, List[EndPointId]]]
+    context_client : ContextClient, traversed_domain_uuids : Set[str]
 ) -> Optional[str]:
-    traversed_domain_uuids = {traversed_domain[0] for traversed_domain in traversed_domains}
-
-    existing_topology_ids = context_client.ListTopologyIds(ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)))
-    existing_topology_uuids = {
-        topology_id.topology_uuid.uuid for topology_id in existing_topology_ids.topology_ids
-    }
-    existing_topology_uuids.discard(DEFAULT_TOPOLOGY_NAME)
-    existing_topology_uuids.discard(INTERDOMAIN_TOPOLOGY_NAME)
-
-    candidate_owner_uuids = traversed_domain_uuids.intersection(existing_topology_uuids)
+    existing_topologies = context_client.ListTopologies(ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)))
+    domain_uuids_names = set()
+    DISCARD_TOPOLOGY_NAMES = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME}
+    for topology in existing_topologies.topologies:
+        topology_uuid = topology.topology_id.topology_uuid.uuid
+        if topology_uuid in DISCARD_TOPOLOGY_NAMES: continue
+        topology_name = topology.name
+        if topology_name in DISCARD_TOPOLOGY_NAMES: continue
+        domain_uuids_names.add(topology_uuid)
+        domain_uuids_names.add(topology_name)
+
+    for topology in existing_topologies.topologies:
+        topology_details = context_client.GetTopologyDetails(topology.topology_id)
+        for device in topology_details.devices:
+            if device.device_type != DeviceTypeEnum.NETWORK.value: continue
+            domain_uuids_names.discard(device.device_id.device_uuid.uuid)
+            domain_uuids_names.discard(device.name)
+
+    candidate_owner_uuids = traversed_domain_uuids.intersection(domain_uuids_names)
     if len(candidate_owner_uuids) != 1:
         data = {
-            'traversed_domain_uuids' : [td_uuid for td_uuid in traversed_domain_uuids ],
-            'existing_topology_uuids': [et_uuid for et_uuid in existing_topology_uuids],
-            'candidate_owner_uuids'  : [co_uuid for co_uuid in candidate_owner_uuids  ],
+            'traversed_domain_uuids': [td_uuid for td_uuid in traversed_domain_uuids],
+            'domain_uuids_names'    : [et_uuid for et_uuid in domain_uuids_names    ],
+            'candidate_owner_uuids' : [co_uuid for co_uuid in candidate_owner_uuids ],
         }
         LOGGER.warning('Unable to identify slice owner: {:s}'.format(json.dumps(data)))
         return None
@@ -52,17 +62,24 @@ def compute_slice_owner(
     return candidate_owner_uuids.pop()
 
 def compose_slice(
-    context_uuid : str, slice_uuid : str, endpoint_ids : List[EndPointId], constraints : List[Constraint] = [],
-    config_rules : List[ConfigRule] = [], owner_uuid : Optional[str] = None
+    context_uuid : str, slice_uuid : str, endpoint_ids : List[EndPointId], slice_name : Optional[str] = None,
+    constraints : List[Constraint] = [], config_rules : List[ConfigRule] = [], owner_uuid : Optional[str] = None,
+    owner_string : Optional[str] = None
 ) -> Slice:
     slice_ = Slice()
     slice_.slice_id.context_id.context_uuid.uuid = context_uuid             # pylint: disable=no-member
     slice_.slice_id.slice_uuid.uuid = slice_uuid                            # pylint: disable=no-member
     slice_.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED  # pylint: disable=no-member
 
+    if slice_name is not None:
+        slice_.name = slice_name
+
     if owner_uuid is not None:
         slice_.slice_owner.owner_uuid.uuid = owner_uuid                     # pylint: disable=no-member
 
+    if owner_string is not None:
+        slice_.slice_owner.owner_string = owner_string                      # pylint: disable=no-member
+
     if len(endpoint_ids) >= 2:
         slice_.slice_endpoint_ids.add().CopyFrom(endpoint_ids[0])           # pylint: disable=no-member
         slice_.slice_endpoint_ids.add().CopyFrom(endpoint_ids[-1])          # pylint: disable=no-member
diff --git a/src/interdomain/service/__main__.py b/src/interdomain/service/__main__.py
index f867dc378020f3ef2ca8fb43b3beed538a1ebb9c..b986f8921fd212318dad3598d91e93418a6b51b7 100644
--- a/src/interdomain/service/__main__.py
+++ b/src/interdomain/service/__main__.py
@@ -18,6 +18,7 @@ from common.Constants import ServiceNameEnum
 from common.Settings import (
     ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_log_level, get_metrics_port,
     wait_for_environment_variables)
+from interdomain.Config import is_topology_abstractor_enabled
 from .topology_abstractor.TopologyAbstractor import TopologyAbstractor
 from .InterdomainService import InterdomainService
 from .RemoteDomainClients import RemoteDomainClients
@@ -63,14 +64,17 @@ def main():
     grpc_service.start()
 
     # Subscribe to Context Events
-    topology_abstractor = TopologyAbstractor()
-    topology_abstractor.start()
+    topology_abstractor_enabled = is_topology_abstractor_enabled()
+    if topology_abstractor_enabled:
+        topology_abstractor = TopologyAbstractor()
+        topology_abstractor.start()
 
     # Wait for Ctrl+C or termination signal
     while not terminate.wait(timeout=1.0): pass
 
     LOGGER.info('Terminating...')
-    topology_abstractor.stop()
+    if topology_abstractor_enabled:
+        topology_abstractor.stop()
     grpc_service.stop()
     remote_domain_clients.stop()
 
diff --git a/src/interdomain/service/topology_abstractor/AbstractDevice.py b/src/interdomain/service/topology_abstractor/AbstractDevice.py
index 0de93daa8c6e7a77b696cdf437d6e870d33b3666..47832acc02c78b5cfc095fb3ecceccfb6b9a774f 100644
--- a/src/interdomain/service/topology_abstractor/AbstractDevice.py
+++ b/src/interdomain/service/topology_abstractor/AbstractDevice.py
@@ -24,13 +24,15 @@ from common.tools.context_queries.Device import add_device_to_topology, get_exis
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Device import json_device, json_device_id
 from context.client.ContextClient import ContextClient
+from context.service.database.uuids.EndPoint import endpoint_get_uuid
 
 LOGGER = logging.getLogger(__name__)
 
 class AbstractDevice:
-    def __init__(self, device_uuid : str, device_type : DeviceTypeEnum):
+    def __init__(self, device_uuid : str, device_name : str, device_type : DeviceTypeEnum):
         self.__context_client = ContextClient()
         self.__device_uuid : str = device_uuid
+        self.__device_name : str = device_name
         self.__device_type : DeviceTypeEnum = device_type
         self.__device : Optional[Device] = None
         self.__device_id : Optional[DeviceId] = None
@@ -41,9 +43,23 @@ class AbstractDevice:
         # Dict[endpoint_uuid, device_uuid]
         self.__abstract_endpoint_to_device : Dict[str, str] = dict()
 
+    def to_json(self) -> Dict:
+        return {
+            'device_uuid' : self.__device_uuid,
+            'device_name' : self.__device_name,
+            'device_type' : self.__device_type,
+            'device' : self.__device,
+            'device_id' : self.__device_id,
+            'device_endpoint_to_abstract' : self.__device_endpoint_to_abstract,
+            'abstract_endpoint_to_device' : self.__abstract_endpoint_to_device,
+        }
+
     @property
     def uuid(self) -> str: return self.__device_uuid
 
+    @property
+    def name(self) -> str: return self.__device_name
+
     @property
     def device_id(self) -> Optional[DeviceId]: return self.__device_id
 
@@ -92,7 +108,7 @@ class AbstractDevice:
 
         device = Device(**json_device(
             device_uuid, self.__device_type.value, DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED,
-            endpoints=[], config_rules=[], drivers=[DeviceDriverEnum.DEVICEDRIVER_UNDEFINED]
+            name=self.__device_name, endpoints=[], config_rules=[], drivers=[DeviceDriverEnum.DEVICEDRIVER_UNDEFINED]
         ))
         self.__context_client.SetDevice(device)
         self.__device = device
@@ -126,6 +142,14 @@ class AbstractDevice:
             self.__abstract_endpoint_to_device\
                 .setdefault(endpoint_uuid, device_uuid)
 
+    def _update_endpoint_name(self, device_uuid : str, endpoint_uuid : str, endpoint_name : str) -> bool:
+        device_endpoint_to_abstract = self.__device_endpoint_to_abstract.get(device_uuid, {})
+        interdomain_endpoint = device_endpoint_to_abstract.get(endpoint_uuid)
+        interdomain_endpoint_name = interdomain_endpoint.name
+        if endpoint_name == interdomain_endpoint_name: return False
+        interdomain_endpoint.name = endpoint_name
+        return True
+
     def _update_endpoint_type(self, device_uuid : str, endpoint_uuid : str, endpoint_type : str) -> bool:
         device_endpoint_to_abstract = self.__device_endpoint_to_abstract.get(device_uuid, {})
         interdomain_endpoint = device_endpoint_to_abstract.get(endpoint_uuid)
@@ -134,16 +158,24 @@ class AbstractDevice:
         interdomain_endpoint.endpoint_type = endpoint_type
         return True
 
-    def _add_endpoint(self, device_uuid : str, endpoint_uuid : str, endpoint_type : str) -> EndPoint:
+    def _add_endpoint(
+        self, device_uuid : str, endpoint_uuid : str, endpoint_name : str, endpoint_type : str
+    ) -> EndPoint:
         interdomain_endpoint = self.__device.device_endpoints.add()
+        interdomain_endpoint.endpoint_id.topology_id.topology_uuid.uuid = INTERDOMAIN_TOPOLOGY_NAME
+        interdomain_endpoint.endpoint_id.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
         interdomain_endpoint.endpoint_id.device_id.CopyFrom(self.__device_id)
-        interdomain_endpoint.endpoint_id.endpoint_uuid.uuid = endpoint_uuid
+        interdomain_endpoint.endpoint_id.endpoint_uuid.uuid = endpoint_name
+        interdomain_endpoint.name = endpoint_name
         interdomain_endpoint.endpoint_type = endpoint_type
 
+        uuids = endpoint_get_uuid(interdomain_endpoint.endpoint_id, endpoint_name=endpoint_name, allow_random=False)
+        _, _, interdomain_endpoint_uuid = uuids
+
         self.__device_endpoint_to_abstract\
             .setdefault(device_uuid, {}).setdefault(endpoint_uuid, interdomain_endpoint)
         self.__abstract_endpoint_to_device\
-            .setdefault(endpoint_uuid, device_uuid)
+            .setdefault(interdomain_endpoint_uuid, device_uuid)
 
         return interdomain_endpoint
 
@@ -160,7 +192,7 @@ class AbstractDevice:
 
         device_uuid = device.device_id.device_uuid.uuid
         device_border_endpoint_uuids = {
-            endpoint.endpoint_id.endpoint_uuid.uuid : endpoint.endpoint_type
+            endpoint.endpoint_id.endpoint_uuid.uuid : (endpoint.name, endpoint.endpoint_type)
             for endpoint in device.device_endpoints
             if endpoint_type_is_border(endpoint.endpoint_type)
         }
@@ -177,14 +209,15 @@ class AbstractDevice:
             updated = True
 
         # for each border endpoint in device that is not in abstract device; add to abstract device
-        for endpoint_uuid,endpoint_type in device_border_endpoint_uuids.items():
-            # if already added; just check endpoint type is not modified
+        for endpoint_uuid,(endpoint_name, endpoint_type) in device_border_endpoint_uuids.items():
+            # if already added; just check endpoint name and type are not modified
             if endpoint_uuid in self.__abstract_endpoint_to_device:
+                updated = updated or self._update_endpoint_name(device_uuid, endpoint_uuid, endpoint_name)
                 updated = updated or self._update_endpoint_type(device_uuid, endpoint_uuid, endpoint_type)
                 continue
 
             # otherwise, add it to the abstract device
-            self._add_endpoint(device_uuid, endpoint_uuid, endpoint_type)
+            self._add_endpoint(device_uuid, endpoint_uuid, endpoint_name, endpoint_type)
             updated = True
 
         return updated
diff --git a/src/interdomain/service/topology_abstractor/AbstractLink.py b/src/interdomain/service/topology_abstractor/AbstractLink.py
index bdab62476c709de7d3fa2c4de2dba687714aba77..76b2a0311b2213d35c1b5461e06c324f9304b934 100644
--- a/src/interdomain/service/topology_abstractor/AbstractLink.py
+++ b/src/interdomain/service/topology_abstractor/AbstractLink.py
@@ -33,6 +33,14 @@ class AbstractLink:
         # Dict[(device_uuid, endpoint_uuid), abstract EndPointId]
         self.__device_endpoint_to_abstract : Dict[Tuple[str, str], EndPointId] = dict()
 
+    def to_json(self) -> Dict:
+        return {
+            'link_uuid' : self.__link_uuid,
+            'link' : self.__link,
+            'link_id' : self.__link_id,
+            'device_endpoint_to_abstract' : self.__device_endpoint_to_abstract,
+        }
+
     @property
     def uuid(self) -> str: return self.__link_uuid
 
@@ -95,6 +103,8 @@ class AbstractLink:
 
     def _add_endpoint(self, device_uuid : str, endpoint_uuid : str) -> None:
         endpoint_id = self.__link.link_endpoint_ids.add()
+        endpoint_id.topology_id.topology_uuid.uuid = INTERDOMAIN_TOPOLOGY_NAME
+        endpoint_id.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
         endpoint_id.device_id.device_uuid.uuid = device_uuid
         endpoint_id.endpoint_uuid.uuid = endpoint_uuid
         self.__device_endpoint_to_abstract.setdefault((device_uuid, endpoint_uuid), endpoint_id)
diff --git a/src/interdomain/service/topology_abstractor/TopologyAbstractor.py b/src/interdomain/service/topology_abstractor/TopologyAbstractor.py
index 20b186f307fb583734f8d0e96cea2a26e24e5590..0d9faa0408fe77dceaf5652b144590f9beb4a88d 100644
--- a/src/interdomain/service/topology_abstractor/TopologyAbstractor.py
+++ b/src/interdomain/service/topology_abstractor/TopologyAbstractor.py
@@ -16,15 +16,16 @@ import logging, threading
 from typing import Dict, Optional, Tuple
 from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME, ServiceNameEnum
 from common.DeviceTypes import DeviceTypeEnum
-from common.Settings import ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_missing_environment_variables, get_env_var_name
+from common.Settings import (
+    ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, find_environment_variables, get_env_var_name)
 from common.proto.context_pb2 import (
     ContextEvent, ContextId, Device, DeviceEvent, DeviceId, EndPoint, EndPointId, Link, LinkEvent, TopologyId,
     TopologyEvent)
 from common.tools.context_queries.CheckType import (
     device_type_is_datacenter, device_type_is_network, endpoint_type_is_border)
 from common.tools.context_queries.Context import create_context
-from common.tools.context_queries.Device import get_devices_in_topology, get_uuids_of_devices_in_topology
-from common.tools.context_queries.Link import get_links_in_topology
+from common.tools.context_queries.Device import get_uuids_of_devices_in_topology #, get_devices_in_topology
+#from common.tools.context_queries.Link import get_links_in_topology
 from common.tools.context_queries.Topology import create_missing_topologies
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Context import json_context_id
@@ -99,13 +100,13 @@ class TopologyAbstractor(threading.Thread):
     #    return False
 
     def _get_or_create_abstract_device(
-        self, device_uuid : str, device_type : DeviceTypeEnum, dlt_record_sender : DltRecordSender,
+        self, device_uuid : str, device_name : str, device_type : DeviceTypeEnum, dlt_record_sender : DltRecordSender,
         abstract_topology_id : TopologyId
     ) -> AbstractDevice:
         abstract_device = self.abstract_devices.get(device_uuid)
         changed = False
         if abstract_device is None:
-            abstract_device = AbstractDevice(device_uuid, device_type)
+            abstract_device = AbstractDevice(device_uuid, device_name, device_type)
             changed = abstract_device.initialize()
             if changed: dlt_record_sender.add_device(abstract_topology_id, abstract_device.device)
             self.abstract_devices[device_uuid] = abstract_device
@@ -117,16 +118,17 @@ class TopologyAbstractor(threading.Thread):
         abstract_device_uuid : Optional[str] = None
     ) -> None:
         device_uuid = device.device_id.device_uuid.uuid
+        device_name = device.name
         if device_type_is_datacenter(device.device_type):
             abstract_device_uuid = device_uuid
             abstract_device = self._get_or_create_abstract_device(
-                device_uuid, DeviceTypeEnum.EMULATED_DATACENTER, dlt_record_sender, abstract_topology_id)
+                device_uuid, device_name, DeviceTypeEnum.EMULATED_DATACENTER, dlt_record_sender, abstract_topology_id)
         elif device_type_is_network(device.device_type):
             LOGGER.warning('device_type is network; not implemented')
             return
         else:
             abstract_device = self._get_or_create_abstract_device(
-                abstract_device_uuid, DeviceTypeEnum.NETWORK, dlt_record_sender, abstract_topology_id)
+                abstract_device_uuid, None, DeviceTypeEnum.NETWORK, dlt_record_sender, abstract_topology_id)
         self.real_to_abstract_device_uuid[device_uuid] = abstract_device_uuid
         changed = abstract_device.update_endpoints(device)
         if changed: dlt_record_sender.add_device(abstract_topology_id, abstract_device.device)
@@ -224,11 +226,11 @@ class TopologyAbstractor(threading.Thread):
             if changed: dlt_record_sender.add_link(INTERDOMAIN_TOPOLOGY_ID, abstract_link.link)
 
     def update_abstraction(self, event : EventTypes) -> None:
-        missing_env_vars = find_missing_environment_variables([
+        env_vars = find_environment_variables([
             get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_HOST     ),
             get_env_var_name(ServiceNameEnum.DLT, ENVVAR_SUFIX_SERVICE_PORT_GRPC),
         ])
-        if len(missing_env_vars) == 0:
+        if len(env_vars) == 2:
             # DLT available
             dlt_connector_client = DltConnectorClient()
             dlt_connector_client.connect()
@@ -238,41 +240,55 @@ class TopologyAbstractor(threading.Thread):
         dlt_record_sender = DltRecordSender(self.context_client, dlt_connector_client)
 
         if isinstance(event, ContextEvent):
-            LOGGER.warning('Ignoring Event({:s})'.format(grpc_message_to_json_string(event)))
+            LOGGER.debug('Processing ContextEvent({:s})'.format(grpc_message_to_json_string(event)))
+            LOGGER.warning('Ignoring ContextEvent({:s})'.format(grpc_message_to_json_string(event)))
 
         elif isinstance(event, TopologyEvent):
+            LOGGER.debug('Processing TopologyEvent({:s})'.format(grpc_message_to_json_string(event)))
             topology_id = event.topology_id
             topology_uuid = topology_id.topology_uuid.uuid
             context_id = topology_id.context_id
             context_uuid = context_id.context_uuid.uuid
             topology_uuids = {DEFAULT_TOPOLOGY_NAME, INTERDOMAIN_TOPOLOGY_NAME}
-            if (context_uuid == DEFAULT_CONTEXT_NAME) and (topology_uuid not in topology_uuids):
+
+            context = self.context_client.GetContext(context_id)
+            context_name = context.name
+
+            topology_details = self.context_client.GetTopologyDetails(topology_id)
+            topology_name = topology_details.name
+
+            if ((context_uuid == DEFAULT_CONTEXT_NAME) or (context_name == DEFAULT_CONTEXT_NAME)) and \
+                (topology_uuid not in topology_uuids) and (topology_name not in topology_uuids):
+
                 abstract_topology_id = TopologyId(**json_topology_id(topology_uuid, context_id=ADMIN_CONTEXT_ID))
                 self._get_or_create_abstract_device(
-                    topology_uuid, DeviceTypeEnum.NETWORK, dlt_record_sender, abstract_topology_id)
+                    topology_uuid, topology_name, DeviceTypeEnum.NETWORK, dlt_record_sender, abstract_topology_id)
 
-                devices = get_devices_in_topology(self.context_client, context_id, topology_uuid)
-                for device in devices:
+                #devices = get_devices_in_topology(self.context_client, context_id, topology_uuid)
+                for device in topology_details.devices:
                     self._update_abstract_device(
                         device, dlt_record_sender, abstract_topology_id, abstract_device_uuid=topology_uuid)
 
-                links = get_links_in_topology(self.context_client, context_id, topology_uuid)
-                for link in links:
+                #links = get_links_in_topology(self.context_client, context_id, topology_uuid)
+                for link in topology_details.links:
                     self._update_abstract_link(link, dlt_record_sender, abstract_topology_id)
                 
-                for device in devices:
+                for device in topology_details.devices:
                     self._infer_abstract_links(device, dlt_record_sender)
 
             else:
-                LOGGER.warning('Ignoring Event({:s})'.format(grpc_message_to_json_string(event)))
-            
+                MSG = 'Ignoring ({:s}/{:s})({:s}/{:s}) TopologyEvent({:s})'
+                args = context_uuid, context_name, topology_uuid, topology_name, grpc_message_to_json_string(event)
+                LOGGER.warning(MSG.format(*args))
+
         elif isinstance(event, DeviceEvent):
+            LOGGER.debug('Processing DeviceEvent({:s})'.format(grpc_message_to_json_string(event)))
             device_id = event.device_id
             device_uuid = device_id.device_uuid.uuid
             abstract_device_uuid = self.real_to_abstract_device_uuid.get(device_uuid)
             device = self.context_client.GetDevice(device_id)
             if abstract_device_uuid is None:
-                LOGGER.warning('Ignoring Event({:s})'.format(grpc_message_to_json_string(event)))
+                LOGGER.warning('Ignoring DeviceEvent({:s})'.format(grpc_message_to_json_string(event)))
             else:
                 abstract_topology_id = self.abstract_device_to_topology_id[abstract_device_uuid]
                 self._update_abstract_device(
@@ -281,11 +297,12 @@ class TopologyAbstractor(threading.Thread):
             self._infer_abstract_links(device, dlt_record_sender)
 
         elif isinstance(event, LinkEvent):
+            LOGGER.debug('Processing LinkEvent({:s})'.format(grpc_message_to_json_string(event)))
             link_id = event.link_id
             link_uuid = link_id.link_uuid.uuid
             abstract_link_uuid = self.real_to_abstract_link_uuid.get(link_uuid)
             if abstract_link_uuid is None:
-                LOGGER.warning('Ignoring Event({:s})'.format(grpc_message_to_json_string(event)))
+                LOGGER.warning('Ignoring LinkEvent({:s})'.format(grpc_message_to_json_string(event)))
             else:
                 abstract_topology_id = self.abstract_link_to_topology_id[abstract_link_uuid]
                 link = self.context_client.GetLink(link_id)
@@ -295,4 +312,4 @@ class TopologyAbstractor(threading.Thread):
             LOGGER.warning('Unsupported Event({:s})'.format(grpc_message_to_json_string(event)))
 
         dlt_record_sender.commit()
-        dlt_connector_client.close()
+        if dlt_connector_client is not None: dlt_connector_client.close()
diff --git a/src/interdomain/tests/test_unitary.py b/src/interdomain/tests/old_tests.py
similarity index 99%
rename from src/interdomain/tests/test_unitary.py
rename to src/interdomain/tests/old_tests.py
index 403dea54334da54a794b6da40dd64d1e6e856034..3543c9541371d3e1dd3d81e8f51c62082cec6ec1 100644
--- a/src/interdomain/tests/test_unitary.py
+++ b/src/interdomain/tests/old_tests.py
@@ -12,7 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
 #import logging, grpc
 #import os
 #import sqlite3
diff --git a/src/interdomain/tests/test_compute_domains.py b/src/interdomain/tests/test_compute_domains.py
new file mode 100644
index 0000000000000000000000000000000000000000..3332731dd53ad62801c80c5172fbfee3ea943c6a
--- /dev/null
+++ b/src/interdomain/tests/test_compute_domains.py
@@ -0,0 +1,119 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging, pytest
+from typing import Dict, List, Tuple
+from common.DeviceTypes import DeviceTypeEnum
+from common.proto.context_pb2 import EndPointId
+from common.proto.pathcomp_pb2 import PathCompRequest
+from common.tools.context_queries.Device import get_device
+from common.tools.context_queries.InterDomain import get_device_to_domain_map, get_local_device_uuids
+from common.tools.grpc.Tools import grpc_message_list_to_json, grpc_message_list_to_json_string, grpc_message_to_json_string
+from context.client.ContextClient import ContextClient
+from pathcomp.frontend.client.PathCompClient import PathCompClient
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+@pytest.fixture(scope='session')
+def context_client():
+    _client = ContextClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def pathcomp_client():
+    _client = PathCompClient()
+    yield _client
+    _client.close()
+
+def test_interdomain_topology_abstractor(
+    context_client  : ContextClient,    # pylint: disable=redefined-outer-name
+    pathcomp_client : PathCompClient,   # pylint: disable=redefined-outer-name
+) -> None:
+
+    pathcomp_req = PathCompRequest(**{
+        "services": [
+            {"name": "", "service_constraints": [{"sla_capacity": {"capacity_gbps": 10.0}}, {"sla_latency": {"e2e_latency_ms": 100.0}}], "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "cda90d2f-e7b0-5837-8f2e-2fb29dd9b367"}}, "endpoint_uuid": {"uuid": "37ab67ef-0064-54e3-ae9b-d40100953834"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}}, "topology_uuid": {"uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8"}}},
+                {"device_id": {"device_uuid": {"uuid": "800d5bd4-a7a3-5a66-82ab-d399767ca3d8"}}, "endpoint_uuid": {"uuid": "97f57787-cfec-5315-9718-7e850905f11a"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}}, "topology_uuid": {"uuid": "c76135e3-24a8-5e92-9bed-c3c9139359c8"}}}
+            ], "service_id": {"context_id": {"context_uuid": {"uuid": "43813baf-195e-5da6-af20-b3d0922e71a7"}}, "service_uuid": {"uuid": "77277b43-f9cd-5e01-a3e7-6c5fa4577137"}}, "service_type": "SERVICETYPE_L2NM"}
+        ],
+        "shortest_path": {}
+    })
+    pathcomp_req_svc = pathcomp_req.services[0]
+
+    pathcomp_rep = pathcomp_client.Compute(pathcomp_req)
+    LOGGER.warning('pathcomp_rep = {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
+
+    num_services = len(pathcomp_rep.services)
+    if num_services == 0:
+        raise Exception('No services received : {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
+
+    num_connections = len(pathcomp_rep.connections)
+    if num_connections == 0:
+        raise Exception('No connections received : {:s}'.format(grpc_message_to_json_string(pathcomp_rep)))
+
+    local_device_uuids = get_local_device_uuids(context_client)
+    LOGGER.warning('local_device_uuids={:s}'.format(str(local_device_uuids)))
+
+    device_to_domain_map = get_device_to_domain_map(context_client)
+    LOGGER.warning('device_to_domain_map={:s}'.format(str(device_to_domain_map)))
+
+    local_slices  : List[List[EndPointId]] = list()
+    remote_slices : List[List[EndPointId]] = list()
+    req_service_uuid = pathcomp_req_svc.service_id.service_uuid.uuid
+    for service in pathcomp_rep.services:
+        service_uuid = service.service_id.service_uuid.uuid
+        if service_uuid == req_service_uuid: continue # main synthetic service; we don't care
+        device_uuids = {
+            endpoint_id.device_id.device_uuid.uuid
+            for endpoint_id in service.service_endpoint_ids
+        }
+        local_domain_uuids = set()
+        remote_domain_uuids = set()
+        for device_uuid in device_uuids:
+            if device_uuid in local_device_uuids:
+                domain_uuid = device_to_domain_map.get(device_uuid)
+                if domain_uuid is None:
+                    raise Exception('Unable to map device({:s}) to a domain'.format(str(device_uuid)))
+                local_domain_uuids.add(domain_uuid)
+            else:
+                device = get_device(
+                    context_client, device_uuid, include_endpoints=True, include_config_rules=False,
+                    include_components=False)
+                if device is None: raise Exception('Device({:s}) not found'.format(str(device_uuid)))
+                device_type = DeviceTypeEnum._value2member_map_.get(device.device_type)
+                is_remote = device_type == DeviceTypeEnum.NETWORK
+                if not is_remote:
+                    MSG = 'Weird device({:s}) is not local and not network'
+                    raise Exception(MSG.format(grpc_message_to_json_string(device)))
+                remote_domain_uuids.add(device_uuid)
+        is_local = len(local_domain_uuids) > 0
+        is_remote = len(remote_domain_uuids) > 0
+        if is_local == is_remote:
+            MSG = 'Weird service combines local and remote devices: {:s}'
+            raise Exception(MSG.format(grpc_message_to_json_string(service)))
+        elif is_local:
+            local_slices.append(service.service_endpoint_ids)
+        else:
+            remote_slices.append(service.service_endpoint_ids)
+
+    str_local_slices = [grpc_message_list_to_json(endpoint_ids) for endpoint_ids in local_slices]
+    LOGGER.warning('local_slices={:s}'.format(str(str_local_slices)))
+
+    str_remote_slices = [grpc_message_list_to_json(endpoint_ids) for endpoint_ids in remote_slices]
+    LOGGER.warning('remote_slices={:s}'.format(str(str_remote_slices)))
+
+    raise Exception()
diff --git a/src/interdomain/tests/test_topology_abstractor.py b/src/interdomain/tests/test_topology_abstractor.py
new file mode 100644
index 0000000000000000000000000000000000000000..e6243a236c6a2ab38bd5e5325ecdd1668d2b033f
--- /dev/null
+++ b/src/interdomain/tests/test_topology_abstractor.py
@@ -0,0 +1,105 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging, pytest, time
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import ContextId, Empty
+from common.proto.context_pb2 import ConfigActionEnum, Device, DeviceId
+from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from common.tools.object_factory.Context import json_context_id
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from interdomain.service.topology_abstractor.TopologyAbstractor import TopologyAbstractor
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+@pytest.fixture(scope='session')
+def context_client():
+    _client = ContextClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def device_client():
+    _client = DeviceClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def topology_abstractor():
+    _topology_abstractor = TopologyAbstractor()
+    _topology_abstractor.start()
+    yield _topology_abstractor
+    _topology_abstractor.stop()
+    _topology_abstractor.join()
+
+def test_pre_cleanup_scenario(
+    context_client : ContextClient,             # pylint: disable=redefined-outer-name
+    device_client : DeviceClient,               # pylint: disable=redefined-outer-name
+) -> None:
+    for link_id in context_client.ListLinkIds(Empty()).link_ids: context_client.RemoveLink(link_id)
+    for device_id in context_client.ListDeviceIds(Empty()).device_ids: device_client.DeleteDevice(device_id)
+
+    contexts = context_client.ListContexts(Empty())
+    for context in contexts.contexts:
+        assert len(context.slice_ids) == 0, 'Found Slices: {:s}'.format(grpc_message_to_json_string(context))
+        assert len(context.service_ids) == 0, 'Found Services: {:s}'.format(grpc_message_to_json_string(context))
+        for topology_id in context.topology_ids: context_client.RemoveTopology(topology_id)
+        context_client.RemoveContext(context.context_id)
+
+DESCRIPTOR_FILE = 'oeccpsc22/descriptors/domain1.json'
+#DESCRIPTOR_FILE = 'oeccpsc22/descriptors/domain2.json'
+
+def test_interdomain_topology_abstractor(
+    context_client : ContextClient,             # pylint: disable=redefined-outer-name
+    device_client : DeviceClient,               # pylint: disable=redefined-outer-name
+    topology_abstractor : TopologyAbstractor,   # pylint: disable=redefined-outer-name
+) -> None:
+    #validate_empty_scenario(context_client)
+
+    time.sleep(3)
+
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client)
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+    #descriptor_loader.validate()
+
+    time.sleep(3)
+
+    LOGGER.warning('real_to_abstract_device_uuid={:s}'.format(str(topology_abstractor.real_to_abstract_device_uuid)))
+    LOGGER.warning('real_to_abstract_link_uuid={:s}'.format(str(topology_abstractor.real_to_abstract_link_uuid)))
+
+    LOGGER.warning('abstract_device_to_topology_id={:s}'.format(str(topology_abstractor.abstract_device_to_topology_id)))
+    LOGGER.warning('abstract_link_to_topology_id={:s}'.format(str(topology_abstractor.abstract_link_to_topology_id)))
+
+    LOGGER.warning('abstract_devices={:s}'.format(str({
+        k:v.to_json()
+        for k,v in topology_abstractor.abstract_devices.items()
+    })))
+    LOGGER.warning('abstract_links={:s}'.format(str({
+        k:v.to_json()
+        for k,v in topology_abstractor.abstract_links.items()
+    })))
+
+    raise Exception()
+
+
+#def test_post_cleanup_scenario(
+#    context_client : ContextClient,             # pylint: disable=redefined-outer-name
+#    device_client : DeviceClient,               # pylint: disable=redefined-outer-name
+#) -> None:
+#    test_pre_cleanup_scenario(context_client, device_client)
diff --git a/src/l3_attackmitigator/README.md b/src/l3_attackmitigator/README.md
index 04c937a1d35e91071e0357278c81b33335e2e37a..d82400cdcd2a396c6275fea39dc1c127ee3510dc 100644
--- a/src/l3_attackmitigator/README.md
+++ b/src/l3_attackmitigator/README.md
@@ -1,3 +1,8 @@
-# l3_attackmitigator
-- Receives packages and process it with TSTAT
-- Functions: ReportSummarizeKpi(KpiList)
+# L3 Attack Mitigator
+
+Receives detected attacks from the Centralized Attack Detector component and performs the necessary mitigations.
+
+## Functions:
+- PerformMitigation(L3AttackmitigatorOutput) -> StatusMessage
+- GetMitigation(Empty) -> Empty
+- GetConfiguredACLRules(Empty) -> ACLRules
diff --git a/src/l3_attackmitigator/client/l3_attackmitigatorClient.py b/src/l3_attackmitigator/client/l3_attackmitigatorClient.py
index c5d98b1c4974172e50e65db16ba4753e742eab28..bae3fd62785e02eed1cd8fd7678c1775b0193d84 100644
--- a/src/l3_attackmitigator/client/l3_attackmitigatorClient.py
+++ b/src/l3_attackmitigator/client/l3_attackmitigatorClient.py
@@ -15,17 +15,12 @@
 import grpc, logging
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_host, get_service_port_grpc
+from common.proto.context_pb2 import Empty
+from common.proto.l3_attackmitigator_pb2 import L3AttackmitigatorOutput, ACLRules
+from common.proto.l3_attackmitigator_pb2_grpc import L3AttackmitigatorStub
+from common.proto.l3_centralizedattackdetector_pb2 import StatusMessage
 from common.tools.client.RetryDecorator import retry, delay_exponential
-from common.proto.l3_attackmitigator_pb2_grpc import (
-    L3AttackmitigatorStub,
-)
-from common.proto.l3_attackmitigator_pb2 import (
-    L3AttackmitigatorOutput, ACLRules
-)
-
-from common.proto.context_pb2 import (
-    Empty
-)
+from common.tools.grpc.Tools import grpc_message_to_json_string
 
 LOGGER = logging.getLogger(__name__)
 MAX_RETRIES = 15
@@ -37,7 +32,7 @@ class l3_attackmitigatorClient:
         if not host: host = get_service_host(ServiceNameEnum.L3_AM)
         if not port: port = get_service_port_grpc(ServiceNameEnum.L3_AM)
         self.endpoint = "{}:{}".format(host, port)
-        LOGGER.debug("Creating channel to {}...".format(self.endpoint))
+        LOGGER.debug("Creating channel to {:s}...".format(self.endpoint))
         self.channel = None
         self.stub = None
         self.connect()
@@ -54,23 +49,22 @@ class l3_attackmitigatorClient:
         self.stub = None
 
     @RETRY_DECORATOR
-    def PerformMitigation(self, request: L3AttackmitigatorOutput) -> Empty:
-        LOGGER.debug('PerformMitigation request: {}'.format(request))
+    def PerformMitigation(self, request: L3AttackmitigatorOutput) -> StatusMessage:
+        LOGGER.debug('PerformMitigation request: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.PerformMitigation(request)
-        LOGGER.debug('PerformMitigation result: {}'.format(response))
+        LOGGER.debug('PerformMitigation result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
     
     @RETRY_DECORATOR
     def GetMitigation(self, request: Empty) -> Empty:
-        LOGGER.debug('GetMitigation request: {}'.format(request))
+        LOGGER.debug('GetMitigation request: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.GetMitigation(request)
-        LOGGER.debug('GetMitigation result: {}'.format(response))
+        LOGGER.debug('GetMitigation result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
     
     @RETRY_DECORATOR
     def GetConfiguredACLRules(self, request: Empty) -> ACLRules:
-        LOGGER.debug('GetConfiguredACLRules request: {}'.format(request))
+        LOGGER.debug('GetConfiguredACLRules request: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.GetConfiguredACLRules(request)
-        LOGGER.debug('GetConfiguredACLRules result: {}'.format(response))
+        LOGGER.debug('GetConfiguredACLRules result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
-
diff --git a/src/l3_attackmitigator/requirements.in b/src/l3_attackmitigator/requirements.in
index a8aba849708799232f6b0732c3661396266da329..38d04994fb0fa1951fb465bc127eb72659dc2eaf 100644
--- a/src/l3_attackmitigator/requirements.in
+++ b/src/l3_attackmitigator/requirements.in
@@ -11,5 +11,3 @@
 # 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.
-
-# no extra dependency
diff --git a/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py b/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py
index 34cfcd5d081a431f165461564eeb5a3390a3bda5..5a7abe0a7416e61ae73b24e5f528ebc1717d8f2e 100644
--- a/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py
+++ b/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py
@@ -13,33 +13,39 @@
 # limitations under the License.
 
 from __future__ import print_function
+
+import grpc
 import logging
 import time
 
-from common.proto.l3_centralizedattackdetector_pb2 import Empty
-from common.proto.l3_attackmitigator_pb2_grpc import L3AttackmitigatorServicer
-from common.proto.l3_attackmitigator_pb2 import ACLRules
-from common.proto.context_pb2 import (
-    ServiceId,
-    ConfigActionEnum,
-)
-
+from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
 from common.proto.acl_pb2 import AclForwardActionEnum, AclLogActionEnum, AclRuleTypeEnum
-from common.proto.context_pb2 import ConfigActionEnum, Service, ServiceId, ConfigRule
+from common.proto.context_pb2 import ConfigActionEnum, Empty, Service, ServiceId
+from common.proto.l3_attackmitigator_pb2 import ACLRules, L3AttackmitigatorOutput
+from common.proto.l3_attackmitigator_pb2_grpc import L3AttackmitigatorServicer
+from common.proto.l3_centralizedattackdetector_pb2 import StatusMessage
 from common.tools.grpc.Tools import grpc_message_to_json_string
 from context.client.ContextClient import ContextClient
 from service.client.ServiceClient import ServiceClient
 
-from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
 
 LOGGER = logging.getLogger(__name__)
-
-METRICS_POOL = MetricsPool('l3_attackmitigator', 'RPC')
+METRICS_POOL = MetricsPool("l3_attackmitigator", "RPC")
 
 
 class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
     def __init__(self):
-        LOGGER.info("Creating Attack Mitigator Service")
+        """
+        Initializes the Attack Mitigator service.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+
+        LOGGER.info("Creating Attack Mitigator service")
 
         self.last_value = -1
         self.last_tag = 0
@@ -60,14 +66,28 @@ class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
         src_port: str,
         dst_port: str,
     ) -> None:
+        """
+        Configures an ACL rule to block undesired TCP traffic.
+
+        Args:
+            context_uuid (str): The UUID of the context.
+            service_uuid (str): The UUID of the service.
+            device_uuid (str): The UUID of the device.
+            endpoint_uuid (str): The UUID of the endpoint.
+            src_ip (str): The source IP address.
+            dst_ip (str): The destination IP address.
+            src_port (str): The source port.
+            dst_port (str): The destination port.
+
+        Returns:
+            None.
+        """
+
         # Create ServiceId
         service_id = ServiceId()
         service_id.context_id.context_uuid.uuid = context_uuid
         service_id.service_uuid.uuid = service_uuid
 
-        # Get service form Context
-        # context_client = ContextClient()
-
         try:
             _service: Service = self.context_client.GetService(service_id)
         except:
@@ -88,11 +108,9 @@ class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
 
         # Set RuleSet for this ACL ConfigRule
         acl_rule_set = acl_config_rule.acl.rule_set
-        # TODO: update the following parameters; for instance, add them as parameters of the method configure_acl_rule
-        # acl_rule_set.name = "DROP-HTTPS"
+
         acl_rule_set.name = "DROP-TCP"
         acl_rule_set.type = AclRuleTypeEnum.ACLRULETYPE_IPV4
-        # acl_rule_set.description = "DROP undesired HTTPS traffic"
         acl_rule_set.description = "DROP undesired TCP traffic"
 
         # Add ACLEntry to the ACLRuleSet
@@ -108,35 +126,45 @@ class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
         acl_entry.match.dst_address = "{}/32".format(dst_ip)
         acl_entry.match.src_port = int(src_port)
         acl_entry.match.dst_port = int(dst_port)
-        # TODO: update the following parameters; for instance, add them as parameters of the method configure_acl_rule
+
         acl_entry.action.forward_action = AclForwardActionEnum.ACLFORWARDINGACTION_DROP
         acl_entry.action.log_action = AclLogActionEnum.ACLLOGACTION_NOLOG
 
-        LOGGER.info("ACL Rule Set: %s", acl_rule_set)
-        LOGGER.info("ACL Config Rule: %s", acl_config_rule)
+        LOGGER.info(f"ACL Rule Set: {grpc_message_to_json_string(acl_rule_set)}")
+        LOGGER.info(f"ACL Config Rule: {grpc_message_to_json_string(acl_config_rule)}")
 
         # Add the ACLRuleSet to the list of configured ACLRuleSets
         self.configured_acl_config_rules.append(acl_config_rule)
+        
+        LOGGER.info(service_request)
 
         # Update the Service with the new ACL RuleSet
-        # service_client = ServiceClient()
-        service_reply: ServiceId = self.service_client.UpdateService(service_request)
+        service_reply = self.service_client.UpdateService(service_request)
 
-        # TODO: Log the service_reply details
+        LOGGER.info(f"Service reply: {grpc_message_to_json_string(service_reply)}")
 
         if service_reply != service_request.service_id:  # pylint: disable=no-member
             raise Exception("Service update failed. Wrong ServiceId was returned")
 
-
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def PerformMitigation(self, request, context):
+    def PerformMitigation(self, request : L3AttackmitigatorOutput, context : grpc.ServicerContext) -> StatusMessage:
+        """
+        Performs mitigation on an attack by configuring an ACL rule to block undesired TCP traffic.
+
+        Args:
+            request (L3AttackmitigatorOutput): The request message containing the attack mitigation information.
+            context (Empty): The context of the request.
+
+        Returns:
+            StatusMessage: A response with a message indicating that the attack mitigation information
+                was received and processed.
+        """
+
         last_value = request.confidence
         last_tag = request.tag
 
         LOGGER.info(
-            "Attack Mitigator received attack mitigation information. Prediction confidence: %s, Predicted class: %s",
-            last_value,
-            last_tag,
+            f"Attack Mitigator received attack mitigation information. Prediction confidence: {last_value}, Predicted class: {last_tag}"
         )
 
         ip_o = request.ip_o
@@ -148,21 +176,23 @@ class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
         counter = 0
         service_id = request.service_id
 
-        LOGGER.info("Service Id.:\n{}".format(service_id))
-
+        LOGGER.info(f"Service Id.: {grpc_message_to_json_string(service_id)}")
         LOGGER.info("Retrieving service from Context")
+
         while sentinel:
             try:
                 service = self.context_client.GetService(service_id)
                 sentinel = False
             except Exception as e:
                 counter = counter + 1
-                LOGGER.debug("Waiting 2 seconds", counter, e)
+                LOGGER.debug(f"Waiting 2 seconds for service to be available (attempt: {counter})")
                 time.sleep(2)
 
-        LOGGER.info(f"Service with Service Id.: {service_id}\n{service}")
-
+        LOGGER.info(
+            f"Service with Service Id.: {grpc_message_to_json_string(service_id)}\n{grpc_message_to_json_string(service)}"
+        )
         LOGGER.info("Adding new rule to the service to block the attack")
+
         self.configure_acl_rule(
             context_uuid=service_id.context_id.context_uuid.uuid,
             service_uuid=service_id.service_uuid.uuid,
@@ -173,22 +203,33 @@ class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
             src_port=port_o,
             dst_port=port_d,
         )
-        LOGGER.info("Service with new rule:\n{}".format(service))
-
+        LOGGER.info("Service with new rule:\n{}".format(grpc_message_to_json_string(service)))
         LOGGER.info("Updating service with the new rule")
+
         self.service_client.UpdateService(service)
+        service = self.context_client.GetService(service_id)
 
         LOGGER.info(
             "Service obtained from Context after updating with the new rule:\n{}".format(
-                self.context_client.GetService(service_id)
+                grpc_message_to_json_string(service)
             )
         )
 
-        return Empty(message=f"OK, received values: {last_tag} with confidence {last_value}.")
-
+        return StatusMessage(message=f"OK, received values: {last_tag} with confidence {last_value}.")
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def GetConfiguredACLRules(self, request, context):
+    def GetConfiguredACLRules(self, request : Empty, context : grpc.ServicerContext) -> ACLRules:
+        """
+        Returns the configured ACL rules.
+
+        Args:
+            request (Empty): The request message.
+            context (Empty): The context of the RPC call.
+
+        Returns:
+            acl_rules (ACLRules): The configured ACL rules.
+        """
+
         acl_rules = ACLRules()
 
         for acl_config_rule in self.configured_acl_config_rules:
diff --git a/src/l3_attackmitigator/service/test_create_service.py b/src/l3_attackmitigator/service/test_create_service.py
deleted file mode 100644
index 01cf769a271de1bbbd0329a3ce21ea476ac10cab..0000000000000000000000000000000000000000
--- a/src/l3_attackmitigator/service/test_create_service.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# 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
-#
-#      http://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.
-
-from __future__ import print_function
-import logging
-from common.proto.l3_centralizedattackdetector_pb2 import (
-    Empty
-)
-from common.proto.l3_attackmitigator_pb2_grpc import (
-    L3AttackmitigatorServicer,
-)
-from common.proto.context_pb2 import (
-    Service, ServiceId, ServiceConfig, ServiceTypeEnum, ServiceStatusEnum, ServiceStatus, Context, ContextId, Uuid,
-    Timestamp, ConfigRule, ConfigRule_Custom, ConfigActionEnum, Device, DeviceId, DeviceConfig,
-    DeviceOperationalStatusEnum, DeviceDriverEnum, EndPoint, Link, LinkId, EndPoint, EndPointId, Topology, TopologyId
-)
-from common.proto.context_pb2_grpc import (
-    ContextServiceStub
-)
-from common.proto.service_pb2_grpc import (
-    ServiceServiceStub
-)
-from datetime import datetime
-import grpc
-
-LOGGER = logging.getLogger(__name__)
-CONTEXT_CHANNEL = "192.168.165.78:1010"
-SERVICE_CHANNEL = "192.168.165.78:3030"
-
-class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
-
-    def GetNewService(self, service_id):
-        service = Service()
-        service_id_obj = self.GenerateServiceId(service_id)
-        service.service_id.CopyFrom(service_id_obj)
-        service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM
-        service_status = ServiceStatus()
-        service_status.service_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE
-        service.service_status.CopyFrom(service_status)
-        timestamp = Timestamp()
-        timestamp.timestamp = datetime.timestamp(datetime.now())
-        service.timestamp.CopyFrom(timestamp)
-        return service
-    
-    def GetNewContext(self, service_id):
-        context = Context()
-        context_id = ContextId()
-        uuid = Uuid()
-        uuid.uuid = service_id
-        context_id.context_uuid.CopyFrom(uuid)
-        context.context_id.CopyFrom(context_id)
-        return context
-
-    def GetNewDevice(self, service_id):
-        device = Device()
-        device_id = DeviceId()
-        uuid = Uuid()
-        uuid.uuid = service_id
-        device_id.device_uuid.CopyFrom(uuid)
-        device.device_type="test"
-        device.device_id.CopyFrom(device_id)
-        device.device_operational_status = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
-        return device
-
-    def GetNewLink(self, service_id):
-        link = Link()
-        link_id = LinkId()
-        uuid = Uuid()
-        uuid.uuid = service_id
-        link_id.link_uuid.CopyFrom(uuid)
-        link.link_id.CopyFrom(link_id)
-        return link
-
-    def GetNewTopology(self,context_id, device_id, link_id):
-        topology = Topology()
-        topology_id = TopologyId()
-        topology_id.context_id.CopyFrom(context_id)
-        uuid = Uuid()
-        uuid.uuid = "test_crypto"
-        topology_id.topology_uuid.CopyFrom(uuid)
-        topology.topology_id.CopyFrom(topology_id)
-        topology.device_ids.extend([device_id])
-        topology.link_ids.extend([link_id])
-        return topology
-
-    def GetNewEndpoint(self, topology_id, device_id, uuid_name):
-        endpoint = EndPoint()
-        endpoint_id = EndPointId()
-        endpoint_id.topology_id.CopyFrom(topology_id)
-        endpoint_id.device_id.CopyFrom(device_id)
-        uuid = Uuid()
-        uuid.uuid = uuid_name
-        endpoint_id.endpoint_uuid.CopyFrom(uuid)
-        endpoint.endpoint_id.CopyFrom(endpoint_id)
-        endpoint.endpoint_type = "test"
-        return endpoint
-        
-
-    def __init__(self):
-        LOGGER.debug("Creating Servicer...")
-        self.last_value = -1
-        self.last_tag = 0
-       """ 
-        context = self.GetNewContext("test_crypto")
-        print(context, flush=True)
-        print(self.SetContext(context))
-
-        service = self.GetNewService("test_crypto")
-        print("This is the new service", self.CreateService(service), flush = True)
-
-        ip_o = "127.0.0.1"
-        ip_d = "127.0.0.2"
-        port_o = "123"
-        port_d = "124"
-
-        service_id = self.GenerateServiceId("test_crypto")
-
-        config_rule = self.GetConfigRule(ip_o, ip_d, port_o, port_d)
-
-        service = self.GetService(service_id)
-        print("Service obtained from id", service, flush=True)
-        
-        config_rule = self.GetConfigRule(ip_o, ip_d, port_o, port_d)
-
-        #service_config = service.service_config
-        #service_config.append(config_rule)
-        
-        service_config = ServiceConfig()
-        service_config.config_rules.extend([config_rule])
-        service.service_config.CopyFrom(service_config)
-        
-        device = self.GetNewDevice("test_crypto")
-        print("New device", device, flush=True)
-        device_id = self.SetDevice(device)
-
-        link = self.GetNewLink("test_crypto")
-        print("New link", link, flush=True)
-        link_id = self.SetLink(link)
-        
-        topology = self.GetNewTopology(context.context_id, device.device_id, link.link_id)
-        print("New topology", topology, flush=True)
-        topology_id = self.SetTopology(topology)
-
-        endpoint = self.GetNewEndpoint(topology.topology_id, device.device_id, "test_crypto")
-        print("New endpoint", endpoint, flush=True)
-        link.link_endpoint_ids.extend([endpoint.endpoint_id])
-
-        self.SetLink(link)
-
-        print("Service with new rule", service, flush=True)
-        self.UpdateService(service)
-
-        service2 = self.GetService(service_id)
-        print("Service obtained from id after updating", service2, flush=True)
-        """
-
-    def GenerateRuleValue(self, ip_o, ip_d, port_o, port_d):
-        value = {
-            'ipv4:source-address': ip_o,
-            'ipv4:destination-address': ip_d,
-            'transport:source-port': port_o,
-            'transport:destination-port': port_d,
-            'forwarding-action': 'DROP',
-        }
-        return value
-
-    def GetConfigRule(self, ip_o, ip_d, port_o, port_d):
-        config_rule = ConfigRule()
-        config_rule_custom = ConfigRule_Custom()
-        config_rule.action = ConfigActionEnum.CONFIGACTION_SET
-        config_rule_custom.resource_key = 'test'
-        config_rule_custom.resource_value = str(self.GenerateRuleValue(ip_o, ip_d, port_o, port_d))
-        config_rule.custom.CopyFrom(config_rule_custom)
-        return config_rule
-
-    def GenerateServiceId(self, service_id):
-        service_id_obj = ServiceId()
-        context_id = ContextId()
-        uuid = Uuid()
-        uuid.uuid = service_id
-        context_id.context_uuid.CopyFrom(uuid)
-        service_id_obj.context_id.CopyFrom(context_id)
-        service_id_obj.service_uuid.CopyFrom(uuid)
-        return service_id_obj
-   
-    def SendOutput(self, request, context):
-        # SEND CONFIDENCE TO MITIGATION SERVER
-        print("Server received mitigation values...", request.confidence, flush=True)
-        
-        last_value = request.confidence
-        last_tag = request.tag
-
-        ip_o = request.ip_o
-        ip_d = request.ip_d
-        port_o = request.port_o
-        port_d = request.port_d
-
-        service_id = self.GenerateServiceId(request.service_id)
-
-        config_rule = self.GetConfigRule(ip_o, ip_d, port_o, port_d)
-        
-        service = GetService(service_id)
-        print(service)
-        #service.config_rules.append(config_rule)
-        #UpdateService(service)
-
-        # RETURN OK TO THE CALLER
-        return Empty(
-            message=f"OK, received values: {last_tag} with confidence {last_value}."
-        )
-     
-    def SetDevice(self, device):
-        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
-            stub = ContextServiceStub(channel)
-            return stub.SetDevice(device)
-
-    def SetLink(self, link):
-        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
-            stub = ContextServiceStub(channel)
-            return stub.SetLink(link)
-
-    def SetTopology(self, link):
-        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
-            stub = ContextServiceStub(channel)
-            return stub.SetTopology(link)
-
-
-    def GetService(self, service_id):
-        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
-            stub = ContextServiceStub(channel)
-            return stub.GetService(service_id)
-
-    def SetContext(self, context):
-        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
-            stub = ContextServiceStub(channel)
-            return stub.SetContext(context)
-
-    def UpdateService(self, service):
-        with grpc.insecure_channel(SERVICE_CHANNEL) as channel:
-            stub = ServiceServiceStub(channel)
-            stub.UpdateService(service)
-
-    def CreateService(self, service):
-        with grpc.insecure_channel(SERVICE_CHANNEL) as channel:
-            stub = ServiceServiceStub(channel)
-            stub.CreateService(service)
-
-    def GetMitigation(self, request, context):
-        # GET OR PERFORM MITIGATION STRATEGY
-        logging.debug("")
-        print("Returing mitigation strategy...")
-        k = self.last_value * 2
-        return Empty(
-            message=f"Mitigation with double confidence = {k}"
-        )
-    
diff --git a/src/l3_centralizedattackdetector/Config.py b/src/l3_centralizedattackdetector/Config.py
index f6c7e33553820b1214e5265cf219db629bcfe006..809380b2cda1c8c556f973e570de36e3189edb99 100644
--- a/src/l3_centralizedattackdetector/Config.py
+++ b/src/l3_centralizedattackdetector/Config.py
@@ -18,7 +18,7 @@ import logging
 LOG_LEVEL = logging.WARNING
 
 # gRPC settings
-GRPC_SERVICE_PORT = 10001  # TODO UPM FIXME
+GRPC_SERVICE_PORT = 10001
 GRPC_MAX_WORKERS = 10
 GRPC_GRACE_PERIOD = 60
 
diff --git a/src/l3_centralizedattackdetector/README.md b/src/l3_centralizedattackdetector/README.md
index bcec4052cc9aa2ea734e08a4ed6b9158609b3532..2273eef80ec4c366d549d20d9447434003257217 100644
--- a/src/l3_centralizedattackdetector/README.md
+++ b/src/l3_centralizedattackdetector/README.md
@@ -1,3 +1,10 @@
-# l3_centralizedattackdetector
-- Receives packages and process it with TSTAT
-- Functions: ReportSummarizeKpi(KpiList)
+# L3 Centralized Attack Detector
+
+Receives snapshot statistics from Distributed Attack Detector component and performs an inference to detect attacks.
+It then sends the detected attacks to the Attack Mitigator component for them to be mitigated.
+
+## Functions: 
+- AnalyzeConnectionStatistics(L3CentralizedattackdetectorMetrics) -> StatusMessage
+- AnalyzeBatchConnectionStatistics(L3CentralizedattackdetectorBatchInput) -> StatusMessage
+- GetFeaturesIds(Empty) -> AutoFeatures
+- SetAttackIPs(AttackIPs) -> Empty
diff --git a/src/l3_centralizedattackdetector/client/l3_centralizedattackdetectorClient.py b/src/l3_centralizedattackdetector/client/l3_centralizedattackdetectorClient.py
index 2ef33438e77dbe4c3609bd21133fb3a9c95c8bcc..8de016a5d56ea1e1fefe23ba6e29f6865ee5e5a6 100644
--- a/src/l3_centralizedattackdetector/client/l3_centralizedattackdetectorClient.py
+++ b/src/l3_centralizedattackdetector/client/l3_centralizedattackdetectorClient.py
@@ -13,18 +13,17 @@
 # limitations under the License.
 
 import grpc, logging
-from common.tools.client.RetryDecorator import retry, delay_exponential
-from common.proto.l3_centralizedattackdetector_pb2_grpc import (
-    L3CentralizedattackdetectorStub,
-)
+from common.proto.context_pb2 import Empty
+from common.proto.l3_centralizedattackdetector_pb2_grpc import L3CentralizedattackdetectorStub
 from common.proto.l3_centralizedattackdetector_pb2 import (
+    AttackIPs,
     AutoFeatures,
-    Empty,
     L3CentralizedattackdetectorBatchInput,
     L3CentralizedattackdetectorMetrics,
-    ModelInput,
-    ModelOutput
+    StatusMessage
 )
+from common.tools.client.RetryDecorator import retry, delay_exponential
+from common.tools.grpc.Tools import grpc_message_to_json_string
 
 LOGGER = logging.getLogger(__name__)
 MAX_RETRIES = 15
@@ -34,7 +33,7 @@ RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION,
 class l3_centralizedattackdetectorClient:
     def __init__(self, address, port):
         self.endpoint = "{}:{}".format(address, port)
-        LOGGER.debug("Creating channel to {}...".format(self.endpoint))
+        LOGGER.debug("Creating channel to {:s}...".format(self.endpoint))
         self.channel = None
         self.stub = None
         self.connect()
@@ -51,24 +50,29 @@ class l3_centralizedattackdetectorClient:
         self.stub = None
 
     @RETRY_DECORATOR
-    def AnalyzeConnectionStatistics(self, request: L3CentralizedattackdetectorMetrics) -> Empty:
-        LOGGER.debug('AnalyzeConnectionStatistics request: {}'.format(request))
+    def AnalyzeConnectionStatistics(self, request : L3CentralizedattackdetectorMetrics) -> StatusMessage:
+        LOGGER.debug('AnalyzeConnectionStatistics request: {:s}'.format(grpc_message_to_json_string(request)))
         response = self.stub.AnalyzeConnectionStatistics(request)
-        LOGGER.debug('AnalyzeConnectionStatistics result: {}'.format(response))
+        LOGGER.debug('AnalyzeConnectionStatistics result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
-    
+
     @RETRY_DECORATOR
-    def AnalyzeBatchConnectionStatistics(self, request: L3CentralizedattackdetectorBatchInput) -> Empty:
-        LOGGER.debug('AnalyzeBatchConnectionStatistics request: {}'.format(request))
-        response = self.stub.GetOutput(request)
-        LOGGER.debug('AnalyzeBatchConnectionStatistics result: {}'.format(response))
+    def AnalyzeBatchConnectionStatistics(self, request: L3CentralizedattackdetectorBatchInput) -> StatusMessage:
+        LOGGER.debug('AnalyzeBatchConnectionStatistics request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.AnalyzeBatchConnectionStatistics(request)
+        LOGGER.debug('AnalyzeBatchConnectionStatistics result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
-    
+
     @RETRY_DECORATOR
-    def GetFeaturesIds(self, request: Empty) -> AutoFeatures:
-        LOGGER.debug('GetFeaturesIds request: {}'.format(request))
-        response = self.stub.GetOutput(request)
-        LOGGER.debug('GetFeaturesIds result: {}'.format(response))
+    def GetFeaturesIds(self, request : Empty) -> AutoFeatures:
+        LOGGER.debug('GetFeaturesIds request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.GetFeaturesIds(request)
+        LOGGER.debug('GetFeaturesIds result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
-
+    @RETRY_DECORATOR
+    def SetAttackIPs(self, request : AttackIPs) -> Empty:
+        LOGGER.debug('SetAttackIPs request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SetAttackIPs(request)
+        LOGGER.debug('SetAttackIPs result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
diff --git a/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py b/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py
index 8f59c81150345f15faaf69824d1036b87f5bd80d..a5c38151c0f44534b96c550860deac495d442c4d 100644
--- a/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py
+++ b/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py
@@ -13,46 +13,36 @@
 # limitations under the License.
 
 from __future__ import print_function
-from datetime import datetime
-from datetime import timedelta
 
-import os
+import csv
+import grpc
+import logging
 import numpy as np
 import onnxruntime as rt
-import logging
+import os
 import time
+import uuid
 
-from common.proto.l3_centralizedattackdetector_pb2 import Empty, AutoFeatures
-from common.proto.l3_centralizedattackdetector_pb2_grpc import L3CentralizedattackdetectorServicer
-
-from common.proto.l3_attackmitigator_pb2 import L3AttackmitigatorOutput
-
-from common.proto.monitoring_pb2 import KpiDescriptor
+from datetime import datetime, timedelta
+from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
+from common.proto.context_pb2 import Empty, Timestamp
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
-
-from monitoring.client.MonitoringClient import MonitoringClient
-from common.proto.monitoring_pb2 import Kpi
-
+from common.proto.l3_attackmitigator_pb2 import L3AttackmitigatorOutput
+from common.proto.l3_centralizedattackdetector_pb2 import AttackIPs, AutoFeatures, L3CentralizedattackdetectorMetrics, L3CentralizedattackdetectorBatchInput, StatusMessage
+from common.proto.l3_centralizedattackdetector_pb2_grpc import L3CentralizedattackdetectorServicer
+from common.proto.monitoring_pb2 import Kpi, KpiDescriptor
 from common.tools.timestamp.Converters import timestamp_utcnow_to_float
-from common.proto.context_pb2 import Timestamp, SliceId, ConnectionId
-
 from l3_attackmitigator.client.l3_attackmitigatorClient import l3_attackmitigatorClient
-
-import uuid
-
-from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
+from monitoring.client.MonitoringClient import MonitoringClient
 
 
 LOGGER = logging.getLogger(__name__)
 current_dir = os.path.dirname(os.path.abspath(__file__))
 
-# Demo constants
-DEMO_MODE = False
-ATTACK_IPS = ["37.187.95.110", "91.121.140.167", "94.23.23.52", "94.23.247.226", "149.202.83.171"]
-
-BATCH_SIZE= 10
-
-METRICS_POOL = MetricsPool('l3_centralizedattackdetector', 'RPC')
+# Environment variables
+TEST_ML_MODEL = True if int(os.getenv("TEST_ML_MODEL", 0)) == 1 else False
+BATCH_SIZE = int(os.getenv("BATCH_SIZE", 10))
+METRICS_POOL = MetricsPool("l3_centralizedattackdetector", "RPC")
 
 
 class ConnectionInfo:
@@ -71,16 +61,21 @@ class ConnectionInfo:
         )
 
     def __str__(self):
-        return "ip_o: " + self.ip_o + "\nport_o: " + self.port_o + "\nip_d: " + self.ip_d + "\nport_d: " + self.port_d
+        return f"ip_o: {self.ip_o}\nport_o: {self.port_o}\nip_d: {self.ip_d}\nport_d: {self.port_d}"
 
 
 class l3_centralizedattackdetectorServiceServicerImpl(L3CentralizedattackdetectorServicer):
+    def __init__(self):
+        """
+        Initializes the Centralized Attack Detector service.
 
-    """
-    Initialize variables, prediction model and clients of components used by CAD
-    """
+        Args:
+            None
+
+        Returns:
+            None
+        """
 
-    def __init__(self):
         LOGGER.info("Creating Centralized Attack Detector Service")
 
         self.inference_values = []
@@ -92,22 +87,22 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         )
         self.cryptomining_detector_model = rt.InferenceSession(self.cryptomining_detector_model_path)
 
-        # Load cryptomining detector features metadata from ONNX file
+        # Load cryptomining attack detector features metadata from ONNX file
         self.cryptomining_detector_features_metadata = list(
             self.cryptomining_detector_model.get_modelmeta().custom_metadata_map.values()
         )
         self.cryptomining_detector_features_metadata = [float(x) for x in self.cryptomining_detector_features_metadata]
         self.cryptomining_detector_features_metadata.sort()
-        LOGGER.info("Cryptomining Detector Features: " + str(self.cryptomining_detector_features_metadata))
-        
-        LOGGER.info("Batch size: " + str(BATCH_SIZE))
+
+        LOGGER.info(f"Cryptomining Attack Detector Features: {self.cryptomining_detector_features_metadata}")
+        LOGGER.info(f"Batch size: {BATCH_SIZE}")
 
         self.input_name = self.cryptomining_detector_model.get_inputs()[0].name
         self.label_name = self.cryptomining_detector_model.get_outputs()[0].name
         self.prob_name = self.cryptomining_detector_model.get_outputs()[1].name
 
-        # Kpi values
-        self.l3_security_status = 0  # unnecessary
+        # KPI values
+        self.l3_security_status = 0
         self.l3_ml_model_confidence = 0
         self.l3_inferences_in_interval_counter = 0
 
@@ -123,7 +118,7 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         self.l3_unique_attackers = 0
 
         self.l3_non_empty_time_interval = False
-        
+
         self.active_requests = []
 
         self.monitoring_client = MonitoringClient()
@@ -131,7 +126,7 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         self.monitored_kpis = {
             "l3_security_status": {
                 "kpi_id": None,
-                "description": "L3 - Confidence of the cryptomining detector in the security status in the last time interval of the service {service_id}",
+                "description": "L3 - Confidence of the cryptomining attack detector in the security status in the last time interval of the service {service_id}",
                 "kpi_sample_type": KpiSampleType.KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO,
                 "service_ids": [],
             },
@@ -163,8 +158,8 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         self.attackmitigator_client = l3_attackmitigatorClient()
 
         # Environment variables
-        self.CLASSIFICATION_THRESHOLD = os.getenv("CAD_CLASSIFICATION_THRESHOLD", 0.5)
-        self.MONITORED_KPIS_TIME_INTERVAL_AGG = os.getenv("MONITORED_KPIS_TIME_INTERVAL_AGG", 60)
+        self.CLASSIFICATION_THRESHOLD = float(os.getenv("CAD_CLASSIFICATION_THRESHOLD", 0.5))
+        self.MONITORED_KPIS_TIME_INTERVAL_AGG = int(os.getenv("MONITORED_KPIS_TIME_INTERVAL_AGG", 60))
 
         # Constants
         self.NORMAL_CLASS = 0
@@ -180,6 +175,9 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
 
         # AM evaluation tests
         self.am_notification_times = []
+        
+        # List of attack connections IPs
+        self.attack_ips = []
 
         # List of attack connections
         self.attack_connections = []
@@ -190,15 +188,18 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         self.false_positives = 0
         self.false_negatives = 0
 
-    """
-    Create a monitored KPI for a specific service and add it to the Monitoring Client
-        -input: 
-            + service_id: service ID where the KPI will be monitored
-            + kpi_name: name of the KPI
-            + kpi_description: description of the KPI
-            + kpi_sample_type: KPI sample type of the KPI (it must be defined in the kpi_sample_types.proto file)
-        -output: KPI identifier representing the KPI
-    """
+        self.pod_id = uuid.uuid4()
+        LOGGER.info(f"Pod Id.: {self.pod_id}")
+
+        self.first_batch_request_time = 0
+        self.last_batch_request_time = 0
+
+        self.response_times_csv_file_path = "response_times.csv"
+        col_names = ["timestamp_first_req", "timestamp_last_req", "total_time", "batch_size"]
+
+        with open(self.response_times_csv_file_path, "w", newline="") as file:
+            writer = csv.writer(file)
+            writer.writerow(col_names)
 
     def create_kpi(
         self,
@@ -207,36 +208,44 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         kpi_description,
         kpi_sample_type,
     ):
+        """
+        Creates a new KPI for a specific service and add it to the Monitoring client
+
+        Args:
+            service_id (ServiceID): The ID of the service.
+            kpi_name (str): The name of the KPI.
+            kpi_description (str): The description of the KPI.
+            kpi_sample_type (KpiSampleType): The sample type of the KPI.
+
+        Returns:
+            kpi (Kpi): The created KPI.
+        """
+
         kpidescriptor = KpiDescriptor()
         kpidescriptor.kpi_description = kpi_description
         kpidescriptor.service_id.service_uuid.uuid = service_id.service_uuid.uuid
         kpidescriptor.kpi_sample_type = kpi_sample_type
-        new_kpi = self.monitoring_client.SetKpi(kpidescriptor)
+        kpi = self.monitoring_client.SetKpi(kpidescriptor)
 
         LOGGER.info("Created KPI {}".format(kpi_name))
 
-        return new_kpi
+        return kpi
 
-    """
-    Create the monitored KPIs for a specific service, add them to the Monitoring Client and store their identifiers in the monitored_kpis dictionary
-        -input:
-            + service_id: service ID where the KPIs will be monitored
-        -output: None
-    """
+    def create_kpis(self, service_id):
+        """
+        Creates the monitored KPIs for a specific service, adds them to the Monitoring client and stores their identifiers in the monitored_kpis dictionary
 
-    def create_kpis(self, service_id, device_id, endpoint_id):
-        LOGGER.info("Creating KPIs for service {}".format(service_id))
+        Args:
+            service_id (uuid): The ID of the service.
 
-        # for now, all the KPIs are created for all the services from which requests are received
-        for kpi in self.monitored_kpis:
-            # generate random slice_id
-            slice_id = SliceId()
-            slice_id.slice_uuid.uuid = str(uuid.uuid4())
+        Returns:
+            None
+        """
 
-            # generate random connection_id
-            connection_id = ConnectionId()
-            connection_id.connection_uuid.uuid = str(uuid.uuid4())
+        LOGGER.info("Creating KPIs for service {}".format(service_id))
 
+        # all the KPIs are created for all the services from which requests are received
+        for kpi in self.monitored_kpis:
             created_kpi = self.create_kpi(
                 service_id,
                 kpi,
@@ -249,6 +258,16 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         LOGGER.info("Created KPIs for service {}".format(service_id))
 
     def monitor_kpis(self):
+        """
+        Monitors KPIs for all the services from which requests are received
+
+        Args:
+            None
+
+        Returns:
+            None
+        """
+
         monitor_inference_results = self.inference_results
         monitor_service_ids = self.service_ids
 
@@ -259,22 +278,23 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         if non_empty_time_interval:
             for service_id in monitor_service_ids:
                 LOGGER.debug("service_id: {}".format(service_id))
-
-                self.monitor_compute_l3_kpi(service_id, monitor_inference_results)
-
-                # Demo mode inference results are erased
-                """if DEMO_MODE:
-                    # Delete fist half of the inference results
-                    LOGGER.debug("inference_results len: {}".format(len(self.inference_results)))
-                    self.inference_results = self.inference_results[len(self.inference_results)//2:]
-                    LOGGER.debug("inference_results len after erase: {}".format(len(self.inference_results)))"""
-                # end = time.time()
-                # LOGGER.debug("Time to process inference results with erase: {}".format(end - start))
+                
+                self.monitor_compute_l3_kpi()
                 LOGGER.debug("KPIs sent to monitoring server")
         else:
             LOGGER.debug("No KPIs sent to monitoring server")
 
     def assign_timestamp(self, monitor_inference_results):
+        """
+        Assigns a timestamp to the monitored inference results.
+
+        Args:
+            monitor_inference_results (list): A list of monitored inference results.
+
+        Returns:
+            None
+        """
+
         time_interval = self.MONITORED_KPIS_TIME_INTERVAL_AGG
 
         # assign the timestamp of the first inference result to the time_interval_start
@@ -314,7 +334,19 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         LOGGER.debug("time_interval_start: {}".format(self.time_interval_start))
         LOGGER.debug("time_interval_end: {}".format(self.time_interval_end))
 
-    def monitor_compute_l3_kpi(self, service_id, monitor_inference_results):
+    def monitor_compute_l3_kpi(
+        self,
+    ):
+        """
+        Computes the monitored KPIs for a specific service and sends them to the Monitoring server
+
+        Args:
+            None
+
+        Returns:
+            None
+        """
+
         # L3 security status
         kpi_security_status = Kpi()
         kpi_security_status.kpi_id.kpi_id.CopyFrom(self.monitored_kpis["l3_security_status"]["kpi_id"])
@@ -369,19 +401,36 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
             LOGGER.debug("Error sending KPIs to monitoring server: {}".format(e))
 
     def monitor_ml_model_confidence(self):
-        if self.l3_security_status == 0:
-            return self.l3_ml_model_confidence_normal
+        """
+        Get the monitored KPI for the confidence of the ML model
+
+        Args:
+            None
 
-        return self.l3_ml_model_confidence_crypto
+        Returns:
+            confidence (float): The monitored KPI for the confidence of the ML model
+        """
 
-    """
-    Classify connection as standard traffic or cryptomining attack and return results
-        -input: 
-            + request: L3CentralizedattackdetectorMetrics object with connection features information
-        -output: L3AttackmitigatorOutput object with information about the assigned class and prediction confidence
-    """
+        confidence = None
+
+        if self.l3_security_status == 0:
+            confidence = self.l3_ml_model_confidence_normal
+        else:
+            confidence = self.l3_ml_model_confidence_crypto
+
+        return confidence
 
     def perform_inference(self, request):
+        """
+        Performs inference on the input data using the Cryptomining Attack Detector model to classify the connection as standard traffic or cryptomining attack.
+
+        Args:
+            request (L3CentralizedattackdetectorMetrics): A L3CentralizedattackdetectorMetrics object with connection features information.
+
+        Returns:
+            dict: A dictionary containing the predicted class, the probability of that class, and other relevant information required to block the attack.
+        """
+
         x_data = np.array([[feature.feature for feature in request.features]])
 
         # Print input data shape
@@ -389,19 +438,14 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
 
         # Get batch size
         batch_size = x_data.shape[0]
-
-        # Print batch size
-        LOGGER.debug("batch_size: {}".format(batch_size))
-        LOGGER.debug("x_data.shape: {}".format(x_data.shape))
-
-        inference_time_start = time.perf_counter()
+        inference_time_start = time.time()
 
         # Perform inference
         predictions = self.cryptomining_detector_model.run(
             [self.prob_name], {self.input_name: x_data.astype(np.float32)}
         )[0]
 
-        inference_time_end = time.perf_counter()
+        inference_time_end = time.time()
 
         # Measure inference time
         inference_time = inference_time_end - inference_time_start
@@ -459,15 +503,18 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
             output_message["tag"] = self.NORMAL_CLASS
 
         return output_message
-    
-    """
-    Classify connection as standard traffic or cryptomining attack and return results
-        -input: 
-            + request: L3CentralizedattackdetectorMetrics object with connection features information
-        -output: L3AttackmitigatorOutput object with information about the assigned class and prediction confidence
-    """
-
-    def perform_distributed_inference(self, requests):
+
+    def perform_batch_inference(self, requests):
+        """
+        Performs batch inference on the input data using the Cryptomining Attack Detector model to classify the connection as standard traffic or cryptomining attack.
+
+        Args:
+            requests (list): A list of L3CentralizedattackdetectorMetrics objects with connection features information.
+
+        Returns:
+            list: A list of dictionaries containing the predicted class, the probability of that class, and other relevant information required to block the attack for each request.
+        """
+
         batch_size = len(requests)
 
         # Create an empty array to hold the input data
@@ -480,14 +527,14 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         # Print input data shape
         LOGGER.debug("x_data.shape: {}".format(x_data.shape))
 
-        inference_time_start = time.perf_counter()
+        inference_time_start = time.time()
 
         # Perform inference
         predictions = self.cryptomining_detector_model.run(
             [self.prob_name], {self.input_name: x_data.astype(np.float32)}
         )[0]
 
-        inference_time_end = time.perf_counter()
+        inference_time_end = time.time()
 
         # Measure inference time
         inference_time = inference_time_end - inference_time_start
@@ -519,23 +566,25 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         # Gather the predicted class, the probability of that class and other relevant information required to block the attack
         output_messages = []
         for i, request in enumerate(requests):
-            output_messages.append({
-                "confidence": None,
-                "timestamp": datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
-                "ip_o": request.connection_metadata.ip_o,
-                "ip_d": request.connection_metadata.ip_d,
-                "tag_name": None,
-                "tag": None,
-                "flow_id": request.connection_metadata.flow_id,
-                "protocol": request.connection_metadata.protocol,
-                "port_o": request.connection_metadata.port_o,
-                "port_d": request.connection_metadata.port_d,
-                "ml_id": self.cryptomining_detector_file_name,
-                "service_id": request.connection_metadata.service_id,
-                "endpoint_id": request.connection_metadata.endpoint_id,
-                "time_start": request.connection_metadata.time_start,
-                "time_end": request.connection_metadata.time_end,
-            })
+            output_messages.append(
+                {
+                    "confidence": None,
+                    "timestamp": datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
+                    "ip_o": request.connection_metadata.ip_o,
+                    "ip_d": request.connection_metadata.ip_d,
+                    "tag_name": None,
+                    "tag": None,
+                    "flow_id": request.connection_metadata.flow_id,
+                    "protocol": request.connection_metadata.protocol,
+                    "port_o": request.connection_metadata.port_o,
+                    "port_d": request.connection_metadata.port_d,
+                    "ml_id": self.cryptomining_detector_file_name,
+                    "service_id": request.connection_metadata.service_id,
+                    "endpoint_id": request.connection_metadata.endpoint_id,
+                    "time_start": request.connection_metadata.time_start,
+                    "time_end": request.connection_metadata.time_end,
+                }
+            )
 
             if predictions[i][1] >= self.CLASSIFICATION_THRESHOLD:
                 output_messages[i]["confidence"] = predictions[i][1]
@@ -548,38 +597,51 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
 
         return output_messages
 
-    """
-    Receive features from Attack Mitigator, predict attack and communicate with Attack Mitigator
-        -input: 
-            + request: L3CentralizedattackdetectorMetrics object with connection features information
-        -output: Empty object with a message about the execution of the function
-    """
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def AnalyzeConnectionStatistics(self, request, context):
+    def AnalyzeConnectionStatistics(
+        self, request : L3CentralizedattackdetectorMetrics, context : grpc.ServicerContext
+    ) -> StatusMessage:
+        """
+        Analyzes the connection statistics sent in the request, performs batch inference on the
+        input data using the Cryptomining Attack Detector model to classify the connection as
+        standard traffic or cryptomining attack, and notifies the Attack Mitigator component in
+        case of attack.
+
+        Args:
+            request (L3CentralizedattackdetectorMetrics): A L3CentralizedattackdetectorMetrics
+                object with connection features information.
+            context (grpc.ServicerContext): The context of the request.
+
+        Returns:
+            StatusMessage: An response indicating that the information was received and processed.
+        """
+
         # Perform inference with the data sent in the request
+        if len(self.active_requests) == 0:
+            self.first_batch_request_time = time.time()
+
         self.active_requests.append(request)
-        
-        if len(self.active_requests) == BATCH_SIZE:
-            logging.info("Performing inference...")
-            
+
+        if len(self.active_requests) >= BATCH_SIZE:
+            LOGGER.debug("Performing inference... {}".format(self.pod_id))
+
             inference_time_start = time.time()
-            cryptomining_detector_output = self.perform_distributed_inference(self.active_requests)
+            cryptomining_detector_output = self.perform_batch_inference(self.active_requests)
             inference_time_end = time.time()
-            
+
             LOGGER.debug("Inference performed in {} seconds".format(inference_time_end - inference_time_start))
-            logging.info("Inference performed correctly")
+            LOGGER.info("Inference performed correctly")
 
             self.inference_results.append({"output": cryptomining_detector_output, "timestamp": datetime.now()})
             LOGGER.debug("inference_results length: {}".format(len(self.inference_results)))
 
             for i, req in enumerate(self.active_requests):
                 service_id = req.connection_metadata.service_id
-                device_id = req.connection_metadata.endpoint_id.device_id
-                endpoint_id = req.connection_metadata.endpoint_id
 
-                # Check if a request of a new service has been received and, if so, create the monitored KPIs for that service
+                # Check if a request of a new service has been received and, if so, create
+                # the monitored KPIs for that service
                 if service_id not in self.service_ids:
-                    self.create_kpis(service_id, device_id, endpoint_id)
+                    self.create_kpis(service_id)
                     self.service_ids.append(service_id)
 
                 monitor_kpis_start = time.time()
@@ -589,7 +651,7 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
                 LOGGER.debug("Monitoring KPIs performed in {} seconds".format(monitor_kpis_end - monitor_kpis_start))
                 LOGGER.debug("cryptomining_detector_output: {}".format(cryptomining_detector_output[i]))
 
-                if DEMO_MODE:
+                if TEST_ML_MODEL:
                     self.analyze_prediction_accuracy(cryptomining_detector_output[i]["confidence"])
 
                 connection_info = ConnectionInfo(
@@ -626,10 +688,10 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
 
                 # Only notify Attack Mitigator when a cryptomining connection has been detected
                 if cryptomining_detector_output[i]["tag_name"] == "Crypto":
-                    if DEMO_MODE:
+                    if TEST_ML_MODEL:
                         self.attack_connections.append(connection_info)
 
-                    if connection_info.ip_o in ATTACK_IPS or connection_info.ip_d in ATTACK_IPS:
+                    if connection_info.ip_o in self.attack_ips or connection_info.ip_d in self.attack_ips:
                         self.correct_attack_conns += 1
                         self.correct_predictions += 1
                     else:
@@ -637,22 +699,23 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
                         self.false_positives += 1
 
                     self.total_predictions += 1
-
-                    # if False:
-                    notification_time_start = time.perf_counter()
+                    notification_time_start = time.time()
 
                     LOGGER.debug("Crypto attack detected")
 
                     # Notify the Attack Mitigator component about the attack
-                    logging.info(
+                    LOGGER.info(
                         "Notifying the Attack Mitigator component about the attack in order to block the connection..."
                     )
 
                     try:
-                        logging.info("Sending the connection information to the Attack Mitigator component...")
+                        LOGGER.info("Sending the connection information to the Attack Mitigator component...")
                         message = L3AttackmitigatorOutput(**cryptomining_detector_output[i])
-                        response = self.attackmitigator_client.PerformMitigation(message)
-                        notification_time_end = time.perf_counter()
+
+                        am_response = self.attackmitigator_client.PerformMitigation(message)
+                        LOGGER.debug("AM response: {}".format(am_response))
+
+                        notification_time_end = time.time()
 
                         self.am_notification_times.append(notification_time_end - notification_time_start)
 
@@ -682,21 +745,18 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
                                 f.write("Std notification time: {}\n".format(std_notification_time))
                                 f.write("Median notification time: {}\n".format(median_notification_time))
 
-                        # logging.info("Attack Mitigator notified and received response: ", response.message)  # FIX No message received
-                        logging.info("Attack Mitigator notified")
+                        LOGGER.info("Attack Mitigator notified")
 
-                        #return Empty(message="OK, information received and mitigator notified abou the attack")
-                    
                     except Exception as e:
-                        logging.error("Error notifying the Attack Mitigator component about the attack: ", e)
-                        logging.error("Couldn't find l3_attackmitigator")
+                        LOGGER.error("Error notifying the Attack Mitigator component about the attack: ", e)
+                        LOGGER.error("Couldn't find l3_attackmitigator")
 
-                        return Empty(message="Attack Mitigator not found")
+                        return StatusMessage(message="Attack Mitigator not found")
                 else:
-                    logging.info("No attack detected")
+                    LOGGER.info("No attack detected")
 
                     if cryptomining_detector_output[i]["tag_name"] != "Crypto":
-                        if connection_info.ip_o not in ATTACK_IPS and connection_info.ip_d not in ATTACK_IPS:
+                        if connection_info.ip_o not in self.attack_ips and connection_info.ip_d not in self.attack_ips:
                             self.correct_predictions += 1
                         else:
                             LOGGER.debug("False negative: {}".format(connection_info))
@@ -704,14 +764,37 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
 
                         self.total_predictions += 1
 
-                    # return Empty(message="Ok, information received (no attack detected)")
-            
             self.active_requests = []
-            return Empty(message="Ok, metrics processed")
-            
-        return Empty(message="Ok, information received")
+            self.last_batch_request_time = time.time()
+
+            col_values = [
+                self.first_batch_request_time,
+                self.last_batch_request_time,
+                self.last_batch_request_time - self.first_batch_request_time,
+                BATCH_SIZE,
+            ]
+
+            LOGGER.debug("col_values: {}".format(col_values))
+
+            with open(self.response_times_csv_file_path, "a", newline="") as file:
+                writer = csv.writer(file)
+                writer.writerow(col_values)
+
+            return StatusMessage(message="Ok, metrics processed")
+
+        return StatusMessage(message="Ok, information received")
 
     def analyze_prediction_accuracy(self, confidence):
+        """
+        Analyzes the prediction accuracy of the Centralized Attack Detector.
+
+        Args:
+            confidence (float): The confidence level of the Cryptomining Attack Detector model.
+
+        Returns:
+            None
+        """
+
         LOGGER.info("Number of Attack Connections Correctly Classified: {}".format(self.correct_attack_conns))
         LOGGER.info("Number of Attack Connections: {}".format(len(self.attack_connections)))
 
@@ -728,7 +811,7 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
             cryptomining_attack_detection_acc = 0
 
         LOGGER.info("Cryptomining Attack Detection Accuracy: {}".format(cryptomining_attack_detection_acc))
-        LOGGER.info("Cryptomining Detector Confidence: {}".format(confidence))
+        LOGGER.info("Cryptomining Attack Detector Confidence: {}".format(confidence))
 
         with open("prediction_accuracy.txt", "a") as f:
             LOGGER.debug("Exporting prediction accuracy and confidence")
@@ -740,12 +823,28 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
             f.write("False Positives: {}\n".format(self.false_positives))
             f.write("True Negatives: {}\n".format(self.total_predictions - len(self.attack_connections)))
             f.write("False Negatives: {}\n".format(self.false_negatives))
-            f.write("Cryptomining Detector Confidence: {}\n\n".format(confidence))
+            f.write("Cryptomining Attack Detector Confidence: {}\n\n".format(confidence))
             f.write("Timestamp: {}\n".format(datetime.now().strftime("%d/%m/%Y %H:%M:%S")))
             f.close()
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def AnalyzeBatchConnectionStatistics(self, request, context):
+    def AnalyzeBatchConnectionStatistics(
+        self, request : L3CentralizedattackdetectorBatchInput, context : grpc.ServicerContext
+    ) -> StatusMessage:
+        """
+        Analyzes a batch of connection statistics sent in the request, performs batch inference on the
+        input data using the Cryptomining Attack Detector model to classify the connection as standard
+        traffic or cryptomining attack, and notifies the Attack Mitigator component in case of attack.
+
+        Args:
+            request (L3CentralizedattackdetectorBatchInput): A L3CentralizedattackdetectorBatchInput
+                object with connection features information.
+            context (grpc.ServicerContext): The context of the request.
+
+        Returns:
+            StatusMessage: An StatusMessage indicating that the information was received and processed.
+        """
+
         batch_time_start = time.time()
 
         for metric in request.metrics:
@@ -753,24 +852,50 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         batch_time_end = time.time()
 
         with open("batch_time.txt", "a") as f:
-            f.write(str(len(request.metrics)) + "\n")
-            f.write(str(batch_time_end - batch_time_start) + "\n\n")
+            f.write(f"{len(request.metrics)}\n")
+            f.write(f"{batch_time_end - batch_time_start}\n\n")
             f.close()
 
-        logging.debug("Metrics: " + str(len(request.metrics)))
-        logging.debug("Batch time: " + str(batch_time_end - batch_time_start))
+        LOGGER.debug(f"Batch time: {batch_time_end - batch_time_start}")
+        LOGGER.debug("Batch time: {}".format(batch_time_end - batch_time_start))
 
-        return Empty(message="OK, information received.")
+        return StatusMessage(message="OK, information received.")
 
-    """
-    Send features allocated in the metadata of the onnx file to the DAD
-        -output: ONNX metadata as a list of integers
-    """
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def GetFeaturesIds(self, request: Empty, context):
-        features = AutoFeatures()
+    def GetFeaturesIds(self, request : Empty, context : grpc.ServicerContext) -> AutoFeatures:
+        """
+        Returns a list of feature IDs used by the Cryptomining Attack Detector model.
+
+        Args:
+            request (Empty): An empty request object.
+            context (grpc.ServicerContext): The context of the request.
+
+        Returns:
+            features_ids (AutoFeatures): A list of feature IDs used by the Cryptomining Attack Detector model.
+        """
+
+        features_ids = AutoFeatures()
 
         for feature in self.cryptomining_detector_features_metadata:
-            features.auto_features.append(feature)
+            features_ids.auto_features.append(feature)
+
+        return features_ids
+
+    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def SetAttackIPs(self, request : AttackIPs, context : grpc.ServicerContext) -> Empty:
+        """
+        Sets the list of attack IPs in order to be used to compute the prediction accuracy of the
+        Centralized Attack Detector in case of testing the ML model.
+
+        Args:
+            request (AttackIPs): A list of attack IPs.
+            context (grpc.ServicerContext): The context of the request.
+
+        Returns:
+            empty (Empty): An empty response object.
+        """
+
+        self.attack_ips = request.attack_ips
+        LOGGER.debug(f"Succesfully set attack IPs: {self.attack_ips}")
 
-        return features
+        return Empty()
diff --git a/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl_old.py b/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl_old.py
deleted file mode 100644
index 1fdc955557f189d2f5aded162052743b3e762036..0000000000000000000000000000000000000000
--- a/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl_old.py
+++ /dev/null
@@ -1,791 +0,0 @@
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# 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
-#
-#      http://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.
-
-from __future__ import print_function
-from datetime import datetime
-from datetime import timedelta
-
-import os
-import numpy as np
-import onnxruntime as rt
-import logging
-import time
-
-from common.proto.l3_centralizedattackdetector_pb2 import Empty, AutoFeatures
-from common.proto.l3_centralizedattackdetector_pb2_grpc import L3CentralizedattackdetectorServicer
-
-from common.proto.l3_attackmitigator_pb2 import L3AttackmitigatorOutput
-
-from common.proto.monitoring_pb2 import KpiDescriptor
-from common.proto.kpi_sample_types_pb2 import KpiSampleType
-
-from monitoring.client.MonitoringClient import MonitoringClient
-from common.proto.monitoring_pb2 import Kpi
-
-from common.tools.timestamp.Converters import timestamp_utcnow_to_float
-from common.proto.context_pb2 import Timestamp, SliceId, ConnectionId
-
-from l3_attackmitigator.client.l3_attackmitigatorClient import l3_attackmitigatorClient
-
-import uuid
-
-
-LOGGER = logging.getLogger(__name__)
-# ML directory (ml_model/cryptomining_detector/cryptomining_detector.onnx)
-current_dir = os.path.dirname(os.path.abspath(__file__))
-
-# Demo constants
-DEMO_MODE = True
-ATTACK_IPS = ["37.187.95.110", "91.121.140.167", "94.23.23.52", "94.23.247.226", "149.202.83.171"]
-
-
-class ConnectionInfo:
-    def __init__(self, ip_o, port_o, ip_d, port_d):
-        self.ip_o = ip_o
-        self.port_o = port_o
-        self.ip_d = ip_d
-        self.port_d = port_d
-
-    def __eq__(self, other):
-        return (
-            self.ip_o == other.ip_o
-            and self.port_o == other.port_o
-            and self.ip_d == other.ip_d
-            and self.port_d == other.port_d
-        )
-
-    def __str__(self):
-        return "ip_o: " + self.ip_o + "\nport_o: " + self.port_o + "\nip_d: " + self.ip_d + "\nport_d: " + self.port_d
-
-
-class l3_centralizedattackdetectorServiceServicerImpl(L3CentralizedattackdetectorServicer):
-
-    """
-    Initialize variables, prediction model and clients of components used by CAD
-    """
-
-    def __init__(self):
-        LOGGER.info("Creating Centralized Attack Detector Service")
-
-        self.inference_values = []
-        self.inference_results = []
-        self.cryptomining_detector_path = os.path.join(current_dir, "ml_model/cryptomining_detector/")
-        self.cryptomining_detector_file_name = os.listdir(self.cryptomining_detector_path)[0]
-        self.cryptomining_detector_model_path = os.path.join(
-            self.cryptomining_detector_path, self.cryptomining_detector_file_name
-        )
-        self.cryptomining_detector_model = rt.InferenceSession(self.cryptomining_detector_model_path)
-
-        # Load cryptomining detector features metadata from ONNX file
-        self.cryptomining_detector_features_metadata = list(
-            self.cryptomining_detector_model.get_modelmeta().custom_metadata_map.values()
-        )
-        self.cryptomining_detector_features_metadata = [float(x) for x in self.cryptomining_detector_features_metadata]
-        self.cryptomining_detector_features_metadata.sort()
-        LOGGER.info("Cryptomining Detector Features: " + str(self.cryptomining_detector_features_metadata))
-
-        self.input_name = self.cryptomining_detector_model.get_inputs()[0].name
-        self.label_name = self.cryptomining_detector_model.get_outputs()[0].name
-        self.prob_name = self.cryptomining_detector_model.get_outputs()[1].name
-
-        self.monitoring_client = MonitoringClient()
-        self.service_ids = []
-        self.monitored_kpis = {
-            "l3_security_status": {
-                "kpi_id": None,
-                "description": "L3 - Confidence of the cryptomining detector in the security status in the last time interval of the service {service_id}",
-                "kpi_sample_type": KpiSampleType.KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO,
-                "service_ids": [],
-            },
-            "l3_ml_model_confidence": {
-                "kpi_id": None,
-                "description": "L3 - Security status of the service in a time interval of the service {service_id} (“0” if no attack has been detected on the service and “1” if a cryptomining attack has been detected)",
-                "kpi_sample_type": KpiSampleType.KPISAMPLETYPE_ML_CONFIDENCE,
-                "service_ids": [],
-            },
-            "l3_unique_attack_conns": {
-                "kpi_id": None,
-                "description": "L3 - Number of attack connections detected in a time interval of the service {service_id} (attacks of the same connection [origin IP, origin port, destination IP and destination port] are only considered once)",
-                "kpi_sample_type": KpiSampleType.KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS,
-                "service_ids": [],
-            },
-            "l3_unique_compromised_clients": {
-                "kpi_id": None,
-                "description": "L3 - Number of unique compromised clients of the service in a time interval of the service {service_id} (attacks from the same origin IP are only considered once)",
-                "kpi_sample_type": KpiSampleType.KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CLIENTS,
-                "service_ids": [],
-            },
-            "l3_unique_attackers": {
-                "kpi_id": None,
-                "description": "L3 - number of unique attackers of the service in a time interval of the service {service_id} (attacks from the same destination IP are only considered once)",
-                "kpi_sample_type": KpiSampleType.KPISAMPLETYPE_L3_UNIQUE_ATTACKERS,
-                "service_ids": [],
-            },
-        }
-        self.attackmitigator_client = l3_attackmitigatorClient()
-
-        # Environment variables
-        self.CLASSIFICATION_THRESHOLD = os.getenv("CAD_CLASSIFICATION_THRESHOLD", 0.5)
-        self.MONITORED_KPIS_TIME_INTERVAL_AGG = os.getenv("MONITORED_KPIS_TIME_INTERVAL_AGG", 60)
-
-        # Constants
-        self.NORMAL_CLASS = 0
-        self.CRYPTO_CLASS = 1
-
-        self.kpi_test = None
-        self.time_interval_start = None
-        self.time_interval_end = None
-
-        # CAD evaluation tests
-        self.cad_inference_times = []
-        self.cad_num_inference_measurements = 100
-
-        # AM evaluation tests
-        self.am_notification_times = []
-
-        # List of attack connections
-        self.attack_connections = []
-
-        self.correct_attack_conns = 0
-        self.correct_predictions = 0
-        self.total_predictions = 0
-        self.false_positives = 0
-        self.false_negatives = 0
-
-    """
-    Create a monitored KPI for a specific service and add it to the Monitoring Client
-        -input: 
-            + service_id: service ID where the KPI will be monitored
-            + kpi_name: name of the KPI
-            + kpi_description: description of the KPI
-            + kpi_sample_type: KPI sample type of the KPI (it must be defined in the kpi_sample_types.proto file)
-        -output: KPI identifier representing the KPI
-    """
-
-    def create_kpi(
-        self,
-        service_id,
-        kpi_name,
-        kpi_description,
-        kpi_sample_type,
-    ):
-        kpidescriptor = KpiDescriptor()
-        kpidescriptor.kpi_description = kpi_description
-        kpidescriptor.service_id.service_uuid.uuid = service_id.service_uuid.uuid
-        kpidescriptor.kpi_sample_type = kpi_sample_type
-        new_kpi = self.monitoring_client.SetKpi(kpidescriptor)
-
-        LOGGER.info("Created KPI {}".format(kpi_name))
-
-        return new_kpi
-
-    """
-    Create the monitored KPIs for a specific service, add them to the Monitoring Client and store their identifiers in the monitored_kpis dictionary
-        -input:
-            + service_id: service ID where the KPIs will be monitored
-        -output: None
-    """
-
-    def create_kpis(self, service_id, device_id, endpoint_id):
-        LOGGER.info("Creating KPIs for service {}".format(service_id))
-
-        # for now, all the KPIs are created for all the services from which requests are received
-        for kpi in self.monitored_kpis:
-            # generate random slice_id
-            slice_id = SliceId()
-            slice_id.slice_uuid.uuid = str(uuid.uuid4())
-
-            # generate random connection_id
-            connection_id = ConnectionId()
-            connection_id.connection_uuid.uuid = str(uuid.uuid4())
-
-            created_kpi = self.create_kpi(
-                service_id,
-                kpi,
-                self.monitored_kpis[kpi]["description"].format(service_id=service_id.service_uuid.uuid),
-                self.monitored_kpis[kpi]["kpi_sample_type"],
-            )
-            self.monitored_kpis[kpi]["kpi_id"] = created_kpi.kpi_id
-            self.monitored_kpis[kpi]["service_ids"].append(service_id.service_uuid.uuid)
-
-        LOGGER.info("Created KPIs for service {}".format(service_id))
-
-    def monitor_kpis(self):
-        monitor_inference_results = self.inference_results
-        monitor_service_ids = self.service_ids
-
-        LOGGER.debug("monitor_inference_results: {}".format(len(monitor_inference_results)))
-        LOGGER.debug("monitor_service_ids: {}".format(len(monitor_service_ids)))
-
-        self.assign_timestamp(monitor_inference_results)
-
-        self.delete_older_inference_results(monitor_inference_results)
-
-        non_empty_time_interval = self.check_inference_time_interval(monitor_inference_results)
-
-        if non_empty_time_interval:
-            # start = time.time()
-            for service_id in monitor_service_ids:
-                LOGGER.debug("service_id: {}".format(service_id))
-
-                self.monitor_compute_l3_kpi(service_id, monitor_inference_results)
-
-                # Demo mode inference results are erased
-                """if DEMO_MODE:
-                    # Delete fist half of the inference results
-                    LOGGER.debug("inference_results len: {}".format(len(self.inference_results)))
-                    self.inference_results = self.inference_results[len(self.inference_results)//2:]
-                    LOGGER.debug("inference_results len after erase: {}".format(len(self.inference_results)))"""
-                # end = time.time()
-                # LOGGER.debug("Time to process inference results with erase: {}".format(end - start))
-                LOGGER.debug("KPIs sent to monitoring server")
-        else:
-            LOGGER.debug("No KPIs sent to monitoring server")
-
-    def assign_timestamp(self, monitor_inference_results):
-        time_interval = self.MONITORED_KPIS_TIME_INTERVAL_AGG
-
-        # assign the timestamp of the first inference result to the time_interval_start
-        if self.time_interval_start is None:
-            self.time_interval_start = monitor_inference_results[0]["timestamp"]
-            LOGGER.debug("self.time_interval_start: {}".format(self.time_interval_start))
-
-            # add time_interval to the current time to get the time interval end
-            LOGGER.debug("time_interval: {}".format(time_interval))
-            LOGGER.debug(timedelta(seconds=time_interval))
-            self.time_interval_end = self.time_interval_start + timedelta(seconds=time_interval)
-
-        current_time = datetime.utcnow()
-
-        LOGGER.debug("current_time: {}".format(current_time))
-
-        if current_time >= self.time_interval_end:
-            self.time_interval_start = self.time_interval_end
-            self.time_interval_end = self.time_interval_start + timedelta(seconds=time_interval)
-
-        LOGGER.debug("time_interval_start: {}".format(self.time_interval_start))
-        LOGGER.debug("time_interval_end: {}".format(self.time_interval_end))
-
-    def delete_older_inference_results(self, monitor_inference_results):
-        # delete all inference results that are older than the time_interval_start
-        delete_inference_results = []
-
-        for i in range(len(monitor_inference_results)):
-            inference_result_timestamp = monitor_inference_results[i]["timestamp"]
-
-            if inference_result_timestamp < self.time_interval_start:
-                delete_inference_results.append(monitor_inference_results[i])
-
-        if len(delete_inference_results) > 0:
-            monitor_inference_results = [
-                inference_result
-                for inference_result in monitor_inference_results
-                if inference_result not in delete_inference_results
-            ]
-            if DEMO_MODE:
-                LOGGER.debug("inference_results len: {}".format(len(self.inference_results)))
-                self.inference_results = monitor_inference_results
-                LOGGER.debug("inference_results len after erase: {}".format(len(self.inference_results)))
-            LOGGER.debug(f"Cleaned inference results. {len(delete_inference_results)} inference results deleted")
-
-    def check_inference_time_interval(self, monitor_inference_results):
-        # check if there is at least one inference result in monitor_inference_results in the current time_interval
-        num_inference_results_in_time_interval = 0
-        for i in range(len(monitor_inference_results)):
-            inference_result_timestamp = monitor_inference_results[i]["timestamp"]
-
-            if (
-                inference_result_timestamp >= self.time_interval_start
-                and inference_result_timestamp < self.time_interval_end
-            ):
-                num_inference_results_in_time_interval += 1
-
-        if num_inference_results_in_time_interval > 0:
-            non_empty_time_interval = True
-            LOGGER.debug(
-                f"Current time interval is not empty (there are {num_inference_results_in_time_interval} inference results"
-            )
-        else:
-            non_empty_time_interval = False
-            LOGGER.debug("Current time interval is empty. No KPIs will be reported.")
-
-        return non_empty_time_interval
-
-    def monitor_compute_l3_kpi(self, service_id, monitor_inference_results):
-        # L3 security status
-        kpi_security_status = Kpi()
-        kpi_security_status.kpi_id.kpi_id.CopyFrom(self.monitored_kpis["l3_security_status"]["kpi_id"])
-        kpi_security_status.kpi_value.int32Val = self.monitor_security_status(service_id, monitor_inference_results)
-
-        # L3 ML model confidence
-        kpi_conf = Kpi()
-        kpi_conf.kpi_id.kpi_id.CopyFrom(self.monitored_kpis["l3_ml_model_confidence"]["kpi_id"])
-        kpi_conf.kpi_value.floatVal = self.monitor_ml_model_confidence(
-            service_id, monitor_inference_results, kpi_security_status
-        )
-
-        # L3 unique attack connections
-        kpi_unique_attack_conns = Kpi()
-        kpi_unique_attack_conns.kpi_id.kpi_id.CopyFrom(self.monitored_kpis["l3_unique_attack_conns"]["kpi_id"])
-        kpi_unique_attack_conns.kpi_value.int32Val = self.monitor_unique_attack_conns(
-            service_id, monitor_inference_results
-        )
-
-        # L3 unique compromised clients
-        kpi_unique_compromised_clients = Kpi()
-        kpi_unique_compromised_clients.kpi_id.kpi_id.CopyFrom(
-            self.monitored_kpis["l3_unique_compromised_clients"]["kpi_id"]
-        )
-        kpi_unique_compromised_clients.kpi_value.int32Val = self.monitor_unique_compromised_clients(
-            service_id, monitor_inference_results
-        )
-
-        # L3 unique attackers
-        kpi_unique_attackers = Kpi()
-        kpi_unique_attackers.kpi_id.kpi_id.CopyFrom(self.monitored_kpis["l3_unique_attackers"]["kpi_id"])
-        kpi_unique_attackers.kpi_value.int32Val = self.monitor_unique_attackers(service_id, monitor_inference_results)
-
-        timestamp = Timestamp()
-        timestamp.timestamp = timestamp_utcnow_to_float()
-
-        kpi_security_status.timestamp.CopyFrom(timestamp)
-        kpi_conf.timestamp.CopyFrom(timestamp)
-        kpi_unique_attack_conns.timestamp.CopyFrom(timestamp)
-        kpi_unique_compromised_clients.timestamp.CopyFrom(timestamp)
-        kpi_unique_attackers.timestamp.CopyFrom(timestamp)
-
-        LOGGER.debug("Sending KPIs to monitoring server")
-
-        LOGGER.debug("kpi_security_status: {}".format(kpi_security_status))
-        LOGGER.debug("kpi_conf: {}".format(kpi_conf))
-        LOGGER.debug("kpi_unique_attack_conns: {}".format(kpi_unique_attack_conns))
-        LOGGER.debug("kpi_unique_compromised_clients: {}".format(kpi_unique_compromised_clients))
-        LOGGER.debug("kpi_unique_attackers: {}".format(kpi_unique_attackers))
-
-        try:
-            self.monitoring_client.IncludeKpi(kpi_security_status)
-            self.monitoring_client.IncludeKpi(kpi_conf)
-            self.monitoring_client.IncludeKpi(kpi_unique_attack_conns)
-            self.monitoring_client.IncludeKpi(kpi_unique_compromised_clients)
-            self.monitoring_client.IncludeKpi(kpi_unique_attackers)
-        except Exception as e:
-            LOGGER.debug("Error sending KPIs to monitoring server: {}".format(e))
-
-    def monitor_security_status(self, service_id, monitor_inference_results):
-        # get the output.tag of the ML model of the last aggregation time interval as indicated by the self.MONITORED_KPIS_TIME_INTERVAL_AGG variable
-        outputs_last_time_interval = []
-
-        for i in range(len(monitor_inference_results)):
-            if (
-                monitor_inference_results[i]["timestamp"] >= self.time_interval_start
-                and monitor_inference_results[i]["timestamp"] < self.time_interval_end
-                and monitor_inference_results[i]["output"]["service_id"] == service_id
-                and service_id.service_uuid.uuid in self.monitored_kpis["l3_security_status"]["service_ids"]
-            ):
-                outputs_last_time_interval.append(monitor_inference_results[i]["output"]["tag"])
-
-        LOGGER.debug("outputs_last_time_interval: {}".format(outputs_last_time_interval))
-
-        # check if all outputs are 0
-        all_outputs_zero = True
-        for output in outputs_last_time_interval:
-            if output != self.NORMAL_CLASS:
-                all_outputs_zero = False
-                break
-
-        if all_outputs_zero:
-            return 0
-        return 1
-
-    def monitor_ml_model_confidence(self, service_id, monitor_inference_results, kpi_security_status):
-        # get the output.confidence of the ML model of the last aggregation time interval as indicated by the self.MONITORED_KPIS_TIME_INTERVAL_AGG variable
-        confidences_normal_last_time_interval = []
-        confidences_crypto_last_time_interval = []
-
-        for i in range(len(monitor_inference_results)):
-            LOGGER.debug("monitor_inference_results[i]: {}".format(monitor_inference_results[i]))
-
-            if (
-                monitor_inference_results[i]["timestamp"] >= self.time_interval_start
-                and monitor_inference_results[i]["timestamp"] < self.time_interval_end
-                and monitor_inference_results[i]["output"]["service_id"] == service_id
-                and service_id.service_uuid.uuid in self.monitored_kpis["l3_ml_model_confidence"]["service_ids"]
-            ):
-                if monitor_inference_results[i]["output"]["tag"] == self.NORMAL_CLASS:
-                    confidences_normal_last_time_interval.append(monitor_inference_results[i]["output"]["confidence"])
-                elif monitor_inference_results[i]["output"]["tag"] == self.CRYPTO_CLASS:
-                    confidences_crypto_last_time_interval.append(monitor_inference_results[i]["output"]["confidence"])
-                else:
-                    LOGGER.debug("Unknown tag: {}".format(monitor_inference_results[i]["output"]["tag"]))
-
-        LOGGER.debug("confidences_normal_last_time_interval: {}".format(confidences_normal_last_time_interval))
-        LOGGER.debug("confidences_crypto_last_time_interval: {}".format(confidences_crypto_last_time_interval))
-
-        if kpi_security_status.kpi_value.int32Val == 0:
-            return np.mean(confidences_normal_last_time_interval)
-
-        return np.mean(confidences_crypto_last_time_interval)
-
-    def monitor_unique_attack_conns(self, service_id, monitor_inference_results):
-        # get the number of unique attack connections (grouping by origin IP, origin port, destination IP, destination port) of the last aggregation time interval as indicated by the self.MONITORED_KPIS_TIME_INTERVAL_AGG variable
-        num_unique_attack_conns_last_time_interval = 0
-        unique_attack_conns_last_time_interval = []
-
-        for i in range(len(monitor_inference_results)):
-            if (
-                monitor_inference_results[i]["timestamp"] >= self.time_interval_start
-                and monitor_inference_results[i]["timestamp"] < self.time_interval_end
-                and monitor_inference_results[i]["output"]["service_id"] == service_id
-                and service_id.service_uuid.uuid in self.monitored_kpis["l3_unique_attack_conns"]["service_ids"]
-            ):
-                if monitor_inference_results[i]["output"]["tag"] == self.CRYPTO_CLASS:
-                    current_attack_conn = {
-                        "ip_o": monitor_inference_results[i]["output"]["ip_o"],
-                        "port_o": monitor_inference_results[i]["output"]["port_o"],
-                        "ip_d": monitor_inference_results[i]["output"]["ip_d"],
-                        "port_d": monitor_inference_results[i]["output"]["port_d"],
-                    }
-
-                    is_unique_attack_conn = True
-
-                    for j in range(len(unique_attack_conns_last_time_interval)):
-                        if current_attack_conn == unique_attack_conns_last_time_interval[j]:
-                            is_unique_attack_conn = False
-
-                    if is_unique_attack_conn:
-                        num_unique_attack_conns_last_time_interval += 1
-                        unique_attack_conns_last_time_interval.append(current_attack_conn)
-
-        return num_unique_attack_conns_last_time_interval
-
-    def monitor_unique_compromised_clients(self, service_id, monitor_inference_results):
-        # get the number of unique compromised clients (grouping by origin IP) of the last aggregation time interval as indicated by the self.MONITORED_KPIS_TIME_INTERVAL_AGG variable
-        num_unique_compromised_clients_last_time_interval = 0
-        unique_compromised_clients_last_time_interval = []
-
-        for i in range(len(monitor_inference_results)):
-            if (
-                monitor_inference_results[i]["timestamp"] >= self.time_interval_start
-                and monitor_inference_results[i]["timestamp"] < self.time_interval_end
-                and monitor_inference_results[i]["output"]["service_id"] == service_id
-                and service_id.service_uuid.uuid in self.monitored_kpis["l3_unique_compromised_clients"]["service_ids"]
-            ):
-                if monitor_inference_results[i]["output"]["tag"] == self.CRYPTO_CLASS:
-                    if (
-                        monitor_inference_results[i]["output"]["ip_o"]
-                        not in unique_compromised_clients_last_time_interval
-                    ):
-                        unique_compromised_clients_last_time_interval.append(
-                            monitor_inference_results[i]["output"]["ip_o"]
-                        )
-                        num_unique_compromised_clients_last_time_interval += 1
-
-        return num_unique_compromised_clients_last_time_interval
-
-    def monitor_unique_attackers(self, service_id, monitor_inference_results):
-        # get the number of unique attackers (grouping by destination ip) of the last aggregation time interval as indicated by the self.MONITORED_KPIS_TIME_INTERVAL_AGG variable
-        num_unique_attackers_last_time_interval = 0
-        unique_attackers_last_time_interval = []
-
-        for i in range(len(monitor_inference_results)):
-            if (
-                monitor_inference_results[i]["timestamp"] >= self.time_interval_start
-                and monitor_inference_results[i]["timestamp"] < self.time_interval_end
-                and monitor_inference_results[i]["output"]["service_id"] == service_id
-                and service_id.service_uuid.uuid in self.monitored_kpis["l3_unique_attackers"]["service_ids"]
-            ):
-                if monitor_inference_results[i]["output"]["tag"] == self.CRYPTO_CLASS:
-                    if monitor_inference_results[i]["output"]["ip_d"] not in unique_attackers_last_time_interval:
-                        unique_attackers_last_time_interval.append(monitor_inference_results[i]["output"]["ip_d"])
-                        num_unique_attackers_last_time_interval += 1
-
-        return num_unique_attackers_last_time_interval
-
-    """
-    Classify connection as standard traffic or cryptomining attack and return results
-        -input: 
-            + request: L3CentralizedattackdetectorMetrics object with connection features information
-        -output: L3AttackmitigatorOutput object with information about the assigned class and prediction confidence
-    """
-
-    def perform_inference(self, request):
-        x_data = np.array([[feature.feature for feature in request.features]])
-
-        # Print input data shape
-        LOGGER.debug("x_data.shape: {}".format(x_data.shape))
-
-        # Get batch size
-        batch_size = x_data.shape[0]
-
-        # Print batch size
-        LOGGER.debug("batch_size: {}".format(batch_size))
-        LOGGER.debug("x_data.shape: {}".format(x_data.shape))
-
-        inference_time_start = time.perf_counter()
-
-        # Perform inference
-        predictions = self.cryptomining_detector_model.run(
-            [self.prob_name], {self.input_name: x_data.astype(np.float32)}
-        )[0]
-
-        inference_time_end = time.perf_counter()
-
-        # Measure inference time
-        inference_time = inference_time_end - inference_time_start
-        self.cad_inference_times.append(inference_time)
-
-        if len(self.cad_inference_times) > self.cad_num_inference_measurements:
-            inference_times_np_array = np.array(self.cad_inference_times)
-            np.save(f"inference_times_{batch_size}.npy", inference_times_np_array)
-
-            avg_inference_time = np.mean(inference_times_np_array)
-            max_inference_time = np.max(inference_times_np_array)
-            min_inference_time = np.min(inference_times_np_array)
-            std_inference_time = np.std(inference_times_np_array)
-            median_inference_time = np.median(inference_times_np_array)
-
-            LOGGER.debug("Average inference time: {}".format(avg_inference_time))
-            LOGGER.debug("Max inference time: {}".format(max_inference_time))
-            LOGGER.debug("Min inference time: {}".format(min_inference_time))
-            LOGGER.debug("Standard deviation inference time: {}".format(std_inference_time))
-            LOGGER.debug("Median inference time: {}".format(median_inference_time))
-
-            with open(f"inference_times_stats_{batch_size}.txt", "w") as f:
-                f.write("Average inference time: {}\n".format(avg_inference_time))
-                f.write("Max inference time: {}\n".format(max_inference_time))
-                f.write("Min inference time: {}\n".format(min_inference_time))
-                f.write("Standard deviation inference time: {}\n".format(std_inference_time))
-                f.write("Median inference time: {}\n".format(median_inference_time))
-
-        # Gather the predicted class, the probability of that class and other relevant information required to block the attack
-        output_message = {
-            "confidence": None,
-            "timestamp": datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
-            "ip_o": request.connection_metadata.ip_o,
-            "ip_d": request.connection_metadata.ip_d,
-            "tag_name": None,
-            "tag": None,
-            "flow_id": request.connection_metadata.flow_id,
-            "protocol": request.connection_metadata.protocol,
-            "port_o": request.connection_metadata.port_o,
-            "port_d": request.connection_metadata.port_d,
-            "ml_id": self.cryptomining_detector_file_name,
-            "service_id": request.connection_metadata.service_id,
-            "endpoint_id": request.connection_metadata.endpoint_id,
-            "time_start": request.connection_metadata.time_start,
-            "time_end": request.connection_metadata.time_end,
-        }
-
-        if predictions[0][1] >= self.CLASSIFICATION_THRESHOLD:
-            output_message["confidence"] = predictions[0][1]
-            output_message["tag_name"] = "Crypto"
-            output_message["tag"] = self.CRYPTO_CLASS
-        else:
-            output_message["confidence"] = predictions[0][0]
-            output_message["tag_name"] = "Normal"
-            output_message["tag"] = self.NORMAL_CLASS
-
-        return output_message
-
-    """
-    Receive features from Attack Mitigator, predict attack and communicate with Attack Mitigator
-        -input: 
-            + request: L3CentralizedattackdetectorMetrics object with connection features information
-        -output: Empty object with a message about the execution of the function
-    """
-
-    def AnalyzeConnectionStatistics(self, request, context):
-        # Perform inference with the data sent in the request
-        logging.info("Performing inference...")
-        start = time.time()
-        cryptomining_detector_output = self.perform_inference(request)
-        end = time.time()
-        LOGGER.debug("Inference performed in {} seconds".format(end - start))
-        logging.info("Inference performed correctly")
-
-        self.inference_results.append({"output": cryptomining_detector_output, "timestamp": datetime.now()})
-        LOGGER.debug("inference_results length: {}".format(len(self.inference_results)))
-
-        service_id = request.connection_metadata.service_id
-        device_id = request.connection_metadata.endpoint_id.device_id
-        endpoint_id = request.connection_metadata.endpoint_id
-
-        # Check if a request of a new service has been received and, if so, create the monitored KPIs for that service
-        if service_id not in self.service_ids:
-            self.create_kpis(service_id, device_id, endpoint_id)
-            self.service_ids.append(service_id)
-
-        start = time.time()
-        self.monitor_kpis()
-        end = time.time()
-
-        LOGGER.debug("Monitoring KPIs performed in {} seconds".format(end - start))
-        LOGGER.debug("cryptomining_detector_output: {}".format(cryptomining_detector_output))
-
-        if DEMO_MODE:
-            self.analyze_prediction_accuracy(cryptomining_detector_output["confidence"])
-
-        connection_info = ConnectionInfo(
-            request.connection_metadata.ip_o,
-            request.connection_metadata.port_o,
-            request.connection_metadata.ip_d,
-            request.connection_metadata.port_d,
-        )
-
-        if cryptomining_detector_output["tag_name"] == "Crypto":
-            LOGGER.debug("Crypto found")
-            LOGGER.debug(connection_info)
-
-        # Only notify Attack Mitigator when a cryptomining connection has been detected
-        if cryptomining_detector_output["tag_name"] == "Crypto" and connection_info not in self.attack_connections:
-            self.attack_connections.append(connection_info)
-
-            if connection_info.ip_o in ATTACK_IPS or connection_info.ip_d in ATTACK_IPS:
-                self.correct_attack_conns += 1
-                self.correct_predictions += 1
-            else:
-                LOGGER.debug("False positive: {}".format(connection_info))
-                self.false_positives += 1
-
-            self.total_predictions += 1
-
-            # if False:
-            notification_time_start = time.perf_counter()
-
-            LOGGER.debug("Crypto attack detected")
-
-            # Notify the Attack Mitigator component about the attack
-            logging.info(
-                "Notifying the Attack Mitigator component about the attack in order to block the connection..."
-            )
-
-            try:
-                logging.info("Sending the connection information to the Attack Mitigator component...")
-                message = L3AttackmitigatorOutput(**cryptomining_detector_output)
-                response = self.attackmitigator_client.PerformMitigation(message)
-                notification_time_end = time.perf_counter()
-
-                self.am_notification_times.append(notification_time_end - notification_time_start)
-
-                LOGGER.debug(f"am_notification_times length: {len(self.am_notification_times)}")
-                LOGGER.debug(f"last am_notification_time: {self.am_notification_times[-1]}")
-
-                if len(self.am_notification_times) > 100:
-                    am_notification_times_np_array = np.array(self.am_notification_times)
-                    np.save("am_notification_times.npy", am_notification_times_np_array)
-
-                    avg_notification_time = np.mean(am_notification_times_np_array)
-                    max_notification_time = np.max(am_notification_times_np_array)
-                    min_notification_time = np.min(am_notification_times_np_array)
-                    std_notification_time = np.std(am_notification_times_np_array)
-                    median_notification_time = np.median(am_notification_times_np_array)
-
-                    LOGGER.debug("Average notification time: {}".format(avg_notification_time))
-                    LOGGER.debug("Max notification time: {}".format(max_notification_time))
-                    LOGGER.debug("Min notification time: {}".format(min_notification_time))
-                    LOGGER.debug("Std notification time: {}".format(std_notification_time))
-                    LOGGER.debug("Median notification time: {}".format(median_notification_time))
-
-                    with open("am_notification_times_stats.txt", "w") as f:
-                        f.write("Average notification time: {}\n".format(avg_notification_time))
-                        f.write("Max notification time: {}\n".format(max_notification_time))
-                        f.write("Min notification time: {}\n".format(min_notification_time))
-                        f.write("Std notification time: {}\n".format(std_notification_time))
-                        f.write("Median notification time: {}\n".format(median_notification_time))
-
-                # logging.info("Attack Mitigator notified and received response: ", response.message)  # FIX No message received
-                logging.info("Attack Mitigator notified")
-
-                return Empty(message="OK, information received and mitigator notified abou the attack")
-            except Exception as e:
-                logging.error("Error notifying the Attack Mitigator component about the attack: ", e)
-                logging.error("Couldn't find l3_attackmitigator")
-
-                return Empty(message="Attack Mitigator not found")
-        else:
-            logging.info("No attack detected")
-
-            if cryptomining_detector_output["tag_name"] != "Crypto":
-                if connection_info.ip_o not in ATTACK_IPS and connection_info.ip_d not in ATTACK_IPS:
-                    self.correct_predictions += 1
-                else:
-                    LOGGER.debug("False negative: {}".format(connection_info))
-                    self.false_negatives += 1
-
-                self.total_predictions += 1
-
-            return Empty(message="Ok, information received (no attack detected)")
-
-    def analyze_prediction_accuracy(self, confidence):
-        LOGGER.info("Number of Attack Connections Correctly Classified: {}".format(self.correct_attack_conns))
-        LOGGER.info("Number of Attack Connections: {}".format(len(self.attack_connections)))
-
-        if self.total_predictions > 0:
-            overall_detection_acc = self.correct_predictions / self.total_predictions
-        else:
-            overall_detection_acc = 0
-
-        LOGGER.info("Overall Detection Accuracy: {}\n".format(overall_detection_acc))
-
-        if len(self.attack_connections) > 0:
-            cryptomining_attack_detection_acc = self.correct_attack_conns / len(self.attack_connections)
-        else:
-            cryptomining_attack_detection_acc = 0
-
-        LOGGER.info("Cryptomining Attack Detection Accuracy: {}".format(cryptomining_attack_detection_acc))
-        LOGGER.info("Cryptomining Detector Confidence: {}".format(confidence))
-
-        with open("prediction_accuracy.txt", "a") as f:
-            LOGGER.debug("Exporting prediction accuracy and confidence")
-
-            f.write("Overall Detection Accuracy: {}\n".format(overall_detection_acc))
-            f.write("Cryptomining Attack Detection Accuracy: {}\n".format(cryptomining_attack_detection_acc))
-            f.write("Total Predictions: {}\n".format(self.total_predictions))
-            f.write("Total Positives: {}\n".format(len(self.attack_connections)))
-            f.write("False Positives: {}\n".format(self.false_positives))
-            f.write("True Negatives: {}\n".format(self.total_predictions - len(self.attack_connections)))
-            f.write("False Negatives: {}\n".format(self.false_negatives))
-            f.write("Cryptomining Detector Confidence: {}\n\n".format(confidence))
-            f.write("Timestamp: {}\n".format(datetime.now().strftime("%d/%m/%Y %H:%M:%S")))
-            f.close()
-
-    def AnalyzeBatchConnectionStatistics(self, request, context):
-        start = time.time()
-
-        for metric in request.metrics:
-            self.AnalyzeConnectionStatistics(metric, context)
-        end = time.time()
-
-        with open("batch_time.txt", "a") as f:
-            f.write(str(len(request.metrics)) + "\n")
-            f.write(str(end - start) + "\n\n")
-            f.close()
-
-        logging.debug("Metrics: " + str(len(request.metrics)))
-        logging.debug("Batch time: " + str(end - start))
-
-        return Empty(message="OK, information received.")
-
-    """
-    Send features allocated in the metadata of the onnx file to the DAD
-        -output: ONNX metadata as a list of integers
-    """
-
-    def GetFeaturesIds(self, request: Empty, context):
-        features = AutoFeatures()
-
-        for feature in self.cryptomining_detector_features_metadata:
-            features.auto_features.append(feature)
-
-        return features
diff --git a/src/l3_distributedattackdetector/Config.py b/src/l3_distributedattackdetector/Config.py
index e04de0b2622b621fb95f1c382ac3a152836de760..a1419ef09c9b3dcbff5aa576536fae8ffe6bc7a4 100644
--- a/src/l3_distributedattackdetector/Config.py
+++ b/src/l3_distributedattackdetector/Config.py
@@ -18,7 +18,7 @@ import logging
 LOG_LEVEL = logging.WARNING
 
 # gRPC settings
-GRPC_SERVICE_PORT = 10000  # TODO UPM FIXME
+GRPC_SERVICE_PORT = 10000
 GRPC_MAX_WORKERS = 10
 GRPC_GRACE_PERIOD = 60
 
diff --git a/src/l3_distributedattackdetector/README.md b/src/l3_distributedattackdetector/README.md
index d8cac8b72d41c6eb6ce2b2908e6ab7402966ad62..d79563dd8936814132e96aa738216435be44950a 100644
--- a/src/l3_distributedattackdetector/README.md
+++ b/src/l3_distributedattackdetector/README.md
@@ -1,3 +1,3 @@
-# l3_distributedattackdetector
-- Receives packages and process it with TSTAT
-- Functions: ReportSummarizeKpi(KpiList)
+# L3 Distributed Attack Detector
+
+Receives packages and processes them with TSTAT to generate traffic snapshot statistics.
diff --git a/src/l3_distributedattackdetector/requirements.in b/src/l3_distributedattackdetector/requirements.in
index a8aba849708799232f6b0732c3661396266da329..64e4aa198bd8b7902c0bb810e5fcd6f108faae6f 100644
--- a/src/l3_distributedattackdetector/requirements.in
+++ b/src/l3_distributedattackdetector/requirements.in
@@ -12,4 +12,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# no extra dependency
+numpy==1.23.*
+asyncio==3.4.3
diff --git a/src/l3_distributedattackdetector/service/__main__.py b/src/l3_distributedattackdetector/service/__main__.py
index 1f558dfb6c271cf63a9e36ae06cb9993f7e49c57..a8f0ac3c4f9737091c2c1a39134b97ee7bd6de7d 100644
--- a/src/l3_distributedattackdetector/service/__main__.py
+++ b/src/l3_distributedattackdetector/service/__main__.py
@@ -13,207 +13,39 @@
 # limitations under the License.
 
 import logging
-import sys 
-import os 
-import time
-import grpc
-from common.proto.l3_centralizedattackdetector_pb2_grpc import (
-    L3CentralizedattackdetectorStub,
-)
-from common.proto.l3_centralizedattackdetector_pb2 import (
-    ModelInput,
-)
+from sys import stdout
+import sys
+from l3_distributedattackdetector import l3_distributedattackdetector
 
-LOGGER = logging.getLogger(__name__)
-TSTAT_DIR_NAME = "piped/"
-JSON_BLANK = {
-    "ip_o": "",  # Client IP
-    "port_o": "",  # Client port
-    "ip_d": "",  # Server ip
-    "port_d": "",  # Server port
-    "flow_id": "",  # Identifier:c_ip,c_port,s_ip,s_port,time_start
-    "protocol": "",  # Connection protocol
-    "time_start": 0,  # Start of connection
-    "time_end": 0,  # Time of last packet
-}
+#  Setup LOGGER
+LOGGER = logging.getLogger("main_dad_LOGGER")
+LOGGER.setLevel(logging.INFO)
+logFormatter = logging.Formatter(fmt="%(levelname)-8s %(message)s")
+consoleHandler = logging.StreamHandler(stdout)
+consoleHandler.setFormatter(logFormatter)
+LOGGER.addHandler(consoleHandler)
 
-def follow(thefile, time_sleep):
-    """
-    Generator function that yields new lines in a file
-    It reads the logfie (the opened file)
-    """
-    # seek the end of the file
-    thefile.seek(0, os.SEEK_END)
+PROFILING = False
 
-    trozo = ""
-    # start infinite loop
-    while True:
-        # read last line of file
-        line = thefile.readline()
-        # sleep if file hasn't been updated
-        if not line:
-            time.sleep(time_sleep)  # FIXME
-            continue
-
-        if line[-1] != "\n":
-            trozo += line
-            # print ("OJO :"+line+":")
-        else:
-            if trozo != "":
-                line = trozo + line
-                trozo = ""
-            yield line
-
-def load_file(dirname=TSTAT_DIR_NAME):
-    """
-    - Client side -
-    """
-    # "/home/dapi/Tstat/TOSHI/tstat/tstat_DRv4/tstat/piped/"
-
-    while True:
-        here = os.path.dirname(os.path.abspath(__file__))
-        tstat_piped = os.path.join(here, dirname)
-        tstat_dirs = os.listdir(tstat_piped)
-        if len(tstat_dirs) > 0:
-            tstat_dirs.sort()
-            new_dir = tstat_dirs[-1]
-            print(new_dir)
-            # print("dir: {0}".format(new_dir))
-            tstat_file = tstat_piped + new_dir + "/log_tcp_temp_complete"
-            print("tstat_file: {0}".format(tstat_file))
-            return tstat_file
-        else:
-            print("No tstat directory!")
-            time.sleep(1)
-
-def process_line(line):
-    """
-    - Preprocessing before a message per line
-    - Avoids crash when nan are found by generating a 0s array
-    - Returns a list of values
-    """
-
-    def makeDivision(i, j):
-        """
-        Helper function
-        """
-        return i / j if (j and type(i) != str and type(j) != str) else 0
-
-    line = line.split(" ")
-    try:
-        n_packets_server, n_packets_client = float(
-            line[16]), float(line[2])
-    except:
-        return [0 for i in range(9)]
-    n_bits_server, n_bits_client = float(line[22]), float(line[8])
-    seconds = float(line[30]) / 1e6  # Duration in ms
-    values = [
-        makeDivision(n_packets_server, seconds),
-        makeDivision(n_packets_client, seconds),
-        makeDivision(n_bits_server, seconds),
-        makeDivision(n_bits_client, seconds),
-        makeDivision(n_bits_server, n_packets_server),
-        makeDivision(n_bits_client, n_packets_client),
-        makeDivision(n_packets_server, n_packets_client),
-        makeDivision(n_bits_server, n_bits_client),
-    ]
-    return values
-
-def open_channel(input_information):
-    with grpc.insecure_channel("localhost:10001") as channel:
-        stub = L3CentralizedattackdetectorStub(channel)
-        response = stub.SendInput(
-            ModelInput(**input_information))
-        LOGGER.debug("Inferencer send_input sent and received: ",
-                        response.message)
-        # response = stub.get_output(Inferencer_pb2.empty(message=""))
-        # print("Inferencer get_output response: \n", response)
-
-def run(time_sleep, max_lines):
-
-    filename = load_file()
-    write_salida = None
-    print(
-        "following: ",
-        filename,
-        " time to wait:",
-        time_sleep,
-        "lineas_tope:",
-        max_lines,
-        "write salida:",
-        write_salida,
-    )
-    logfile = open(filename, "r")
-    # iterate over the generator
-    loglines = follow(logfile, time_sleep)
-    lin = 0
-    ultima_lin = 0
-    last_line = ""
-    cryptos = 0
-    new_connections = {}  # Dict for storing NEW data
-    connections_db = {}  # Dict for storing ALL data
-    print('Reading lines')
-    for line in loglines:
-        print('Received Line')
-        start = time.time()
-        line_id = line.split(" ")
-        conn_id = (line_id[0], line_id[1], line_id[14], line_id[15])
-        new_connections[conn_id] = process_line(line)
-        try:
-            connections_db[conn_id]["time_end"] = time.time()
-        except KeyError:
-            connections_db[conn_id] = JSON_BLANK.copy()
-            connections_db[conn_id]["time_start"] = time.time()
-            connections_db[conn_id]["time_end"] = time.time()
-            connections_db[conn_id]["ip_o"] = conn_id[0]
-            connections_db[conn_id]["port_o"] = conn_id[1]
-            connections_db[conn_id]["flow_id"] = "".join(conn_id)
-            connections_db[conn_id]["protocol"] = "TCP"
-            connections_db[conn_id]["ip_d"] = conn_id[2]
-            connections_db[conn_id]["port_d"] = conn_id[3]
+def main():
+    l3_distributedattackdetector()
 
-        # CRAFT DICT
-        inference_information = {
-            "n_packets_server_seconds": new_connections[conn_id][0],
-            "n_packets_client_seconds": new_connections[conn_id][1],
-            "n_bits_server_seconds": new_connections[conn_id][2],
-            "n_bits_client_seconds": new_connections[conn_id][3],
-            "n_bits_server_n_packets_server": new_connections[conn_id][4],
-            "n_bits_client_n_packets_client": new_connections[conn_id][5],
-            "n_packets_server_n_packets_client": new_connections[conn_id][6],
-            "n_bits_server_n_bits_client": new_connections[conn_id][7],
-            "ip_o": connections_db[conn_id]["ip_o"],
-            "port_o": connections_db[conn_id]["port_o"],
-            "ip_d": connections_db[conn_id]["ip_d"],
-            "port_d": connections_db[conn_id]["port_d"],
-            "flow_id": connections_db[conn_id]["flow_id"],
-            "protocol": connections_db[conn_id]["protocol"],
-            "time_start": connections_db[conn_id]["time_start"],
-            "time_end": connections_db[conn_id]["time_end"],
-        }
 
-        # SEND MSG
-        try:
-            open_channel(inference_information)
-        except:
-            LOGGER.info("Centralized Attack Mitigator is not up")
+if __name__ == "__main__":
+    if PROFILING:
+        import cProfile, pstats, io
 
-        if write_salida:
-            print(line, end="")
-            sys.stdout.flush()
-        lin += 1
-        if lin >= max_lines:
-            break
-        elif lin == 1:
-            print("primera:", ultima_lin)
+        pr = cProfile.Profile()
+        pr.enable()
 
-        end = time.time() - start
-        print(end)
+    main()
 
+    if PROFILING:
+        pr.disable()
+        s = io.StringIO()
+        sortby = "cumulative"
+        ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
+        ps.print_stats()
+        LOGGER.info(s.getvalue())
 
-def main():
-    logging.basicConfig()
-    run(5, 70)
-    
-if __name__ == '__main__':
-    sys.exit(main())
+    sys.exit(0)
\ No newline at end of file
diff --git a/src/l3_distributedattackdetector/service/known_attack_ips.csv b/src/l3_distributedattackdetector/service/known_attack_ips.csv
new file mode 100644
index 0000000000000000000000000000000000000000..254dad83da9342581186335ca63c6ea1e8b2a219
--- /dev/null
+++ b/src/l3_distributedattackdetector/service/known_attack_ips.csv
@@ -0,0 +1 @@
+37.187.95.110,91.121.140.167,94.23.23.52,94.23.247.226,149.202.83.171
\ No newline at end of file
diff --git a/src/l3_distributedattackdetector/service/l3_distributedattackdetector.py b/src/l3_distributedattackdetector/service/l3_distributedattackdetector.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c9d09dc57d2966538dbe804117e330e06b10bd4
--- /dev/null
+++ b/src/l3_distributedattackdetector/service/l3_distributedattackdetector.py
@@ -0,0 +1,587 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import asyncio
+import logging
+import os
+import signal
+import time
+from sys import stdout
+
+import grpc
+import numpy as np
+
+from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum
+from common.proto.context_pb2_grpc import ContextServiceStub
+from common.proto.l3_centralizedattackdetector_pb2 import (
+    ConnectionMetadata,
+    Feature,
+    L3CentralizedattackdetectorBatchInput,
+    L3CentralizedattackdetectorMetrics,
+)
+from common.proto.l3_centralizedattackdetector_pb2_grpc import L3CentralizedattackdetectorStub
+
+# Setup LOGGER
+LOGGER = logging.getLogger("dad_LOGGER")
+LOGGER.setLevel(logging.INFO)
+logFormatter = logging.Formatter(fmt="%(levelname)-8s %(message)s")
+consoleHandler = logging.StreamHandler(stdout)
+consoleHandler.setFormatter(logFormatter)
+LOGGER.addHandler(consoleHandler)
+
+# Define constants
+TSTAT_DIR_NAME = "piped/"
+CONTROLLER_IP = "192.168.165.78"  # Change this to the IP of the controller
+CONTEXT_ID = "admin"  # Change this to the context ID to be used
+CONTEXT_CHANNEL = f"{CONTROLLER_IP}:1010"
+CENTRALIZED_ATTACK_DETECTOR = f"{CONTROLLER_IP}:10001"
+JSON_BLANK = {
+    "ip_o": "",  # Client IP
+    "port_o": "",  # Client port
+    "ip_d": "",  # Server ip
+    "port_d": "",  # Server port
+    "flow_id": "",  # Identifier: c_ip,c_port, s_ip,s_port, time_start
+    "protocol": "",  # Connection protocol
+    "time_start": 0.0,  # Start of connection
+    "time_end": 0.0,  # Time of last packet
+}
+STOP = False
+IGNORE_FIRST_LINE_TSTAT = True
+PROFILING = False
+SEND_DATA_IN_BATCHES = False
+BATCH_SIZE = 10
+
+
+class l3_distributedattackdetector:
+    def __init__(self):
+        """
+        Initializes a Distributed Attack Detector.
+
+        This method initializes a Distributed Attack Detector by setting up instance variables, connecting to the Centralized Attack Detector, obtaining feature IDs, and starting the process traffic loop. It also sets up a signal handler for handling keyboard interrupts.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+    
+        LOGGER.info("Creating Distributed Attack Detector")
+
+        self.feature_ids = []
+
+        self.cad_features = {}
+        self.conn_id = ()
+
+        self.connections_dict = {}  # Dictionary for storing all connections data
+        self.new_connections = {}  # Dictionary for storing new connections data
+
+        self.known_attack_ips = self.read_kwnown_attack_ips()
+
+        signal.signal(signal.SIGINT, self.handler)
+
+        with grpc.insecure_channel(CENTRALIZED_ATTACK_DETECTOR) as channel:
+            self.cad = L3CentralizedattackdetectorStub(channel)
+            LOGGER.info("Connected to the Centralized Attack Detector")
+
+            LOGGER.info("Obtaining features Ids. from the Centralized Attack Detector...")
+            self.feature_ids = self.get_features_ids()
+            LOGGER.info("Features Ids.: {:s}".format(str(self.feature_ids)))
+
+            asyncio.run(self.process_traffic())
+    
+    def read_kwnown_attack_ips(self):
+        """
+        Reads a list of known attack IPs from a CSV file.
+
+        This method reads a list of known attack IPs from a CSV file named "known_attack_ips.csv". The method returns a list of strings containing the IP addresses.
+
+        Args:
+            None.
+
+        Returns:
+            List[str]: A list of strings containing the IP addresses of known attack sources.
+        """
+        
+        # Initialize an empty list to store the known attack IPs
+        known_attack_ips = []
+
+        # Open the known attack IPs CSV file
+        with open("known_attack_ips.csv", "r") as f:
+            # Read the contents of the file and split it into a list of strings
+            known_attack_ips = f.read().split(",")
+
+        # Return the list of known attack IPs
+        return known_attack_ips
+        
+    def handler(self):
+        """
+        Handles a keyboard interrupt signal.
+
+        This method handles a keyboard interrupt signal by setting the `STOP` flag to `True` and logging a message indicating that the program is stopping gracefully.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+        
+        # Set the STOP flag to True
+        if STOP:
+            exit()
+        STOP = True
+
+        # Log a message indicating that the program is stopping gracefully
+        LOGGER.info("Gracefully stopping...")
+
+    def follow(self, logfile, time_sleep):
+        """
+        Generator function that yields new lines in a log file.
+
+        This method reads a file object and yields new lines as they are added to the file. The method uses an infinite loop to continuously read the last line of the file. If the file hasn't been updated, the method sleeps for the specified `time_sleep` interval. If the last line of the file doesn't end with a newline character, the method appends the line to a `chunk` variable. When a newline character is encountered, the method yields the line, possibly appending the `chunk` variable to the line if it contains a partial line. The method returns an iterator that yields lines from the file.
+
+        Args:
+            file (TextIO): The file object to read from.
+            time_sleep (float): The time to sleep if the file hasn't been updated.
+
+        Yields:
+            str: The next line in the file.
+
+        Returns:
+            None.
+        """
+
+        # seek the end of the file
+        # logfile.seek(0, os.SEEK_END)
+
+        chunk = ""
+
+        # start an infinite loop
+        while True:
+            # read last line of the file
+            line = logfile.readline()
+
+            # sleep if the file hasn't been updated
+            if not line:
+                time.sleep(time_sleep)
+                continue
+
+            if line[-1] != "\n":
+                chunk += line
+            else:
+                if chunk != "":
+                    line = chunk + line
+                    chunk = ""
+
+                yield line
+
+    def load_file(self, dirname=TSTAT_DIR_NAME):
+        """
+        Loads the latest Tstat log file.
+
+        This method loads the latest Tstat log file by searching for the most recent directory in the specified `dirname` directory. If a directory is found, the method returns the path to the `log_tcp_temp_complete` file in that directory. If no directory is found, the method logs a message and waits for 5 seconds before trying again.
+
+        Args:
+            dirname (str): The name of the directory to search for Tstat log files. Defaults to `TSTAT_DIR_NAME`.
+
+        Returns:
+            str: The path to the latest Tstat log file.
+        """
+        
+        while True:
+            # Get the path to the Tstat directory
+            here = os.path.dirname(os.path.abspath(__file__))
+            tstat_piped = os.path.join(here, dirname)
+
+            # Get a list of all directories in the Tstat directory
+            tstat_dirs = os.listdir(tstat_piped)
+
+            # If there are directories in the Tstat directory, find the most recent one and return the path to the log file
+            if len(tstat_dirs) > 0:
+                tstat_dirs.sort()
+                new_dir = tstat_dirs[-1]
+                tstat_file = tstat_piped + new_dir + "/log_tcp_temp_complete"
+
+                LOGGER.info("Following: {:s}".format(str(tstat_file)))
+
+                return tstat_file
+            # If there are no directories in the Tstat directory, log a message and wait for 5 seconds before trying again
+            else:
+                LOGGER.info("No Tstat directory found. Waiting...")
+                time.sleep(5)
+
+    def process_line(self, line):
+        """
+        Processes a single line of input data and returns a list of feature values.
+
+        Args:
+            line (str): A single line of input data containing feature values separated by spaces.
+
+        Returns:
+            List[float]: A list of feature values extracted from the input line.
+
+        Raises:
+            IndexError: If the input line does not contain enough feature values.
+        """
+        
+        line = line.split(" ")
+
+        try:
+            values = []
+            for feature_id in self.feature_ids:
+                feature_id = int(feature_id)
+                feature = feature_id - 1
+                values.append(float(line[feature]))
+        except IndexError:
+            LOGGER.error("IndexError: {0}".format(line))
+
+        return values
+
+    def get_services(self, context_id_str):
+        """
+        Gets the services for a given context ID.
+
+        This method gets the services for a given context ID by calling the ListServices method of the ContextService gRPC stub.
+
+        Args:
+            context_id_str (str): The context ID to get services for.
+
+        Returns:
+            ListServicesResponse: A response object containing the services.
+        """
+        
+        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
+            stub = ContextServiceStub(channel)
+            context_id = ContextId()
+            context_id.context_uuid.uuid = context_id_str
+
+            return stub.ListServices(context_id)
+
+    def get_service_id(self, context_id):
+        """
+        Gets the service ID for a given context ID.
+
+        This method gets the service ID for a given context ID by calling the get_services method and searching for the first service in the list with the service type of SERVICETYPE_L3NM.
+
+        Args:
+            context_id (str): The context ID to get the service ID for.
+
+        Returns:
+            str: The service ID.
+        """
+    
+        service_list = self.get_services(context_id)
+        service_id = None
+
+        for s in service_list.services:
+            if s.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
+                service_id = s.service_id
+                break
+            else:
+                pass
+
+        return service_id
+
+    def get_endpoint_id(self, context_id):
+        """
+        Gets the endpoint ID for a given context ID.
+
+        This method gets the endpoint ID for a given context ID by calling the get_services method and searching for the first service in the list with the service type of SERVICETYPE_L3NM.
+
+        Args:
+            context_id (str): The context ID to get the endpoint ID for.
+
+        Returns:
+            str: The endpoint ID.
+        """
+    
+        service_list = self.get_services(context_id)
+        endpoint_id = None
+
+        for s in service_list.services:
+            if s.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
+                endpoint_id = s.service_endpoint_ids[0]
+                break
+
+        return endpoint_id
+
+    def get_features_ids(self):
+        """
+        Gets the feature IDs used by the Centralized Attack Detector model.
+
+        This method gets the feature IDs used by the Centralized Attack Detector model by calling the GetFeaturesIds method of the Centralized Attack Detector gRPC stub.
+
+        Args:
+            None.
+
+        Returns:
+            list: A list of feature IDs.
+        """
+        
+        return self.cad.GetFeaturesIds(Empty()).auto_features
+
+    def check_types(self):
+        """
+        Checks the types of the features that will be sent to the Centralized Attack Detector.
+
+        This method checks the types of the Centralized Attack Detector features to ensure that they are of the correct type. If any of the types are incorrect, the method raises an AssertionError.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+    
+        for feature in self.cad_features["features"]:
+            assert isinstance(feature, float)
+
+        assert isinstance(self.cad_features["connection_metadata"]["ip_o"], str)
+        assert isinstance(self.cad_features["connection_metadata"]["port_o"], str)
+        assert isinstance(self.cad_features["connection_metadata"]["ip_d"], str)
+        assert isinstance(self.cad_features["connection_metadata"]["port_d"], str)
+        assert isinstance(self.cad_features["connection_metadata"]["flow_id"], str)
+        assert isinstance(self.cad_features["connection_metadata"]["protocol"], str)
+        assert isinstance(self.cad_features["connection_metadata"]["time_start"], float)
+        assert isinstance(self.cad_features["connection_metadata"]["time_end"], float)
+
+    def insert_connection(self):
+        """
+        Inserts a new connection into the `connections_dict` instance variable.
+
+        This method inserts a new connection into the `connections_dict` instance variable. The method uses the `conn_id` instance variable to create a new dictionary entry for the connection. If the connection already exists in the dictionary, the method updates the `time_end` value of the existing entry. If the connection doesn't exist in the dictionary, the method creates a new entry with the following keys:
+        - "ip_o": The source IP address of the connection.
+        - "port_o": The source port of the connection.
+        - "ip_d": The destination IP address of the connection.
+        - "port_d": The destination port of the connection.
+        - "flow_id": The flow ID of the connection.
+        - "service_id": The service ID of the connection.
+        - "endpoint_id": The endpoint ID of the connection.
+        - "protocol": The protocol of the connection.
+        - "time_start": The start time of the connection.
+        - "time_end": The end time of the connection.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+        
+        try:
+            self.connections_dict[self.conn_id]["time_end"] = time.time()
+        except KeyError:
+            self.connections_dict[self.conn_id] = JSON_BLANK.copy()
+            self.connections_dict[self.conn_id]["time_start"] = time.time()
+            self.connections_dict[self.conn_id]["time_end"] = time.time()
+            self.connections_dict[self.conn_id]["ip_o"] = self.conn_id[0]
+            self.connections_dict[self.conn_id]["port_o"] = self.conn_id[1]
+            self.connections_dict[self.conn_id]["flow_id"] = ":".join(self.conn_id)
+            self.connections_dict[self.conn_id]["service_id"] = self.get_service_id(CONTEXT_ID)
+            self.connections_dict[self.conn_id]["endpoint_id"] = self.get_endpoint_id(CONTEXT_ID)
+            self.connections_dict[self.conn_id]["protocol"] = "TCP"
+            self.connections_dict[self.conn_id]["ip_d"] = self.conn_id[2]
+            self.connections_dict[self.conn_id]["port_d"] = self.conn_id[3]
+
+    def check_if_connection_is_attack(self):
+        """
+        Checks if a connection is an attack based on known attack IP addresses.
+
+        This method checks if a connection is an attack based on known attack IP addresses. The method uses the `conn_id` and `known_attack_ips` instance variables to determine if the source or destination IP address of the connection is in the list of known attack IP addresses. If either IP address is in the list, the method logs a message indicating that an attack has been detected.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+    
+        if self.conn_id[0] in self.known_attack_ips or self.conn_id[2] in self.known_attack_ips:
+            LOGGER.info("Attack detected. Origin IP address: {0}, destination IP address: {1}".format(self.conn_id[0], self.conn_id[2]))
+
+    def create_cad_features(self):
+        """
+        Creates a dictionary of features and connection metadata for the Centralized Attack Detector.
+
+        This method creates a dictionary of features and connection metadata for the Centralized Attack Detector. The method uses the `new_connections` and `connections_dict` instance variables to obtain the necessary data. The resulting dictionary contains the following keys:
+        - "features": A list of the first 10 features of the connection.
+        - "connection_metadata": A dictionary containing the following keys:
+            - "ip_o": The source IP address of the connection.
+            - "port_o": The source port of the connection.
+            - "ip_d": The destination IP address of the connection.
+            - "port_d": The destination port of the connection.
+            - "flow_id": The flow ID of the connection.
+            - "service_id": The service ID of the connection.
+            - "endpoint_id": The endpoint ID of the connection.
+            - "protocol": The protocol of the connection.
+            - "time_start": The start time of the connection.
+            - "time_end": The end time of the connection.
+
+        Args:
+            None.
+
+        Returns:
+            None.
+        """
+        
+        self.cad_features = {
+            "features": self.new_connections[self.conn_id][0:10],
+            "connection_metadata": {
+                "ip_o": self.connections_dict[self.conn_id]["ip_o"],
+                "port_o": self.connections_dict[self.conn_id]["port_o"],
+                "ip_d": self.connections_dict[self.conn_id]["ip_d"],
+                "port_d": self.connections_dict[self.conn_id]["port_d"],
+                "flow_id": self.connections_dict[self.conn_id]["flow_id"],
+                "service_id": self.connections_dict[self.conn_id]["service_id"],
+                "endpoint_id": self.connections_dict[self.conn_id]["endpoint_id"],
+                "protocol": self.connections_dict[self.conn_id]["protocol"],
+                "time_start": self.connections_dict[self.conn_id]["time_start"],
+                "time_end": self.connections_dict[self.conn_id]["time_end"],
+            },
+        }
+
+    async def send_batch_async(self, metrics_list_pb):
+        """
+        Sends a batch of traffic data to a Centralized Attack Detector.
+
+        This method sends a batch of traffic data to a Centralized Attack Detector for analysis. The method creates a `L3CentralizedattackdetectorBatchInput` object from the provided `metrics_list_pb`, and sends the batch using an executor to run the `AnalyzeBatchConnectionStatistics` method in a separate thread. The method returns `None`.
+
+        Args:
+            metrics_list_pb (List[L3CentralizedattackdetectorMetrics]): A list of traffic metrics to send to the Centralized Attack Detector.
+
+        Returns:
+            None.
+        """
+        
+        loop = asyncio.get_running_loop()
+
+        # Create metrics batch
+        metrics_batch = L3CentralizedattackdetectorBatchInput()
+        metrics_batch.metrics.extend(metrics_list_pb)
+
+        # Send batch
+        future = loop.run_in_executor(None, self.cad.AnalyzeBatchConnectionStatistics, metrics_batch)
+
+        try:
+            await future
+        except Exception as e:
+            LOGGER.error(f"Error sending batch: {e}")
+
+    async def send_data(self, metrics_list_pb, send_data_times):
+        """
+        Sends traffic data to a Centralized Attack Detector.
+
+        This method sends traffic data to a Centralized Attack Detector for analysis. If the `SEND_DATA_IN_BATCHES` flag is set to `True`, the data is sent in batches of size `BATCH_SIZE`. Otherwise, the data is sent one metric at a time. The method returns the updated `metrics_list_pb` and `send_data_times` arrays.
+
+        Args:
+            metrics_list_pb (List[L3CentralizedattackdetectorMetrics]): A list of traffic metrics to send to the Centralized Attack Detector.
+            send_data_times (np.ndarray): An array of times it took to send each batch of data.
+
+        Returns:
+            Tuple[List[L3CentralizedattackdetectorMetrics], np.ndarray]: A tuple containing the updated `metrics_list_pb` and `send_data_times` arrays.
+        """
+        
+        if SEND_DATA_IN_BATCHES:
+            if len(metrics_list_pb) == BATCH_SIZE:
+                send_data_time_start = time.time()
+                await self.send_batch_async(metrics_list_pb)
+                metrics_list_pb = []
+
+                send_data_time_end = time.time()
+                send_data_time = send_data_time_end - send_data_time_start
+                send_data_times = np.append(send_data_times, send_data_time)
+
+        else:
+            send_data_time_start = time.time()
+            self.cad.AnalyzeConnectionStatistics(metrics_list_pb[-1])
+
+            send_data_time_end = time.time()
+            send_data_time = send_data_time_end - send_data_time_start
+            send_data_times = np.append(send_data_times, send_data_time)
+
+        return metrics_list_pb, send_data_times
+
+    async def process_traffic(self):
+        """ Processes traffic data from a Tstat log file.
+        This method reads traffic data from a Tstat log file, processes each line of data, and sends the resulting metrics to a Centralized Attack Detector. It runs indefinitely until the `STOP` flag is set to `True`.
+
+        Args:
+            None.
+        Returns:
+            None.
+        """
+        
+        LOGGER.info("Loading Tstat log file...")
+        logfile = open(self.load_file(), "r")
+
+        LOGGER.info("Following Tstat log file...")
+        loglines = self.follow(logfile, 5)
+
+        process_time = []
+        num_lines = 0
+
+        send_data_times = np.array([])
+        metrics_list_pb = []
+
+        LOGGER.info("Starting to process data...")
+
+        index = 0
+        while True:
+            line = next(loglines, None)
+
+            while line is None:
+                LOGGER.info("Waiting for new data...")
+
+                time.sleep(1 / 100)
+                line = next(loglines, None)
+
+            if index == 0 and IGNORE_FIRST_LINE_TSTAT:
+                index = index + 1
+                continue
+
+            if STOP:
+                break
+
+            num_lines += 1
+            start = time.time()
+            line_id = line.split(" ")
+
+            self.conn_id = (line_id[0], line_id[1], line_id[14], line_id[15])
+            self.new_connections[self.conn_id] = self.process_line(line)
+
+            self.check_if_connection_is_attack()
+            self.insert_connection()
+            self.create_cad_features()
+            self.check_types()
+
+            connection_metadata = ConnectionMetadata(**self.cad_features["connection_metadata"])
+            metrics = L3CentralizedattackdetectorMetrics()
+
+            for feature in self.cad_features["features"]:
+                feature_obj = Feature()
+                feature_obj.feature = feature
+                metrics.features.append(feature_obj)
+
+            metrics.connection_metadata.CopyFrom(connection_metadata)
+            metrics_list_pb.append(metrics)
+
+            metrics_list_pb, send_data_times = await self.send_data(metrics_list_pb, send_data_times)
+
+            index += 1
+
+            process_time.append(time.time() - start)
+
+            if num_lines % 10 == 0:
+                LOGGER.info(f"Number of lines: {num_lines} - Average processing time: {sum(process_time) / num_lines}")
diff --git a/src/l3_distributedattackdetector/service/tstat b/src/l3_distributedattackdetector/service/tstat
deleted file mode 100644
index 06c7fb082e12c8392b71d0ec2f7d74827d30e4a3..0000000000000000000000000000000000000000
Binary files a/src/l3_distributedattackdetector/service/tstat and /dev/null differ
diff --git a/src/load_generator/requirements.in b/src/load_generator/requirements.in
index 03a61d7a3fa8fa880d8877a33025401b95da9e25..44bd0ef1a321e9d08e253f01caca2d204d61fd6c 100644
--- a/src/load_generator/requirements.in
+++ b/src/load_generator/requirements.in
@@ -12,4 +12,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-APScheduler==3.8.1
+APScheduler==3.10.1
diff --git a/src/monitoring/requirements.in b/src/monitoring/requirements.in
index 981b4cdf291b6234d53de185ad83a1df2d1148a4..4e57dd0193485b3f7ed3ea346534fb1cb43c5538 100644
--- a/src/monitoring/requirements.in
+++ b/src/monitoring/requirements.in
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 anytree==2.8.0
-APScheduler==3.8.1
+APScheduler==3.10.1
 #fastcache==1.1.0
 #google-api-core
 #opencensus[stackdriver]
@@ -26,7 +26,7 @@ APScheduler==3.8.1
 influx-line-protocol==0.1.4
 python-dateutil==2.8.2
 python-json-logger==2.0.2
-pytz==2021.3
+#pytz==2021.3
 #redis==4.1.2
 requests==2.27.1
 xmltodict==0.12.0
diff --git a/src/monitoring/service/EventTools.py b/src/monitoring/service/EventTools.py
index 0d351eee968684f18571f0da9f094a806f577efd..468e0c58cc43d1c3ecf1232ebf2a9ed46a91e93b 100644
--- a/src/monitoring/service/EventTools.py
+++ b/src/monitoring/service/EventTools.py
@@ -12,12 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import grpc, json, logging, queue, threading
 from typing import Dict
-import grpc, logging, queue, threading
 from common.method_wrappers.ServiceExceptions import ServiceException
 from common.proto import monitoring_pb2
-from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty, EventTypeEnum
+from common.proto.context_pb2 import ConfigActionEnum, DeviceOperationalStatusEnum, Empty, EventTypeEnum
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.tools.grpc.Tools import grpc_message_to_json_string
 from context.client.ContextClient import ContextClient
 from monitoring.client.MonitoringClient import MonitoringClient
 from monitoring.service.MonitoringServiceServicerImpl import LOGGER
@@ -43,7 +44,8 @@ class EventsDeviceCollector:
 
         self._device_thread   = threading.Thread(target=self._collect, args=(self._device_stream,), daemon=False)
 
-        self._device_to_state : Dict[str, DeviceOperationalStatusEnum] = dict()
+        #self._device_to_state : Dict[str, DeviceOperationalStatusEnum] = dict()
+        self._device_endpoint_monitored : Dict[str, Dict[str, bool]] = dict()
         self._name_mapping = name_mapping
 
     def grpc_server_on(self):
@@ -79,50 +81,75 @@ class EventsDeviceCollector:
             kpi_id_list = []
 
             while True:
-                # LOGGER.info('getting Kpi by KpiID')
                 try:
                     event = self.get_event(block=True, timeout=0.5)
 
                     event_type = event.event.event_type
                     device_uuid = event.device_id.device_uuid.uuid
                     if event_type in {EventTypeEnum.EVENTTYPE_REMOVE}:
-                        self._device_to_state.pop(device_uuid, None)
+                        LOGGER.debug('Ignoring REMOVE event: {:s}'.format(grpc_message_to_json_string(event)))
+                        self._device_endpoint_monitored.pop(device_uuid, None)
                         continue
 
                     if event_type not in {EventTypeEnum.EVENTTYPE_CREATE, EventTypeEnum.EVENTTYPE_UPDATE}:
-                        # Unknown event type
+                        LOGGER.debug('Ignoring UNKNOWN event type: {:s}'.format(grpc_message_to_json_string(event)))
                         continue
 
                     device = self._context_client.GetDevice(event.device_id)
                     self._name_mapping.set_device_name(device_uuid, device.name)
 
-                    old_operational_status = self._device_to_state.get(device_uuid, DEVICE_OP_STATUS_UNDEFINED)
-                    device_was_not_enabled = (old_operational_status in DEVICE_OP_STATUS_NOT_ENABLED)
-
-                    new_operational_status = device.device_operational_status
-                    device_is_enabled = (new_operational_status == DEVICE_OP_STATUS_ENABLED)
-                    self._device_to_state[device_uuid] = new_operational_status
-
-                    activate_monitoring = device_was_not_enabled and device_is_enabled
-                    if not activate_monitoring:
-                        # device is not ready for monitoring
+                    device_op_status = device.device_operational_status
+                    if device_op_status != DEVICE_OP_STATUS_ENABLED:
+                        LOGGER.debug('Ignoring Device not enabled: {:s}'.format(grpc_message_to_json_string(device)))
                         continue
 
+                    enabled_endpoint_names = set()
+                    for config_rule in device.device_config.config_rules:
+                        if config_rule.action != ConfigActionEnum.CONFIGACTION_SET: continue
+                        if config_rule.WhichOneof('config_rule') != 'custom': continue
+                        str_resource_key = str(config_rule.custom.resource_key)
+                        if not str_resource_key.startswith('/interface['): continue
+                        json_resource_value = json.loads(config_rule.custom.resource_value)
+                        if 'name' not in json_resource_value: continue
+                        if 'enabled' not in json_resource_value: continue
+                        if not json_resource_value['enabled']: continue
+                        enabled_endpoint_names.add(json_resource_value['name'])
+
+                    endpoints_monitored = self._device_endpoint_monitored.setdefault(device_uuid, dict())
                     for endpoint in device.device_endpoints:
                         endpoint_uuid = endpoint.endpoint_id.endpoint_uuid.uuid
-                        self._name_mapping.set_endpoint_name(endpoint_uuid, endpoint.name)
+                        endpoint_name_or_uuid = endpoint.name
+                        if endpoint_name_or_uuid is None or len(endpoint_name_or_uuid) == 0:
+                            endpoint_name_or_uuid = endpoint_uuid
 
-                        for value in endpoint.kpi_sample_types:
-                            if value == KPISAMPLETYPE_UNKNOWN: continue
+                        self._name_mapping.set_endpoint_name(endpoint_uuid, endpoint.name)
 
-                            kpi_descriptor = monitoring_pb2.KpiDescriptor()
-                            kpi_descriptor.kpi_description = device.device_type
-                            kpi_descriptor.kpi_sample_type = value
-                            kpi_descriptor.device_id.CopyFrom(device.device_id)         # pylint: disable=no-member
-                            kpi_descriptor.endpoint_id.CopyFrom(endpoint.endpoint_id)   # pylint: disable=no-member
+                        endpoint_was_monitored = endpoints_monitored.get(endpoint_uuid, False)
+                        endpoint_is_enabled = (endpoint_name_or_uuid in enabled_endpoint_names)
+
+                        if not endpoint_was_monitored and endpoint_is_enabled:
+                            # activate
+                            for value in endpoint.kpi_sample_types:
+                                if value == KPISAMPLETYPE_UNKNOWN: continue
+
+                                kpi_descriptor = monitoring_pb2.KpiDescriptor()
+                                kpi_descriptor.kpi_description = device.device_type
+                                kpi_descriptor.kpi_sample_type = value
+                                kpi_descriptor.device_id.CopyFrom(device.device_id)         # pylint: disable=no-member
+                                kpi_descriptor.endpoint_id.CopyFrom(endpoint.endpoint_id)   # pylint: disable=no-member
+
+                                kpi_id = self._monitoring_client.SetKpi(kpi_descriptor)
+                                kpi_id_list.append(kpi_id)
+                            endpoints_monitored[endpoint_uuid] = True
+                        else:
+                            MSG = 'Not implemented condition: event={:s} device={:s} endpoint={:s}' + \
+                                  ' endpoint_was_monitored={:s} endpoint_is_enabled={:s}'
+                            LOGGER.warning(MSG.format(
+                                grpc_message_to_json_string(event), grpc_message_to_json_string(device),
+                                grpc_message_to_json_string(endpoint), str(endpoint_was_monitored),
+                                str(endpoint_is_enabled)
+                            ))
 
-                            kpi_id = self._monitoring_client.SetKpi(kpi_descriptor)
-                            kpi_id_list.append(kpi_id)
                 except queue.Empty:
                     break
 
diff --git a/src/monitoring/service/ManagementDBTools.py b/src/monitoring/service/ManagementDBTools.py
index a2beddccd633a1961238a6affa4b8d069c26762e..6c0a69e0ec6ec22a9fff24a1de073f2df03e2115 100644
--- a/src/monitoring/service/ManagementDBTools.py
+++ b/src/monitoring/service/ManagementDBTools.py
@@ -261,10 +261,10 @@ class ManagementDB():
             else:
                 if data[0] == 1:
                     return True
-                elif data[0] == 0:
+                elif data[0] == 0 or data[0] is None:
                     return False
                 else:
-                    LOGGER.debug(f"KPI {kpi_id} is wrong")
+                    LOGGER.debug(f"KPI {kpi_id} is wrong: {str(data)}")
                     return None
         except sqlite3.Error as e:
             LOGGER.debug(f"KPI {kpi_id} cannot be checked from the ManagementDB: {e}")
diff --git a/src/monitoring/service/__main__.py b/src/monitoring/service/__main__.py
index d0a132c70bed2c56bc9159ec3ad284120c0eb623..d242f0fc0add7afebed32178bfafde23552a7649 100644
--- a/src/monitoring/service/__main__.py
+++ b/src/monitoring/service/__main__.py
@@ -49,7 +49,7 @@ def start_monitoring(name_mapping : NameMapping):
                 monitor_kpi_request = monitoring_pb2.MonitorKpiRequest()
                 monitor_kpi_request.kpi_id.CopyFrom(kpi_id)
                 monitor_kpi_request.monitoring_window_s = 86400
-                monitor_kpi_request.sampling_rate_s = 30
+                monitor_kpi_request.sampling_rate_s = 10
                 events_collector._monitoring_client.MonitorKpi(monitor_kpi_request)
         
         time.sleep(0.5) # let other tasks run; do not overload CPU
diff --git a/src/monitoring/tests/Objects.py b/src/monitoring/tests/Objects.py
index 447ed0d601bd7079e55dc30e5cab66d25eb1fd88..c5228981bd0c0a5c9104c286f7daa8fb38baf47b 100644
--- a/src/monitoring/tests/Objects.py
+++ b/src/monitoring/tests/Objects.py
@@ -15,6 +15,7 @@
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled)
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 
 PACKET_PORT_SAMPLE_TYPES = [
     KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED,
@@ -25,6 +26,8 @@ PACKET_PORT_SAMPLE_TYPES = [
 
 DEVICE_DEV1_UUID          = 'DEV1'
 ENDPOINT_END1_UUID        = 'END1'
-DEVICE_DEV1_ENDPOINT_DEFS = [(ENDPOINT_END1_UUID, 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_DEV1_ENDPOINT_DEFS = [
+    json_endpoint_descriptor(ENDPOINT_END1_UUID, 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)
+]
 DEVICE_DEV1               = json_device_emulated_packet_router_disabled(DEVICE_DEV1_UUID)
 DEVICE_DEV1_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_DEV1_ENDPOINT_DEFS)
diff --git a/src/monitoring/tests/test_unitary.py b/src/monitoring/tests/test_unitary.py
index 4e84431a5438e1536c92ca644bd5005deba545a4..ff19e231e1e6dfee78d5bc1ae71f170990d11609 100644
--- a/src/monitoring/tests/test_unitary.py
+++ b/src/monitoring/tests/test_unitary.py
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 import copy, os, pytest #, threading, time
-import logging
+import logging, json
 #from queue import Queue
 from random import random
 from time import sleep
@@ -25,12 +25,13 @@ from grpc._channel import _MultiThreadedRendezvous
 from common.Constants import ServiceNameEnum
 from common.Settings import (
     ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc)
-from common.proto.context_pb2 import DeviceOperationalStatusEnum, EventTypeEnum, DeviceEvent, Device, Empty
+from common.proto.context_pb2 import ConfigActionEnum, DeviceOperationalStatusEnum, EventTypeEnum, DeviceEvent, Device, Empty
 from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
 from common.proto.monitoring_pb2 import KpiId, KpiDescriptor, SubsDescriptor, SubsList, AlarmID, \
     AlarmDescriptor, AlarmList, KpiDescriptorList, SubsResponse, AlarmResponse, RawKpiTable #, Kpi, KpiList
 from common.tests.MockServicerImpl_Context import MockServicerImpl_Context
+from common.tools.object_factory.ConfigRule import json_config_rule_set
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from common.tools.timestamp.Converters import timestamp_utcnow_to_float #, timestamp_string_to_float
 from context.client.ContextClient import ContextClient
@@ -48,7 +49,7 @@ from monitoring.service.NameMapping import NameMapping
 #from monitoring.service.SubscriptionManager import SubscriptionManager
 from monitoring.tests.Messages import create_kpi_request, create_kpi_request_d, include_kpi_request, monitor_kpi_request, \
     create_kpi_request_c, kpi_query, subs_descriptor, alarm_descriptor, alarm_subscription #, create_kpi_request_b
-from monitoring.tests.Objects import DEVICE_DEV1, DEVICE_DEV1_CONNECT_RULES, DEVICE_DEV1_UUID
+from monitoring.tests.Objects import DEVICE_DEV1, DEVICE_DEV1_CONNECT_RULES, DEVICE_DEV1_UUID, ENDPOINT_END1_UUID
 
 os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE'
 from device.service.drivers import DRIVERS  # pylint: disable=wrong-import-position,ungrouped-imports
@@ -605,11 +606,14 @@ def test_listen_events(
     assert response.device_uuid.uuid == DEVICE_DEV1_UUID
 
     LOGGER.info('Activating Device {:s}'.format(DEVICE_DEV1_UUID))
-
     device = context_client.GetDevice(response)
     device_with_op_state = Device()
     device_with_op_state.CopyFrom(device)
     device_with_op_state.device_operational_status = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
+    config_rule = device_with_op_state.device_config.config_rules.add()
+    config_rule.action = ConfigActionEnum.CONFIGACTION_SET
+    config_rule.custom.resource_key = '/interface[{:s}]'.format(ENDPOINT_END1_UUID)
+    config_rule.custom.resource_value = json.dumps({'name': ENDPOINT_END1_UUID, 'enabled': True})
     response = context_client.SetDevice(device_with_op_state)
     assert response.device_uuid.uuid == DEVICE_DEV1_UUID
 
diff --git a/src/opticalattackdetector/.gitlab-ci.yml b/src/opticalattackdetector/.gitlab-ci.yml
index b06725852a573a41b0cf97dd0bdfa527847fe6fc..2a89b5c54f49434d9703f833e2c72486c2394f9f 100644
--- a/src/opticalattackdetector/.gitlab-ci.yml
+++ b/src/opticalattackdetector/.gitlab-ci.yml
@@ -49,9 +49,26 @@ unit_test opticalattackdetector:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
     - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi
     - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME image is not in the system"; fi
+    - if docker container ls | grep redis; then docker rm -f redis; else echo "redis image is not in the system"; fi
+    - if docker container ls | grep dbscanserving; then docker rm -f dbscanserving; else echo "dbscanserving image is not in the system"; fi
   script:
+    - export REDIS_PASSWORD=$(uuidgen)
+    - docker pull "redis:7.0-alpine"
+    - docker run --name redis -d --network=teraflowbridge -p 16379:6379 -e REDIS_PASSWORD=${REDIS_PASSWORD} --rm redis:7.0-alpine redis-server --requirepass ${REDIS_PASSWORD}
+    - docker logs redis
+    - REDIS_ADDRESS=$(docker inspect redis --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
+    - docker pull "$CI_REGISTRY_IMAGE/dbscanserving:$IMAGE_TAG"
+    - docker run --name dbscanserving -d -p 10008:10008 --network=teraflowbridge --rm $CI_REGISTRY_IMAGE/dbscanserving:$IMAGE_TAG "python -m dbscanserving.service"
+    - docker logs dbscanserving
+    - DBSCANSERVING_ADDRESS=$(docker inspect dbscanserving --format "{{.NetworkSettings.Networks.teraflowbridge.IPAddress}}")
     - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
-    - docker run --name $IMAGE_NAME -d -p 10006:10006 --env-file "$PWD/src/$IMAGE_NAME/.env" -v "$PWD/src/$IMAGE_NAME/tests:/home/${IMAGE_NAME}/results" --network=teraflowbridge --rm $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
+    - >
+      docker run --name $IMAGE_NAME -d -p 10006:10006 
+      -v "$PWD/src/$IMAGE_NAME/tests:/home/${IMAGE_NAME}/results" 
+      -e REDIS_PASSWORD=${REDIS_PASSWORD}
+      -e DBSCANSERVINGSERVICE_SERVICE_HOST=${DBSCANSERVING_ADDRESS}
+      -e CACHINGSERVICE_SERVICE_HOST=${REDIS_ADDRESS}
+      --network=teraflowbridge --rm $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
     - sleep 5
     - docker ps -a
     - docker logs $IMAGE_NAME
@@ -59,6 +76,8 @@ unit_test opticalattackdetector:
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
     - docker rm -f $IMAGE_NAME
+    - docker rm -f redis
+    - docker rm -f dbscanserving
     - docker network rm teraflowbridge
   rules:
     - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
diff --git a/src/opticalattackdetector/tests/test_unitary.py b/src/opticalattackdetector/tests/test_unitary.py
index 72e3a4ac124bd034a76461baee316ab0f1139ed9..6c7579238a157a0f00e9eb0c9df53a04c1774ff6 100644
--- a/src/opticalattackdetector/tests/test_unitary.py
+++ b/src/opticalattackdetector/tests/test_unitary.py
@@ -13,88 +13,69 @@
 # limitations under the License.
 
 import logging
-import os
+import uuid
+import queue
 from unittest.mock import patch
 
 import pytest
-from common.Constants import (DEFAULT_GRPC_GRACE_PERIOD,
-                              DEFAULT_GRPC_MAX_WORKERS)
+
 from common.proto import dbscanserving_pb2 as dbscan
 from common.proto.optical_attack_detector_pb2 import DetectionRequest
+from common.tests.MockServicerImpl_Monitoring import MockServicerImpl_Monitoring
 
 from opticalattackdetector.client.OpticalAttackDetectorClient import \
     OpticalAttackDetectorClient
-from opticalattackdetector.Config import GRPC_SERVICE_PORT
 from opticalattackdetector.service.OpticalAttackDetectorService import \
     OpticalAttackDetectorService
 
 # from .example_objects import CONTEXT_ID, CONTEXT_ID_2, SERVICE_DEV1_DEV2
 
-port = 10000 + GRPC_SERVICE_PORT  # avoid privileged ports
-
 LOGGER = logging.getLogger(__name__)
-LOGGER.setLevel(logging.DEBUG)
 
 
 @pytest.fixture(scope="session")
 def optical_attack_detector_service():
-    with patch.dict(
-        os.environ,
-        {
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_PORT_GRPC": str(port),
-            "DBSCANSERVINGSERVICE_SERVICE_HOST": "127.0.0.1",
-            "DBSCANSERVINGSERVICE_SERVICE_PORT_GRPC": str(port),
-        },
-        clear=True,
-    ):
-        _service = OpticalAttackDetectorService(
-            port=port,
-            max_workers=DEFAULT_GRPC_MAX_WORKERS,
-            grace_period=DEFAULT_GRPC_GRACE_PERIOD,
-        )
-        _service.start()
-        yield _service
-        _service.stop()
+    _service = OpticalAttackDetectorService()
+    _service.start()
+    yield _service
+    _service.stop()
 
 
 @pytest.fixture(scope="session")
-def optical_attack_detector_client(optical_attack_detector_service):
-    with patch.dict(
-        os.environ,
-        {
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_PORT_GRPC": str(port),
-            "DBSCANSERVINGSERVICE_SERVICE_HOST": "127.0.0.1",
-            "DBSCANSERVINGSERVICE_SERVICE_PORT_GRPC": str(port),
-        },
-        clear=True,
-    ):
-        _client = OpticalAttackDetectorClient()
-        yield _client
+def optical_attack_detector_client(optical_attack_detector_service: OpticalAttackDetectorService):
+    _client = OpticalAttackDetectorClient(
+        host=optical_attack_detector_service.bind_address,
+        port=optical_attack_detector_service.bind_port,
+    )
+    yield _client
     _client.close()
 
 
 def test_detect_attack(
+    optical_attack_detector_service: OpticalAttackDetectorService,
     optical_attack_detector_client: OpticalAttackDetectorClient,
 ):
     message = dbscan.DetectionResponse()
     message.cluster_indices.extend([0, 1, -1, -1, -1])
+
+    monitoring_mock = MockServicerImpl_Monitoring(queue_samples = queue.Queue())
     with patch(
         "opticalattackdetector.service.OpticalAttackDetectorServiceServicerImpl.attack_mitigator_client"
     ) as mitigator, patch(
-        "opticalattackdetector.service.OpticalAttackDetectorServiceServicerImpl.monitoring_client"
+        "opticalattackdetector.service.OpticalAttackDetectorServiceServicerImpl.monitoring_client",
+        monitoring_mock,
     ) as monitoring, patch(
         "opticalattackdetector.service.OpticalAttackDetectorServiceServicerImpl.dbscanserving_client.Detect",
         # TODO: return dumb object with "cluster_indices" attribute
         # idea: create new response object
         return_value=message,
     ) as dbscanserving:
-        request: DetectionRequest = DetectionRequest()
-        request.service_id.context_id.context_uuid.uuid = ""
-        request.service_id.service_uuid.uuid = str("")
-        request.kpi_id.kpi_id.uuid = ""
-        optical_attack_detector_client.DetectAttack(request)
-        mitigator.NotifyAttack.assert_called_once()
-        monitoring.IncludeKpi.assert_called_once()
-        dbscanserving.assert_called_once()
+        for _ in range(10):
+            request: DetectionRequest = DetectionRequest()
+            request.service_id.context_id.context_uuid.uuid = str(uuid.uuid4())
+            request.service_id.service_uuid.uuid = str(uuid.uuid4())
+            request.kpi_id.kpi_id.uuid = "1"
+            optical_attack_detector_client.DetectAttack(request)
+            dbscanserving.assert_called_once()
+            monitoring.IncludeKpi.assert_called_once()
+        mitigator.NotifyAttack.assert_called()
diff --git a/src/opticalattackmanager/.gitlab-ci.yml b/src/opticalattackmanager/.gitlab-ci.yml
index 08136e4900d184d4923d9690322b76f7f2ef9fcc..1fe77d3159ba5d5f2d0bd99f23c4692e1f509d20 100644
--- a/src/opticalattackmanager/.gitlab-ci.yml
+++ b/src/opticalattackmanager/.gitlab-ci.yml
@@ -52,11 +52,11 @@ unit_test opticalattackmanager:
     - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME image is not in the system"; fi
   script:
     - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
-    - docker run --name $IMAGE_NAME -d -p 10005:10005 -v "$PWD/src/$IMAGE_NAME/tests:/home/teraflow/$IMAGE_NAME/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
+    - docker run --name $IMAGE_NAME -d -p 10005:10005 -e LOG_LEVEL=DEBUG -v "$PWD/src/$IMAGE_NAME/tests:/home/teraflow/controller/$IMAGE_NAME/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
     - docker ps -a
     - docker logs $IMAGE_NAME
-    - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=INFO --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/home/teraflow/$IMAGE_NAME/results/${IMAGE_NAME}_report.xml"
-    - docker exec -i $IMAGE_NAME bash -c "coverage report --include='${IMAGE_NAME}/*' --show-missing"
+    - docker exec -i $IMAGE_NAME bash -c "coverage run -m pytest --log-level=DEBUG --verbose $IMAGE_NAME/tests/test_unitary.py --junitxml=/home/teraflow/controller/$IMAGE_NAME/results/${IMAGE_NAME}_report.xml; coverage report --include='${IMAGE_NAME}/*' --show-missing"
+    - ls -la src/$IMAGE_NAME/tests
   coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
   after_script:
     - docker rm -f $IMAGE_NAME
@@ -74,9 +74,9 @@ unit_test opticalattackmanager:
       - manifests/${IMAGE_NAME}service.yaml
       - .gitlab-ci.yml
   artifacts:
-      when: always
-      reports:
-        junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
+    when: always
+    reports:
+      junit: src/$IMAGE_NAME/tests/${IMAGE_NAME}_report.xml
 
 # Deployment of the service in Kubernetes Cluster
 # deploy opticalattackmanager:
diff --git a/src/opticalattackmanager/tests/test_unitary.py b/src/opticalattackmanager/tests/test_unitary.py
index 5d29079d7c2c2bfbe1313c974c528e5211317e8f..0f50b333326a687f1c18e03ae6854561bb5501aa 100644
--- a/src/opticalattackmanager/tests/test_unitary.py
+++ b/src/opticalattackmanager/tests/test_unitary.py
@@ -13,108 +13,27 @@
 # limitations under the License.
 
 import logging
-import os
-from unittest.mock import patch
+import uuid
 
-import pytest
+from opticalattackmanager.utils.monitor import delegate_services
 
-from common.Constants import (DEFAULT_GRPC_GRACE_PERIOD,
-                              DEFAULT_GRPC_MAX_WORKERS,
-                              DEFAULT_SERVICE_GRPC_PORTS, ServiceNameEnum)
-from common.proto import dbscanserving_pb2 as dbscan
-from common.proto.optical_attack_detector_pb2 import DetectionRequest
-from opticalattackdetector.client.OpticalAttackDetectorClient import \
-    OpticalAttackDetectorClient
-from opticalattackdetector.Config import GRPC_SERVICE_PORT
-from opticalattackdetector.service.OpticalAttackDetectorService import \
-    OpticalAttackDetectorService
-
-# from .example_objects import CONTEXT_ID, CONTEXT_ID_2, SERVICE_DEV1_DEV2
-
-port = 10000 + GRPC_SERVICE_PORT  # avoid privileged ports
 
 LOGGER = logging.getLogger(__name__)
-LOGGER.setLevel(logging.DEBUG)
 
 
-@pytest.fixture(scope="session")
-def optical_attack_detector_service():
-    with patch.dict(
-        os.environ,
+def test_delegate_services():
+    service_list = [
         {
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_PORT_GRPC": str(
-                1000
-                + DEFAULT_SERVICE_GRPC_PORTS.get(
-                    ServiceNameEnum.OPTICALATTACKDETECTOR.value
-                )
-            ),
-            "OPTICALATTACKMITIGATORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKMITIGATORSERVICE_SERVICE_PORT_GRPC": str(
-                1000
-                + DEFAULT_SERVICE_GRPC_PORTS.get(
-                    ServiceNameEnum.OPTICALATTACKMITIGATOR.value
-                )
-            ),
-            "DBSCANSERVINGSERVICE_SERVICE_HOST": "127.0.0.1",
-            "DBSCANSERVINGSERVICE_SERVICE_PORT_GRPC": str(
-                1000
-                + DEFAULT_SERVICE_GRPC_PORTS.get(ServiceNameEnum.DBSCANSERVING.value)
-            ),
-        },
-        clear=True,
-    ):
-        _service = OpticalAttackDetectorService(
-            port=port,
-            max_workers=DEFAULT_GRPC_MAX_WORKERS,
-            grace_period=DEFAULT_GRPC_GRACE_PERIOD,
-        )
-        # mocker_context_client = mock.patch('opticalattackdetector.service.OpticalAttackDetectorServiceServicerImpl.context_client')
-        # mocker_context_client.start()
-
-        # mocker_influx_db = mock.patch('opticalattackdetector.service.OpticalAttackDetectorServiceServicerImpl.influxdb_client')
-        # mocker_influx_db.start()
-
-        _service.start()
-        yield _service
-        _service.stop()
-        # mocker_context_client.stop()
-        # mocker_influx_db.stop()
-
-
-@pytest.fixture(scope="session")
-def optical_attack_detector_client(optical_attack_detector_service):
-    with patch.dict(
-        os.environ,
-        {
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKDETECTORSERVICE_SERVICE_PORT_GRPC": str(
-                1000
-                + DEFAULT_SERVICE_GRPC_PORTS.get(
-                    ServiceNameEnum.OPTICALATTACKDETECTOR.value
-                )
-            ),
-            "OPTICALATTACKMITIGATORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKMITIGATORSERVICE_SERVICE_PORT_GRPC": str(
-                1000
-                + DEFAULT_SERVICE_GRPC_PORTS.get(
-                    ServiceNameEnum.OPTICALATTACKMITIGATOR.value
-                )
-            ),
-            "DBSCANSERVINGSERVICE_SERVICE_HOST": "127.0.0.1",
-            "DBSCANSERVINGSERVICE_SERVICE_PORT_GRPC": str(
-                1000
-                + DEFAULT_SERVICE_GRPC_PORTS.get(ServiceNameEnum.DBSCANSERVING.value)
-            ),
-        },
-        clear=True,
-    ):
-        _client = OpticalAttackDetectorClient()
-        yield _client
-    _client.close()
-
-
-def test_detect_attack(
-    optical_attack_detector_client: OpticalAttackDetectorClient,
-):
-    LOGGER.info("placeholder")
+            "context": uuid.uuid4(),
+            "service": uuid.uuid4(),
+            "kpi": 10,
+        }
+        for _ in range(10)]
+    delegate_services(
+        service_list=service_list,
+        start_index=0,
+        end_index=9,
+        host="127.0.0.1",
+        port="10006",
+        monitoring_interval=10,
+    )
diff --git a/src/opticalattackmanager/utils/monitor.py b/src/opticalattackmanager/utils/monitor.py
index c34ac217c0d29b086101e7fafc7d6cefef1fa114..9889c0caf61129c30bc3f1681dceda1e1a4adfad 100644
--- a/src/opticalattackmanager/utils/monitor.py
+++ b/src/opticalattackmanager/utils/monitor.py
@@ -17,7 +17,6 @@ import logging
 import traceback
 
 from grpclib.client import Channel
-from prometheus_client import Counter
 
 from common.proto.asyncio.optical_attack_detector_grpc import \
     OpticalAttackDetectorServiceStub
diff --git a/src/opticalattackmitigator/.gitlab-ci.yml b/src/opticalattackmitigator/.gitlab-ci.yml
index 44f13aa20f0a19e24e3188bd0c2315f581b2e006..30eb94b1b5a765eb3dbfac3e544b9bd94a6e415b 100644
--- a/src/opticalattackmitigator/.gitlab-ci.yml
+++ b/src/opticalattackmitigator/.gitlab-ci.yml
@@ -33,7 +33,6 @@ build opticalattackmitigator:
       - src/$IMAGE_NAME/**/*.{py,in,yml}
       - src/$IMAGE_NAME/Dockerfile
       - src/$IMAGE_NAME/tests/*.py
-      - src/$IMAGE_NAME/tests/Dockerfile
       - manifests/${IMAGE_NAME}service.yaml
       - .gitlab-ci.yml
 
@@ -48,7 +47,7 @@ unit_test opticalattackmitigator:
   before_script:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
     - if docker network list | grep teraflowbridge; then echo "teraflowbridge is already created"; else docker network create -d bridge teraflowbridge; fi
-    - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME image is not in the system"; fi
+    - if docker container ls | grep $IMAGE_NAME; then docker rm -f $IMAGE_NAME; else echo "$IMAGE_NAME container is not in the system"; fi
   script:
     - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
     - docker run --name $IMAGE_NAME -d -p 10007:10007 -v "$PWD/src/$IMAGE_NAME/tests:/home/${IMAGE_NAME}/results" --network=teraflowbridge --rm $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
@@ -66,8 +65,7 @@ unit_test opticalattackmitigator:
       - src/$IMAGE_NAME/**/*.{py,in,yml}
       - src/$IMAGE_NAME/Dockerfile
       - src/$IMAGE_NAME/tests/*.py
-      - src/$IMAGE_NAME/tests/Dockerfile
-      - manifests/$IMAGE_NAMEservice.yaml
+      - manifests/${IMAGE_NAME}service.yaml
       - .gitlab-ci.yml
   artifacts:
     when: always
diff --git a/src/opticalattackmitigator/tests/test_unitary.py b/src/opticalattackmitigator/tests/test_unitary.py
index 68836c4e81dd8e88b34cf85c9e2a29fd9f5e5678..76b31c3a853e64f87b30d9e2d27b9c98d44642b6 100644
--- a/src/opticalattackmitigator/tests/test_unitary.py
+++ b/src/opticalattackmitigator/tests/test_unitary.py
@@ -17,29 +17,20 @@ import os
 from unittest.mock import patch
 
 import pytest
-from common.Constants import (DEFAULT_GRPC_GRACE_PERIOD,
-                              DEFAULT_GRPC_MAX_WORKERS)
 from common.proto.optical_attack_mitigator_pb2 import AttackDescription
 
 from opticalattackmitigator.client.OpticalAttackMitigatorClient import \
     OpticalAttackMitigatorClient
-from opticalattackmitigator.Config import GRPC_SERVICE_PORT
 from opticalattackmitigator.service.OpticalAttackMitigatorService import \
     OpticalAttackMitigatorService
 
-port = 10000 + GRPC_SERVICE_PORT  # avoid privileged ports
-
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
 
 
 @pytest.fixture(scope="session")
 def optical_attack_mitigator_service():
-    _service = OpticalAttackMitigatorService(
-        port=port,
-        max_workers=DEFAULT_GRPC_MAX_WORKERS,
-        grace_period=DEFAULT_GRPC_GRACE_PERIOD,
-    )
+    _service = OpticalAttackMitigatorService()
     _service.start()
     yield _service
     _service.stop()
@@ -51,7 +42,7 @@ def optical_attack_mitigator_client(optical_attack_mitigator_service):
         os.environ,
         {
             "OPTICALATTACKMITIGATORSERVICE_SERVICE_HOST": "127.0.0.1",
-            "OPTICALATTACKMITIGATORSERVICE_SERVICE_PORT_GRPC": str(port),
+            "OPTICALATTACKMITIGATORSERVICE_SERVICE_PORT_GRPC": str(optical_attack_mitigator_service.bind_port),
         },
         clear=True,
     ):
diff --git a/src/pathcomp/frontend/service/PathCompServiceServicerImpl.py b/src/pathcomp/frontend/service/PathCompServiceServicerImpl.py
index 52f1cd3d584e14ca5dee1bc5e0511e014bdc8e73..784a09e32c2dbb6f6cfcbbbe51048e49ad9a7005 100644
--- a/src/pathcomp/frontend/service/PathCompServiceServicerImpl.py
+++ b/src/pathcomp/frontend/service/PathCompServiceServicerImpl.py
@@ -46,16 +46,18 @@ class PathCompServiceServicerImpl(PathCompServiceServicer):
         context_client = ContextClient()
 
         context_id = json_context_id(DEFAULT_CONTEXT_NAME)
-        if (len(request.services) == 1) and is_inter_domain(context_client, request.services[0].service_endpoint_ids):
-            #devices = get_devices_in_topology(context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME)
-            #links = get_links_in_topology(context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME)
-            topology_id = json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id)
-        else:
-            # TODO: improve filtering of devices and links
-            # TODO: add contexts, topologies, and membership of devices/links in topologies
-            #devices = context_client.ListDevices(Empty())
-            #links = context_client.ListLinks(Empty())
-            topology_id = json_topology_id(DEFAULT_TOPOLOGY_NAME, context_id)
+        # TODO: improve definition of topologies; for interdomain the current topology design might be not convenient
+        #if (len(request.services) == 1) and is_inter_domain(context_client, request.services[0].service_endpoint_ids):
+        #    #devices = get_devices_in_topology(context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME)
+        #    #links = get_links_in_topology(context_client, ADMIN_CONTEXT_ID, INTERDOMAIN_TOPOLOGY_NAME)
+        #    topology_id = json_topology_id(INTERDOMAIN_TOPOLOGY_NAME, context_id)
+        #else:
+        #    # TODO: improve filtering of devices and links
+        #    # TODO: add contexts, topologies, and membership of devices/links in topologies
+        #    #devices = context_client.ListDevices(Empty())
+        #    #links = context_client.ListLinks(Empty())
+        #    topology_id = json_topology_id(DEFAULT_TOPOLOGY_NAME, context_id)
+        topology_id = json_topology_id(DEFAULT_TOPOLOGY_NAME, context_id)
 
         topology_details = context_client.GetTopologyDetails(TopologyId(**topology_id))
 
diff --git a/src/pathcomp/frontend/service/algorithms/_Algorithm.py b/src/pathcomp/frontend/service/algorithms/_Algorithm.py
index 0eb01c1341421e379850f89d5671d9156c8a9fd6..0a1b62040a81ee964d373132763e964381cbc19e 100644
--- a/src/pathcomp/frontend/service/algorithms/_Algorithm.py
+++ b/src/pathcomp/frontend/service/algorithms/_Algorithm.py
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import json, logging, requests
+import json, logging, requests, uuid
 from typing import Dict, List, Optional, Tuple, Union
 from common.proto.context_pb2 import (
     Connection, Device, DeviceList, EndPointId, Link, LinkList, Service, ServiceStatusEnum, ServiceTypeEnum)
@@ -210,7 +210,7 @@ class _Algorithm:
         response_list = self.json_reply.get('response-list', [])
         reply = PathCompReply()
         grpc_services : Dict[Tuple[str, str], Service] = {}
-        grpc_connections : Dict[str, Connection] = {}
+        #grpc_connections : Dict[str, Connection] = {}
         for response in response_list:
             orig_service_id = response['serviceId']
             context_uuid = orig_service_id['contextId']
@@ -251,23 +251,23 @@ class _Algorithm:
                     self.logger.debug('BASIC connections = {:s}'.format(str(connections)))
 
                 for connection in connections:
-                    connection_uuid,service_type,path_hops,_ = connection
-                    service_key = (context_uuid, connection_uuid)
+                    service_uuid,service_type,path_hops,_ = connection
+                    service_key = (context_uuid, service_uuid)
                     if service_key in grpc_services: continue
                     grpc_service = self.add_service_to_reply(
-                        reply, context_uuid, connection_uuid, service_type, path_hops=path_hops,
+                        reply, context_uuid, service_uuid, service_type, path_hops=path_hops,
                         config_rules=orig_config_rules)
                     grpc_services[service_key] = grpc_service
 
                 for connection in connections:
-                    connection_uuid,_,path_hops,dependencies = connection
+                    service_uuid,_,path_hops,dependencies = connection
 
-                    service_key = (context_uuid, connection_uuid)
+                    service_key = (context_uuid, service_uuid)
                     grpc_service = grpc_services.get(service_key)
                     if grpc_service is None: raise Exception('Service({:s}) not found'.format(str(service_key)))
                         
                     #if connection_uuid in grpc_connections: continue
-                    grpc_connection = self.add_connection_to_reply(reply, connection_uuid, grpc_service, path_hops)
+                    grpc_connection = self.add_connection_to_reply(reply, str(uuid.uuid4()), grpc_service, path_hops)
                     #grpc_connections[connection_uuid] = grpc_connection
 
                     for sub_service_uuid in dependencies:
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py
index 91367e23f29a02aa3e9605fcd0d2864b9191d800..329552a914e478f0e927bd6f04fce6725bef0b5e 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py
@@ -12,14 +12,18 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import itertools, json, re
+import itertools, json, logging, re
 from typing import Dict, List, Optional, Tuple
 from common.proto.context_pb2 import ConfigRule
+from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.ConfigRule import json_config_rule_set
 
+LOGGER = logging.getLogger(__name__)
+
 SETTINGS_RULE_NAME = '/settings'
 
-DEV_EP_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/endpoint\[([^\]]+)\]\/settings')
+DEVICE_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/settings')
+ENDPOINT_SETTINGS = re.compile(r'\/device\[([^\]]+)\]\/endpoint\[([^\]]+)\]\/settings')
 
 L2NM_SETTINGS_FIELD_DEFAULTS = {
     'encapsulation_type': 'dot1q',
@@ -75,27 +79,78 @@ def compose_device_config_rules(
     config_rules : List, subservice_config_rules : List, path_hops : List,
     device_name_mapping : Dict[str, str], endpoint_name_mapping : Dict[Tuple[str, str], str]
 ) -> None:
+    LOGGER.debug('[compose_device_config_rules] begin')
+
+    LOGGER.debug('[compose_device_config_rules] device_name_mapping={:s}'.format(str(device_name_mapping)))
+    LOGGER.debug('[compose_device_config_rules] endpoint_name_mapping={:s}'.format(str(endpoint_name_mapping)))
 
+    devices_traversed = set()
     endpoints_traversed = set()
     for path_hop in path_hops:
         device_uuid_or_name = path_hop['device']
+        devices_traversed.add(device_uuid_or_name)
         endpoints_traversed.add((device_uuid_or_name, path_hop['ingress_ep']))
         endpoints_traversed.add((device_uuid_or_name, path_hop['egress_ep']))
 
-    for config_rule in config_rules:
-        if config_rule.WhichOneof('config_rule') != 'custom': continue
-        match = DEV_EP_SETTINGS.match(config_rule.custom.resource_key)
-        if match is None: continue
+    LOGGER.debug('[compose_device_config_rules] devices_traversed={:s}'.format(str(devices_traversed)))
+    LOGGER.debug('[compose_device_config_rules] endpoints_traversed={:s}'.format(str(endpoints_traversed)))
 
-        device_uuid_or_name = match.group(1)
-        device_name_or_uuid = device_name_mapping[device_uuid_or_name]
-        device_keys = {device_uuid_or_name, device_name_or_uuid}
-
-        endpoint_uuid_or_name = match.group(2)
-        endpoint_name_or_uuid_1 = endpoint_name_mapping[(device_uuid_or_name, endpoint_uuid_or_name)]
-        endpoint_name_or_uuid_2 = endpoint_name_mapping[(device_name_or_uuid, endpoint_uuid_or_name)]
-        endpoint_keys = {endpoint_uuid_or_name, endpoint_name_or_uuid_1, endpoint_name_or_uuid_2}
-
-        device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys))
-        if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue
-        subservice_config_rules.append(config_rule)
+    for config_rule in config_rules:
+        LOGGER.debug('[compose_device_config_rules] processing config_rule: {:s}'.format(
+            grpc_message_to_json_string(config_rule)))
+
+        if config_rule.WhichOneof('config_rule') == 'acl':
+            LOGGER.debug('[compose_device_config_rules]   is acl')
+            endpoint_id = config_rule.acl.endpoint_id
+            device_uuid_or_name = endpoint_id.device_id.device_uuid.uuid
+            LOGGER.debug('[compose_device_config_rules]   device_uuid_or_name={:s}'.format(str(device_uuid_or_name)))
+            device_name_or_uuid = device_name_mapping.get(device_uuid_or_name, device_uuid_or_name)
+            LOGGER.debug('[compose_device_config_rules]   device_name_or_uuid={:s}'.format(str(device_name_or_uuid)))
+            device_keys = {device_uuid_or_name, device_name_or_uuid}
+            if len(device_keys.intersection(devices_traversed)) == 0: continue
+
+            endpoint_uuid = endpoint_id.endpoint_uuid.uuid
+            LOGGER.debug('[compose_device_config_rules]   endpoint_uuid={:s}'.format(str(endpoint_uuid)))
+            # given endpoint uuids link 'eth-1/0/20.533', remove last part after the '.'
+            endpoint_uuid_or_name = (endpoint_uuid[::-1].split('.', maxsplit=1)[-1])[::-1]
+            LOGGER.debug('[compose_device_config_rules]   endpoint_uuid_or_name={:s}'.format(str(endpoint_uuid_or_name)))
+            endpoint_name_or_uuid_1 = endpoint_name_mapping[(device_uuid_or_name, endpoint_uuid_or_name)]
+            endpoint_name_or_uuid_2 = endpoint_name_mapping[(device_name_or_uuid, endpoint_uuid_or_name)]
+            endpoint_keys = {endpoint_uuid_or_name, endpoint_name_or_uuid_1, endpoint_name_or_uuid_2}
+
+            device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys))
+            if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue
+            
+            LOGGER.debug('[compose_device_config_rules]   adding acl config rule')
+            subservice_config_rules.append(config_rule)
+
+        elif config_rule.WhichOneof('config_rule') == 'custom':
+            LOGGER.debug('[compose_device_config_rules]   is custom')
+
+            match = DEVICE_SETTINGS.match(config_rule.custom.resource_key)
+            if match is not None:
+                device_uuid_or_name = match.group(1)
+                device_name_or_uuid = device_name_mapping[device_uuid_or_name]
+                device_keys = {device_uuid_or_name, device_name_or_uuid}
+
+                if len(device_keys.intersection(devices_traversed)) == 0: continue
+                subservice_config_rules.append(config_rule)
+
+            match = ENDPOINT_SETTINGS.match(config_rule.custom.resource_key)
+            if match is not None:
+                device_uuid_or_name = match.group(1)
+                device_name_or_uuid = device_name_mapping[device_uuid_or_name]
+                device_keys = {device_uuid_or_name, device_name_or_uuid}
+
+                endpoint_uuid_or_name = match.group(2)
+                endpoint_name_or_uuid_1 = endpoint_name_mapping[(device_uuid_or_name, endpoint_uuid_or_name)]
+                endpoint_name_or_uuid_2 = endpoint_name_mapping[(device_name_or_uuid, endpoint_uuid_or_name)]
+                endpoint_keys = {endpoint_uuid_or_name, endpoint_name_or_uuid_1, endpoint_name_or_uuid_2}
+
+                device_endpoint_keys = set(itertools.product(device_keys, endpoint_keys))
+                if len(device_endpoint_keys.intersection(endpoints_traversed)) == 0: continue
+                subservice_config_rules.append(config_rule)
+        else:
+            continue
+
+    LOGGER.debug('[compose_device_config_rules] end')
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py b/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py
index 8ffdfaf3ed9d35b52e9c262a980e6e8e8fd234af..06b24031bd82b6b51add6569b9c35b360f0491fe 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py
@@ -49,7 +49,7 @@ import logging, queue, uuid
 from typing import Dict, List, Optional, Tuple
 from common.DeviceTypes import DeviceTypeEnum
 from common.proto.context_pb2 import Device, ServiceTypeEnum
-from .ResourceGroups import IGNORED_DEVICE_TYPES, get_resource_classification
+from .ResourceGroups import IGNORED_DEVICE_TYPES, REMOTEDOMAIN_DEVICE_TYPES, get_resource_classification
 from .ServiceTypes import get_service_type
 
 LOGGER = logging.getLogger(__name__)
@@ -81,17 +81,31 @@ def convert_explicit_path_hops_to_connections(
             LOGGER.debug('  ignored')
             continue
 
-        if prv_res_class[0] is None:
+        if res_class[1] in REMOTEDOMAIN_DEVICE_TYPES:
+            LOGGER.debug('  create and terminate underlying connection')
+
+            # create underlying connection
+            sub_service_uuid = str(uuid.uuid4())
+            prv_service_type = connection_stack.queue[-1][1]
+            service_type = get_service_type(res_class[1], prv_service_type)
+            connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
+
+            # underlying connection ended
+            connection = connection_stack.get()
+            connections.append(connection)
+            connection_stack.queue[-1][3].append(connection[0])
+            #connection_stack.queue[-1][2].append(path_hop)
+        elif prv_res_class[0] is None:
             # path ingress
             LOGGER.debug('  path ingress')
             connection_stack.put((main_service_uuid, main_service_type, [path_hop], []))
         elif prv_res_class[0] > res_class[0]:
             # create underlying connection
             LOGGER.debug('  create underlying connection')
-            connection_uuid = str(uuid.uuid4())
+            sub_service_uuid = str(uuid.uuid4())
             prv_service_type = connection_stack.queue[-1][1]
             service_type = get_service_type(res_class[1], prv_service_type)
-            connection_stack.put((connection_uuid, service_type, [path_hop], []))
+            connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
         elif prv_res_class[0] == res_class[0]:
             # same resource group kind
             LOGGER.debug('  same resource group kind')
@@ -106,10 +120,10 @@ def convert_explicit_path_hops_to_connections(
                 connections.append(connection)
                 connection_stack.queue[-1][3].append(connection[0])
 
-                connection_uuid = str(uuid.uuid4())
+                sub_service_uuid = str(uuid.uuid4())
                 prv_service_type = connection_stack.queue[-1][1]
                 service_type = get_service_type(res_class[1], prv_service_type)
-                connection_stack.put((connection_uuid, service_type, [path_hop], []))
+                connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
         elif prv_res_class[0] < res_class[0]:
             # underlying connection ended
             LOGGER.debug('  underlying connection ended')
diff --git a/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py b/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py
index cf41f186f4f35c45cbb1ce836196272327f6048f..c3e1a0d5738bc2fe4706c336b587ece97746da85 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py
@@ -111,14 +111,16 @@ def eropath_to_hops(
 
             if num_ero_hops - 1 == len(path_hops): break
 
-            endpoint_key = (last_hop['device'], last_hop['egress_ep'])
-            link_tuple = endpoint_to_link_dict.get(endpoint_key)
+            endpoint_key = (last_hop['device'], last_hop['egress_ep'], 'src')
+            link_tuple = endpoint_to_link_dict[endpoint_key]
+            if link_tuple is None: raise Exception('Malformed path')
+
             ingress = next(iter([
-                ep_id for ep_id in link_tuple[0]['link_endpoint_ids']
-                if (ep_id['endpoint_id']['device_id'] == device_uuid) and\
-                    (ep_id['endpoint_id']['endpoint_uuid'] != endpoint_uuid)
+                ep_id
+                for ep_id in link_tuple[0]['link_endpoint_ids']
+                if ep_id['endpoint_id']['device_id'] != device_uuid
             ]), None)
-            if ingress['endpoint_id']['device_id'] != device_uuid: raise Exception('Malformed path')
+
             ingress_ep = ingress['endpoint_id']['endpoint_uuid']
             ingress_ep = MAP_TAPI_UUIDS.get(ingress_ep, ingress_ep)
             path_hops.append({
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py
index c1591dbeb7c71c950135b92446849569bcd781f8..843c41803805106e9f7575fb9ff6b1344d036994 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py
@@ -22,7 +22,6 @@ from common.tools.grpc.Tools import grpc_message_to_json_string
 DEVICE_TYPE_TO_DEEPNESS = {
     DeviceTypeEnum.EMULATED_DATACENTER.value             : 90,
     DeviceTypeEnum.DATACENTER.value                      : 90,
-    DeviceTypeEnum.NETWORK.value                         : 90,
 
     DeviceTypeEnum.TERAFLOWSDN_CONTROLLER.value          : 80,
     DeviceTypeEnum.EMULATED_PACKET_ROUTER.value          : 70,
@@ -50,9 +49,11 @@ DEVICE_TYPE_TO_DEEPNESS = {
     DeviceTypeEnum.OPTICAL_ROADM.value                   : 10,
 
     DeviceTypeEnum.EMULATED_OPTICAL_SPLITTER.value       :  0,
+    DeviceTypeEnum.NETWORK.value                         :  0, # network out of our control; always delegate
 }
 
 IGNORED_DEVICE_TYPES = {DeviceTypeEnum.EMULATED_OPTICAL_SPLITTER}
+REMOTEDOMAIN_DEVICE_TYPES = {DeviceTypeEnum.NETWORK}
 
 def get_device_controller_uuid(
     device : Device
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py
index 463b8039b6c8c611b579bdb74933c06fb0f99507..73a741ae551c5179cb78268f6fb87040c8481c53 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py
@@ -16,6 +16,10 @@
 from common.DeviceTypes import DeviceTypeEnum
 from common.proto.context_pb2 import ServiceTypeEnum
 
+NETWORK_DEVICE_TYPES = {
+    DeviceTypeEnum.NETWORK,
+}
+
 PACKET_DEVICE_TYPES = {
     DeviceTypeEnum.TERAFLOWSDN_CONTROLLER,
     DeviceTypeEnum.PACKET_ROUTER, DeviceTypeEnum.EMULATED_PACKET_ROUTER,
@@ -45,6 +49,7 @@ def get_service_type(device_type : DeviceTypeEnum, prv_service_type : ServiceTyp
     if device_type in PACKET_DEVICE_TYPES and prv_service_type in SERVICE_TYPE_LXNM: return prv_service_type
     if device_type in L2_DEVICE_TYPES: return ServiceTypeEnum.SERVICETYPE_L2NM
     if device_type in OPTICAL_DEVICE_TYPES: return ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE
+    if device_type in NETWORK_DEVICE_TYPES: return prv_service_type
 
     str_fields = ', '.join([
         'device_type={:s}'.format(str(device_type)),
diff --git a/src/pathcomp/frontend/tests/Objects_A_B_C.py b/src/pathcomp/frontend/tests/Objects_A_B_C.py
index 5290123b62251a58d8e0a7f273ea23c38ee2cc8a..4bd1907cd71530973424d623428d8318acdf8ea9 100644
--- a/src/pathcomp/frontend/tests/Objects_A_B_C.py
+++ b/src/pathcomp/frontend/tests/Objects_A_B_C.py
@@ -16,14 +16,14 @@ from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
 from common.tools.object_factory.Constraint import json_constraint_sla_capacity, json_constraint_sla_latency
 from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import json_device_emulated_packet_router_disabled, json_device_id
-from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 
 def compose_device(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
     endpoints = json_endpoints(device_id, endpoints, topology_id=topology_id)
     device = json_device_emulated_packet_router_disabled(device_uuid, endpoints=endpoints)
     return device_id, endpoints, device
diff --git a/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN.py b/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN.py
index 053dfd4c45e3822914745905c71f9b64300e1a2f..38218e987a2aadf1d3a7152fa64125f606e3f947 100644
--- a/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN.py
+++ b/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_datacenter_disabled,
     json_device_emulated_packet_router_disabled, json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
 from common.tools.object_factory.Topology import json_topology, json_topology_id
@@ -29,7 +29,7 @@ ADD_CONNECT_RULES_TO_DEVICES = False
 
 def compose_router(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -38,7 +38,7 @@ def compose_router(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_datacenter(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
diff --git a/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN_OLS.py b/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN_OLS.py
index 2c8428568c001a53cbf2c08aa13b61ad14a1bd51..3b385412038edfcfa8a1c7c8d5a805c867c69993 100644
--- a/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN_OLS.py
+++ b/src/pathcomp/frontend/tests/Objects_DC_CSGW_TN_OLS.py
@@ -18,8 +18,9 @@ from common.tools.object_factory.Constraint import json_constraint_sla_capacity,
 from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_datacenter_disabled,
-    json_device_emulated_packet_router_disabled, json_device_emulated_tapi_disabled, json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoints
+    json_device_emulated_packet_router_disabled, json_device_emulated_tapi_disabled,
+    json_device_id)
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
 from common.tools.object_factory.Topology import json_topology, json_topology_id
@@ -30,7 +31,7 @@ ADD_CONNECT_RULES_TO_DEVICES = False
 
 def compose_router(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -39,7 +40,7 @@ def compose_router(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_ols(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'optical', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'optical') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -48,7 +49,7 @@ def compose_ols(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_datacenter(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
diff --git a/src/pathcomp/frontend/tests/test_ero_path.py b/src/pathcomp/frontend/tests/test_ero_path.py
new file mode 100644
index 0000000000000000000000000000000000000000..e263544a00e104065495fda3f2c85f1528ad8561
--- /dev/null
+++ b/src/pathcomp/frontend/tests/test_ero_path.py
@@ -0,0 +1,198 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import logging
+from typing import Any, Dict, List, Tuple
+#from common.proto.context_pb2 import Link
+
+logging.basicConfig(level=logging.DEBUG)
+LOGGER = logging.getLogger(__name__)
+
+ERO_PATH = [
+  {'device_id': 'DC1-GW', 'endpoint_uuid': 'int'},
+  {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth1'},
+  {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/2'},
+  {'device_id': 'TN-R2', 'endpoint_uuid': '2/1'},
+  {'device_id': 'TN-OLS', 'endpoint_uuid': '77486d5b0a15'},
+  {'device_id': 'TN-R4', 'endpoint_uuid': '1/2'},
+  {'device_id': 'CS2-GW1', 'endpoint_uuid': '10/1'},
+  {'device_id': 'DC2-GW', 'endpoint_uuid': 'int'}
+]
+
+ENDPOINT_TO_LINK_DICT = {
+  ('CS1-GW1', '1/1'         , 'dst'): ({'link_Id': 'TN-R1/1/1==CS1-GW1/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS1-GW1', '1/1'         , 'src'): ({'link_Id': 'CS1-GW1/1/1==TN-R1/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS1-GW1', '1/2'         , 'dst'): ({'link_Id': 'TN-R2/1/2==CS1-GW1/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS1-GW1', '1/2'         , 'src'): ({'link_Id': 'CS1-GW1/1/2==TN-R2/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS1-GW1', '10/1'        , 'dst'): ({'link_Id': 'DC1-GW/eth1==CS1-GW1/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth1'}}, {'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '10/1'}}]}, None),
+  ('CS1-GW1', '10/1'        , 'src'): ({'link_Id': 'CS1-GW1/10/1==DC1-GW/eth1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth1'}}]}, None),
+  ('CS1-GW2', '1/1'         , 'dst'): ({'link_Id': 'TN-R2/1/1==CS1-GW2/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS1-GW2', '1/1'         , 'src'): ({'link_Id': 'CS1-GW2/1/1==TN-R2/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS1-GW2', '1/2'         , 'dst'): ({'link_Id': 'TN-R1/1/2==CS1-GW2/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS1-GW2', '1/2'         , 'src'): ({'link_Id': 'CS1-GW2/1/2==TN-R1/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS1-GW2', '10/1'        , 'dst'): ({'link_Id': 'DC1-GW/eth2==CS1-GW2/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth2'}}, {'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '10/1'}}]}, None),
+  ('CS1-GW2', '10/1'        , 'src'): ({'link_Id': 'CS1-GW2/10/1==DC1-GW/eth2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth2'}}]}, None),
+  ('CS2-GW1', '1/1'         , 'dst'): ({'link_Id': 'TN-R3/1/1==CS2-GW1/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS2-GW1', '1/1'         , 'src'): ({'link_Id': 'CS2-GW1/1/1==TN-R3/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS2-GW1', '1/2'         , 'dst'): ({'link_Id': 'TN-R4/1/2==CS2-GW1/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS2-GW1', '1/2'         , 'src'): ({'link_Id': 'CS2-GW1/1/2==TN-R4/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS2-GW1', '10/1'        , 'dst'): ({'link_Id': 'DC2-GW/eth1==CS2-GW1/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth1'}}, {'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '10/1'}}]}, None),
+  ('CS2-GW1', '10/1'        , 'src'): ({'link_Id': 'CS2-GW1/10/1==DC2-GW/eth1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth1'}}]}, None),
+  ('CS2-GW2', '1/1'         , 'dst'): ({'link_Id': 'TN-R4/1/1==CS2-GW2/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS2-GW2', '1/1'         , 'src'): ({'link_Id': 'CS2-GW2/1/1==TN-R4/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/1'}}]}, None),
+  ('CS2-GW2', '1/2'         , 'dst'): ({'link_Id': 'TN-R3/1/2==CS2-GW2/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS2-GW2', '1/2'         , 'src'): ({'link_Id': 'CS2-GW2/1/2==TN-R3/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/2'}}]}, None),
+  ('CS2-GW2', '10/1'        , 'dst'): ({'link_Id': 'DC2-GW/eth2==CS2-GW2/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth2'}}, {'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '10/1'}}]}, None),
+  ('CS2-GW2', '10/1'        , 'src'): ({'link_Id': 'CS2-GW2/10/1==DC2-GW/eth2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth2'}}]}, None),
+  ('DC1-GW' , 'eth1'        , 'dst'): ({'link_Id': 'CS1-GW1/10/1==DC1-GW/eth1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth1'}}]}, None),
+  ('DC1-GW' , 'eth1'        , 'src'): ({'link_Id': 'DC1-GW/eth1==CS1-GW1/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth1'}}, {'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '10/1'}}]}, None),
+  ('DC1-GW' , 'eth2'        , 'dst'): ({'link_Id': 'CS1-GW2/10/1==DC1-GW/eth2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth2'}}]}, None),
+  ('DC1-GW' , 'eth2'        , 'src'): ({'link_Id': 'DC1-GW/eth2==CS1-GW2/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC1-GW', 'endpoint_uuid': 'eth2'}}, {'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '10/1'}}]}, None),
+  ('DC2-GW' , 'eth1'        , 'dst'): ({'link_Id': 'CS2-GW1/10/1==DC2-GW/eth1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth1'}}]}, None),
+  ('DC2-GW' , 'eth1'        , 'src'): ({'link_Id': 'DC2-GW/eth1==CS2-GW1/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth1'}}, {'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '10/1'}}]}, None),
+  ('DC2-GW' , 'eth2'        , 'dst'): ({'link_Id': 'CS2-GW2/10/1==DC2-GW/eth2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '10/1'}}, {'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth2'}}]}, None),
+  ('DC2-GW' , 'eth2'        , 'src'): ({'link_Id': 'DC2-GW/eth2==CS2-GW2/10/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'DC2-GW', 'endpoint_uuid': 'eth2'}}, {'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '10/1'}}]}, None),
+  ('TN-OLS' , '3c5ace9aaf9f', 'dst'): ({'link_Id': 'TN-R1/2/1==TN-OLS/3c5ace9aaf9f', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c5ace9aaf9f'}}]}, None),
+  ('TN-OLS' , '3c5ace9aaf9f', 'src'): ({'link_Id': 'TN-OLS/3c5ace9aaf9f==TN-R1/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c5ace9aaf9f'}}, {'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-OLS' , '3c9fd5178cd5', 'dst'): ({'link_Id': 'TN-R2/2/1==TN-OLS/3c9fd5178cd5', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c9fd5178cd5'}}]}, None),
+  ('TN-OLS' , '3c9fd5178cd5', 'src'): ({'link_Id': 'TN-OLS/3c9fd5178cd5==TN-R2/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c9fd5178cd5'}}, {'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-OLS' , '77486d5b0a15', 'dst'): ({'link_Id': 'TN-R4/2/1==TN-OLS/77486d5b0a15', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '77486d5b0a15'}}]}, None),
+  ('TN-OLS' , '77486d5b0a15', 'src'): ({'link_Id': 'TN-OLS/77486d5b0a15==TN-R4/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '77486d5b0a15'}}, {'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-OLS' , 'e4072030a6d6', 'dst'): ({'link_Id': 'TN-R3/2/1==TN-OLS/e4072030a6d6', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': 'e4072030a6d6'}}]}, None),
+  ('TN-OLS' , 'e4072030a6d6', 'src'): ({'link_Id': 'TN-OLS/e4072030a6d6==TN-R3/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': 'e4072030a6d6'}}, {'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-R1'  , '1/1'         , 'dst'): ({'link_Id': 'CS1-GW1/1/1==TN-R1/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R1'  , '1/1'         , 'src'): ({'link_Id': 'TN-R1/1/1==CS1-GW1/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R1'  , '1/2'         , 'dst'): ({'link_Id': 'CS1-GW2/1/2==TN-R1/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R1'  , '1/2'         , 'src'): ({'link_Id': 'TN-R1/1/2==CS1-GW2/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R1'  , '2/1'         , 'dst'): ({'link_Id': 'TN-OLS/3c5ace9aaf9f==TN-R1/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c5ace9aaf9f'}}, {'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-R1'  , '2/1'         , 'src'): ({'link_Id': 'TN-R1/2/1==TN-OLS/3c5ace9aaf9f', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R1', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c5ace9aaf9f'}}]}, None),
+  ('TN-R2'  , '1/1'         , 'dst'): ({'link_Id': 'CS1-GW2/1/1==TN-R2/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R2'  , '1/1'         , 'src'): ({'link_Id': 'TN-R2/1/1==CS1-GW2/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS1-GW2', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R2'  , '1/2'         , 'dst'): ({'link_Id': 'CS1-GW1/1/2==TN-R2/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R2'  , '1/2'         , 'src'): ({'link_Id': 'TN-R2/1/2==CS1-GW1/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS1-GW1', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R2'  , '2/1'         , 'dst'): ({'link_Id': 'TN-OLS/3c9fd5178cd5==TN-R2/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c9fd5178cd5'}}, {'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-R2'  , '2/1'         , 'src'): ({'link_Id': 'TN-R2/2/1==TN-OLS/3c9fd5178cd5', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R2', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '3c9fd5178cd5'}}]}, None),
+  ('TN-R3'  , '1/1'         , 'dst'): ({'link_Id': 'CS2-GW1/1/1==TN-R3/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R3'  , '1/1'         , 'src'): ({'link_Id': 'TN-R3/1/1==CS2-GW1/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R3'  , '1/2'         , 'dst'): ({'link_Id': 'CS2-GW2/1/2==TN-R3/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R3'  , '1/2'         , 'src'): ({'link_Id': 'TN-R3/1/2==CS2-GW2/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R3'  , '2/1'         , 'dst'): ({'link_Id': 'TN-OLS/e4072030a6d6==TN-R3/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': 'e4072030a6d6'}}, {'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-R3'  , '2/1'         , 'src'): ({'link_Id': 'TN-R3/2/1==TN-OLS/e4072030a6d6', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R3', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': 'e4072030a6d6'}}]}, None),
+  ('TN-R4'  , '1/1'         , 'dst'): ({'link_Id': 'CS2-GW2/1/1==TN-R4/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R4'  , '1/1'         , 'src'): ({'link_Id': 'TN-R4/1/1==CS2-GW2/1/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/1'}}, {'endpoint_id': {'device_id': 'CS2-GW2', 'endpoint_uuid': '1/1'}}]}, None),
+  ('TN-R4'  , '1/2'         , 'dst'): ({'link_Id': 'CS2-GW1/1/2==TN-R4/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R4'  , '1/2'         , 'src'): ({'link_Id': 'TN-R4/1/2==CS2-GW1/1/2', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '1/2'}}, {'endpoint_id': {'device_id': 'CS2-GW1', 'endpoint_uuid': '1/2'}}]}, None),
+  ('TN-R4'  , '2/1'         , 'dst'): ({'link_Id': 'TN-OLS/77486d5b0a15==TN-R4/2/1', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '77486d5b0a15'}}, {'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '2/1'}}]}, None),
+  ('TN-R4'  , '2/1'         , 'src'): ({'link_Id': 'TN-R4/2/1==TN-OLS/77486d5b0a15', 'link_endpoint_ids': [{'endpoint_id': {'device_id': 'TN-R4', 'endpoint_uuid': '2/1'}}, {'endpoint_id': {'device_id': 'TN-OLS', 'endpoint_uuid': '77486d5b0a15'}}]}, None),
+}
+
+MAP_TAPI_UUIDS = {
+    "c3dbaa44-9cda-5d54-8f99-0f282362be65": "5b835e46-53f7-52e8-9c8a-077322679e36", # node-1-port-13-input => node-1-port-13-output
+    "1fb9ac86-b7ad-5d6d-87b1-a09d995f1ddd": "c9df6ece-1650-5078-876a-1e488a453625", # node-1-port-14-input => node-1-port-14-output
+    "aa109937-8291-5a09-853a-97bff463e569": "b245480f-027c-53a0-9320-fca5b9d7a1e1", # node-1-port-15-input => node-1-port-15-output
+    "6653ae16-42a3-56b5-adf3-71adda024a61": "ac356900-ce2f-5c15-b038-1b05e6f50bf7", # node-1-port-17-input => node-1-port-17-output
+    "d782ef85-a473-50b4-93b5-2af86024a42a": "dcfeedd3-2d47-5bc8-b31c-ed9f973d8b76", # node-2-port-13-input => node-2-port-13-output
+    "bbbd83ef-6053-55dc-ab08-06fb0c2bd081": "57bcf45b-eb47-5a9c-86d1-d9cff0c910fd", # node-2-port-14-input => node-2-port-14-output
+    "27cdf70d-4e48-53ff-bc4f-20addf6524c0": "fd31eff5-392e-5fb5-a6f4-6dfca583344d", # node-2-port-15-input => node-2-port-15-output
+    "55ac2364-fad8-5a05-ac2b-5003997ff89e": "d12a2591-7f4a-575d-8fda-0bc3d6b7ca32", # node-2-port-17-input => node-2-port-17-output
+    "59f44a3c-32a5-5abf-af58-45e6fa7ca657": "1977ef5c-4383-5195-9221-0cdf8ee26cb7", # node-3-port-13-input => node-3-port-13-output
+    "1be3f905-d553-5291-9906-47c0772d45aa": "9def067b-9a75-54df-8867-853f35a42e87", # node-3-port-14-input => node-3-port-14-output
+    "fb4ece7a-2dd1-593a-b6ca-a787b3b59fc5": "1f294257-132a-54ad-b653-ef8b7517c9d8", # node-3-port-15-input => node-3-port-15-output
+    "a571d2fe-c7f8-5ac8-b2af-8e5b92a558b0": "5b60a688-deac-567a-8e36-0d52e56fd4fc", # node-3-port-16-input => node-3-port-16-output
+    "9ea9dc53-2d6a-5f28-b81a-e930f7cbedf9": "2aec14c1-3a84-5cba-8f22-783bd0273cd0", # node-3-port-17-input => node-3-port-17-output
+    "9ec8e0f3-3378-55e0-bed1-be1fe120a1a9": "ece2ed55-ce16-59d3-8137-3f4cf17e67ab", # node-3-port-18-input => node-3-port-18-output
+    "a7e114aa-a3b6-52ae-b7b7-0e5fe4dd4d1c": "0a05e43d-a13c-5276-9839-613600f3ff28", # node-4-port-13-input => node-4-port-13-output
+    "4ca8357a-3468-51e6-bba8-65137486666f": "18926fdf-de5c-5a52-be88-cccc065e5e03", # node-4-port-14-input => node-4-port-14-output
+    "a7e9f06f-6fd2-594e-8a0c-25bfe8c652d7": "1adb9e17-e499-58dc-8aa2-881ed5ce9670", # node-4-port-15-input => node-4-port-15-output
+    "9f6a23b2-c71c-5559-8fb3-f76421bea1d9": "049bb1f1-cc04-5b72-8c0f-43891d9637bf", # node-4-port-16-input => node-4-port-16-output
+    "f1d74c96-41f5-5eb9-a160-a38463184934": "2206440b-ef66-5d3e-8da5-40608fb00a10", # node-4-port-17-input => node-4-port-17-output
+
+    "5b835e46-53f7-52e8-9c8a-077322679e36": "c3dbaa44-9cda-5d54-8f99-0f282362be65", # node-1-port-13-output => node-1-port-13-input
+    "c9df6ece-1650-5078-876a-1e488a453625": "1fb9ac86-b7ad-5d6d-87b1-a09d995f1ddd", # node-1-port-14-output => node-1-port-14-input
+    "b245480f-027c-53a0-9320-fca5b9d7a1e1": "aa109937-8291-5a09-853a-97bff463e569", # node-1-port-15-output => node-1-port-15-input
+    "ac356900-ce2f-5c15-b038-1b05e6f50bf7": "6653ae16-42a3-56b5-adf3-71adda024a61", # node-1-port-17-output => node-1-port-17-input
+    "dcfeedd3-2d47-5bc8-b31c-ed9f973d8b76": "d782ef85-a473-50b4-93b5-2af86024a42a", # node-2-port-13-output => node-2-port-13-input
+    "57bcf45b-eb47-5a9c-86d1-d9cff0c910fd": "bbbd83ef-6053-55dc-ab08-06fb0c2bd081", # node-2-port-14-output => node-2-port-14-input
+    "fd31eff5-392e-5fb5-a6f4-6dfca583344d": "27cdf70d-4e48-53ff-bc4f-20addf6524c0", # node-2-port-15-output => node-2-port-15-input
+    "d12a2591-7f4a-575d-8fda-0bc3d6b7ca32": "55ac2364-fad8-5a05-ac2b-5003997ff89e", # node-2-port-17-output => node-2-port-17-input
+    "1977ef5c-4383-5195-9221-0cdf8ee26cb7": "59f44a3c-32a5-5abf-af58-45e6fa7ca657", # node-3-port-13-output => node-3-port-13-input
+    "9def067b-9a75-54df-8867-853f35a42e87": "1be3f905-d553-5291-9906-47c0772d45aa", # node-3-port-14-output => node-3-port-14-input
+    "1f294257-132a-54ad-b653-ef8b7517c9d8": "fb4ece7a-2dd1-593a-b6ca-a787b3b59fc5", # node-3-port-15-output => node-3-port-15-input
+    "5b60a688-deac-567a-8e36-0d52e56fd4fc": "a571d2fe-c7f8-5ac8-b2af-8e5b92a558b0", # node-3-port-16-output => node-3-port-16-input
+    "2aec14c1-3a84-5cba-8f22-783bd0273cd0": "9ea9dc53-2d6a-5f28-b81a-e930f7cbedf9", # node-3-port-17-output => node-3-port-17-input
+    "ece2ed55-ce16-59d3-8137-3f4cf17e67ab": "9ec8e0f3-3378-55e0-bed1-be1fe120a1a9", # node-3-port-18-output => node-3-port-18-input
+    "0a05e43d-a13c-5276-9839-613600f3ff28": "a7e114aa-a3b6-52ae-b7b7-0e5fe4dd4d1c", # node-4-port-13-output => node-4-port-13-input
+    "18926fdf-de5c-5a52-be88-cccc065e5e03": "4ca8357a-3468-51e6-bba8-65137486666f", # node-4-port-14-output => node-4-port-14-input
+    "1adb9e17-e499-58dc-8aa2-881ed5ce9670": "a7e9f06f-6fd2-594e-8a0c-25bfe8c652d7", # node-4-port-15-output => node-4-port-15-input
+    "049bb1f1-cc04-5b72-8c0f-43891d9637bf": "9f6a23b2-c71c-5559-8fb3-f76421bea1d9", # node-4-port-16-output => node-4-port-16-input
+    "2206440b-ef66-5d3e-8da5-40608fb00a10": "f1d74c96-41f5-5eb9-a160-a38463184934", # node-4-port-17-output => node-4-port-17-input
+}
+
+def eropath_to_hops(
+    ero_path : List[Dict], endpoint_to_link_dict : Dict[Tuple[str, str, str], Tuple[Dict, Any]]
+) -> List[Dict]:
+    LOGGER.debug('ero_path = {:s}'.format(str(ero_path)))
+    try:
+        path_hops = []
+        num_ero_hops = len(ero_path)
+        for endpoint in ero_path:
+            LOGGER.info('endpoint={:s}'.format(str(endpoint)))
+
+            device_uuid = endpoint['device_id']
+            endpoint_uuid = endpoint['endpoint_uuid']
+
+            if len(path_hops) == 0:
+                LOGGER.info('  first hop')
+                path_hops.append({'device': device_uuid, 'ingress_ep': endpoint_uuid})
+                continue
+
+            LOGGER.info('  next hop')
+            last_hop = path_hops[-1]
+            LOGGER.info('  last_hop={:s}'.format(str(last_hop)))
+            if last_hop['device'] != device_uuid: raise Exception('Malformed path')
+            last_hop['egress_ep'] = endpoint_uuid
+
+            if num_ero_hops - 1 == len(path_hops): break
+
+            endpoint_key = (last_hop['device'], last_hop['egress_ep'], 'src')
+            LOGGER.info('  endpoint_key={:s}'.format(str(endpoint_key)))
+            link_tuple = endpoint_to_link_dict[endpoint_key]
+            LOGGER.info('  link_tuple={:s}'.format(str(link_tuple)))
+            if link_tuple is None: raise Exception('Malformed path')
+
+            ingress = next(iter([
+                ep_id
+                for ep_id in link_tuple[0]['link_endpoint_ids']
+                if ep_id['endpoint_id']['device_id'] != device_uuid
+            ]), None)
+            LOGGER.info('  ingress={:s}'.format(str(ingress)))
+            #if ingress['endpoint_id']['device_id'] != device_uuid:
+            #    raise Exception('Malformed path')
+
+            ingress_ep = ingress['endpoint_id']['endpoint_uuid']
+            ingress_ep = MAP_TAPI_UUIDS.get(ingress_ep, ingress_ep)
+            path_hops.append({
+                'device': ingress['endpoint_id']['device_id'],
+                'ingress_ep': ingress_ep,
+                'egress_ep': endpoint_uuid,
+            })
+        LOGGER.debug('path_hops = {:s}'.format(str(path_hops)))
+        return path_hops
+    except:
+        #LOGGER.exception('Unhandled exception: ero_path={:s} endpoint_to_link_dict={:s}'.format(
+        #    str(ero_path), str(endpoint_to_link_dict)))
+        raise
+
+res = eropath_to_hops(ERO_PATH, ENDPOINT_TO_LINK_DICT)
+LOGGER.warning('res = {:s}'.format(str(res)))
diff --git a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
index fa74d7c132eb2753ee941f5eacca7a564424288e..a605e30de68ae66866a78d53863412937ceea890 100644
--- a/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
+++ b/src/policy/target/generated-sources/grpc/context/ContextOuterClass.java
@@ -181,6 +181,10 @@ public final class ContextOuterClass {
      * <code>DEVICEDRIVER_IETF_L2VPN = 7;</code>
      */
     DEVICEDRIVER_IETF_L2VPN(7),
+    /**
+     * <code>DEVICEDRIVER_GNMI_OPENCONFIG = 8;</code>
+     */
+    DEVICEDRIVER_GNMI_OPENCONFIG(8),
     UNRECOGNIZED(-1),
     ;
 
@@ -220,6 +224,10 @@ public final class ContextOuterClass {
      * <code>DEVICEDRIVER_IETF_L2VPN = 7;</code>
      */
     public static final int DEVICEDRIVER_IETF_L2VPN_VALUE = 7;
+    /**
+     * <code>DEVICEDRIVER_GNMI_OPENCONFIG = 8;</code>
+     */
+    public static final int DEVICEDRIVER_GNMI_OPENCONFIG_VALUE = 8;
 
 
     public final int getNumber() {
@@ -254,6 +262,7 @@ public final class ContextOuterClass {
         case 5: return DEVICEDRIVER_ONF_TR_352;
         case 6: return DEVICEDRIVER_XR;
         case 7: return DEVICEDRIVER_IETF_L2VPN;
+        case 8: return DEVICEDRIVER_GNMI_OPENCONFIG;
         default: return null;
       }
     }
@@ -962,6 +971,127 @@ public final class ContextOuterClass {
     // @@protoc_insertion_point(enum_scope:context.ConfigActionEnum)
   }
 
+  /**
+   * <pre>
+   * ----- Constraint ----------------------------------------------------------------------------------------------------
+   * </pre>
+   *
+   * Protobuf enum {@code context.ConstraintActionEnum}
+   */
+  public enum ConstraintActionEnum
+      implements com.google.protobuf.ProtocolMessageEnum {
+    /**
+     * <code>CONSTRAINTACTION_UNDEFINED = 0;</code>
+     */
+    CONSTRAINTACTION_UNDEFINED(0),
+    /**
+     * <code>CONSTRAINTACTION_SET = 1;</code>
+     */
+    CONSTRAINTACTION_SET(1),
+    /**
+     * <code>CONSTRAINTACTION_DELETE = 2;</code>
+     */
+    CONSTRAINTACTION_DELETE(2),
+    UNRECOGNIZED(-1),
+    ;
+
+    /**
+     * <code>CONSTRAINTACTION_UNDEFINED = 0;</code>
+     */
+    public static final int CONSTRAINTACTION_UNDEFINED_VALUE = 0;
+    /**
+     * <code>CONSTRAINTACTION_SET = 1;</code>
+     */
+    public static final int CONSTRAINTACTION_SET_VALUE = 1;
+    /**
+     * <code>CONSTRAINTACTION_DELETE = 2;</code>
+     */
+    public static final int CONSTRAINTACTION_DELETE_VALUE = 2;
+
+
+    public final int getNumber() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalArgumentException(
+            "Can't get the number of an unknown enum value.");
+      }
+      return value;
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     * @deprecated Use {@link #forNumber(int)} instead.
+     */
+    @java.lang.Deprecated
+    public static ConstraintActionEnum valueOf(int value) {
+      return forNumber(value);
+    }
+
+    /**
+     * @param value The numeric wire value of the corresponding enum entry.
+     * @return The enum associated with the given numeric wire value.
+     */
+    public static ConstraintActionEnum forNumber(int value) {
+      switch (value) {
+        case 0: return CONSTRAINTACTION_UNDEFINED;
+        case 1: return CONSTRAINTACTION_SET;
+        case 2: return CONSTRAINTACTION_DELETE;
+        default: return null;
+      }
+    }
+
+    public static com.google.protobuf.Internal.EnumLiteMap<ConstraintActionEnum>
+        internalGetValueMap() {
+      return internalValueMap;
+    }
+    private static final com.google.protobuf.Internal.EnumLiteMap<
+        ConstraintActionEnum> internalValueMap =
+          new com.google.protobuf.Internal.EnumLiteMap<ConstraintActionEnum>() {
+            public ConstraintActionEnum findValueByNumber(int number) {
+              return ConstraintActionEnum.forNumber(number);
+            }
+          };
+
+    public final com.google.protobuf.Descriptors.EnumValueDescriptor
+        getValueDescriptor() {
+      if (this == UNRECOGNIZED) {
+        throw new java.lang.IllegalStateException(
+            "Can't get the descriptor of an unrecognized enum value.");
+      }
+      return getDescriptor().getValues().get(ordinal());
+    }
+    public final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptorForType() {
+      return getDescriptor();
+    }
+    public static final com.google.protobuf.Descriptors.EnumDescriptor
+        getDescriptor() {
+      return context.ContextOuterClass.getDescriptor().getEnumTypes().get(7);
+    }
+
+    private static final ConstraintActionEnum[] VALUES = values();
+
+    public static ConstraintActionEnum valueOf(
+        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+      if (desc.getType() != getDescriptor()) {
+        throw new java.lang.IllegalArgumentException(
+          "EnumValueDescriptor is not for this type.");
+      }
+      if (desc.getIndex() == -1) {
+        return UNRECOGNIZED;
+      }
+      return VALUES[desc.getIndex()];
+    }
+
+    private final int value;
+
+    private ConstraintActionEnum(int value) {
+      this.value = value;
+    }
+
+    // @@protoc_insertion_point(enum_scope:context.ConstraintActionEnum)
+  }
+
   /**
    * Protobuf enum {@code context.IsolationLevelEnum}
    */
@@ -1107,7 +1237,7 @@ public final class ContextOuterClass {
     }
     public static final com.google.protobuf.Descriptors.EnumDescriptor
         getDescriptor() {
-      return context.ContextOuterClass.getDescriptor().getEnumTypes().get(7);
+      return context.ContextOuterClass.getDescriptor().getEnumTypes().get(8);
     }
 
     private static final IsolationLevelEnum[] VALUES = values();
@@ -11075,9 +11205,6 @@ public final class ContextOuterClass {
         return s;
       }
     }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object name_;
     /**
      * <code>string name = 2;</code>
      * @return The bytes for name.
@@ -24641,15 +24768,11 @@ public final class ContextOuterClass {
           final com.google.protobuf.UnknownFieldSet unknownFields) {
         return super.setUnknownFields(unknownFields);
       }
-      /**
-       * <code>.context.DeviceOperationalStatusEnum device_operational_status = 5;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearDeviceOperationalStatus() {
-        
-        deviceOperationalStatus_ = 0;
-        onChanged();
-        return this;
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
       }
 
 
@@ -24757,6 +24880,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -25205,9 +25329,6 @@ public final class ContextOuterClass {
       private com.google.protobuf.RepeatedFieldBuilderV3<
           context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdsBuilder_;
 
-      private context.ContextOuterClass.Uuid linkUuid_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> linkUuidBuilder_;
       /**
        * <code>repeated .context.LinkId link_ids = 1;</code>
        */
@@ -25267,7 +25388,6 @@ public final class ContextOuterClass {
         } else {
           linkIdsBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
@@ -25284,7 +25404,6 @@ public final class ContextOuterClass {
         } else {
           linkIdsBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
@@ -25358,7 +25477,6 @@ public final class ContextOuterClass {
         } else {
           linkIdsBuilder_.clear();
         }
-
         return this;
       }
       /**
@@ -25372,7 +25490,6 @@ public final class ContextOuterClass {
         } else {
           linkIdsBuilder_.remove(index);
         }
-
         return this;
       }
       /**
@@ -25568,25 +25685,6 @@ public final class ContextOuterClass {
               done = true;
               break;
             case 10: {
-              context.ContextOuterClass.LinkId.Builder subBuilder = null;
-              if (linkId_ != null) {
-                subBuilder = linkId_.toBuilder();
-              }
-              linkId_ = input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(linkId_);
-                linkId_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 18: {
-              java.lang.String s = input.readStringRequireUtf8();
-
-              name_ = s;
-              break;
-            }
-            case 26: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                 links_ = new java.util.ArrayList<context.ContextOuterClass.Link>();
                 mutable_bitField0_ |= 0x00000001;
@@ -25654,9 +25752,6 @@ public final class ContextOuterClass {
     public int getLinksCount() {
       return links_.size();
     }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object name_;
     /**
      * <code>repeated .context.Link links = 1;</code>
      */
@@ -25911,7 +26006,8 @@ public final class ContextOuterClass {
         } else {
           result.links_ = linksBuilder_.build();
         }
-        return linkIdBuilder_;
+        onBuilt();
+        return result;
       }
 
       @java.lang.Override
@@ -25951,7 +26047,8 @@ public final class ContextOuterClass {
         if (other instanceof context.ContextOuterClass.LinkList) {
           return mergeFrom((context.ContextOuterClass.LinkList)other);
         } else {
-          return (java.lang.String) ref;
+          super.mergeFrom(other);
+          return this;
         }
       }
 
@@ -25983,31 +26080,14 @@ public final class ContextOuterClass {
             }
           }
         }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        name_ = value;
+        this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
       }
-      /**
-       * <code>string name = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearName() {
-        
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
 
       @java.lang.Override
@@ -26028,6 +26108,7 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
 
       private java.util.List<context.ContextOuterClass.Link> links_ =
         java.util.Collections.emptyList();
@@ -26390,7 +26471,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -26424,8 +26504,7 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom(linkId_);
                 linkId_ = subBuilder.buildPartial();
               }
-              linkIds_.add(
-                  input.readMessage(context.ContextOuterClass.LinkId.parser(), extensionRegistry));
+
               break;
             }
             default: {
@@ -26478,9 +26557,12 @@ public final class ContextOuterClass {
     public context.ContextOuterClass.Event getEvent() {
       return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
     }
-    public static final com.google.protobuf.Descriptors.Descriptor
-        getDescriptor() {
-      return context.ContextOuterClass.internal_static_context_LinkIdList_descriptor;
+    /**
+     * <code>.context.Event event = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+      return getEvent();
     }
 
     public static final int LINK_ID_FIELD_NUMBER = 2;
@@ -26718,7 +26800,6 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getLinkIdsFieldBuilder();
         }
       }
       @java.lang.Override
@@ -26854,38 +26935,122 @@ public final class ContextOuterClass {
         }
         return this;
       }
-      private int bitField0_;
 
-      private java.util.List<context.ContextOuterClass.LinkId> linkIds_ =
-        java.util.Collections.emptyList();
-      private void ensureLinkIdsIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          linkIds_ = new java.util.ArrayList<context.ContextOuterClass.LinkId>(linkIds_);
-          bitField0_ |= 0x00000001;
-         }
+      private context.ContextOuterClass.Event event_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> eventBuilder_;
+      /**
+       * <code>.context.Event event = 1;</code>
+       * @return Whether the event field is set.
+       */
+      public boolean hasEvent() {
+        return eventBuilder_ != null || event_ != null;
       }
+      /**
+       * <code>.context.Event event = 1;</code>
+       * @return The event.
+       */
+      public context.ContextOuterClass.Event getEvent() {
+        if (eventBuilder_ == null) {
+          return event_ == null ? context.ContextOuterClass.Event.getDefaultInstance() : event_;
+        } else {
+          return eventBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      public Builder setEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          event_ = value;
+          onChanged();
+        } else {
+          eventBuilder_.setMessage(value);
+        }
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.LinkId, context.ContextOuterClass.LinkId.Builder, context.ContextOuterClass.LinkIdOrBuilder> linkIdsBuilder_;
+        return this;
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      public Builder setEvent(
+          context.ContextOuterClass.Event.Builder builderForValue) {
+        if (eventBuilder_ == null) {
+          event_ = builderForValue.build();
+          onChanged();
+        } else {
+          eventBuilder_.setMessage(builderForValue.build());
+        }
 
+        return this;
+      }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public java.util.List<context.ContextOuterClass.LinkId> getLinkIdsList() {
-        if (linkIdsBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(linkIds_);
+      public Builder mergeEvent(context.ContextOuterClass.Event value) {
+        if (eventBuilder_ == null) {
+          if (event_ != null) {
+            event_ =
+              context.ContextOuterClass.Event.newBuilder(event_).mergeFrom(value).buildPartial();
+          } else {
+            event_ = value;
+          }
+          onChanged();
         } else {
-          return linkIdsBuilder_.getMessageList();
+          eventBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
-       * <code>repeated .context.LinkId link_ids = 1;</code>
+       * <code>.context.Event event = 1;</code>
        */
-      public int getLinkIdsCount() {
-        if (linkIdsBuilder_ == null) {
-          return linkIds_.size();
+      public Builder clearEvent() {
+        if (eventBuilder_ == null) {
+          event_ = null;
+          onChanged();
         } else {
-          return linkIdsBuilder_.getCount();
+          event_ = null;
+          eventBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      public context.ContextOuterClass.Event.Builder getEventBuilder() {
+        
+        onChanged();
+        return getEventFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      public context.ContextOuterClass.EventOrBuilder getEventOrBuilder() {
+        if (eventBuilder_ != null) {
+          return eventBuilder_.getMessageOrBuilder();
+        } else {
+          return event_ == null ?
+              context.ContextOuterClass.Event.getDefaultInstance() : event_;
+        }
+      }
+      /**
+       * <code>.context.Event event = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder> 
+          getEventFieldBuilder() {
+        if (eventBuilder_ == null) {
+          eventBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Event, context.ContextOuterClass.Event.Builder, context.ContextOuterClass.EventOrBuilder>(
+                  getEvent(),
+                  getParentForChildren(),
+                  isClean());
+          event_ = null;
         }
         return eventBuilder_;
       }
@@ -26910,7 +27075,6 @@ public final class ContextOuterClass {
         } else {
           return linkIdBuilder_.getMessage();
         }
-        return this;
       }
       /**
        * <code>.context.LinkId link_id = 2;</code>
@@ -26925,6 +27089,7 @@ public final class ContextOuterClass {
         } else {
           linkIdBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
@@ -26938,6 +27103,7 @@ public final class ContextOuterClass {
         } else {
           linkIdBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
@@ -26955,6 +27121,7 @@ public final class ContextOuterClass {
         } else {
           linkIdBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
@@ -26968,6 +27135,7 @@ public final class ContextOuterClass {
           linkId_ = null;
           linkIdBuilder_ = null;
         }
+
         return this;
       }
       /**
@@ -27131,7 +27299,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -27165,8 +27332,7 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom(serviceUuid_);
                 serviceUuid_ = subBuilder.buildPartial();
               }
-              links_.add(
-                  input.readMessage(context.ContextOuterClass.Link.parser(), extensionRegistry));
+
               break;
             }
             default: {
@@ -27184,9 +27350,6 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          links_ = java.util.Collections.unmodifiableList(links_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -27469,7 +27632,6 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getLinksFieldBuilder();
         }
       }
       @java.lang.Override
@@ -27564,7 +27726,8 @@ public final class ContextOuterClass {
         if (other instanceof context.ContextOuterClass.ServiceId) {
           return mergeFrom((context.ContextOuterClass.ServiceId)other);
         } else {
-          return linksBuilder_.getCount();
+          super.mergeFrom(other);
+          return this;
         }
       }
 
@@ -27576,6 +27739,14 @@ public final class ContextOuterClass {
         if (other.hasServiceUuid()) {
           mergeServiceUuid(other.getServiceUuid());
         }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
 
       @java.lang.Override
@@ -27593,11 +27764,6 @@ public final class ContextOuterClass {
           if (parsedMessage != null) {
             mergeFrom(parsedMessage);
           }
-          ensureLinksIsMutable();
-          links_.set(index, value);
-          onChanged();
-        } else {
-          linksBuilder_.setMessage(index, value);
         }
         return this;
       }
@@ -27741,7 +27907,6 @@ public final class ContextOuterClass {
         } else {
           return serviceUuidBuilder_.getMessage();
         }
-        return this;
       }
       /**
        * <code>.context.Uuid service_uuid = 2;</code>
@@ -27756,6 +27921,7 @@ public final class ContextOuterClass {
         } else {
           serviceUuidBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
@@ -27769,6 +27935,7 @@ public final class ContextOuterClass {
         } else {
           serviceUuidBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
@@ -27786,6 +27953,7 @@ public final class ContextOuterClass {
         } else {
           serviceUuidBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
@@ -27799,6 +27967,7 @@ public final class ContextOuterClass {
           serviceUuid_ = null;
           serviceUuidBuilder_ = null;
         }
+
         return this;
       }
       /**
@@ -27819,7 +27988,6 @@ public final class ContextOuterClass {
           return serviceUuid_ == null ?
               context.ContextOuterClass.Uuid.getDefaultInstance() : serviceUuid_;
         }
-        return this;
       }
       /**
        * <code>.context.Uuid service_uuid = 2;</code>
@@ -28064,6 +28232,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -28983,6 +29152,7 @@ public final class ContextOuterClass {
         }
         return this;
       }
+      private int bitField0_;
 
       private context.ContextOuterClass.ServiceId serviceId_;
       private com.google.protobuf.SingleFieldBuilderV3<
@@ -29304,7 +29474,6 @@ public final class ContextOuterClass {
         } else {
           serviceEndpointIdsBuilder_.setMessage(index, builderForValue.build());
         }
-
         return this;
       }
       /**
@@ -29321,7 +29490,6 @@ public final class ContextOuterClass {
         } else {
           serviceEndpointIdsBuilder_.addMessage(value);
         }
-
         return this;
       }
       /**
@@ -29395,7 +29563,6 @@ public final class ContextOuterClass {
         } else {
           serviceEndpointIdsBuilder_.clear();
         }
-
         return this;
       }
       /**
@@ -29409,7 +29576,6 @@ public final class ContextOuterClass {
         } else {
           serviceEndpointIdsBuilder_.remove(index);
         }
-
         return this;
       }
       /**
@@ -29965,10 +30131,6 @@ public final class ContextOuterClass {
       public boolean hasTimestamp() {
         return timestampBuilder_ != null || timestamp_ != null;
       }
-
-      private context.ContextOuterClass.Uuid serviceUuid_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> serviceUuidBuilder_;
       /**
        * <code>.context.Timestamp timestamp = 8;</code>
        * @return The timestamp.
@@ -30520,15 +30682,6 @@ public final class ContextOuterClass {
         if (other.serviceStatus_ != 0) {
           setServiceStatusValue(other.getServiceStatusValue());
         }
-        if (other.hasServiceStatus()) {
-          mergeServiceStatus(other.getServiceStatus());
-        }
-        if (other.hasServiceConfig()) {
-          mergeServiceConfig(other.getServiceConfig());
-        }
-        if (other.hasTimestamp()) {
-          mergeTimestamp(other.getTimestamp());
-        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -30539,270 +30692,6 @@ public final class ContextOuterClass {
         return true;
       }
 
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.Service parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.Service) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-      private int bitField0_;
-
-      private context.ContextOuterClass.ServiceId serviceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       * @return Whether the serviceId field is set.
-       */
-      public boolean hasServiceId() {
-        return serviceIdBuilder_ != null || serviceId_ != null;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       * @return The serviceId.
-       */
-      public context.ContextOuterClass.ServiceId getServiceId() {
-        if (serviceIdBuilder_ == null) {
-          return serviceId_ == null ? context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
-        } else {
-          return serviceIdBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      public Builder setServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          serviceId_ = value;
-          onChanged();
-        } else {
-          serviceIdBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      public Builder setServiceId(
-          context.ContextOuterClass.ServiceId.Builder builderForValue) {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = builderForValue.build();
-          onChanged();
-        } else {
-          serviceIdBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      public Builder mergeServiceId(context.ContextOuterClass.ServiceId value) {
-        if (serviceIdBuilder_ == null) {
-          if (serviceId_ != null) {
-            serviceId_ =
-              context.ContextOuterClass.ServiceId.newBuilder(serviceId_).mergeFrom(value).buildPartial();
-          } else {
-            serviceId_ = value;
-          }
-          onChanged();
-        } else {
-          serviceIdBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      public Builder clearServiceId() {
-        if (serviceIdBuilder_ == null) {
-          serviceId_ = null;
-          onChanged();
-        } else {
-          serviceId_ = null;
-          serviceIdBuilder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      public context.ContextOuterClass.ServiceId.Builder getServiceIdBuilder() {
-        
-        onChanged();
-        return getServiceIdFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      public context.ContextOuterClass.ServiceIdOrBuilder getServiceIdOrBuilder() {
-        if (serviceIdBuilder_ != null) {
-          return serviceIdBuilder_.getMessageOrBuilder();
-        } else {
-          return serviceId_ == null ?
-              context.ContextOuterClass.ServiceId.getDefaultInstance() : serviceId_;
-        }
-      }
-      /**
-       * <code>.context.ServiceId service_id = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> 
-          getServiceIdFieldBuilder() {
-        if (serviceIdBuilder_ == null) {
-          serviceIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder>(
-                  getServiceId(),
-                  getParentForChildren(),
-                  isClean());
-          serviceId_ = null;
-        }
-        return serviceIdBuilder_;
-      }
-
-      private java.lang.Object name_ = "";
-      /**
-       * <code>string name = 2;</code>
-       * @return The name.
-       */
-      public java.lang.String getName() {
-        java.lang.Object ref = name_;
-        if (!(ref instanceof java.lang.String)) {
-          com.google.protobuf.ByteString bs =
-              (com.google.protobuf.ByteString) ref;
-          java.lang.String s = bs.toStringUtf8();
-          name_ = s;
-          return s;
-        } else {
-          return (java.lang.String) ref;
-        }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return The bytes for name.
-       */
-      public com.google.protobuf.ByteString
-          getNameBytes() {
-        java.lang.Object ref = name_;
-        if (ref instanceof String) {
-          com.google.protobuf.ByteString b = 
-              com.google.protobuf.ByteString.copyFromUtf8(
-                  (java.lang.String) ref);
-          name_ = b;
-          return b;
-        } else {
-          return (com.google.protobuf.ByteString) ref;
-        }
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setName(
-          java.lang.String value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  
-        name_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearName() {
-        
-        name_ = getDefaultInstance().getName();
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>string name = 2;</code>
-       * @param value The bytes for name to set.
-       * @return This builder for chaining.
-       */
-      public Builder setNameBytes(
-          com.google.protobuf.ByteString value) {
-        if (value == null) {
-    throw new NullPointerException();
-  }
-  checkByteStringIsUtf8(value);
-        
-        name_ = value;
-        onChanged();
-        return this;
-      }
-
-      private int serviceType_ = 0;
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @return The enum numeric value on the wire for serviceType.
-       */
-      @java.lang.Override public int getServiceTypeValue() {
-        return serviceType_;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @param value The enum numeric value on the wire for serviceType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setServiceTypeValue(int value) {
-        
-        serviceType_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @return The serviceType.
-       */
-      @java.lang.Override
-      public context.ContextOuterClass.ServiceTypeEnum getServiceType() {
-        @SuppressWarnings("deprecation")
-        context.ContextOuterClass.ServiceTypeEnum result = context.ContextOuterClass.ServiceTypeEnum.valueOf(serviceType_);
-        return result == null ? context.ContextOuterClass.ServiceTypeEnum.UNRECOGNIZED : result;
-      }
-      /**
-       * <code>.context.ServiceTypeEnum service_type = 3;</code>
-       * @param value The serviceType to set.
-       * @return This builder for chaining.
-       */
-      public Builder setServiceType(context.ContextOuterClass.ServiceTypeEnum value) {
-        if (value == null) {
-          throw new NullPointerException();
-        }
-        
-        serviceType_ = value.getNumber();
-        onChanged();
-        return this;
-      }
-
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
-      }
-
       @java.lang.Override
       public Builder mergeFrom(
           com.google.protobuf.CodedInputStream input,
@@ -31117,12 +31006,15 @@ public final class ContextOuterClass {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, configRules_.get(i));
       }
-      /**
-       * <code>repeated .context.EndPointId service_endpoint_ids = 4;</code>
-       */
-      public context.ContextOuterClass.EndPointId.Builder getServiceEndpointIdsBuilder(
-          int index) {
-        return getServiceEndpointIdsFieldBuilder().getBuilder(index);
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
       }
       if (!(obj instanceof context.ContextOuterClass.ServiceConfig)) {
         return super.equals(obj);
@@ -31146,6 +31038,10 @@ public final class ContextOuterClass {
         hash = (37 * hash) + CONFIG_RULES_FIELD_NUMBER;
         hash = (53 * hash) + getConfigRulesList().hashCode();
       }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
 
     public static context.ContextOuterClass.ServiceConfig parseFrom(
         java.nio.ByteBuffer data)
@@ -31261,29 +31157,17 @@ public final class ContextOuterClass {
       private Builder() {
         maybeForceBuilderInitialization();
       }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public Builder setServiceConstraints(
-          int index, context.ContextOuterClass.Constraint value) {
-        if (serviceConstraintsBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureServiceConstraintsIsMutable();
-          serviceConstraints_.set(index, value);
-          onChanged();
-        } else {
-          serviceConstraintsBuilder_.setMessage(index, value);
-        }
-        return this;
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
           getConfigRulesFieldBuilder();
         }
-        return this;
       }
       @java.lang.Override
       public Builder clear() {
@@ -31314,97 +31198,7 @@ public final class ContextOuterClass {
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
-        return this;
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public Builder clearServiceConstraints() {
-        if (serviceConstraintsBuilder_ == null) {
-          serviceConstraints_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
-          onChanged();
-        } else {
-          serviceConstraintsBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public Builder removeServiceConstraints(int index) {
-        if (serviceConstraintsBuilder_ == null) {
-          ensureServiceConstraintsIsMutable();
-          serviceConstraints_.remove(index);
-          onChanged();
-        } else {
-          serviceConstraintsBuilder_.remove(index);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public context.ContextOuterClass.Constraint.Builder getServiceConstraintsBuilder(
-          int index) {
-        return getServiceConstraintsFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public context.ContextOuterClass.ConstraintOrBuilder getServiceConstraintsOrBuilder(
-          int index) {
-        if (serviceConstraintsBuilder_ == null) {
-          return serviceConstraints_.get(index);  } else {
-          return serviceConstraintsBuilder_.getMessageOrBuilder(index);
-        }
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public java.util.List<? extends context.ContextOuterClass.ConstraintOrBuilder> 
-           getServiceConstraintsOrBuilderList() {
-        if (serviceConstraintsBuilder_ != null) {
-          return serviceConstraintsBuilder_.getMessageOrBuilderList();
-        } else {
-          return java.util.Collections.unmodifiableList(serviceConstraints_);
-        }
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public context.ContextOuterClass.Constraint.Builder addServiceConstraintsBuilder() {
-        return getServiceConstraintsFieldBuilder().addBuilder(
-            context.ContextOuterClass.Constraint.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public context.ContextOuterClass.Constraint.Builder addServiceConstraintsBuilder(
-          int index) {
-        return getServiceConstraintsFieldBuilder().addBuilder(
-            index, context.ContextOuterClass.Constraint.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .context.Constraint service_constraints = 5;</code>
-       */
-      public java.util.List<context.ContextOuterClass.Constraint.Builder> 
-           getServiceConstraintsBuilderList() {
-        return getServiceConstraintsFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder> 
-          getServiceConstraintsFieldBuilder() {
-        if (serviceConstraintsBuilder_ == null) {
-          serviceConstraintsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              context.ContextOuterClass.Constraint, context.ContextOuterClass.Constraint.Builder, context.ContextOuterClass.ConstraintOrBuilder>(
-                  serviceConstraints_,
-                  ((bitField0_ & 0x00000002) != 0),
-                  getParentForChildren(),
-                  isClean());
-          serviceConstraints_ = null;
-        }
-        return serviceConstraintsBuilder_;
+        return result;
       }
 
       @java.lang.Override
@@ -31420,16 +31214,51 @@ public final class ContextOuterClass {
         } else {
           result.configRules_ = configRulesBuilder_.build();
         }
+        onBuilt();
+        return result;
+      }
 
-        return this;
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
         if (other instanceof context.ContextOuterClass.ServiceConfig) {
           return mergeFrom((context.ContextOuterClass.ServiceConfig)other);
         } else {
-          serviceStatusBuilder_.mergeFrom(value);
+          super.mergeFrom(other);
+          return this;
         }
+      }
 
       public Builder mergeFrom(context.ContextOuterClass.ServiceConfig other) {
         if (other == context.ContextOuterClass.ServiceConfig.getDefaultInstance()) return this;
@@ -31463,19 +31292,10 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-      /**
-       * <code>.context.ServiceStatus service_status = 6;</code>
-       */
-      public Builder clearServiceStatus() {
-        if (serviceStatusBuilder_ == null) {
-          serviceStatus_ = null;
-          onChanged();
-        } else {
-          serviceStatus_ = null;
-          serviceStatusBuilder_ = null;
-        }
 
-        return this;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
 
       @java.lang.Override
@@ -31494,22 +31314,7 @@ public final class ContextOuterClass {
             mergeFrom(parsedMessage);
           }
         }
-      }
-      /**
-       * <code>.context.ServiceStatus service_status = 6;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceStatus, context.ContextOuterClass.ServiceStatus.Builder, context.ContextOuterClass.ServiceStatusOrBuilder> 
-          getServiceStatusFieldBuilder() {
-        if (serviceStatusBuilder_ == null) {
-          serviceStatusBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ServiceStatus, context.ContextOuterClass.ServiceStatus.Builder, context.ContextOuterClass.ServiceStatusOrBuilder>(
-                  getServiceStatus(),
-                  getParentForChildren(),
-                  isClean());
-          serviceStatus_ = null;
-        }
-        return serviceStatusBuilder_;
+        return this;
       }
       private int bitField0_;
 
@@ -33916,7 +33721,6 @@ public final class ContextOuterClass {
           super.mergeFrom(other);
           return this;
         }
-        return this;
       }
 
       public Builder mergeFrom(context.ContextOuterClass.ServiceFilter other) {
@@ -33982,7 +33786,6 @@ public final class ContextOuterClass {
         } else {
           return serviceIdsBuilder_.getMessage();
         }
-        return this;
       }
       /**
        * <code>.context.ServiceIdList service_ids = 1;</code>
@@ -33997,6 +33800,7 @@ public final class ContextOuterClass {
         } else {
           serviceIdsBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
@@ -34010,6 +33814,7 @@ public final class ContextOuterClass {
         } else {
           serviceIdsBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
@@ -34027,6 +33832,8 @@ public final class ContextOuterClass {
         } else {
           serviceIdsBuilder_.mergeFrom(value);
         }
+
+        return this;
       }
       /**
        * <code>.context.ServiceIdList service_ids = 1;</code>
@@ -34039,6 +33846,8 @@ public final class ContextOuterClass {
           serviceIds_ = null;
           serviceIdsBuilder_ = null;
         }
+
+        return this;
       }
       /**
        * <code>.context.ServiceIdList service_ids = 1;</code>
@@ -34290,7 +34099,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -34342,9 +34150,6 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          services_ = java.util.Collections.unmodifiableList(services_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -34623,7 +34428,6 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getServicesFieldBuilder();
         }
       }
       @java.lang.Override
@@ -35732,10 +35536,6 @@ public final class ContextOuterClass {
           return sliceUuidBuilder_.getMessage();
         }
       }
-
-      private context.ContextOuterClass.ServiceId serviceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ServiceId, context.ContextOuterClass.ServiceId.Builder, context.ContextOuterClass.ServiceIdOrBuilder> serviceIdBuilder_;
       /**
        * <code>.context.Uuid slice_uuid = 2;</code>
        */
@@ -36113,6 +35913,7 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
+      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -36442,9 +36243,6 @@ public final class ContextOuterClass {
     public int getSliceServiceIdsCount() {
       return sliceServiceIds_.size();
     }
-
-    public static final int SLICE_UUID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.Uuid sliceUuid_;
     /**
      * <code>repeated .context.ServiceId slice_service_ids = 5;</code>
      */
@@ -37330,10 +37128,6 @@ public final class ContextOuterClass {
 
         return this;
       }
-
-      private context.ContextOuterClass.Uuid sliceUuid_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Uuid, context.ContextOuterClass.Uuid.Builder, context.ContextOuterClass.UuidOrBuilder> sliceUuidBuilder_;
       /**
        * <code>.context.SliceId slice_id = 1;</code>
        */
@@ -37418,8 +37212,6 @@ public final class ContextOuterClass {
         } else {
           return (java.lang.String) ref;
         }
-
-        return this;
       }
       /**
        * <code>string name = 2;</code>
@@ -37437,8 +37229,6 @@ public final class ContextOuterClass {
         } else {
           return (com.google.protobuf.ByteString) ref;
         }
-
-        return this;
       }
       /**
        * <code>string name = 2;</code>
@@ -38714,6 +38504,7 @@ public final class ContextOuterClass {
         } else {
           sliceOwnerBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
@@ -38727,6 +38518,7 @@ public final class ContextOuterClass {
         } else {
           sliceOwnerBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
@@ -38740,12 +38532,11 @@ public final class ContextOuterClass {
           } else {
             sliceOwner_ = value;
           }
-          ensureSliceServiceIdsIsMutable();
-          sliceServiceIds_.add(value);
           onChanged();
         } else {
           sliceOwnerBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
@@ -38759,6 +38550,7 @@ public final class ContextOuterClass {
           sliceOwner_ = null;
           sliceOwnerBuilder_ = null;
         }
+
         return this;
       }
       /**
@@ -38817,7 +38609,6 @@ public final class ContextOuterClass {
         } else {
           return timestampBuilder_.getMessage();
         }
-        return this;
       }
       /**
        * <code>.context.Timestamp timestamp = 10;</code>
@@ -38832,6 +38623,7 @@ public final class ContextOuterClass {
         } else {
           timestampBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
@@ -38845,6 +38637,7 @@ public final class ContextOuterClass {
         } else {
           timestampBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
@@ -38862,6 +38655,7 @@ public final class ContextOuterClass {
         } else {
           timestampBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
@@ -38875,6 +38669,7 @@ public final class ContextOuterClass {
           timestamp_ = null;
           timestampBuilder_ = null;
         }
+
         return this;
       }
       /**
@@ -39157,17 +38952,16 @@ public final class ContextOuterClass {
       }
     }
 
-      private java.util.List<context.ContextOuterClass.SliceId> sliceSubsliceIds_ =
-        java.util.Collections.emptyList();
-      private void ensureSliceSubsliceIdsIsMutable() {
-        if (!((bitField0_ & 0x00000008) != 0)) {
-          sliceSubsliceIds_ = new java.util.ArrayList<context.ContextOuterClass.SliceId>(sliceSubsliceIds_);
-          bitField0_ |= 0x00000008;
-         }
-      }
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
 
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceSubsliceIdsBuilder_;
+      memoizedIsInitialized = 1;
+      return true;
+    }
 
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
@@ -39194,19 +38988,15 @@ public final class ContextOuterClass {
       if (!getOwnerStringBytes().isEmpty()) {
         size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ownerString_);
       }
-      /**
-       * <code>repeated .context.SliceId slice_subslice_ids = 6;</code>
-       */
-      public Builder setSliceSubsliceIds(
-          int index, context.ContextOuterClass.SliceId.Builder builderForValue) {
-        if (sliceSubsliceIdsBuilder_ == null) {
-          ensureSliceSubsliceIdsIsMutable();
-          sliceSubsliceIds_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          sliceSubsliceIdsBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
       }
       if (!(obj instanceof context.ContextOuterClass.SliceOwner)) {
         return super.equals(obj);
@@ -39351,55 +39141,21 @@ public final class ContextOuterClass {
             .ensureFieldAccessorsInitialized(
                 context.ContextOuterClass.SliceOwner.class, context.ContextOuterClass.SliceOwner.Builder.class);
       }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder setSliceStatus(context.ContextOuterClass.SliceStatus value) {
-        if (sliceStatusBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          sliceStatus_ = value;
-          onChanged();
-        } else {
-          sliceStatusBuilder_.setMessage(value);
-        }
 
       // Construct using context.ContextOuterClass.SliceOwner.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder setSliceStatus(
-          context.ContextOuterClass.SliceStatus.Builder builderForValue) {
-        if (sliceStatusBuilder_ == null) {
-          sliceStatus_ = builderForValue.build();
-          onChanged();
-        } else {
-          sliceStatusBuilder_.setMessage(builderForValue.build());
-        }
 
-        return this;
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
       }
-      /**
-       * <code>.context.SliceStatus slice_status = 7;</code>
-       */
-      public Builder mergeSliceStatus(context.ContextOuterClass.SliceStatus value) {
-        if (sliceStatusBuilder_ == null) {
-          if (sliceStatus_ != null) {
-            sliceStatus_ =
-              context.ContextOuterClass.SliceStatus.newBuilder(sliceStatus_).mergeFrom(value).buildPartial();
-          } else {
-            sliceStatus_ = value;
-          }
-          onChanged();
-        } else {
-          sliceStatusBuilder_.mergeFrom(value);
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
         }
-
-        return this;
       }
       @java.lang.Override
       public Builder clear() {
@@ -39432,6 +39188,7 @@ public final class ContextOuterClass {
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
+        return result;
       }
 
       @java.lang.Override
@@ -39447,15 +39204,47 @@ public final class ContextOuterClass {
         return result;
       }
 
-        return this;
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
         if (other instanceof context.ContextOuterClass.SliceOwner) {
           return mergeFrom((context.ContextOuterClass.SliceOwner)other);
         } else {
-          sliceConfigBuilder_.mergeFrom(value);
+          super.mergeFrom(other);
+          return this;
         }
+      }
 
       public Builder mergeFrom(context.ContextOuterClass.SliceOwner other) {
         if (other == context.ContextOuterClass.SliceOwner.getDefaultInstance()) return this;
@@ -39470,19 +39259,10 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-      /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
-       */
-      public Builder clearSliceConfig() {
-        if (sliceConfigBuilder_ == null) {
-          sliceConfig_ = null;
-          onChanged();
-        } else {
-          sliceConfig_ = null;
-          sliceConfigBuilder_ = null;
-        }
 
-        return this;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
 
       @java.lang.Override
@@ -39501,22 +39281,7 @@ public final class ContextOuterClass {
             mergeFrom(parsedMessage);
           }
         }
-      }
-      /**
-       * <code>.context.SliceConfig slice_config = 8;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder> 
-          getSliceConfigFieldBuilder() {
-        if (sliceConfigBuilder_ == null) {
-          sliceConfigBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.SliceConfig, context.ContextOuterClass.SliceConfig.Builder, context.ContextOuterClass.SliceConfigOrBuilder>(
-                  getSliceConfig(),
-                  getParentForChildren(),
-                  isClean());
-          sliceConfig_ = null;
-        }
-        return sliceConfigBuilder_;
+        return this;
       }
 
       private context.ContextOuterClass.Uuid ownerUuid_;
@@ -40161,22 +39926,9 @@ public final class ContextOuterClass {
         return this;
       }
 
-    @java.lang.Override
-    protected Builder newBuilderForType(
-        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
-      Builder builder = new Builder(parent);
-      return builder;
-    }
-    /**
-     * Protobuf type {@code context.SliceOwner}
-     */
-    public static final class Builder extends
-        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:context.SliceOwner)
-        context.ContextOuterClass.SliceOwnerOrBuilder {
-      public static final com.google.protobuf.Descriptors.Descriptor
-          getDescriptor() {
-        return context.ContextOuterClass.internal_static_context_SliceOwner_descriptor;
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
 
       @java.lang.Override
@@ -40665,7 +40417,6 @@ public final class ContextOuterClass {
         } else {
           configRulesBuilder_.clear();
         }
-
         return this;
       }
 
@@ -40877,6 +40628,7 @@ public final class ContextOuterClass {
         } else {
           configRulesBuilder_.setMessage(index, builderForValue.build());
         }
+        return this;
       }
       /**
        * <code>repeated .context.ConfigRule config_rules = 1;</code>
@@ -40892,8 +40644,6 @@ public final class ContextOuterClass {
         } else {
           configRulesBuilder_.addMessage(value);
         }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
         return this;
       }
       /**
@@ -40913,8 +40663,6 @@ public final class ContextOuterClass {
         }
         return this;
       }
-
-      private int sliceStatus_ = 0;
       /**
        * <code>repeated .context.ConfigRule config_rules = 1;</code>
        */
@@ -40969,9 +40717,6 @@ public final class ContextOuterClass {
         } else {
           configRulesBuilder_.clear();
         }
-        
-        sliceStatus_ = value.getNumber();
-        onChanged();
         return this;
       }
       /**
@@ -42774,7 +42519,6 @@ public final class ContextOuterClass {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -42838,9 +42582,6 @@ public final class ContextOuterClass {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          slices_ = java.util.Collections.unmodifiableList(slices_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -43192,7 +42933,6 @@ public final class ContextOuterClass {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getSlicesFieldBuilder();
         }
       }
       @java.lang.Override
@@ -44345,10 +44085,6 @@ public final class ContextOuterClass {
           return sliceIdBuilder_.getMessage();
         }
       }
-
-      private context.ContextOuterClass.SliceId sliceId_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.SliceId, context.ContextOuterClass.SliceId.Builder, context.ContextOuterClass.SliceIdOrBuilder> sliceIdBuilder_;
       /**
        * <code>.context.SliceId slice_id = 2;</code>
        */
@@ -46491,8 +46227,6 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-
-      private int etherType_ ;
       /**
        * <code>string dst_mac_address = 2;</code>
        * @return This builder for chaining.
@@ -46602,8 +46336,6 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-
-      private int mplsTrafficClass_ ;
       /**
        * <code>uint32 mpls_label = 5;</code>
        * @return This builder for chaining.
@@ -49145,189 +48877,6 @@ public final class ContextOuterClass {
         return l0Builder_;
       }
 
-      private context.ContextOuterClass.ConnectionSettings_L2 l2_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder> l2Builder_;
-      /**
-       * <code>.context.ConnectionSettings_L2 l2 = 2;</code>
-       * @return Whether the l2 field is set.
-       */
-      public boolean hasL2() {
-        return l2Builder_ != null || l2_ != null;
-      }
-      @java.lang.Override
-      public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof context.ContextOuterClass.ConnectionSettings) {
-          return mergeFrom((context.ContextOuterClass.ConnectionSettings)other);
-        } else {
-          return l2Builder_.getMessage();
-        }
-      }
-
-      public Builder mergeFrom(context.ContextOuterClass.ConnectionSettings other) {
-        if (other == context.ContextOuterClass.ConnectionSettings.getDefaultInstance()) return this;
-        if (other.hasL0()) {
-          mergeL0(other.getL0());
-        }
-        if (other.hasL2()) {
-          mergeL2(other.getL2());
-        }
-        if (other.hasL3()) {
-          mergeL3(other.getL3());
-        }
-        if (other.hasL4()) {
-          mergeL4(other.getL4());
-        }
-        this.mergeUnknownFields(other.unknownFields);
-        onChanged();
-        return this;
-      }
-
-      @java.lang.Override
-      public final boolean isInitialized() {
-        return true;
-      }
-
-      @java.lang.Override
-      public Builder mergeFrom(
-          com.google.protobuf.CodedInputStream input,
-          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
-          throws java.io.IOException {
-        context.ContextOuterClass.ConnectionSettings parsedMessage = null;
-        try {
-          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
-        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (context.ContextOuterClass.ConnectionSettings) e.getUnfinishedMessage();
-          throw e.unwrapIOException();
-        } finally {
-          if (parsedMessage != null) {
-            mergeFrom(parsedMessage);
-          }
-        }
-        return this;
-      }
-
-      private context.ContextOuterClass.ConnectionSettings_L0 l0_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder> l0Builder_;
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       * @return Whether the l0 field is set.
-       */
-      public boolean hasL0() {
-        return l0Builder_ != null || l0_ != null;
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       * @return The l0.
-       */
-      public context.ContextOuterClass.ConnectionSettings_L0 getL0() {
-        if (l0Builder_ == null) {
-          return l0_ == null ? context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
-        } else {
-          return l0Builder_.getMessage();
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      public Builder setL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
-        if (l0Builder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          l0_ = value;
-          onChanged();
-        } else {
-          l0Builder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      public Builder setL0(
-          context.ContextOuterClass.ConnectionSettings_L0.Builder builderForValue) {
-        if (l0Builder_ == null) {
-          l0_ = builderForValue.build();
-          onChanged();
-        } else {
-          l0Builder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      public Builder mergeL0(context.ContextOuterClass.ConnectionSettings_L0 value) {
-        if (l0Builder_ == null) {
-          if (l0_ != null) {
-            l0_ =
-              context.ContextOuterClass.ConnectionSettings_L0.newBuilder(l0_).mergeFrom(value).buildPartial();
-          } else {
-            l0_ = value;
-          }
-          onChanged();
-        } else {
-          l0Builder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      public Builder clearL0() {
-        if (l0Builder_ == null) {
-          l0_ = null;
-          onChanged();
-        } else {
-          l0_ = null;
-          l0Builder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      public context.ContextOuterClass.ConnectionSettings_L0.Builder getL0Builder() {
-        
-        onChanged();
-        return getL0FieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      public context.ContextOuterClass.ConnectionSettings_L0OrBuilder getL0OrBuilder() {
-        if (l0Builder_ != null) {
-          return l0Builder_.getMessageOrBuilder();
-        } else {
-          return l0_ == null ?
-              context.ContextOuterClass.ConnectionSettings_L0.getDefaultInstance() : l0_;
-        }
-      }
-      /**
-       * <code>.context.ConnectionSettings_L0 l0 = 1;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder> 
-          getL0FieldBuilder() {
-        if (l0Builder_ == null) {
-          l0Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.ConnectionSettings_L0, context.ContextOuterClass.ConnectionSettings_L0.Builder, context.ContextOuterClass.ConnectionSettings_L0OrBuilder>(
-                  getL0(),
-                  getParentForChildren(),
-                  isClean());
-          l0_ = null;
-        }
-        return l0Builder_;
-      }
-
       private context.ContextOuterClass.ConnectionSettings_L2 l2_;
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.ConnectionSettings_L2, context.ContextOuterClass.ConnectionSettings_L2.Builder, context.ContextOuterClass.ConnectionSettings_L2OrBuilder> l2Builder_;
@@ -49484,10 +49033,6 @@ public final class ContextOuterClass {
 
         return this;
       }
-
-      private context.ContextOuterClass.ConnectionSettings_L3 l3_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L3, context.ContextOuterClass.ConnectionSettings_L3.Builder, context.ContextOuterClass.ConnectionSettings_L3OrBuilder> l3Builder_;
       /**
        * <code>.context.ConnectionSettings_L3 l3 = 3;</code>
        */
@@ -49591,10 +49136,6 @@ public final class ContextOuterClass {
           return l4Builder_.getMessage();
         }
       }
-
-      private context.ContextOuterClass.ConnectionSettings_L4 l4_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.ConnectionSettings_L4, context.ContextOuterClass.ConnectionSettings_L4.Builder, context.ContextOuterClass.ConnectionSettings_L4OrBuilder> l4Builder_;
       /**
        * <code>.context.ConnectionSettings_L4 l4 = 4;</code>
        */
@@ -50021,9 +49562,6 @@ public final class ContextOuterClass {
     public boolean hasServiceId() {
       return serviceId_ != null;
     }
-
-    public static final int SERVICE_ID_FIELD_NUMBER = 2;
-    private context.ContextOuterClass.ServiceId serviceId_;
     /**
      * <code>.context.ServiceId service_id = 2;</code>
      * @return The serviceId.
@@ -50177,9 +49715,7 @@ public final class ContextOuterClass {
       }
       unknownFields.writeTo(output);
     }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
+
     @java.lang.Override
     public int getSerializedSize() {
       int size = memoizedSize;
@@ -50210,9 +49746,7 @@ public final class ContextOuterClass {
       memoizedSize = size;
       return size;
     }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
+
     @java.lang.Override
     public boolean equals(final java.lang.Object obj) {
       if (obj == this) {
@@ -50245,9 +49779,7 @@ public final class ContextOuterClass {
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
-    /**
-     * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
-     */
+
     @java.lang.Override
     public int hashCode() {
       if (memoizedHashCode != 0) {
@@ -50350,31 +49882,25 @@ public final class ContextOuterClass {
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
 
-    public static final int SUB_SERVICE_IDS_FIELD_NUMBER = 4;
-    private java.util.List<context.ContextOuterClass.ServiceId> subServiceIds_;
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
-     */
     @java.lang.Override
-    public java.util.List<context.ContextOuterClass.ServiceId> getSubServiceIdsList() {
-      return subServiceIds_;
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
     }
     public static Builder newBuilder(context.ContextOuterClass.Connection prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
-     */
     @java.lang.Override
-    public int getSubServiceIdsCount() {
-      return subServiceIds_.size();
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
     }
-    /**
-     * <code>repeated .context.ServiceId sub_service_ids = 4;</code>
-     */
+
     @java.lang.Override
-    public context.ContextOuterClass.ServiceId getSubServiceIds(int index) {
-      return subServiceIds_.get(index);
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
     }
     /**
      * Protobuf type {@code context.Connection}
@@ -50510,14 +50036,37 @@ public final class ContextOuterClass {
         return result;
       }
 
-    @java.lang.Override
-    public void writeTo(com.google.protobuf.CodedOutputStream output)
-                        throws java.io.IOException {
-      if (connectionId_ != null) {
-        output.writeMessage(1, getConnectionId());
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
       }
-      if (serviceId_ != null) {
-        output.writeMessage(2, getServiceId());
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
@@ -50596,11 +50145,11 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-      if (settings_ != null) {
-        output.writeMessage(5, getSettings());
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
       }
-      unknownFields.writeTo(output);
-    }
 
       @java.lang.Override
       public Builder mergeFrom(
@@ -51062,7 +50611,6 @@ public final class ContextOuterClass {
         } else {
           return java.util.Collections.unmodifiableList(pathHopsEndpointIds_);
         }
-        return this;
       }
       /**
        * <code>repeated .context.EndPointId path_hops_endpoint_ids = 3;</code>
@@ -52448,9 +51996,6 @@ public final class ContextOuterClass {
     public int getConnectionsCount() {
       return connections_.size();
     }
-
-    public static final int CONNECTIONS_FIELD_NUMBER = 1;
-    private java.util.List<context.ContextOuterClass.Connection> connections_;
     /**
      * <code>repeated .context.Connection connections = 1;</code>
      */
@@ -52817,14 +52362,6 @@ public final class ContextOuterClass {
           bitField0_ |= 0x00000001;
          }
       }
-      if (hasConnectionId()) {
-        hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getConnectionId().hashCode();
-      }
-      hash = (29 * hash) + unknownFields.hashCode();
-      memoizedHashCode = hash;
-      return hash;
-    }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
           context.ContextOuterClass.Connection, context.ContextOuterClass.Connection.Builder, context.ContextOuterClass.ConnectionOrBuilder> connectionsBuilder_;
@@ -52904,6 +52441,7 @@ public final class ContextOuterClass {
         } else {
           connectionsBuilder_.addMessage(value);
         }
+        return this;
       }
       /**
        * <code>repeated .context.Connection connections = 1;</code>
@@ -52976,7 +52514,7 @@ public final class ContextOuterClass {
         } else {
           connectionsBuilder_.clear();
         }
-        return result;
+        return this;
       }
       /**
        * <code>repeated .context.Connection connections = 1;</code>
@@ -53018,8 +52556,6 @@ public final class ContextOuterClass {
         } else {
           return java.util.Collections.unmodifiableList(connections_);
         }
-        onBuilt();
-        return result;
       }
       /**
        * <code>repeated .context.Connection connections = 1;</code>
@@ -54121,9 +53657,6 @@ public final class ContextOuterClass {
     public context.ContextOuterClass.TopologyId getTopologyId() {
       return topologyId_ == null ? context.ContextOuterClass.TopologyId.getDefaultInstance() : topologyId_;
     }
-
-    public static final int ENDPOINT_UUID_FIELD_NUMBER = 3;
-    private context.ContextOuterClass.Uuid endpointUuid_;
     /**
      * <code>.context.TopologyId topology_id = 1;</code>
      */
@@ -54702,8 +54235,6 @@ public final class ContextOuterClass {
         } else {
           return deviceIdBuilder_.getMessage();
         }
-
-        return this;
       }
       /**
        * <code>.context.DeviceId device_id = 2;</code>
@@ -55346,9 +54877,6 @@ public final class ContextOuterClass {
     public kpi_sample_types.KpiSampleTypes.KpiSampleType getKpiSampleTypes(int index) {
       return kpiSampleTypes_converter_.convert(kpiSampleTypes_.get(index));
     }
-
-    public static final int NAME_FIELD_NUMBER = 2;
-    private volatile java.lang.Object name_;
     /**
      * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
      * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
@@ -56174,17 +55702,6 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-
-      private context.ContextOuterClass.Location endpointLocation_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Location, context.ContextOuterClass.Location.Builder, context.ContextOuterClass.LocationOrBuilder> endpointLocationBuilder_;
-      /**
-       * <code>.context.Location endpoint_location = 5;</code>
-       * @return Whether the endpointLocation field is set.
-       */
-      public boolean hasEndpointLocation() {
-        return endpointLocationBuilder_ != null || endpointLocation_ != null;
-      }
       /**
        * <code>repeated .kpi_sample_types.KpiSampleType kpi_sample_types = 4;</code>
        * @return A list containing the enum numeric values on the wire for kpiSampleTypes.
@@ -61693,10 +61210,6 @@ public final class ContextOuterClass {
         getConstraintValueBytes();
   }
   /**
-   * <pre>
-   * ----- Constraint ----------------------------------------------------------------------------------------------------
-   * </pre>
-   *
    * Protobuf type {@code context.Constraint_Custom}
    */
   public static final class Constraint_Custom extends
@@ -62028,10 +61541,6 @@ public final class ContextOuterClass {
       return builder;
     }
     /**
-     * <pre>
-     * ----- Constraint ----------------------------------------------------------------------------------------------------
-     * </pre>
-     *
      * Protobuf type {@code context.Constraint_Custom}
      */
     public static final class Builder extends
@@ -67678,11 +67187,6 @@ public final class ContextOuterClass {
               input.popLimit(oldLimit);
               break;
             }
-            case 29: {
-
-              availability_ = input.readFloat();
-              break;
-            }
             default: {
               if (!parseUnknownField(
                   input, unknownFields, extensionRegistry, tag)) {
@@ -67776,21 +67280,6 @@ public final class ContextOuterClass {
     }
     private int isolationLevelMemoizedSerializedSize;
 
-    public static final int AVAILABILITY_FIELD_NUMBER = 3;
-    private float availability_;
-    /**
-     * <pre>
-     * 0.0 .. 100.0 percentage of availability
-     * </pre>
-     *
-     * <code>float availability = 3;</code>
-     * @return The availability.
-     */
-    @java.lang.Override
-    public float getAvailability() {
-      return availability_;
-    }
-
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -67813,9 +67302,6 @@ public final class ContextOuterClass {
       for (int i = 0; i < isolationLevel_.size(); i++) {
         output.writeEnumNoTag(isolationLevel_.get(i));
       }
-      if (availability_ != 0F) {
-        output.writeFloat(3, availability_);
-      }
       unknownFields.writeTo(output);
     }
 
@@ -67837,10 +67323,6 @@ public final class ContextOuterClass {
             .computeUInt32SizeNoTag(dataSize);
         }isolationLevelMemoizedSerializedSize = dataSize;
       }
-      if (availability_ != 0F) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(3, availability_);
-      }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
       return size;
@@ -68097,9 +67579,6 @@ public final class ContextOuterClass {
           }
           onChanged();
         }
-        if (other.getAvailability() != 0F) {
-          setAvailability(other.getAvailability());
-        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -68269,49 +67748,6 @@ public final class ContextOuterClass {
         onChanged();
         return this;
       }
-
-      private float availability_ ;
-      /**
-       * <pre>
-       * 0.0 .. 100.0 percentage of availability
-       * </pre>
-       *
-       * <code>float availability = 3;</code>
-       * @return The availability.
-       */
-      @java.lang.Override
-      public float getAvailability() {
-        return availability_;
-      }
-      /**
-       * <pre>
-       * 0.0 .. 100.0 percentage of availability
-       * </pre>
-       *
-       * <code>float availability = 3;</code>
-       * @param value The availability to set.
-       * @return This builder for chaining.
-       */
-      public Builder setAvailability(float value) {
-        
-        availability_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <pre>
-       * 0.0 .. 100.0 percentage of availability
-       * </pre>
-       *
-       * <code>float availability = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearAvailability() {
-        
-        availability_ = 0F;
-        onChanged();
-        return this;
-      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -69978,137 +69414,148 @@ public final class ContextOuterClass {
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The enum numeric value on the wire for action.
+     */
+    int getActionValue();
+    /**
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The action.
+     */
+    context.ContextOuterClass.ConstraintActionEnum getAction();
+
+    /**
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return Whether the custom field is set.
      */
     boolean hasCustom();
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return The custom.
      */
     context.ContextOuterClass.Constraint_Custom getCustom();
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      */
     context.ContextOuterClass.Constraint_CustomOrBuilder getCustomOrBuilder();
 
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return Whether the schedule field is set.
      */
     boolean hasSchedule();
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return The schedule.
      */
     context.ContextOuterClass.Constraint_Schedule getSchedule();
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      */
     context.ContextOuterClass.Constraint_ScheduleOrBuilder getScheduleOrBuilder();
 
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return Whether the endpointLocation field is set.
      */
     boolean hasEndpointLocation();
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return The endpointLocation.
      */
     context.ContextOuterClass.Constraint_EndPointLocation getEndpointLocation();
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      */
     context.ContextOuterClass.Constraint_EndPointLocationOrBuilder getEndpointLocationOrBuilder();
 
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return Whether the endpointPriority field is set.
      */
     boolean hasEndpointPriority();
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return The endpointPriority.
      */
     context.ContextOuterClass.Constraint_EndPointPriority getEndpointPriority();
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      */
     context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder getEndpointPriorityOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return Whether the slaCapacity field is set.
      */
     boolean hasSlaCapacity();
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return The slaCapacity.
      */
     context.ContextOuterClass.Constraint_SLA_Capacity getSlaCapacity();
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      */
     context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder getSlaCapacityOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return Whether the slaLatency field is set.
      */
     boolean hasSlaLatency();
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return The slaLatency.
      */
     context.ContextOuterClass.Constraint_SLA_Latency getSlaLatency();
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      */
     context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder getSlaLatencyOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return Whether the slaAvailability field is set.
      */
     boolean hasSlaAvailability();
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return The slaAvailability.
      */
     context.ContextOuterClass.Constraint_SLA_Availability getSlaAvailability();
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      */
     context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder getSlaAvailabilityOrBuilder();
 
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return Whether the slaIsolation field is set.
      */
     boolean hasSlaIsolation();
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return The slaIsolation.
      */
     context.ContextOuterClass.Constraint_SLA_Isolation_level getSlaIsolation();
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      */
     context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder getSlaIsolationOrBuilder();
 
     /**
-     * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
      * @return Whether the exclusions field is set.
      */
     boolean hasExclusions();
     /**
-     * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
      * @return The exclusions.
      */
     context.ContextOuterClass.Constraint_Exclusions getExclusions();
     /**
-     * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
      */
     context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder();
 
@@ -70127,6 +69574,7 @@ public final class ContextOuterClass {
       super(builder);
     }
     private Constraint() {
+      action_ = 0;
     }
 
     @java.lang.Override
@@ -70159,9 +69607,15 @@ public final class ContextOuterClass {
             case 0:
               done = true;
               break;
-            case 10: {
+            case 8: {
+              int rawValue = input.readEnum();
+
+              action_ = rawValue;
+              break;
+            }
+            case 18: {
               context.ContextOuterClass.Constraint_Custom.Builder subBuilder = null;
-              if (constraintCase_ == 1) {
+              if (constraintCase_ == 2) {
                 subBuilder = ((context.ContextOuterClass.Constraint_Custom) constraint_).toBuilder();
               }
               constraint_ =
@@ -70170,12 +69624,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Custom) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 1;
+              constraintCase_ = 2;
               break;
             }
-            case 18: {
+            case 26: {
               context.ContextOuterClass.Constraint_Schedule.Builder subBuilder = null;
-              if (constraintCase_ == 2) {
+              if (constraintCase_ == 3) {
                 subBuilder = ((context.ContextOuterClass.Constraint_Schedule) constraint_).toBuilder();
               }
               constraint_ =
@@ -70184,12 +69638,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Schedule) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 2;
+              constraintCase_ = 3;
               break;
             }
-            case 26: {
+            case 34: {
               context.ContextOuterClass.Constraint_EndPointLocation.Builder subBuilder = null;
-              if (constraintCase_ == 3) {
+              if (constraintCase_ == 4) {
                 subBuilder = ((context.ContextOuterClass.Constraint_EndPointLocation) constraint_).toBuilder();
               }
               constraint_ =
@@ -70198,12 +69652,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 3;
+              constraintCase_ = 4;
               break;
             }
-            case 34: {
+            case 42: {
               context.ContextOuterClass.Constraint_EndPointPriority.Builder subBuilder = null;
-              if (constraintCase_ == 4) {
+              if (constraintCase_ == 5) {
                 subBuilder = ((context.ContextOuterClass.Constraint_EndPointPriority) constraint_).toBuilder();
               }
               constraint_ =
@@ -70212,12 +69666,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 4;
+              constraintCase_ = 5;
               break;
             }
-            case 42: {
+            case 50: {
               context.ContextOuterClass.Constraint_SLA_Capacity.Builder subBuilder = null;
-              if (constraintCase_ == 5) {
+              if (constraintCase_ == 6) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_).toBuilder();
               }
               constraint_ =
@@ -70226,12 +69680,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 5;
+              constraintCase_ = 6;
               break;
             }
-            case 50: {
+            case 58: {
               context.ContextOuterClass.Constraint_SLA_Latency.Builder subBuilder = null;
-              if (constraintCase_ == 6) {
+              if (constraintCase_ == 7) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Latency) constraint_).toBuilder();
               }
               constraint_ =
@@ -70240,12 +69694,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 6;
+              constraintCase_ = 7;
               break;
             }
-            case 58: {
+            case 66: {
               context.ContextOuterClass.Constraint_SLA_Availability.Builder subBuilder = null;
-              if (constraintCase_ == 7) {
+              if (constraintCase_ == 8) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Availability) constraint_).toBuilder();
               }
               constraint_ =
@@ -70254,12 +69708,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 7;
+              constraintCase_ = 8;
               break;
             }
-            case 66: {
+            case 74: {
               context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder subBuilder = null;
-              if (constraintCase_ == 8) {
+              if (constraintCase_ == 9) {
                 subBuilder = ((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_).toBuilder();
               }
               constraint_ =
@@ -70268,12 +69722,12 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 8;
+              constraintCase_ = 9;
               break;
             }
-            case 74: {
+            case 82: {
               context.ContextOuterClass.Constraint_Exclusions.Builder subBuilder = null;
-              if (constraintCase_ == 9) {
+              if (constraintCase_ == 10) {
                 subBuilder = ((context.ContextOuterClass.Constraint_Exclusions) constraint_).toBuilder();
               }
               constraint_ =
@@ -70282,7 +69736,7 @@ public final class ContextOuterClass {
                 subBuilder.mergeFrom((context.ContextOuterClass.Constraint_Exclusions) constraint_);
                 constraint_ = subBuilder.buildPartial();
               }
-              constraintCase_ = 9;
+              constraintCase_ = 10;
               break;
             }
             default: {
@@ -70322,15 +69776,15 @@ public final class ContextOuterClass {
     public enum ConstraintCase
         implements com.google.protobuf.Internal.EnumLite,
             com.google.protobuf.AbstractMessage.InternalOneOfEnum {
-      CUSTOM(1),
-      SCHEDULE(2),
-      ENDPOINT_LOCATION(3),
-      ENDPOINT_PRIORITY(4),
-      SLA_CAPACITY(5),
-      SLA_LATENCY(6),
-      SLA_AVAILABILITY(7),
-      SLA_ISOLATION(8),
-      EXCLUSIONS(9),
+      CUSTOM(2),
+      SCHEDULE(3),
+      ENDPOINT_LOCATION(4),
+      ENDPOINT_PRIORITY(5),
+      SLA_CAPACITY(6),
+      SLA_LATENCY(7),
+      SLA_AVAILABILITY(8),
+      SLA_ISOLATION(9),
+      EXCLUSIONS(10),
       CONSTRAINT_NOT_SET(0);
       private final int value;
       private ConstraintCase(int value) {
@@ -70348,15 +69802,15 @@ public final class ContextOuterClass {
 
       public static ConstraintCase forNumber(int value) {
         switch (value) {
-          case 1: return CUSTOM;
-          case 2: return SCHEDULE;
-          case 3: return ENDPOINT_LOCATION;
-          case 4: return ENDPOINT_PRIORITY;
-          case 5: return SLA_CAPACITY;
-          case 6: return SLA_LATENCY;
-          case 7: return SLA_AVAILABILITY;
-          case 8: return SLA_ISOLATION;
-          case 9: return EXCLUSIONS;
+          case 2: return CUSTOM;
+          case 3: return SCHEDULE;
+          case 4: return ENDPOINT_LOCATION;
+          case 5: return ENDPOINT_PRIORITY;
+          case 6: return SLA_CAPACITY;
+          case 7: return SLA_LATENCY;
+          case 8: return SLA_AVAILABILITY;
+          case 9: return SLA_ISOLATION;
+          case 10: return EXCLUSIONS;
           case 0: return CONSTRAINT_NOT_SET;
           default: return null;
         }
@@ -70372,280 +69826,299 @@ public final class ContextOuterClass {
           constraintCase_);
     }
 
-    public static final int CUSTOM_FIELD_NUMBER = 1;
+    public static final int ACTION_FIELD_NUMBER = 1;
+    private int action_;
+    /**
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The enum numeric value on the wire for action.
+     */
+    @java.lang.Override public int getActionValue() {
+      return action_;
+    }
+    /**
+     * <code>.context.ConstraintActionEnum action = 1;</code>
+     * @return The action.
+     */
+    @java.lang.Override public context.ContextOuterClass.ConstraintActionEnum getAction() {
+      @SuppressWarnings("deprecation")
+      context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
+      return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
+    }
+
+    public static final int CUSTOM_FIELD_NUMBER = 2;
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return Whether the custom field is set.
      */
     @java.lang.Override
     public boolean hasCustom() {
-      return constraintCase_ == 1;
+      return constraintCase_ == 2;
     }
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      * @return The custom.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_Custom getCustom() {
-      if (constraintCase_ == 1) {
+      if (constraintCase_ == 2) {
          return (context.ContextOuterClass.Constraint_Custom) constraint_;
       }
       return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_Custom custom = 1;</code>
+     * <code>.context.Constraint_Custom custom = 2;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_CustomOrBuilder getCustomOrBuilder() {
-      if (constraintCase_ == 1) {
+      if (constraintCase_ == 2) {
          return (context.ContextOuterClass.Constraint_Custom) constraint_;
       }
       return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
     }
 
-    public static final int SCHEDULE_FIELD_NUMBER = 2;
+    public static final int SCHEDULE_FIELD_NUMBER = 3;
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return Whether the schedule field is set.
      */
     @java.lang.Override
     public boolean hasSchedule() {
-      return constraintCase_ == 2;
+      return constraintCase_ == 3;
     }
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      * @return The schedule.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_Schedule getSchedule() {
-      if (constraintCase_ == 2) {
+      if (constraintCase_ == 3) {
          return (context.ContextOuterClass.Constraint_Schedule) constraint_;
       }
       return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_Schedule schedule = 2;</code>
+     * <code>.context.Constraint_Schedule schedule = 3;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_ScheduleOrBuilder getScheduleOrBuilder() {
-      if (constraintCase_ == 2) {
+      if (constraintCase_ == 3) {
          return (context.ContextOuterClass.Constraint_Schedule) constraint_;
       }
       return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
     }
 
-    public static final int ENDPOINT_LOCATION_FIELD_NUMBER = 3;
+    public static final int ENDPOINT_LOCATION_FIELD_NUMBER = 4;
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return Whether the endpointLocation field is set.
      */
     @java.lang.Override
     public boolean hasEndpointLocation() {
-      return constraintCase_ == 3;
+      return constraintCase_ == 4;
     }
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      * @return The endpointLocation.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointLocation getEndpointLocation() {
-      if (constraintCase_ == 3) {
+      if (constraintCase_ == 4) {
          return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+     * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointLocationOrBuilder getEndpointLocationOrBuilder() {
-      if (constraintCase_ == 3) {
+      if (constraintCase_ == 4) {
          return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
     }
 
-    public static final int ENDPOINT_PRIORITY_FIELD_NUMBER = 4;
+    public static final int ENDPOINT_PRIORITY_FIELD_NUMBER = 5;
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return Whether the endpointPriority field is set.
      */
     @java.lang.Override
     public boolean hasEndpointPriority() {
-      return constraintCase_ == 4;
+      return constraintCase_ == 5;
     }
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      * @return The endpointPriority.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointPriority getEndpointPriority() {
-      if (constraintCase_ == 4) {
+      if (constraintCase_ == 5) {
          return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+     * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder getEndpointPriorityOrBuilder() {
-      if (constraintCase_ == 4) {
+      if (constraintCase_ == 5) {
          return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
       }
       return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
     }
 
-    public static final int SLA_CAPACITY_FIELD_NUMBER = 5;
+    public static final int SLA_CAPACITY_FIELD_NUMBER = 6;
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return Whether the slaCapacity field is set.
      */
     @java.lang.Override
     public boolean hasSlaCapacity() {
-      return constraintCase_ == 5;
+      return constraintCase_ == 6;
     }
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      * @return The slaCapacity.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Capacity getSlaCapacity() {
-      if (constraintCase_ == 5) {
+      if (constraintCase_ == 6) {
          return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+     * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder getSlaCapacityOrBuilder() {
-      if (constraintCase_ == 5) {
+      if (constraintCase_ == 6) {
          return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
     }
 
-    public static final int SLA_LATENCY_FIELD_NUMBER = 6;
+    public static final int SLA_LATENCY_FIELD_NUMBER = 7;
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return Whether the slaLatency field is set.
      */
     @java.lang.Override
     public boolean hasSlaLatency() {
-      return constraintCase_ == 6;
+      return constraintCase_ == 7;
     }
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      * @return The slaLatency.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Latency getSlaLatency() {
-      if (constraintCase_ == 6) {
+      if (constraintCase_ == 7) {
          return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+     * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder getSlaLatencyOrBuilder() {
-      if (constraintCase_ == 6) {
+      if (constraintCase_ == 7) {
          return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
     }
 
-    public static final int SLA_AVAILABILITY_FIELD_NUMBER = 7;
+    public static final int SLA_AVAILABILITY_FIELD_NUMBER = 8;
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return Whether the slaAvailability field is set.
      */
     @java.lang.Override
     public boolean hasSlaAvailability() {
-      return constraintCase_ == 7;
+      return constraintCase_ == 8;
     }
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      * @return The slaAvailability.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Availability getSlaAvailability() {
-      if (constraintCase_ == 7) {
+      if (constraintCase_ == 8) {
          return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+     * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder getSlaAvailabilityOrBuilder() {
-      if (constraintCase_ == 7) {
+      if (constraintCase_ == 8) {
          return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
     }
 
-    public static final int SLA_ISOLATION_FIELD_NUMBER = 8;
+    public static final int SLA_ISOLATION_FIELD_NUMBER = 9;
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return Whether the slaIsolation field is set.
      */
     @java.lang.Override
     public boolean hasSlaIsolation() {
-      return constraintCase_ == 8;
+      return constraintCase_ == 9;
     }
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      * @return The slaIsolation.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Isolation_level getSlaIsolation() {
-      if (constraintCase_ == 8) {
+      if (constraintCase_ == 9) {
          return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+     * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder getSlaIsolationOrBuilder() {
-      if (constraintCase_ == 8) {
+      if (constraintCase_ == 9) {
          return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
       }
       return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
     }
 
-    public static final int EXCLUSIONS_FIELD_NUMBER = 9;
+    public static final int EXCLUSIONS_FIELD_NUMBER = 10;
     /**
-     * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
      * @return Whether the exclusions field is set.
      */
     @java.lang.Override
     public boolean hasExclusions() {
-      return constraintCase_ == 9;
+      return constraintCase_ == 10;
     }
     /**
-     * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
      * @return The exclusions.
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_Exclusions getExclusions() {
-      if (constraintCase_ == 9) {
+      if (constraintCase_ == 10) {
          return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
       }
       return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
     }
     /**
-     * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+     * <code>.context.Constraint_Exclusions exclusions = 10;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder() {
-      if (constraintCase_ == 9) {
+      if (constraintCase_ == 10) {
          return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
       }
       return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
@@ -70665,32 +70138,35 @@ public final class ContextOuterClass {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (constraintCase_ == 1) {
-        output.writeMessage(1, (context.ContextOuterClass.Constraint_Custom) constraint_);
+      if (action_ != context.ContextOuterClass.ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED.getNumber()) {
+        output.writeEnum(1, action_);
       }
       if (constraintCase_ == 2) {
-        output.writeMessage(2, (context.ContextOuterClass.Constraint_Schedule) constraint_);
+        output.writeMessage(2, (context.ContextOuterClass.Constraint_Custom) constraint_);
       }
       if (constraintCase_ == 3) {
-        output.writeMessage(3, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
+        output.writeMessage(3, (context.ContextOuterClass.Constraint_Schedule) constraint_);
       }
       if (constraintCase_ == 4) {
-        output.writeMessage(4, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
+        output.writeMessage(4, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
       }
       if (constraintCase_ == 5) {
-        output.writeMessage(5, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
+        output.writeMessage(5, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
       }
       if (constraintCase_ == 6) {
-        output.writeMessage(6, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
+        output.writeMessage(6, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
       }
       if (constraintCase_ == 7) {
-        output.writeMessage(7, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+        output.writeMessage(7, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
       }
       if (constraintCase_ == 8) {
-        output.writeMessage(8, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+        output.writeMessage(8, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
       }
       if (constraintCase_ == 9) {
-        output.writeMessage(9, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
+        output.writeMessage(9, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+      }
+      if (constraintCase_ == 10) {
+        output.writeMessage(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
       }
       unknownFields.writeTo(output);
     }
@@ -70701,41 +70177,45 @@ public final class ContextOuterClass {
       if (size != -1) return size;
 
       size = 0;
-      if (constraintCase_ == 1) {
+      if (action_ != context.ContextOuterClass.ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED.getNumber()) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, (context.ContextOuterClass.Constraint_Custom) constraint_);
+          .computeEnumSize(1, action_);
       }
       if (constraintCase_ == 2) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, (context.ContextOuterClass.Constraint_Schedule) constraint_);
+          .computeMessageSize(2, (context.ContextOuterClass.Constraint_Custom) constraint_);
       }
       if (constraintCase_ == 3) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
+          .computeMessageSize(3, (context.ContextOuterClass.Constraint_Schedule) constraint_);
       }
       if (constraintCase_ == 4) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
+          .computeMessageSize(4, (context.ContextOuterClass.Constraint_EndPointLocation) constraint_);
       }
       if (constraintCase_ == 5) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
+          .computeMessageSize(5, (context.ContextOuterClass.Constraint_EndPointPriority) constraint_);
       }
       if (constraintCase_ == 6) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(6, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
+          .computeMessageSize(6, (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_);
       }
       if (constraintCase_ == 7) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(7, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
+          .computeMessageSize(7, (context.ContextOuterClass.Constraint_SLA_Latency) constraint_);
       }
       if (constraintCase_ == 8) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(8, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+          .computeMessageSize(8, (context.ContextOuterClass.Constraint_SLA_Availability) constraint_);
       }
       if (constraintCase_ == 9) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(9, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
+          .computeMessageSize(9, (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_);
+      }
+      if (constraintCase_ == 10) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(10, (context.ContextOuterClass.Constraint_Exclusions) constraint_);
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -70752,41 +70232,42 @@ public final class ContextOuterClass {
       }
       context.ContextOuterClass.Constraint other = (context.ContextOuterClass.Constraint) obj;
 
+      if (action_ != other.action_) return false;
       if (!getConstraintCase().equals(other.getConstraintCase())) return false;
       switch (constraintCase_) {
-        case 1:
+        case 2:
           if (!getCustom()
               .equals(other.getCustom())) return false;
           break;
-        case 2:
+        case 3:
           if (!getSchedule()
               .equals(other.getSchedule())) return false;
           break;
-        case 3:
+        case 4:
           if (!getEndpointLocation()
               .equals(other.getEndpointLocation())) return false;
           break;
-        case 4:
+        case 5:
           if (!getEndpointPriority()
               .equals(other.getEndpointPriority())) return false;
           break;
-        case 5:
+        case 6:
           if (!getSlaCapacity()
               .equals(other.getSlaCapacity())) return false;
           break;
-        case 6:
+        case 7:
           if (!getSlaLatency()
               .equals(other.getSlaLatency())) return false;
           break;
-        case 7:
+        case 8:
           if (!getSlaAvailability()
               .equals(other.getSlaAvailability())) return false;
           break;
-        case 8:
+        case 9:
           if (!getSlaIsolation()
               .equals(other.getSlaIsolation())) return false;
           break;
-        case 9:
+        case 10:
           if (!getExclusions()
               .equals(other.getExclusions())) return false;
           break;
@@ -70804,40 +70285,42 @@ public final class ContextOuterClass {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ACTION_FIELD_NUMBER;
+      hash = (53 * hash) + action_;
       switch (constraintCase_) {
-        case 1:
+        case 2:
           hash = (37 * hash) + CUSTOM_FIELD_NUMBER;
           hash = (53 * hash) + getCustom().hashCode();
           break;
-        case 2:
+        case 3:
           hash = (37 * hash) + SCHEDULE_FIELD_NUMBER;
           hash = (53 * hash) + getSchedule().hashCode();
           break;
-        case 3:
+        case 4:
           hash = (37 * hash) + ENDPOINT_LOCATION_FIELD_NUMBER;
           hash = (53 * hash) + getEndpointLocation().hashCode();
           break;
-        case 4:
+        case 5:
           hash = (37 * hash) + ENDPOINT_PRIORITY_FIELD_NUMBER;
           hash = (53 * hash) + getEndpointPriority().hashCode();
           break;
-        case 5:
+        case 6:
           hash = (37 * hash) + SLA_CAPACITY_FIELD_NUMBER;
           hash = (53 * hash) + getSlaCapacity().hashCode();
           break;
-        case 6:
+        case 7:
           hash = (37 * hash) + SLA_LATENCY_FIELD_NUMBER;
           hash = (53 * hash) + getSlaLatency().hashCode();
           break;
-        case 7:
+        case 8:
           hash = (37 * hash) + SLA_AVAILABILITY_FIELD_NUMBER;
           hash = (53 * hash) + getSlaAvailability().hashCode();
           break;
-        case 8:
+        case 9:
           hash = (37 * hash) + SLA_ISOLATION_FIELD_NUMBER;
           hash = (53 * hash) + getSlaIsolation().hashCode();
           break;
-        case 9:
+        case 10:
           hash = (37 * hash) + EXCLUSIONS_FIELD_NUMBER;
           hash = (53 * hash) + getExclusions().hashCode();
           break;
@@ -70977,6 +70460,8 @@ public final class ContextOuterClass {
       @java.lang.Override
       public Builder clear() {
         super.clear();
+        action_ = 0;
+
         constraintCase_ = 0;
         constraint_ = null;
         return this;
@@ -71005,63 +70490,64 @@ public final class ContextOuterClass {
       @java.lang.Override
       public context.ContextOuterClass.Constraint buildPartial() {
         context.ContextOuterClass.Constraint result = new context.ContextOuterClass.Constraint(this);
-        if (constraintCase_ == 1) {
+        result.action_ = action_;
+        if (constraintCase_ == 2) {
           if (customBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = customBuilder_.build();
           }
         }
-        if (constraintCase_ == 2) {
+        if (constraintCase_ == 3) {
           if (scheduleBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = scheduleBuilder_.build();
           }
         }
-        if (constraintCase_ == 3) {
+        if (constraintCase_ == 4) {
           if (endpointLocationBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = endpointLocationBuilder_.build();
           }
         }
-        if (constraintCase_ == 4) {
+        if (constraintCase_ == 5) {
           if (endpointPriorityBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = endpointPriorityBuilder_.build();
           }
         }
-        if (constraintCase_ == 5) {
+        if (constraintCase_ == 6) {
           if (slaCapacityBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaCapacityBuilder_.build();
           }
         }
-        if (constraintCase_ == 6) {
+        if (constraintCase_ == 7) {
           if (slaLatencyBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaLatencyBuilder_.build();
           }
         }
-        if (constraintCase_ == 7) {
+        if (constraintCase_ == 8) {
           if (slaAvailabilityBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaAvailabilityBuilder_.build();
           }
         }
-        if (constraintCase_ == 8) {
+        if (constraintCase_ == 9) {
           if (slaIsolationBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
             result.constraint_ = slaIsolationBuilder_.build();
           }
         }
-        if (constraintCase_ == 9) {
+        if (constraintCase_ == 10) {
           if (exclusionsBuilder_ == null) {
             result.constraint_ = constraint_;
           } else {
@@ -71117,6 +70603,9 @@ public final class ContextOuterClass {
 
       public Builder mergeFrom(context.ContextOuterClass.Constraint other) {
         if (other == context.ContextOuterClass.Constraint.getDefaultInstance()) return this;
+        if (other.action_ != 0) {
+          setActionValue(other.getActionValue());
+        }
         switch (other.getConstraintCase()) {
           case CUSTOM: {
             mergeCustom(other.getCustom());
@@ -71202,36 +70691,90 @@ public final class ContextOuterClass {
       }
 
 
+      private int action_ = 0;
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @return The enum numeric value on the wire for action.
+       */
+      @java.lang.Override public int getActionValue() {
+        return action_;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @param value The enum numeric value on the wire for action to set.
+       * @return This builder for chaining.
+       */
+      public Builder setActionValue(int value) {
+        
+        action_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @return The action.
+       */
+      @java.lang.Override
+      public context.ContextOuterClass.ConstraintActionEnum getAction() {
+        @SuppressWarnings("deprecation")
+        context.ContextOuterClass.ConstraintActionEnum result = context.ContextOuterClass.ConstraintActionEnum.valueOf(action_);
+        return result == null ? context.ContextOuterClass.ConstraintActionEnum.UNRECOGNIZED : result;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @param value The action to set.
+       * @return This builder for chaining.
+       */
+      public Builder setAction(context.ContextOuterClass.ConstraintActionEnum value) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        
+        action_ = value.getNumber();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>.context.ConstraintActionEnum action = 1;</code>
+       * @return This builder for chaining.
+       */
+      public Builder clearAction() {
+        
+        action_ = 0;
+        onChanged();
+        return this;
+      }
+
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Custom, context.ContextOuterClass.Constraint_Custom.Builder, context.ContextOuterClass.Constraint_CustomOrBuilder> customBuilder_;
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        * @return Whether the custom field is set.
        */
       @java.lang.Override
       public boolean hasCustom() {
-        return constraintCase_ == 1;
+        return constraintCase_ == 2;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        * @return The custom.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_Custom getCustom() {
         if (customBuilder_ == null) {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             return (context.ContextOuterClass.Constraint_Custom) constraint_;
           }
           return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             return customBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder setCustom(context.ContextOuterClass.Constraint_Custom value) {
         if (customBuilder_ == null) {
@@ -71243,11 +70786,11 @@ public final class ContextOuterClass {
         } else {
           customBuilder_.setMessage(value);
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder setCustom(
           context.ContextOuterClass.Constraint_Custom.Builder builderForValue) {
@@ -71257,15 +70800,15 @@ public final class ContextOuterClass {
         } else {
           customBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder mergeCustom(context.ContextOuterClass.Constraint_Custom value) {
         if (customBuilder_ == null) {
-          if (constraintCase_ == 1 &&
+          if (constraintCase_ == 2 &&
               constraint_ != context.ContextOuterClass.Constraint_Custom.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_Custom.newBuilder((context.ContextOuterClass.Constraint_Custom) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -71274,26 +70817,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             customBuilder_.mergeFrom(value);
           }
           customBuilder_.setMessage(value);
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public Builder clearCustom() {
         if (customBuilder_ == null) {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -71302,33 +70845,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       public context.ContextOuterClass.Constraint_Custom.Builder getCustomBuilder() {
         return getCustomFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_CustomOrBuilder getCustomOrBuilder() {
-        if ((constraintCase_ == 1) && (customBuilder_ != null)) {
+        if ((constraintCase_ == 2) && (customBuilder_ != null)) {
           return customBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 1) {
+          if (constraintCase_ == 2) {
             return (context.ContextOuterClass.Constraint_Custom) constraint_;
           }
           return context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Custom custom = 1;</code>
+       * <code>.context.Constraint_Custom custom = 2;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Custom, context.ContextOuterClass.Constraint_Custom.Builder, context.ContextOuterClass.Constraint_CustomOrBuilder> 
           getCustomFieldBuilder() {
         if (customBuilder_ == null) {
-          if (!(constraintCase_ == 1)) {
+          if (!(constraintCase_ == 2)) {
             constraint_ = context.ContextOuterClass.Constraint_Custom.getDefaultInstance();
           }
           customBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -71338,7 +70881,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 1;
+        constraintCase_ = 2;
         onChanged();;
         return customBuilder_;
       }
@@ -71346,33 +70889,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Schedule, context.ContextOuterClass.Constraint_Schedule.Builder, context.ContextOuterClass.Constraint_ScheduleOrBuilder> scheduleBuilder_;
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        * @return Whether the schedule field is set.
        */
       @java.lang.Override
       public boolean hasSchedule() {
-        return constraintCase_ == 2;
+        return constraintCase_ == 3;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        * @return The schedule.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_Schedule getSchedule() {
         if (scheduleBuilder_ == null) {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             return (context.ContextOuterClass.Constraint_Schedule) constraint_;
           }
           return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             return scheduleBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder setSchedule(context.ContextOuterClass.Constraint_Schedule value) {
         if (scheduleBuilder_ == null) {
@@ -71384,11 +70927,11 @@ public final class ContextOuterClass {
         } else {
           scheduleBuilder_.setMessage(value);
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder setSchedule(
           context.ContextOuterClass.Constraint_Schedule.Builder builderForValue) {
@@ -71398,15 +70941,15 @@ public final class ContextOuterClass {
         } else {
           scheduleBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder mergeSchedule(context.ContextOuterClass.Constraint_Schedule value) {
         if (scheduleBuilder_ == null) {
-          if (constraintCase_ == 2 &&
+          if (constraintCase_ == 3 &&
               constraint_ != context.ContextOuterClass.Constraint_Schedule.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_Schedule.newBuilder((context.ContextOuterClass.Constraint_Schedule) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -71415,26 +70958,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             scheduleBuilder_.mergeFrom(value);
           }
           scheduleBuilder_.setMessage(value);
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public Builder clearSchedule() {
         if (scheduleBuilder_ == null) {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -71443,33 +70986,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       public context.ContextOuterClass.Constraint_Schedule.Builder getScheduleBuilder() {
         return getScheduleFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_ScheduleOrBuilder getScheduleOrBuilder() {
-        if ((constraintCase_ == 2) && (scheduleBuilder_ != null)) {
+        if ((constraintCase_ == 3) && (scheduleBuilder_ != null)) {
           return scheduleBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 2) {
+          if (constraintCase_ == 3) {
             return (context.ContextOuterClass.Constraint_Schedule) constraint_;
           }
           return context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Schedule schedule = 2;</code>
+       * <code>.context.Constraint_Schedule schedule = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Schedule, context.ContextOuterClass.Constraint_Schedule.Builder, context.ContextOuterClass.Constraint_ScheduleOrBuilder> 
           getScheduleFieldBuilder() {
         if (scheduleBuilder_ == null) {
-          if (!(constraintCase_ == 2)) {
+          if (!(constraintCase_ == 3)) {
             constraint_ = context.ContextOuterClass.Constraint_Schedule.getDefaultInstance();
           }
           scheduleBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -71479,7 +71022,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 2;
+        constraintCase_ = 3;
         onChanged();;
         return scheduleBuilder_;
       }
@@ -71487,33 +71030,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointLocation, context.ContextOuterClass.Constraint_EndPointLocation.Builder, context.ContextOuterClass.Constraint_EndPointLocationOrBuilder> endpointLocationBuilder_;
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        * @return Whether the endpointLocation field is set.
        */
       @java.lang.Override
       public boolean hasEndpointLocation() {
-        return constraintCase_ == 3;
+        return constraintCase_ == 4;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        * @return The endpointLocation.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointLocation getEndpointLocation() {
         if (endpointLocationBuilder_ == null) {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             return endpointLocationBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder setEndpointLocation(context.ContextOuterClass.Constraint_EndPointLocation value) {
         if (endpointLocationBuilder_ == null) {
@@ -71525,11 +71068,11 @@ public final class ContextOuterClass {
         } else {
           endpointLocationBuilder_.setMessage(value);
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder setEndpointLocation(
           context.ContextOuterClass.Constraint_EndPointLocation.Builder builderForValue) {
@@ -71539,15 +71082,15 @@ public final class ContextOuterClass {
         } else {
           endpointLocationBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder mergeEndpointLocation(context.ContextOuterClass.Constraint_EndPointLocation value) {
         if (endpointLocationBuilder_ == null) {
-          if (constraintCase_ == 3 &&
+          if (constraintCase_ == 4 &&
               constraint_ != context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointLocation.newBuilder((context.ContextOuterClass.Constraint_EndPointLocation) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -71556,26 +71099,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             endpointLocationBuilder_.mergeFrom(value);
           }
           endpointLocationBuilder_.setMessage(value);
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public Builder clearEndpointLocation() {
         if (endpointLocationBuilder_ == null) {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -71584,33 +71127,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       public context.ContextOuterClass.Constraint_EndPointLocation.Builder getEndpointLocationBuilder() {
         return getEndpointLocationFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointLocationOrBuilder getEndpointLocationOrBuilder() {
-        if ((constraintCase_ == 3) && (endpointLocationBuilder_ != null)) {
+        if ((constraintCase_ == 4) && (endpointLocationBuilder_ != null)) {
           return endpointLocationBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 3) {
+          if (constraintCase_ == 4) {
             return (context.ContextOuterClass.Constraint_EndPointLocation) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointLocation endpoint_location = 3;</code>
+       * <code>.context.Constraint_EndPointLocation endpoint_location = 4;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointLocation, context.ContextOuterClass.Constraint_EndPointLocation.Builder, context.ContextOuterClass.Constraint_EndPointLocationOrBuilder> 
           getEndpointLocationFieldBuilder() {
         if (endpointLocationBuilder_ == null) {
-          if (!(constraintCase_ == 3)) {
+          if (!(constraintCase_ == 4)) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointLocation.getDefaultInstance();
           }
           endpointLocationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -71620,7 +71163,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 3;
+        constraintCase_ = 4;
         onChanged();;
         return endpointLocationBuilder_;
       }
@@ -71628,33 +71171,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointPriority, context.ContextOuterClass.Constraint_EndPointPriority.Builder, context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder> endpointPriorityBuilder_;
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        * @return Whether the endpointPriority field is set.
        */
       @java.lang.Override
       public boolean hasEndpointPriority() {
-        return constraintCase_ == 4;
+        return constraintCase_ == 5;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        * @return The endpointPriority.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointPriority getEndpointPriority() {
         if (endpointPriorityBuilder_ == null) {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             return endpointPriorityBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder setEndpointPriority(context.ContextOuterClass.Constraint_EndPointPriority value) {
         if (endpointPriorityBuilder_ == null) {
@@ -71666,11 +71209,11 @@ public final class ContextOuterClass {
         } else {
           endpointPriorityBuilder_.setMessage(value);
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder setEndpointPriority(
           context.ContextOuterClass.Constraint_EndPointPriority.Builder builderForValue) {
@@ -71680,15 +71223,15 @@ public final class ContextOuterClass {
         } else {
           endpointPriorityBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder mergeEndpointPriority(context.ContextOuterClass.Constraint_EndPointPriority value) {
         if (endpointPriorityBuilder_ == null) {
-          if (constraintCase_ == 4 &&
+          if (constraintCase_ == 5 &&
               constraint_ != context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointPriority.newBuilder((context.ContextOuterClass.Constraint_EndPointPriority) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -71697,26 +71240,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             endpointPriorityBuilder_.mergeFrom(value);
           }
           endpointPriorityBuilder_.setMessage(value);
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public Builder clearEndpointPriority() {
         if (endpointPriorityBuilder_ == null) {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -71725,33 +71268,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       public context.ContextOuterClass.Constraint_EndPointPriority.Builder getEndpointPriorityBuilder() {
         return getEndpointPriorityFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder getEndpointPriorityOrBuilder() {
-        if ((constraintCase_ == 4) && (endpointPriorityBuilder_ != null)) {
+        if ((constraintCase_ == 5) && (endpointPriorityBuilder_ != null)) {
           return endpointPriorityBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 4) {
+          if (constraintCase_ == 5) {
             return (context.ContextOuterClass.Constraint_EndPointPriority) constraint_;
           }
           return context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_EndPointPriority endpoint_priority = 4;</code>
+       * <code>.context.Constraint_EndPointPriority endpoint_priority = 5;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_EndPointPriority, context.ContextOuterClass.Constraint_EndPointPriority.Builder, context.ContextOuterClass.Constraint_EndPointPriorityOrBuilder> 
           getEndpointPriorityFieldBuilder() {
         if (endpointPriorityBuilder_ == null) {
-          if (!(constraintCase_ == 4)) {
+          if (!(constraintCase_ == 5)) {
             constraint_ = context.ContextOuterClass.Constraint_EndPointPriority.getDefaultInstance();
           }
           endpointPriorityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -71761,7 +71304,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 4;
+        constraintCase_ = 5;
         onChanged();;
         return endpointPriorityBuilder_;
       }
@@ -71769,33 +71312,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Capacity, context.ContextOuterClass.Constraint_SLA_Capacity.Builder, context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder> slaCapacityBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        * @return Whether the slaCapacity field is set.
        */
       @java.lang.Override
       public boolean hasSlaCapacity() {
-        return constraintCase_ == 5;
+        return constraintCase_ == 6;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        * @return The slaCapacity.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Capacity getSlaCapacity() {
         if (slaCapacityBuilder_ == null) {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             return slaCapacityBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder setSlaCapacity(context.ContextOuterClass.Constraint_SLA_Capacity value) {
         if (slaCapacityBuilder_ == null) {
@@ -71807,11 +71350,11 @@ public final class ContextOuterClass {
         } else {
           slaCapacityBuilder_.setMessage(value);
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder setSlaCapacity(
           context.ContextOuterClass.Constraint_SLA_Capacity.Builder builderForValue) {
@@ -71821,15 +71364,15 @@ public final class ContextOuterClass {
         } else {
           slaCapacityBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder mergeSlaCapacity(context.ContextOuterClass.Constraint_SLA_Capacity value) {
         if (slaCapacityBuilder_ == null) {
-          if (constraintCase_ == 5 &&
+          if (constraintCase_ == 6 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Capacity.newBuilder((context.ContextOuterClass.Constraint_SLA_Capacity) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -71838,26 +71381,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             slaCapacityBuilder_.mergeFrom(value);
           }
           slaCapacityBuilder_.setMessage(value);
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public Builder clearSlaCapacity() {
         if (slaCapacityBuilder_ == null) {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -71866,33 +71409,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Capacity.Builder getSlaCapacityBuilder() {
         return getSlaCapacityFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder getSlaCapacityOrBuilder() {
-        if ((constraintCase_ == 5) && (slaCapacityBuilder_ != null)) {
+        if ((constraintCase_ == 6) && (slaCapacityBuilder_ != null)) {
           return slaCapacityBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 5) {
+          if (constraintCase_ == 6) {
             return (context.ContextOuterClass.Constraint_SLA_Capacity) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Capacity sla_capacity = 5;</code>
+       * <code>.context.Constraint_SLA_Capacity sla_capacity = 6;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Capacity, context.ContextOuterClass.Constraint_SLA_Capacity.Builder, context.ContextOuterClass.Constraint_SLA_CapacityOrBuilder> 
           getSlaCapacityFieldBuilder() {
         if (slaCapacityBuilder_ == null) {
-          if (!(constraintCase_ == 5)) {
+          if (!(constraintCase_ == 6)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Capacity.getDefaultInstance();
           }
           slaCapacityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -71902,7 +71445,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 5;
+        constraintCase_ = 6;
         onChanged();;
         return slaCapacityBuilder_;
       }
@@ -71910,33 +71453,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Latency, context.ContextOuterClass.Constraint_SLA_Latency.Builder, context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder> slaLatencyBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        * @return Whether the slaLatency field is set.
        */
       @java.lang.Override
       public boolean hasSlaLatency() {
-        return constraintCase_ == 6;
+        return constraintCase_ == 7;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        * @return The slaLatency.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Latency getSlaLatency() {
         if (slaLatencyBuilder_ == null) {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             return slaLatencyBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder setSlaLatency(context.ContextOuterClass.Constraint_SLA_Latency value) {
         if (slaLatencyBuilder_ == null) {
@@ -71948,11 +71491,11 @@ public final class ContextOuterClass {
         } else {
           slaLatencyBuilder_.setMessage(value);
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder setSlaLatency(
           context.ContextOuterClass.Constraint_SLA_Latency.Builder builderForValue) {
@@ -71962,15 +71505,15 @@ public final class ContextOuterClass {
         } else {
           slaLatencyBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder mergeSlaLatency(context.ContextOuterClass.Constraint_SLA_Latency value) {
         if (slaLatencyBuilder_ == null) {
-          if (constraintCase_ == 6 &&
+          if (constraintCase_ == 7 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Latency.newBuilder((context.ContextOuterClass.Constraint_SLA_Latency) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -71979,26 +71522,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             slaLatencyBuilder_.mergeFrom(value);
           }
           slaLatencyBuilder_.setMessage(value);
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public Builder clearSlaLatency() {
         if (slaLatencyBuilder_ == null) {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -72007,33 +71550,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Latency.Builder getSlaLatencyBuilder() {
         return getSlaLatencyFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder getSlaLatencyOrBuilder() {
-        if ((constraintCase_ == 6) && (slaLatencyBuilder_ != null)) {
+        if ((constraintCase_ == 7) && (slaLatencyBuilder_ != null)) {
           return slaLatencyBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 6) {
+          if (constraintCase_ == 7) {
             return (context.ContextOuterClass.Constraint_SLA_Latency) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Latency sla_latency = 6;</code>
+       * <code>.context.Constraint_SLA_Latency sla_latency = 7;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Latency, context.ContextOuterClass.Constraint_SLA_Latency.Builder, context.ContextOuterClass.Constraint_SLA_LatencyOrBuilder> 
           getSlaLatencyFieldBuilder() {
         if (slaLatencyBuilder_ == null) {
-          if (!(constraintCase_ == 6)) {
+          if (!(constraintCase_ == 7)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Latency.getDefaultInstance();
           }
           slaLatencyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -72043,7 +71586,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 6;
+        constraintCase_ = 7;
         onChanged();;
         return slaLatencyBuilder_;
       }
@@ -72051,33 +71594,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Availability, context.ContextOuterClass.Constraint_SLA_Availability.Builder, context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder> slaAvailabilityBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        * @return Whether the slaAvailability field is set.
        */
       @java.lang.Override
       public boolean hasSlaAvailability() {
-        return constraintCase_ == 7;
+        return constraintCase_ == 8;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        * @return The slaAvailability.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Availability getSlaAvailability() {
         if (slaAvailabilityBuilder_ == null) {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             return slaAvailabilityBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder setSlaAvailability(context.ContextOuterClass.Constraint_SLA_Availability value) {
         if (slaAvailabilityBuilder_ == null) {
@@ -72089,11 +71632,11 @@ public final class ContextOuterClass {
         } else {
           slaAvailabilityBuilder_.setMessage(value);
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder setSlaAvailability(
           context.ContextOuterClass.Constraint_SLA_Availability.Builder builderForValue) {
@@ -72103,15 +71646,15 @@ public final class ContextOuterClass {
         } else {
           slaAvailabilityBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder mergeSlaAvailability(context.ContextOuterClass.Constraint_SLA_Availability value) {
         if (slaAvailabilityBuilder_ == null) {
-          if (constraintCase_ == 7 &&
+          if (constraintCase_ == 8 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Availability.newBuilder((context.ContextOuterClass.Constraint_SLA_Availability) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -72120,26 +71663,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             slaAvailabilityBuilder_.mergeFrom(value);
           }
           slaAvailabilityBuilder_.setMessage(value);
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public Builder clearSlaAvailability() {
         if (slaAvailabilityBuilder_ == null) {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -72148,33 +71691,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Availability.Builder getSlaAvailabilityBuilder() {
         return getSlaAvailabilityFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder getSlaAvailabilityOrBuilder() {
-        if ((constraintCase_ == 7) && (slaAvailabilityBuilder_ != null)) {
+        if ((constraintCase_ == 8) && (slaAvailabilityBuilder_ != null)) {
           return slaAvailabilityBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 7) {
+          if (constraintCase_ == 8) {
             return (context.ContextOuterClass.Constraint_SLA_Availability) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Availability sla_availability = 7;</code>
+       * <code>.context.Constraint_SLA_Availability sla_availability = 8;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Availability, context.ContextOuterClass.Constraint_SLA_Availability.Builder, context.ContextOuterClass.Constraint_SLA_AvailabilityOrBuilder> 
           getSlaAvailabilityFieldBuilder() {
         if (slaAvailabilityBuilder_ == null) {
-          if (!(constraintCase_ == 7)) {
+          if (!(constraintCase_ == 8)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Availability.getDefaultInstance();
           }
           slaAvailabilityBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -72184,7 +71727,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 7;
+        constraintCase_ = 8;
         onChanged();;
         return slaAvailabilityBuilder_;
       }
@@ -72192,33 +71735,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Isolation_level, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder, context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder> slaIsolationBuilder_;
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        * @return Whether the slaIsolation field is set.
        */
       @java.lang.Override
       public boolean hasSlaIsolation() {
-        return constraintCase_ == 8;
+        return constraintCase_ == 9;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        * @return The slaIsolation.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Isolation_level getSlaIsolation() {
         if (slaIsolationBuilder_ == null) {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             return slaIsolationBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder setSlaIsolation(context.ContextOuterClass.Constraint_SLA_Isolation_level value) {
         if (slaIsolationBuilder_ == null) {
@@ -72230,11 +71773,11 @@ public final class ContextOuterClass {
         } else {
           slaIsolationBuilder_.setMessage(value);
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder setSlaIsolation(
           context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder builderForValue) {
@@ -72244,15 +71787,15 @@ public final class ContextOuterClass {
         } else {
           slaIsolationBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder mergeSlaIsolation(context.ContextOuterClass.Constraint_SLA_Isolation_level value) {
         if (slaIsolationBuilder_ == null) {
-          if (constraintCase_ == 8 &&
+          if (constraintCase_ == 9 &&
               constraint_ != context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Isolation_level.newBuilder((context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -72261,26 +71804,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             slaIsolationBuilder_.mergeFrom(value);
           }
           slaIsolationBuilder_.setMessage(value);
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public Builder clearSlaIsolation() {
         if (slaIsolationBuilder_ == null) {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -72289,33 +71832,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       public context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder getSlaIsolationBuilder() {
         return getSlaIsolationFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder getSlaIsolationOrBuilder() {
-        if ((constraintCase_ == 8) && (slaIsolationBuilder_ != null)) {
+        if ((constraintCase_ == 9) && (slaIsolationBuilder_ != null)) {
           return slaIsolationBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 8) {
+          if (constraintCase_ == 9) {
             return (context.ContextOuterClass.Constraint_SLA_Isolation_level) constraint_;
           }
           return context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 8;</code>
+       * <code>.context.Constraint_SLA_Isolation_level sla_isolation = 9;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_SLA_Isolation_level, context.ContextOuterClass.Constraint_SLA_Isolation_level.Builder, context.ContextOuterClass.Constraint_SLA_Isolation_levelOrBuilder> 
           getSlaIsolationFieldBuilder() {
         if (slaIsolationBuilder_ == null) {
-          if (!(constraintCase_ == 8)) {
+          if (!(constraintCase_ == 9)) {
             constraint_ = context.ContextOuterClass.Constraint_SLA_Isolation_level.getDefaultInstance();
           }
           slaIsolationBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -72325,7 +71868,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 8;
+        constraintCase_ = 9;
         onChanged();;
         return slaIsolationBuilder_;
       }
@@ -72333,33 +71876,33 @@ public final class ContextOuterClass {
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Exclusions, context.ContextOuterClass.Constraint_Exclusions.Builder, context.ContextOuterClass.Constraint_ExclusionsOrBuilder> exclusionsBuilder_;
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        * @return Whether the exclusions field is set.
        */
       @java.lang.Override
       public boolean hasExclusions() {
-        return constraintCase_ == 9;
+        return constraintCase_ == 10;
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        * @return The exclusions.
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_Exclusions getExclusions() {
         if (exclusionsBuilder_ == null) {
-          if (constraintCase_ == 9) {
+          if (constraintCase_ == 10) {
             return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
           }
           return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
         } else {
-          if (constraintCase_ == 9) {
+          if (constraintCase_ == 10) {
             return exclusionsBuilder_.getMessage();
           }
           return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       public Builder setExclusions(context.ContextOuterClass.Constraint_Exclusions value) {
         if (exclusionsBuilder_ == null) {
@@ -72371,11 +71914,11 @@ public final class ContextOuterClass {
         } else {
           exclusionsBuilder_.setMessage(value);
         }
-        constraintCase_ = 9;
+        constraintCase_ = 10;
         return this;
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       public Builder setExclusions(
           context.ContextOuterClass.Constraint_Exclusions.Builder builderForValue) {
@@ -72385,15 +71928,15 @@ public final class ContextOuterClass {
         } else {
           exclusionsBuilder_.setMessage(builderForValue.build());
         }
-        constraintCase_ = 9;
+        constraintCase_ = 10;
         return this;
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       public Builder mergeExclusions(context.ContextOuterClass.Constraint_Exclusions value) {
         if (exclusionsBuilder_ == null) {
-          if (constraintCase_ == 9 &&
+          if (constraintCase_ == 10 &&
               constraint_ != context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance()) {
             constraint_ = context.ContextOuterClass.Constraint_Exclusions.newBuilder((context.ContextOuterClass.Constraint_Exclusions) constraint_)
                 .mergeFrom(value).buildPartial();
@@ -72402,26 +71945,26 @@ public final class ContextOuterClass {
           }
           onChanged();
         } else {
-          if (constraintCase_ == 9) {
+          if (constraintCase_ == 10) {
             exclusionsBuilder_.mergeFrom(value);
           }
           exclusionsBuilder_.setMessage(value);
         }
-        constraintCase_ = 9;
+        constraintCase_ = 10;
         return this;
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       public Builder clearExclusions() {
         if (exclusionsBuilder_ == null) {
-          if (constraintCase_ == 9) {
+          if (constraintCase_ == 10) {
             constraintCase_ = 0;
             constraint_ = null;
             onChanged();
           }
         } else {
-          if (constraintCase_ == 9) {
+          if (constraintCase_ == 10) {
             constraintCase_ = 0;
             constraint_ = null;
           }
@@ -72430,33 +71973,33 @@ public final class ContextOuterClass {
         return this;
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       public context.ContextOuterClass.Constraint_Exclusions.Builder getExclusionsBuilder() {
         return getExclusionsFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       @java.lang.Override
       public context.ContextOuterClass.Constraint_ExclusionsOrBuilder getExclusionsOrBuilder() {
-        if ((constraintCase_ == 9) && (exclusionsBuilder_ != null)) {
+        if ((constraintCase_ == 10) && (exclusionsBuilder_ != null)) {
           return exclusionsBuilder_.getMessageOrBuilder();
         } else {
-          if (constraintCase_ == 9) {
+          if (constraintCase_ == 10) {
             return (context.ContextOuterClass.Constraint_Exclusions) constraint_;
           }
           return context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
         }
       }
       /**
-       * <code>.context.Constraint_Exclusions exclusions = 9;</code>
+       * <code>.context.Constraint_Exclusions exclusions = 10;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Constraint_Exclusions, context.ContextOuterClass.Constraint_Exclusions.Builder, context.ContextOuterClass.Constraint_ExclusionsOrBuilder> 
           getExclusionsFieldBuilder() {
         if (exclusionsBuilder_ == null) {
-          if (!(constraintCase_ == 9)) {
+          if (!(constraintCase_ == 10)) {
             constraint_ = context.ContextOuterClass.Constraint_Exclusions.getDefaultInstance();
           }
           exclusionsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
@@ -72466,7 +72009,7 @@ public final class ContextOuterClass {
                   isClean());
           constraint_ = null;
         }
-        constraintCase_ = 9;
+        constraintCase_ = 10;
         onChanged();;
         return exclusionsBuilder_;
       }
@@ -74645,131 +74188,136 @@ public final class ContextOuterClass {
       "\030\001 \001(\010\022%\n\ndevice_ids\030\002 \003(\0132\021.context.Dev" +
       "iceId\022)\n\014endpoint_ids\030\003 \003(\0132\023.context.En" +
       "dPointId\022!\n\010link_ids\030\004 \003(\0132\017.context.Lin" +
-      "kId\"\254\004\n\nConstraint\022,\n\006custom\030\001 \001(\0132\032.con" +
-      "text.Constraint_CustomH\000\0220\n\010schedule\030\002 \001" +
-      "(\0132\034.context.Constraint_ScheduleH\000\022A\n\021en" +
-      "dpoint_location\030\003 \001(\0132$.context.Constrai" +
-      "nt_EndPointLocationH\000\022A\n\021endpoint_priori" +
-      "ty\030\004 \001(\0132$.context.Constraint_EndPointPr" +
-      "iorityH\000\0228\n\014sla_capacity\030\005 \001(\0132 .context" +
-      ".Constraint_SLA_CapacityH\000\0226\n\013sla_latenc" +
-      "y\030\006 \001(\0132\037.context.Constraint_SLA_Latency" +
-      "H\000\022@\n\020sla_availability\030\007 \001(\0132$.context.C" +
-      "onstraint_SLA_AvailabilityH\000\022@\n\rsla_isol" +
-      "ation\030\010 \001(\0132\'.context.Constraint_SLA_Iso" +
-      "lation_levelH\000\0224\n\nexclusions\030\t \001(\0132\036.con" +
-      "text.Constraint_ExclusionsH\000B\014\n\nconstrai" +
-      "nt\"^\n\022TeraFlowController\022&\n\ncontext_id\030\001" +
-      " \001(\0132\022.context.ContextId\022\022\n\nip_address\030\002" +
-      " \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024AuthenticationResu" +
-      "lt\022&\n\ncontext_id\030\001 \001(\0132\022.context.Context" +
-      "Id\022\025\n\rauthenticated\030\002 \001(\010*j\n\rEventTypeEn" +
-      "um\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EVENTTYPE" +
-      "_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024\n\020EVENT" +
-      "TYPE_REMOVE\020\003*\367\001\n\020DeviceDriverEnum\022\032\n\026DE" +
-      "VICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICEDRIVER_O" +
-      "PENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANSPORT_AP" +
-      "I\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVICEDRIVER" +
-      "_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVICEDRIVER" +
-      "_ONF_TR_352\020\005\022\023\n\017DEVICEDRIVER_XR\020\006\022\033\n\027DE" +
-      "VICEDRIVER_IETF_L2VPN\020\007*\217\001\n\033DeviceOperat" +
-      "ionalStatusEnum\022%\n!DEVICEOPERATIONALSTAT" +
-      "US_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTATU" +
-      "S_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS_" +
-      "ENABLED\020\002*\201\001\n\017ServiceTypeEnum\022\027\n\023SERVICE" +
-      "TYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n\020" +
-      "SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_TAPI_C" +
-      "ONNECTIVITY_SERVICE\020\003*\304\001\n\021ServiceStatusE" +
-      "num\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025SERV" +
-      "ICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS_ACT" +
-      "IVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n\035SER" +
-      "VICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERVICES" +
-      "TATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatusEnum" +
-      "\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICESTAT" +
-      "US_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026\n\022SL" +
-      "ICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DEINIT" +
-      "\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020Conf" +
-      "igActionEnum\022\032\n\026CONFIGACTION_UNDEFINED\020\000" +
-      "\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTION_D" +
-      "ELETE\020\002*\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISO" +
-      "LATION\020\000\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGI" +
-      "CAL_ISOLATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035" +
-      "\n\031PHYSICAL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICA" +
-      "L_NETWORK_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURC" +
-      "E_ISOLATION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLA" +
-      "TION\020\007\022\025\n\021SERVICE_ISOLATION\020\0102\245\026\n\016Contex" +
-      "tService\022:\n\016ListContextIds\022\016.context.Emp" +
-      "ty\032\026.context.ContextIdList\"\000\0226\n\014ListCont" +
-      "exts\022\016.context.Empty\032\024.context.ContextLi" +
-      "st\"\000\0224\n\nGetContext\022\022.context.ContextId\032\020" +
-      ".context.Context\"\000\0224\n\nSetContext\022\020.conte" +
-      "xt.Context\032\022.context.ContextId\"\000\0225\n\rRemo" +
-      "veContext\022\022.context.ContextId\032\016.context." +
-      "Empty\"\000\022=\n\020GetContextEvents\022\016.context.Em" +
-      "pty\032\025.context.ContextEvent\"\0000\001\022@\n\017ListTo" +
-      "pologyIds\022\022.context.ContextId\032\027.context." +
-      "TopologyIdList\"\000\022=\n\016ListTopologies\022\022.con" +
-      "text.ContextId\032\025.context.TopologyList\"\000\022" +
-      "7\n\013GetTopology\022\023.context.TopologyId\032\021.co" +
-      "ntext.Topology\"\000\022E\n\022GetTopologyDetails\022\023" +
-      ".context.TopologyId\032\030.context.TopologyDe" +
-      "tails\"\000\0227\n\013SetTopology\022\021.context.Topolog" +
-      "y\032\023.context.TopologyId\"\000\0227\n\016RemoveTopolo" +
-      "gy\022\023.context.TopologyId\032\016.context.Empty\"" +
-      "\000\022?\n\021GetTopologyEvents\022\016.context.Empty\032\026" +
-      ".context.TopologyEvent\"\0000\001\0228\n\rListDevice" +
-      "Ids\022\016.context.Empty\032\025.context.DeviceIdLi" +
-      "st\"\000\0224\n\013ListDevices\022\016.context.Empty\032\023.co" +
-      "ntext.DeviceList\"\000\0221\n\tGetDevice\022\021.contex" +
-      "t.DeviceId\032\017.context.Device\"\000\0221\n\tSetDevi" +
-      "ce\022\017.context.Device\032\021.context.DeviceId\"\000" +
-      "\0223\n\014RemoveDevice\022\021.context.DeviceId\032\016.co" +
-      "ntext.Empty\"\000\022;\n\017GetDeviceEvents\022\016.conte" +
-      "xt.Empty\032\024.context.DeviceEvent\"\0000\001\022<\n\014Se" +
-      "lectDevice\022\025.context.DeviceFilter\032\023.cont" +
-      "ext.DeviceList\"\000\022I\n\021ListEndPointNames\022\027." +
-      "context.EndPointIdList\032\031.context.EndPoin" +
-      "tNameList\"\000\0224\n\013ListLinkIds\022\016.context.Emp" +
-      "ty\032\023.context.LinkIdList\"\000\0220\n\tListLinks\022\016" +
-      ".context.Empty\032\021.context.LinkList\"\000\022+\n\007G" +
-      "etLink\022\017.context.LinkId\032\r.context.Link\"\000" +
-      "\022+\n\007SetLink\022\r.context.Link\032\017.context.Lin" +
-      "kId\"\000\022/\n\nRemoveLink\022\017.context.LinkId\032\016.c" +
-      "ontext.Empty\"\000\0227\n\rGetLinkEvents\022\016.contex" +
-      "t.Empty\032\022.context.LinkEvent\"\0000\001\022>\n\016ListS" +
-      "erviceIds\022\022.context.ContextId\032\026.context." +
-      "ServiceIdList\"\000\022:\n\014ListServices\022\022.contex" +
-      "t.ContextId\032\024.context.ServiceList\"\000\0224\n\nG" +
-      "etService\022\022.context.ServiceId\032\020.context." +
-      "Service\"\000\0224\n\nSetService\022\020.context.Servic" +
-      "e\032\022.context.ServiceId\"\000\0226\n\014UnsetService\022" +
-      "\020.context.Service\032\022.context.ServiceId\"\000\022" +
-      "5\n\rRemoveService\022\022.context.ServiceId\032\016.c" +
-      "ontext.Empty\"\000\022=\n\020GetServiceEvents\022\016.con" +
-      "text.Empty\032\025.context.ServiceEvent\"\0000\001\022?\n" +
-      "\rSelectService\022\026.context.ServiceFilter\032\024" +
-      ".context.ServiceList\"\000\022:\n\014ListSliceIds\022\022" +
-      ".context.ContextId\032\024.context.SliceIdList" +
-      "\"\000\0226\n\nListSlices\022\022.context.ContextId\032\022.c" +
-      "ontext.SliceList\"\000\022.\n\010GetSlice\022\020.context" +
-      ".SliceId\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016" +
-      ".context.Slice\032\020.context.SliceId\"\000\0220\n\nUn" +
-      "setSlice\022\016.context.Slice\032\020.context.Slice" +
-      "Id\"\000\0221\n\013RemoveSlice\022\020.context.SliceId\032\016." +
-      "context.Empty\"\000\0229\n\016GetSliceEvents\022\016.cont" +
-      "ext.Empty\032\023.context.SliceEvent\"\0000\001\0229\n\013Se" +
-      "lectSlice\022\024.context.SliceFilter\032\022.contex" +
-      "t.SliceList\"\000\022D\n\021ListConnectionIds\022\022.con" +
-      "text.ServiceId\032\031.context.ConnectionIdLis" +
-      "t\"\000\022@\n\017ListConnections\022\022.context.Service" +
-      "Id\032\027.context.ConnectionList\"\000\022=\n\rGetConn" +
-      "ection\022\025.context.ConnectionId\032\023.context." +
-      "Connection\"\000\022=\n\rSetConnection\022\023.context." +
-      "Connection\032\025.context.ConnectionId\"\000\022;\n\020R" +
-      "emoveConnection\022\025.context.ConnectionId\032\016" +
-      ".context.Empty\"\000\022C\n\023GetConnectionEvents\022" +
-      "\016.context.Empty\032\030.context.ConnectionEven" +
-      "t\"\0000\001b\006proto3"
+      "kId\"\333\004\n\nConstraint\022-\n\006action\030\001 \001(\0162\035.con" +
+      "text.ConstraintActionEnum\022,\n\006custom\030\002 \001(" +
+      "\0132\032.context.Constraint_CustomH\000\0220\n\010sched" +
+      "ule\030\003 \001(\0132\034.context.Constraint_ScheduleH" +
+      "\000\022A\n\021endpoint_location\030\004 \001(\0132$.context.C" +
+      "onstraint_EndPointLocationH\000\022A\n\021endpoint" +
+      "_priority\030\005 \001(\0132$.context.Constraint_End" +
+      "PointPriorityH\000\0228\n\014sla_capacity\030\006 \001(\0132 ." +
+      "context.Constraint_SLA_CapacityH\000\0226\n\013sla" +
+      "_latency\030\007 \001(\0132\037.context.Constraint_SLA_" +
+      "LatencyH\000\022@\n\020sla_availability\030\010 \001(\0132$.co" +
+      "ntext.Constraint_SLA_AvailabilityH\000\022@\n\rs" +
+      "la_isolation\030\t \001(\0132\'.context.Constraint_" +
+      "SLA_Isolation_levelH\000\0224\n\nexclusions\030\n \001(" +
+      "\0132\036.context.Constraint_ExclusionsH\000B\014\n\nc" +
+      "onstraint\"^\n\022TeraFlowController\022&\n\nconte" +
+      "xt_id\030\001 \001(\0132\022.context.ContextId\022\022\n\nip_ad" +
+      "dress\030\002 \001(\t\022\014\n\004port\030\003 \001(\r\"U\n\024Authenticat" +
+      "ionResult\022&\n\ncontext_id\030\001 \001(\0132\022.context." +
+      "ContextId\022\025\n\rauthenticated\030\002 \001(\010*j\n\rEven" +
+      "tTypeEnum\022\027\n\023EVENTTYPE_UNDEFINED\020\000\022\024\n\020EV" +
+      "ENTTYPE_CREATE\020\001\022\024\n\020EVENTTYPE_UPDATE\020\002\022\024" +
+      "\n\020EVENTTYPE_REMOVE\020\003*\231\002\n\020DeviceDriverEnu" +
+      "m\022\032\n\026DEVICEDRIVER_UNDEFINED\020\000\022\033\n\027DEVICED" +
+      "RIVER_OPENCONFIG\020\001\022\036\n\032DEVICEDRIVER_TRANS" +
+      "PORT_API\020\002\022\023\n\017DEVICEDRIVER_P4\020\003\022&\n\"DEVIC" +
+      "EDRIVER_IETF_NETWORK_TOPOLOGY\020\004\022\033\n\027DEVIC" +
+      "EDRIVER_ONF_TR_352\020\005\022\023\n\017DEVICEDRIVER_XR\020" +
+      "\006\022\033\n\027DEVICEDRIVER_IETF_L2VPN\020\007\022 \n\034DEVICE" +
+      "DRIVER_GNMI_OPENCONFIG\020\010*\217\001\n\033DeviceOpera" +
+      "tionalStatusEnum\022%\n!DEVICEOPERATIONALSTA" +
+      "TUS_UNDEFINED\020\000\022$\n DEVICEOPERATIONALSTAT" +
+      "US_DISABLED\020\001\022#\n\037DEVICEOPERATIONALSTATUS" +
+      "_ENABLED\020\002*\201\001\n\017ServiceTypeEnum\022\027\n\023SERVIC" +
+      "ETYPE_UNKNOWN\020\000\022\024\n\020SERVICETYPE_L3NM\020\001\022\024\n" +
+      "\020SERVICETYPE_L2NM\020\002\022)\n%SERVICETYPE_TAPI_" +
+      "CONNECTIVITY_SERVICE\020\003*\304\001\n\021ServiceStatus" +
+      "Enum\022\033\n\027SERVICESTATUS_UNDEFINED\020\000\022\031\n\025SER" +
+      "VICESTATUS_PLANNED\020\001\022\030\n\024SERVICESTATUS_AC" +
+      "TIVE\020\002\022\032\n\026SERVICESTATUS_UPDATING\020\003\022!\n\035SE" +
+      "RVICESTATUS_PENDING_REMOVAL\020\004\022\036\n\032SERVICE" +
+      "STATUS_SLA_VIOLATED\020\005*\251\001\n\017SliceStatusEnu" +
+      "m\022\031\n\025SLICESTATUS_UNDEFINED\020\000\022\027\n\023SLICESTA" +
+      "TUS_PLANNED\020\001\022\024\n\020SLICESTATUS_INIT\020\002\022\026\n\022S" +
+      "LICESTATUS_ACTIVE\020\003\022\026\n\022SLICESTATUS_DEINI" +
+      "T\020\004\022\034\n\030SLICESTATUS_SLA_VIOLATED\020\005*]\n\020Con" +
+      "figActionEnum\022\032\n\026CONFIGACTION_UNDEFINED\020" +
+      "\000\022\024\n\020CONFIGACTION_SET\020\001\022\027\n\023CONFIGACTION_" +
+      "DELETE\020\002*m\n\024ConstraintActionEnum\022\036\n\032CONS" +
+      "TRAINTACTION_UNDEFINED\020\000\022\030\n\024CONSTRAINTAC" +
+      "TION_SET\020\001\022\033\n\027CONSTRAINTACTION_DELETE\020\002*" +
+      "\203\002\n\022IsolationLevelEnum\022\020\n\014NO_ISOLATION\020\000" +
+      "\022\026\n\022PHYSICAL_ISOLATION\020\001\022\025\n\021LOGICAL_ISOL" +
+      "ATION\020\002\022\025\n\021PROCESS_ISOLATION\020\003\022\035\n\031PHYSIC" +
+      "AL_MEMORY_ISOLATION\020\004\022\036\n\032PHYSICAL_NETWOR" +
+      "K_ISOLATION\020\005\022\036\n\032VIRTUAL_RESOURCE_ISOLAT" +
+      "ION\020\006\022\037\n\033NETWORK_FUNCTIONS_ISOLATION\020\007\022\025" +
+      "\n\021SERVICE_ISOLATION\020\0102\245\026\n\016ContextService" +
+      "\022:\n\016ListContextIds\022\016.context.Empty\032\026.con" +
+      "text.ContextIdList\"\000\0226\n\014ListContexts\022\016.c" +
+      "ontext.Empty\032\024.context.ContextList\"\000\0224\n\n" +
+      "GetContext\022\022.context.ContextId\032\020.context" +
+      ".Context\"\000\0224\n\nSetContext\022\020.context.Conte" +
+      "xt\032\022.context.ContextId\"\000\0225\n\rRemoveContex" +
+      "t\022\022.context.ContextId\032\016.context.Empty\"\000\022" +
+      "=\n\020GetContextEvents\022\016.context.Empty\032\025.co" +
+      "ntext.ContextEvent\"\0000\001\022@\n\017ListTopologyId" +
+      "s\022\022.context.ContextId\032\027.context.Topology" +
+      "IdList\"\000\022=\n\016ListTopologies\022\022.context.Con" +
+      "textId\032\025.context.TopologyList\"\000\0227\n\013GetTo" +
+      "pology\022\023.context.TopologyId\032\021.context.To" +
+      "pology\"\000\022E\n\022GetTopologyDetails\022\023.context" +
+      ".TopologyId\032\030.context.TopologyDetails\"\000\022" +
+      "7\n\013SetTopology\022\021.context.Topology\032\023.cont" +
+      "ext.TopologyId\"\000\0227\n\016RemoveTopology\022\023.con" +
+      "text.TopologyId\032\016.context.Empty\"\000\022?\n\021Get" +
+      "TopologyEvents\022\016.context.Empty\032\026.context" +
+      ".TopologyEvent\"\0000\001\0228\n\rListDeviceIds\022\016.co" +
+      "ntext.Empty\032\025.context.DeviceIdList\"\000\0224\n\013" +
+      "ListDevices\022\016.context.Empty\032\023.context.De" +
+      "viceList\"\000\0221\n\tGetDevice\022\021.context.Device" +
+      "Id\032\017.context.Device\"\000\0221\n\tSetDevice\022\017.con" +
+      "text.Device\032\021.context.DeviceId\"\000\0223\n\014Remo" +
+      "veDevice\022\021.context.DeviceId\032\016.context.Em" +
+      "pty\"\000\022;\n\017GetDeviceEvents\022\016.context.Empty" +
+      "\032\024.context.DeviceEvent\"\0000\001\022<\n\014SelectDevi" +
+      "ce\022\025.context.DeviceFilter\032\023.context.Devi" +
+      "ceList\"\000\022I\n\021ListEndPointNames\022\027.context." +
+      "EndPointIdList\032\031.context.EndPointNameLis" +
+      "t\"\000\0224\n\013ListLinkIds\022\016.context.Empty\032\023.con" +
+      "text.LinkIdList\"\000\0220\n\tListLinks\022\016.context" +
+      ".Empty\032\021.context.LinkList\"\000\022+\n\007GetLink\022\017" +
+      ".context.LinkId\032\r.context.Link\"\000\022+\n\007SetL" +
+      "ink\022\r.context.Link\032\017.context.LinkId\"\000\022/\n" +
+      "\nRemoveLink\022\017.context.LinkId\032\016.context.E" +
+      "mpty\"\000\0227\n\rGetLinkEvents\022\016.context.Empty\032" +
+      "\022.context.LinkEvent\"\0000\001\022>\n\016ListServiceId" +
+      "s\022\022.context.ContextId\032\026.context.ServiceI" +
+      "dList\"\000\022:\n\014ListServices\022\022.context.Contex" +
+      "tId\032\024.context.ServiceList\"\000\0224\n\nGetServic" +
+      "e\022\022.context.ServiceId\032\020.context.Service\"" +
+      "\000\0224\n\nSetService\022\020.context.Service\032\022.cont" +
+      "ext.ServiceId\"\000\0226\n\014UnsetService\022\020.contex" +
+      "t.Service\032\022.context.ServiceId\"\000\0225\n\rRemov" +
+      "eService\022\022.context.ServiceId\032\016.context.E" +
+      "mpty\"\000\022=\n\020GetServiceEvents\022\016.context.Emp" +
+      "ty\032\025.context.ServiceEvent\"\0000\001\022?\n\rSelectS" +
+      "ervice\022\026.context.ServiceFilter\032\024.context" +
+      ".ServiceList\"\000\022:\n\014ListSliceIds\022\022.context" +
+      ".ContextId\032\024.context.SliceIdList\"\000\0226\n\nLi" +
+      "stSlices\022\022.context.ContextId\032\022.context.S" +
+      "liceList\"\000\022.\n\010GetSlice\022\020.context.SliceId" +
+      "\032\016.context.Slice\"\000\022.\n\010SetSlice\022\016.context" +
+      ".Slice\032\020.context.SliceId\"\000\0220\n\nUnsetSlice" +
+      "\022\016.context.Slice\032\020.context.SliceId\"\000\0221\n\013" +
+      "RemoveSlice\022\020.context.SliceId\032\016.context." +
+      "Empty\"\000\0229\n\016GetSliceEvents\022\016.context.Empt" +
+      "y\032\023.context.SliceEvent\"\0000\001\0229\n\013SelectSlic" +
+      "e\022\024.context.SliceFilter\032\022.context.SliceL" +
+      "ist\"\000\022D\n\021ListConnectionIds\022\022.context.Ser" +
+      "viceId\032\031.context.ConnectionIdList\"\000\022@\n\017L" +
+      "istConnections\022\022.context.ServiceId\032\027.con" +
+      "text.ConnectionList\"\000\022=\n\rGetConnection\022\025" +
+      ".context.ConnectionId\032\023.context.Connecti" +
+      "on\"\000\022=\n\rSetConnection\022\023.context.Connecti" +
+      "on\032\025.context.ConnectionId\"\000\022;\n\020RemoveCon" +
+      "nection\022\025.context.ConnectionId\032\016.context" +
+      ".Empty\"\000\022C\n\023GetConnectionEvents\022\016.contex" +
+      "t.Empty\032\030.context.ConnectionEvent\"\0000\001b\006p" +
+      "roto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -75226,7 +74774,7 @@ public final class ContextOuterClass {
     internal_static_context_Constraint_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_context_Constraint_descriptor,
-        new java.lang.String[] { "Custom", "Schedule", "EndpointLocation", "EndpointPriority", "SlaCapacity", "SlaLatency", "SlaAvailability", "SlaIsolation", "Exclusions", "Constraint", });
+        new java.lang.String[] { "Action", "Custom", "Schedule", "EndpointLocation", "EndpointPriority", "SlaCapacity", "SlaLatency", "SlaAvailability", "SlaIsolation", "Exclusions", "Constraint", });
     internal_static_context_TeraFlowController_descriptor =
       getDescriptor().getMessageTypes().get(75);
     internal_static_context_TeraFlowController_fieldAccessorTable = new
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index f1079230f5e5efb75fb14d6cd6f3ad3fb5c9d2e3..0f97b9338962e0d19427443968fb004ba4da9573 100644
--- a/src/policy/target/kubernetes/kubernetes.yml
+++ b/src/policy/target/kubernetes/kubernetes.yml
@@ -16,8 +16,8 @@ apiVersion: v1
 kind: Service
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 23832f2975e3c8967e9685f7e3a5f5458d04527a
-    app.quarkus.io/build-timestamp: 2023-04-04 - 11:56:04 +0000
+    app.quarkus.io/commit-id: 8d0654b519e90fe0127e7d1419adce25fa3a179d
+    app.quarkus.io/build-timestamp: 2023-07-10 - 09:41:26 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -42,8 +42,8 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   annotations:
-    app.quarkus.io/commit-id: 23832f2975e3c8967e9685f7e3a5f5458d04527a
-    app.quarkus.io/build-timestamp: 2023-04-04 - 11:56:04 +0000
+    app.quarkus.io/commit-id: 8d0654b519e90fe0127e7d1419adce25fa3a179d
+    app.quarkus.io/build-timestamp: 2023-07-10 - 09:41:26 +0000
     prometheus.io/scrape: "true"
     prometheus.io/path: /q/metrics
     prometheus.io/port: "8080"
@@ -60,8 +60,8 @@ spec:
   template:
     metadata:
       annotations:
-        app.quarkus.io/commit-id: 23832f2975e3c8967e9685f7e3a5f5458d04527a
-        app.quarkus.io/build-timestamp: 2023-04-04 - 11:56:04 +0000
+        app.quarkus.io/commit-id: 8d0654b519e90fe0127e7d1419adce25fa3a179d
+        app.quarkus.io/build-timestamp: 2023-07-10 - 09:41:26 +0000
         prometheus.io/scrape: "true"
         prometheus.io/path: /q/metrics
         prometheus.io/port: "8080"
@@ -76,12 +76,12 @@ spec:
               valueFrom:
                 fieldRef:
                   fieldPath: metadata.namespace
-            - name: MONITORING_SERVICE_HOST
-              value: monitoringservice
             - name: CONTEXT_SERVICE_HOST
               value: contextservice
             - name: SERVICE_SERVICE_HOST
               value: serviceservice
+            - name: MONITORING_SERVICE_HOST
+              value: monitoringservice
           image: labs.etsi.org:5050/tfs/controller/policy:0.1.0
           imagePullPolicy: Always
           livenessProbe:
diff --git a/src/service/client/TEServiceClient.py b/src/service/client/TEServiceClient.py
new file mode 100644
index 0000000000000000000000000000000000000000..19ca95bceb285c03df635859728ecf15640d8438
--- /dev/null
+++ b/src/service/client/TEServiceClient.py
@@ -0,0 +1,67 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import grpc, logging
+from common.Constants import ServiceNameEnum
+from common.Settings import get_service_host, get_service_port_grpc
+from common.proto.context_pb2 import Empty, Service, ServiceId, ServiceStatus
+from common.proto.te_pb2_grpc import TEServiceStub
+from common.tools.client.RetryDecorator import retry, delay_exponential
+from common.tools.grpc.Tools import grpc_message_to_json_string
+
+LOGGER = logging.getLogger(__name__)
+MAX_RETRIES = 15
+DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0)
+RETRY_DECORATOR = retry(max_retries=MAX_RETRIES, delay_function=DELAY_FUNCTION, prepare_method_name='connect')
+
+class TEServiceClient:
+    def __init__(self, host=None, port=None):
+        if not host: host = get_service_host(ServiceNameEnum.TE)
+        if not port: port = get_service_port_grpc(ServiceNameEnum.TE)
+        self.endpoint = '{:s}:{:s}'.format(str(host), str(port))
+        LOGGER.debug('Creating channel to {:s}...'.format(str(self.endpoint)))
+        self.channel = None
+        self.stub = None
+        self.connect()
+        LOGGER.debug('Channel created')
+
+    def connect(self):
+        self.channel = grpc.insecure_channel(self.endpoint)
+        self.stub = TEServiceStub(self.channel)
+
+    def close(self):
+        if self.channel is not None: self.channel.close()
+        self.channel = None
+        self.stub = None
+
+    @RETRY_DECORATOR
+    def RequestLSP(self, request : Service) -> ServiceStatus:
+        LOGGER.debug('RequestLSP request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.RequestLSP(request)
+        LOGGER.debug('RequestLSP result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
+    @RETRY_DECORATOR
+    def UpdateLSP(self, request : ServiceId) -> ServiceStatus:
+        LOGGER.debug('UpdateLSP request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.UpdateLSP(request)
+        LOGGER.debug('UpdateLSP result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
+    @RETRY_DECORATOR
+    def DeleteLSP(self, request : ServiceId) -> Empty:
+        LOGGER.debug('DeleteLSP request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.DeleteLSP(request)
+        LOGGER.debug('DeleteLSP result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
diff --git a/src/service/requirements.in b/src/service/requirements.in
index 83b6342c0c0ed5e969ba03e8af5ac502b1f525c9..48fd76485d6bbaf53c3867147882614fc0cf1b04 100644
--- a/src/service/requirements.in
+++ b/src/service/requirements.in
@@ -14,6 +14,7 @@
 
 
 anytree==2.8.0
+geopy==2.3.0
 networkx==2.6.3
 pydot==1.4.2
 redis==4.1.2
diff --git a/src/service/service/ServiceServiceServicerImpl.py b/src/service/service/ServiceServiceServicerImpl.py
index 6d23fd4cee53d1639c9eefbd943d45dab497b253..f79e3e5f3aa983aacda3163682737cdf0ff6be03 100644
--- a/src/service/service/ServiceServiceServicerImpl.py
+++ b/src/service/service/ServiceServiceServicerImpl.py
@@ -12,13 +12,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import grpc, json, logging, random, uuid
+import copy, grpc, json, logging, random, uuid
 from typing import Optional
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
 from common.method_wrappers.ServiceExceptions import (
     AlreadyExistsException, InvalidArgumentException, NotFoundException, NotImplementedException,
     OperationFailedException)
-from common.proto.context_pb2 import Connection, Empty, Service, ServiceId, ServiceStatusEnum, ServiceTypeEnum
+from common.proto.context_pb2 import (
+    Connection, Empty, Service, ServiceId, ServiceStatusEnum, ServiceTypeEnum, ConstraintActionEnum)
 from common.proto.pathcomp_pb2 import PathCompRequest
 from common.proto.service_pb2_grpc import ServiceServiceServicer
 from common.tools.context_queries.Service import get_service_by_id
@@ -26,8 +27,10 @@ from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_s
 from context.client.ContextClient import ContextClient
 from pathcomp.frontend.client.PathCompClient import PathCompClient
 from service.service.tools.ConnectionToString import connection_to_string
+from service.client.TEServiceClient import TEServiceClient
 from .service_handler_api.ServiceHandlerFactory import ServiceHandlerFactory
 from .task_scheduler.TaskScheduler import TasksScheduler
+from .tools.GeodesicDistance import gps_distance
 
 LOGGER = logging.getLogger(__name__)
 
@@ -93,17 +96,101 @@ class ServiceServiceServicerImpl(ServiceServiceServicer):
         context_client = ContextClient()
         _service : Optional[Service] = get_service_by_id(
             context_client, request.service_id, rw_copy=False,
-            include_config_rules=False, include_constraints=False, include_endpoint_ids=False)
+            include_config_rules=True, include_constraints=True, include_endpoint_ids=True)
+
+        # Identify service constraints        
+        num_disjoint_paths = None
+        is_diverse = False
+        gps_location_aware = False
+        for constraint in request.service_constraints:
+            constraint_kind = constraint.WhichOneof('constraint')
+            if constraint_kind == 'sla_availability':
+                num_disjoint_paths = constraint.sla_availability.num_disjoint_paths
+            elif constraint_kind == 'custom':
+                if constraint.custom.constraint_type == 'diversity': is_diverse = True
+            elif constraint_kind == 'endpoint_location':
+                location = constraint.endpoint_location.location
+                if location.WhichOneof('location') == 'gps_position': gps_location_aware = True
+            else:
+                continue
+
+        LOGGER.debug('num_disjoint_paths={:s}'.format(str(num_disjoint_paths)))
+        LOGGER.debug('is_diverse={:s}'.format(str(is_diverse)))
+        LOGGER.debug('gps_location_aware={:s}'.format(str(gps_location_aware)))
+
+        if _service is not None and num_disjoint_paths is None and not is_diverse and gps_location_aware:
+            LOGGER.debug('  Removing previous service')
+            tasks_scheduler = TasksScheduler(self.service_handler_factory)
+            tasks_scheduler.compose_from_service(_service, is_delete=True)
+            tasks_scheduler.execute_all()
+
         service = Service()
         service.CopyFrom(request if _service is None else _service)
+
         if service.service_type == ServiceTypeEnum.SERVICETYPE_UNKNOWN:                     # pylint: disable=no-member
             service.service_type = request.service_type                                     # pylint: disable=no-member
         service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED     # pylint: disable=no-member
 
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_TE:
+            # TE service:
+            context_client.SetService(request)
+
+            te_service_client = TEServiceClient()
+            service_status = te_service_client.RequestLSP(service)
+
+            if service_status.service_status == ServiceStatusEnum.SERVICESTATUS_ACTIVE:
+                _service : Optional[Service] = get_service_by_id(
+                    context_client, request.service_id, rw_copy=True,
+                    include_config_rules=False, include_constraints=False, include_endpoint_ids=False)
+                _service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE
+                service_id = context_client.SetService(_service)
+                return service_id
+            else:
+                MSG = 'RequestLSP for Service({:s}) returned ServiceStatus({:s})'
+                context_uuid = request.service_id.context_id.context_uuid.uuid
+                service_uuid = request.service_id.service_uuid.uuid
+                service_key = '{:s}/{:s}'.format(context_uuid, service_uuid)
+                str_service_status = ServiceStatusEnum.Name(service_status.service_status)
+                raise Exception(MSG.format(service_key, str_service_status))
+
+        # Normal service
         del service.service_endpoint_ids[:] # pylint: disable=no-member
         for endpoint_id in request.service_endpoint_ids:
             service.service_endpoint_ids.add().CopyFrom(endpoint_id)    # pylint: disable=no-member
 
+        device_list = context_client.ListDevices(Empty())
+
+        LOGGER.debug('[before] request={:s}'.format(grpc_message_to_json_string(request)))
+        for constraint in request.service_constraints:
+            if constraint.action == ConstraintActionEnum.CONSTRAINTACTION_UNDEFINED:
+                # Field action is new; assume if not set, it means SET
+                constraint.action = ConstraintActionEnum.CONSTRAINTACTION_SET
+
+            if constraint.action != ConstraintActionEnum.CONSTRAINTACTION_SET: continue
+            if constraint.WhichOneof('constraint') != 'endpoint_location': continue
+            if constraint.endpoint_location.HasField('endpoint_id'): continue
+
+            service_location = constraint.endpoint_location.location
+            distances = {}
+            for device in device_list.devices:
+                for endpoint in device.device_endpoints:
+                    if not endpoint.endpoint_location.HasField('gps_position'): continue
+                    distance = gps_distance(service_location.gps_position, endpoint.endpoint_location.gps_position)
+                    distances[distance] = endpoint.endpoint_id
+
+            closer_endpoint_id = distances[min(distances)]
+            constraint.endpoint_location.endpoint_id.CopyFrom(closer_endpoint_id)
+
+            service_endpoint_ids = [
+                endpoint_id.endpoint_uuid
+                for endpoint_id in service.service_endpoint_ids
+            ]
+            if closer_endpoint_id not in service_endpoint_ids:
+                service.service_endpoint_ids.append(closer_endpoint_id)
+
+        LOGGER.debug('[after] request={:s}'.format(grpc_message_to_json_string(request)))
+        LOGGER.debug('[after] service={:s}'.format(grpc_message_to_json_string(service)))
+
         del service.service_constraints[:]  # pylint: disable=no-member
         for constraint in request.service_constraints:
             service.service_constraints.add().CopyFrom(constraint)  # pylint: disable=no-member
@@ -119,12 +206,6 @@ class ServiceServiceServicerImpl(ServiceServiceServicer):
             context_client, service_id_with_uuids, rw_copy=False,
             include_config_rules=True, include_constraints=True, include_endpoint_ids=True)
 
-        num_disjoint_paths = 0
-        for constraint in request.service_constraints:
-            if constraint.WhichOneof('constraint') == 'sla_availability':
-                num_disjoint_paths = constraint.sla_availability.num_disjoint_paths
-                break
-
         num_disjoint_paths = 1 if num_disjoint_paths is None or num_disjoint_paths == 0 else num_disjoint_paths
         num_expected_endpoints = num_disjoint_paths * 2
 
@@ -164,6 +245,14 @@ class ServiceServiceServicerImpl(ServiceServiceServicer):
         service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PENDING_REMOVAL
         context_client.SetService(service)
 
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_TE:
+            # TE service
+            te_service_client = TEServiceClient()
+            te_service_client.DeleteLSP(request)
+            context_client.RemoveService(request)
+            return Empty()
+
+        # Normal service
         # Feed TaskScheduler with this service and the sub-services and sub-connections related to this service.
         # TaskScheduler identifies inter-dependencies among them and produces a schedule of tasks (an ordered list of
         # tasks to be executed) to implement the requested delete operation.
diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py
index 3ec71dc64536e28457c4f1adbf3679186285786d..1b22c5c42e908e9b9455358edd2abf54442628f5 100644
--- a/src/service/service/service_handler_api/FilterFields.py
+++ b/src/service/service/service_handler_api/FilterFields.py
@@ -23,7 +23,8 @@ SERVICE_TYPE_VALUES = {
     ServiceTypeEnum.SERVICETYPE_UNKNOWN,
     ServiceTypeEnum.SERVICETYPE_L3NM,
     ServiceTypeEnum.SERVICETYPE_L2NM,
-    ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE
+    ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE,
+    ServiceTypeEnum.SERVICETYPE_TE,
 }
 
 DEVICE_DRIVER_VALUES = {
@@ -35,6 +36,7 @@ DEVICE_DRIVER_VALUES = {
     DeviceDriverEnum.DEVICEDRIVER_ONF_TR_352,
     DeviceDriverEnum.DEVICEDRIVER_XR,
     DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN,
+    DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
 }
 
 # Map allowed filter fields to allowed values per Filter field. If no restriction (free text) None is specified
diff --git a/src/service/service/service_handler_api/SettingsHandler.py b/src/service/service/service_handler_api/SettingsHandler.py
index 85dd3a12851bf8c5ba697180fe00d0467e7a76b5..b8daec7d7b5fc857aef9aa5e46bb04d33a02b47c 100644
--- a/src/service/service/service_handler_api/SettingsHandler.py
+++ b/src/service/service/service_handler_api/SettingsHandler.py
@@ -16,7 +16,8 @@ import anytree, json, logging
 from typing import Any, List, Optional, Tuple, Union
 from common.proto.context_pb2 import ConfigActionEnum, ConfigRule, Device, EndPoint, ServiceConfig
 from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string
-from service.service.service_handler_api.AnyTreeTools import TreeNode, delete_subnode, get_subnode, set_subnode_value
+from .AnyTreeTools import TreeNode, delete_subnode, dump_subtree, get_subnode, set_subnode_value
+from .Tools import extract_endpoint_index, extract_index
 
 LOGGER = logging.getLogger(__name__)
 
@@ -41,9 +42,10 @@ class SettingsHandler:
         elif kind == 'acl':
             device_uuid = config_rule.acl.endpoint_id.device_id.device_uuid.uuid
             endpoint_uuid = config_rule.acl.endpoint_id.endpoint_uuid.uuid
+            endpoint_name, endpoint_index = extract_endpoint_index(endpoint_uuid)
             acl_ruleset_name = config_rule.acl.rule_set.name
-            ACL_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/acl_ruleset[{:s}]'
-            key_or_path = ACL_KEY_TEMPLATE.format(device_uuid, endpoint_uuid, acl_ruleset_name)
+            ACL_KEY_TEMPLATE = '/device[{:s}]/endpoint[{:s}]/index[{:d}]/acl_ruleset[{:s}]'
+            key_or_path = ACL_KEY_TEMPLATE.format(device_uuid, endpoint_name,endpoint_index, acl_ruleset_name)
             value = grpc_message_to_json(config_rule.acl)
         else:
             MSG = 'Unsupported Kind({:s}) in ConfigRule({:s})'
@@ -55,6 +57,16 @@ class SettingsHandler:
     def get(self, key_or_path : Union[str, List[str]], default : Optional[Any] = None) -> Optional[TreeNode]:
         return get_subnode(self.__resolver, self.__config, key_or_path, default=default)
 
+    def get_device_settings(self, device : Device) -> Optional[TreeNode]:
+        device_keys = device.device_id.device_uuid.uuid, device.name
+
+        for device_key in device_keys:
+            endpoint_settings_uri = '/device[{:s}]/settings'.format(device_key)
+            endpoint_settings = self.get(endpoint_settings_uri)
+            if endpoint_settings is not None: return endpoint_settings
+
+        return None
+
     def get_endpoint_settings(self, device : Device, endpoint : EndPoint) -> Optional[TreeNode]:
         device_keys   = device.device_id.device_uuid.uuid,       device.name
         endpoint_keys = endpoint.endpoint_id.endpoint_uuid.uuid, endpoint.name
@@ -66,6 +78,28 @@ class SettingsHandler:
                 if endpoint_settings is not None: return endpoint_settings
 
         return None
+    
+    def get_endpoint_acls(self, device : Device, endpoint : EndPoint) -> List [Tuple]:
+        endpoint_name = endpoint.name
+        device_keys   = device.device_id.device_uuid.uuid,       device.name
+        endpoint_keys = endpoint.endpoint_id.endpoint_uuid.uuid, endpoint.name
+        acl_rules = []
+        for device_key in device_keys:
+            for endpoint_key in endpoint_keys:
+                endpoint_settings_uri = '/device[{:s}]/endpoint[{:s}]'.format(device_key, endpoint_key)
+                endpoint_settings = self.get(endpoint_settings_uri)
+                if endpoint_settings is None: continue  
+                endpoint_name, endpoint_index = extract_endpoint_index(endpoint_name)
+                ACL_RULE_PREFIX = '/device[{:s}]/endpoint[{:s}]/'.format(device_key, endpoint_name)
+
+                results = dump_subtree(endpoint_settings)
+                for res_key, res_value in results: 
+                    if not res_key.startswith(ACL_RULE_PREFIX): continue
+                    if not "acl_ruleset" in res_key: continue
+                    acl_index = extract_index(res_value)
+                    if not 'index[{:d}]'.format(acl_index) in res_key: continue
+                    acl_rules.append((res_key, res_value))
+        return acl_rules
 
     def set(self, key_or_path : Union[str, List[str]], value : Any) -> None:
         set_subnode_value(self.__resolver, self.__config, key_or_path, value)
@@ -86,3 +120,6 @@ class SettingsHandler:
             MSG = 'Unsupported Action({:s}) in ConfigRule({:s})'
             LOGGER.warning(MSG.format(str(action), grpc_message_to_json_string(config_rule)))
             return
+
+    def dump_config_rules(self) -> List[Tuple[Any, Any]]:
+        return dump_subtree(self.__config)
diff --git a/src/service/service/service_handler_api/Tools.py b/src/service/service/service_handler_api/Tools.py
index 222cd8968cd490d488dbbfc0082b6c3d4f5c1035..b06d128d94328b0d664e8928e1701ee327aa6d03 100644
--- a/src/service/service/service_handler_api/Tools.py
+++ b/src/service/service/service_handler_api/Tools.py
@@ -12,11 +12,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import functools
+import functools, re
 from typing import Any, List, Optional, Tuple, Union
 from common.method_wrappers.ServiceExceptions import NotFoundException
 from common.proto.context_pb2 import Device, EndPoint
 from common.type_checkers.Checkers import chk_length, chk_type
+from common.tools.grpc.Tools import grpc_message_to_json
 
 ACTION_MSG_SET_ENDPOINT      = 'Set EndPoint(device_uuid={:s}, endpoint_uuid={:s}, topology_uuid={:s})'
 ACTION_MSG_DELETE_ENDPOINT   = 'Delete EndPoint(device_uuid={:s}, endpoint_uuid={:s}, topology_uuid={:s})'
@@ -58,3 +59,18 @@ def get_device_endpoint_uuids(endpoint : Tuple[str, str, Optional[str]]) -> Tupl
     chk_length('endpoint', endpoint, min_length=2, max_length=3)
     device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid by now
     return device_uuid, endpoint_uuid
+
+def extract_endpoint_index(endpoint_name : str, default_index=0) -> Tuple[str, int]:
+    RE_PATTERN = '^(eth\-[0-9]+(?:\/[0-9]+)*)(?:\.([0-9]+))?$'
+    m = re.match(RE_PATTERN, endpoint_name)
+    if m is None: return endpoint_name, default_index
+    endpoint_name, index = m.groups()
+    if index is not None: index = int(index)
+    return endpoint_name, index
+
+def extract_index(res_value : str) ->  int:
+    acl_value = grpc_message_to_json(res_value,use_integers_for_enums=True) 
+    endpoint  = acl_value.split("'endpoint_uuid': {'uuid': '")
+    endpoint  = endpoint[1].split("'}")
+    _ , index = extract_endpoint_index(endpoint[0])
+    return index
diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py
index 257bc138fe932e7e5abee00981848248039d0b3f..7ea0d4f627b5d6010f6e40135f6005471efe8d71 100644
--- a/src/service/service/service_handlers/__init__.py
+++ b/src/service/service/service_handlers/__init__.py
@@ -19,6 +19,7 @@ from .l2nm_ietfl2vpn.L2NM_IETFL2VPN_ServiceHandler import L2NM_IETFL2VPN_Service
 from .l2nm_openconfig.L2NMOpenConfigServiceHandler import L2NMOpenConfigServiceHandler
 from .l3nm_emulated.L3NMEmulatedServiceHandler import L3NMEmulatedServiceHandler
 from .l3nm_openconfig.L3NMOpenConfigServiceHandler import L3NMOpenConfigServiceHandler
+from .l3nm_gnmi_openconfig.L3NMGnmiOpenConfigServiceHandler import L3NMGnmiOpenConfigServiceHandler
 from .microwave.MicrowaveServiceHandler import MicrowaveServiceHandler
 from .p4.p4_service_handler import P4ServiceHandler
 from .tapi_tapi.TapiServiceHandler import TapiServiceHandler
@@ -49,6 +50,12 @@ SERVICE_HANDLERS = [
             FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG,
         }
     ]),
+    (L3NMGnmiOpenConfigServiceHandler, [
+        {
+            FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_L3NM,
+            FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
+        }
+    ]),
     (TapiServiceHandler, [
         {
             FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE,
diff --git a/src/service/service/service_handlers/l2nm_emulated/ConfigRules.py b/src/service/service/service_handlers/l2nm_emulated/ConfigRules.py
index 072696324342bc425329c134cf6c48704de313da..e68a62030fba242d40e6b1c9bf0c2c65e66639f2 100644
--- a/src/service/service/service_handlers/l2nm_emulated/ConfigRules.py
+++ b/src/service/service/service_handlers/l2nm_emulated/ConfigRules.py
@@ -12,13 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Dict, List
+from typing import Dict, List, Tuple
 from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set
 from service.service.service_handler_api.AnyTreeTools import TreeNode
 
 def setup_config_rules(
     service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str,
-    service_settings : TreeNode, endpoint_settings : TreeNode
+    service_settings : TreeNode, endpoint_settings : TreeNode, endpoint_acls : List [Tuple]
 ) -> List[Dict]:
 
     if service_settings  is None: return []
diff --git a/src/service/service/service_handlers/l2nm_emulated/L2NMEmulatedServiceHandler.py b/src/service/service/service_handlers/l2nm_emulated/L2NMEmulatedServiceHandler.py
index 416c10f72fe2199ce241c4d527d9c58ce93d2b44..7bd227f43fc52cf63266faea30c2a492f392b3ae 100644
--- a/src/service/service/service_handlers/l2nm_emulated/L2NMEmulatedServiceHandler.py
+++ b/src/service/service/service_handlers/l2nm_emulated/L2NMEmulatedServiceHandler.py
@@ -15,7 +15,7 @@
 import json, logging
 from typing import Any, List, Optional, Tuple, Union
 from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
-from common.proto.context_pb2 import ConfigRule, DeviceId, Service
+from common.proto.context_pb2 import ConfigActionEnum, ConfigRule, DeviceId, Service
 from common.tools.object_factory.Device import json_device_id
 from common.type_checkers.Checkers import chk_type
 from service.service.service_handler_api.Tools import get_device_endpoint_uuids, get_endpoint_matching
@@ -52,13 +52,42 @@ class L2NMEmulatedServiceHandler(_ServiceHandler):
                 device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint)
 
                 device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+                device_name = device_obj.name
+
+                for config_rule in device_obj.device_config.config_rules:
+                    raw_data = SettingsHandler._config_rule_to_raw(config_rule)
+                    if raw_data is None: continue
+                    action, key_or_path, value = raw_data
+                    if action != ConfigActionEnum.CONFIGACTION_SET: continue
+                    if not key_or_path.startswith('/endpoints/endpoint['): continue
+                    if not key_or_path.endswith(']/settings'): continue
+                    key_or_path = key_or_path.replace('/endpoints/', '/device[{:s}]/'.format(device_name))
+                    LOGGER.debug('Setting key_or_path={:s} value={:s}'.format(str(key_or_path), str(value)))
+                    self.__settings_handler.set(key_or_path, value)
+
+                service_config_rules = self.__settings_handler.dump_config_rules()
+                LOGGER.debug('service_config_rules={:s}'.format(str(service_config_rules)))
+
                 endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid)
-                endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
                 endpoint_name = endpoint_obj.name
+                endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
+                endpoint_acls = self.__settings_handler.get_endpoint_acls(device_obj, endpoint_obj)
+
+                MSG = 'device_uuid={:s} device_name={:s} endpoint_uuid={:s} endpoint_name={:s} endpoint_settings={:s}'
+                str_endpoint_settings = str(None) if endpoint_settings is None else str(endpoint_settings.value)
+                LOGGER.debug(MSG.format(
+                    str(device_uuid), str(device_name), str(endpoint_uuid), str(endpoint_name), str_endpoint_settings
+                ))
 
                 json_config_rules = setup_config_rules(
                     service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
-                    settings, endpoint_settings)
+                    settings, endpoint_settings, endpoint_acls)
+
+                if len(json_config_rules) > 0:
+                    del device_obj.device_config.config_rules[:]
+                    for json_config_rule in json_config_rules:
+                        device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
+                    self.__task_executor.configure_device(device_obj)
 
                 if len(json_config_rules) > 0:
                     del device_obj.device_config.config_rules[:]
@@ -89,9 +118,31 @@ class L2NMEmulatedServiceHandler(_ServiceHandler):
                 device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint)
 
                 device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+                device_name = device_obj.name
+
+                for config_rule in device_obj.device_config.config_rules:
+                    raw_data = SettingsHandler._config_rule_to_raw(config_rule)
+                    if raw_data is None: continue
+                    action, key_or_path, value = raw_data
+                    if action != ConfigActionEnum.CONFIGACTION_SET: continue
+                    if not key_or_path.startswith('/endpoints/endpoint['): continue
+                    if not key_or_path.endswith(']/settings'): continue
+                    key_or_path = key_or_path.replace('/endpoints/', '/device[{:s}]/'.format(device_name))
+                    LOGGER.debug('Setting key_or_path={:s} value={:s}'.format(str(key_or_path), str(value)))
+                    self.__settings_handler.set(key_or_path, value)
+
+                service_config_rules = self.__settings_handler.dump_config_rules()
+                LOGGER.debug('service_config_rules={:s}'.format(str(service_config_rules)))
+
                 endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid)
-                endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
                 endpoint_name = endpoint_obj.name
+                endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
+
+                MSG = 'device_uuid={:s} device_name={:s} endpoint_uuid={:s} endpoint_name={:s} endpoint_settings={:s}'
+                str_endpoint_settings = str(None) if endpoint_settings is None else str(endpoint_settings.value)
+                LOGGER.debug(MSG.format(
+                    str(device_uuid), str(device_name), str(endpoint_uuid), str(endpoint_name), str_endpoint_settings
+                ))
 
                 json_config_rules = teardown_config_rules(
                     service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
diff --git a/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
index 5afedb33dea6783af9cdb88b86bc186a279de9cc..cedb39ebf151ef229d374150619ef4486c03a240 100644
--- a/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
+++ b/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
@@ -12,38 +12,45 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Dict, List
+from typing import Dict, List, Tuple
 from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set
 from service.service.service_handler_api.AnyTreeTools import TreeNode
 
 def setup_config_rules(
     service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str,
-    service_settings : TreeNode, endpoint_settings : TreeNode
+    service_settings : TreeNode, endpoint_settings : TreeNode, endpoint_acls : List [Tuple]
 ) -> List[Dict]:
 
     if service_settings  is None: return []
     if endpoint_settings is None: return []
 
-    #json_settings          : Dict = service_settings.value
+    json_settings          : Dict = service_settings.value
     json_endpoint_settings : Dict = endpoint_settings.value
 
-    #mtu                 = json_settings.get('mtu',                 1450 )    # 1512
-    #address_families    = json_settings.get('address_families',    []   )    # ['IPV4']
-    #bgp_as              = json_settings.get('bgp_as',              0    )    # 65000
-    #bgp_route_target    = json_settings.get('bgp_route_target',    '0:0')    # 65000:333
-
-    #router_id           = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
-    #route_distinguisher = json_endpoint_settings.get('route_distinguisher', '0:0'    )  # '60001:801'
-    sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
-    vlan_id             = json_endpoint_settings.get('vlan_id',             1        )  # 400
-    #address_ip          = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
-    #address_prefix      = json_endpoint_settings.get('address_prefix',      24       )  # 30
-    remote_router       = json_endpoint_settings.get('remote_router',       '0.0.0.0')  # '5.5.5.5'
-    circuit_id          = json_endpoint_settings.get('circuit_id',          '000'    )  # '111'
-
-    if_cirid_name         = '{:s}.{:s}'.format(endpoint_name, str(circuit_id))
-    network_instance_name = 'ELAN-AC:{:s}'.format(str(circuit_id))
-    connection_point_id   = 'VC-1'
+    mtu                     = json_settings.get('mtu',                 1450 )    # 1512
+    #address_families       = json_settings.get('address_families',    []   )    # ['IPV4']
+    #bgp_as                 = json_settings.get('bgp_as',              0    )    # 65000
+    #bgp_route_target       = json_settings.get('bgp_route_target',    '0:0')    # 65000:333
+
+    #router_id              = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
+    #route_distinguisher    = json_endpoint_settings.get('route_distinguisher', '0:0'    )  # '60001:801'
+    sub_interface_index     = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
+    vlan_id                 = json_endpoint_settings.get('vlan_id',             1        )  # 400
+    #address_ip             = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
+    #address_prefix         = json_endpoint_settings.get('address_prefix',      24       )  # 30
+    remote_router           = json_endpoint_settings.get('remote_router',       '5.5.5.5')  # '5.5.5.5'
+    network_instance_name   = json_endpoint_settings.get('ni_name',             'ELAN-AC:{:s}'.format(str(vlan_id)))  #ELAN-AC:1
+    # virtual_circuit_id      = json_endpoint_settings.get('vc_id',               '111'    )  # '111'
+    connection_point        = json_endpoint_settings.get('conn_point',          '1'       ) # '111'
+    #network_interface_desc    = '{:s}-NetIf'.format(service_uuid)
+    network_interface_desc    = json_endpoint_settings.get('ni_description','')
+    #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid)
+    network_subinterface_desc = json_endpoint_settings.get('subif_description','')
+    
+    if_cirid_name           = '{:s}.{:d}'.format(endpoint_name, vlan_id)
+    connection_point_id     = 'VC-{:s}'.format(str(connection_point))                   #Provisionalmente comentado, en principio se deberia usar asi
+    #connection_point_id     = 'VC-1'                                                   #Uso provisional
+    virtual_circuit_id      = vlan_id
 
     json_config_rules = [
 
@@ -62,9 +69,13 @@ def setup_config_rules(
 
         json_config_rule_set(
             '/network_instance[{:s}]/connection_point[{:s}]'.format(network_instance_name, connection_point_id),
-            {'name': network_instance_name, 'connection_point': connection_point_id, 'VC_ID': circuit_id,
+            {'name': network_instance_name, 'connection_point': connection_point_id, 'VC_ID': virtual_circuit_id,
              'remote_system': remote_router}),
     ]
+    for res_key, res_value in endpoint_acls:
+        json_config_rules.append(
+               {'action': 1, 'acl': res_value}
+            )
     return json_config_rules
 
 def teardown_config_rules(
@@ -86,14 +97,14 @@ def teardown_config_rules(
     #router_id           = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
     #route_distinguisher = json_endpoint_settings.get('route_distinguisher', '0:0'    )  # '60001:801'
     sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
-    #vlan_id             = json_endpoint_settings.get('vlan_id',             1        )  # 400
+    vlan_id             = json_endpoint_settings.get('vlan_id',             1        )  # 400
     #address_ip          = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
     #address_prefix      = json_endpoint_settings.get('address_prefix',      24       )  # 30
     #remote_router       = json_endpoint_settings.get('remote_router',       '0.0.0.0')  # '5.5.5.5'
-    circuit_id          = json_endpoint_settings.get('circuit_id',          '000'    )  # '111'
+    #circuit_id          = json_endpoint_settings.get('circuit_id',          '000'    )  # '111'
 
-    if_cirid_name         = '{:s}.{:s}'.format(endpoint_name, str(circuit_id))
-    network_instance_name = 'ELAN-AC:{:s}'.format(str(circuit_id))
+    if_cirid_name         = '{:s}.{:d}'.format(endpoint_name, vlan_id)
+    network_instance_name = 'ELAN-AC:{:s}'.format(str(vlan_id))
     connection_point_id   = 'VC-1'
 
     json_config_rules = [
diff --git a/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py b/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
index aae9e968b44af52170fdf6f6ecfab76fe90e2b52..6f7f05db5ceed0a2b9146f9275e1619131d77278 100644
--- a/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
+++ b/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
@@ -54,11 +54,12 @@ class L2NMOpenConfigServiceHandler(_ServiceHandler):
                 device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
                 endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid)
                 endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
+                endpoint_acls = self.__settings_handler.get_endpoint_acls(device_obj, endpoint_obj)
                 endpoint_name = endpoint_obj.name
 
                 json_config_rules = setup_config_rules(
                     service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
-                    settings, endpoint_settings)
+                    settings, endpoint_settings, endpoint_acls)
 
                 if len(json_config_rules) > 0:
                     del device_obj.device_config.config_rules[:]
diff --git a/src/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py b/src/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f3593df39f88e2e3ee806dcc33f67f9e85a6b69
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_gnmi_openconfig/ConfigRuleComposer.py
@@ -0,0 +1,119 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from typing import Dict, List, Optional, Tuple
+from common.proto.context_pb2 import Device, EndPoint
+from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set
+
+from service.service.service_handler_api.AnyTreeTools import TreeNode
+
+def _interface(if_name, sif_index, ipv4_address, ipv4_prefix, enabled) -> Tuple[str, Dict]:
+    str_path = '/interface[{:s}]'.format(if_name)
+    str_data = {'name': if_name, 'enabled': enabled, 'sub_if_index': sif_index,
+                'sub_if_enabled': enabled, 'sub_if_ipv4_enabled': enabled,
+                'sub_if_ipv4_address': ipv4_address, 'sub_if_ipv4_prefix': ipv4_prefix}
+    return str_path, str_data
+
+def _network_instance(ni_name, ni_type) -> Tuple[str, Dict]:
+    str_path = '/network_instance[{:s}]'.format(ni_name)
+    str_data = {'name': ni_name, 'type': ni_type}
+    return str_path, str_data
+
+def _network_instance_static_route(ni_name, prefix, next_hop, next_hop_index=0) -> Tuple[str, Dict]:
+    str_path = '/network_instance[{:s}]/static_route[{:s}]'.format(ni_name, prefix)
+    str_data = {'name': ni_name, 'prefix': prefix, 'next_hop': next_hop, 'next_hop_index': next_hop_index}
+    return str_path, str_data
+
+def _network_instance_interface(ni_name, if_name, sif_index) -> Tuple[str, Dict]:
+    str_path = '/network_instance[{:s}]/interface[{:s}.{:d}]'.format(ni_name, if_name, sif_index)
+    str_data = {'name': ni_name, 'if_name': if_name, 'sif_index': sif_index}
+    return str_path, str_data
+
+class EndpointComposer:
+    def __init__(self, endpoint_uuid : str) -> None:
+        self.uuid = endpoint_uuid
+        self.objekt : Optional[EndPoint] = None
+        self.sub_interface_index = 0
+        self.ipv4_address = None
+        self.ipv4_prefix = None
+
+    def configure(self, endpoint_obj : EndPoint, settings : Optional[TreeNode]) -> None:
+        self.objekt = endpoint_obj
+        if settings is None: return
+        json_settings : Dict = settings.value
+        self.ipv4_address = json_settings['ipv4_address']
+        self.ipv4_prefix = json_settings['ipv4_prefix']
+        self.sub_interface_index = json_settings['sub_interface_index']
+
+    def get_config_rules(self, network_instance_name : str, delete : bool = False) -> List[Dict]:
+        json_config_rule = json_config_rule_delete if delete else json_config_rule_set
+        return [
+            json_config_rule(*_interface(
+                self.objekt.name, self.sub_interface_index, self.ipv4_address, self.ipv4_prefix, True
+            )),
+            json_config_rule(*_network_instance_interface(
+                network_instance_name, self.objekt.name, self.sub_interface_index
+            )),
+        ]
+
+class DeviceComposer:
+    def __init__(self, device_uuid : str) -> None:
+        self.uuid = device_uuid
+        self.objekt : Optional[Device] = None
+        self.endpoints : Dict[str, EndpointComposer] = dict()
+        self.static_routes : Dict[str, str] = dict()
+    
+    def get_endpoint(self, endpoint_uuid : str) -> EndpointComposer:
+        if endpoint_uuid not in self.endpoints:
+            self.endpoints[endpoint_uuid] = EndpointComposer(endpoint_uuid)
+        return self.endpoints[endpoint_uuid]
+
+    def configure(self, device_obj : Device, settings : Optional[TreeNode]) -> None:
+        self.objekt = device_obj
+        if settings is None: return
+        json_settings : Dict = settings.value
+        static_routes = json_settings.get('static_routes', [])
+        for static_route in static_routes:
+            prefix   = static_route['prefix']
+            next_hop = static_route['next_hop']
+            self.static_routes[prefix] = next_hop
+
+    def get_config_rules(self, network_instance_name : str, delete : bool = False) -> List[Dict]:
+        json_config_rule = json_config_rule_delete if delete else json_config_rule_set
+        config_rules = [
+            json_config_rule(*_network_instance(network_instance_name, 'L3VRF'))
+        ]
+        for endpoint in self.endpoints.values():
+            config_rules.extend(endpoint.get_config_rules(network_instance_name, delete=delete))
+        for prefix, next_hop in self.static_routes.items():
+            config_rules.append(
+                json_config_rule(*_network_instance_static_route(network_instance_name, prefix, next_hop))
+            )
+        if delete: config_rules = list(reversed(config_rules))
+        return config_rules
+
+class ConfigRuleComposer:
+    def __init__(self) -> None:
+        self.devices : Dict[str, DeviceComposer] = dict()
+
+    def get_device(self, device_uuid : str) -> DeviceComposer:
+        if device_uuid not in self.devices:
+            self.devices[device_uuid] = DeviceComposer(device_uuid)
+        return self.devices[device_uuid]
+
+    def get_config_rules(self, network_instance_name : str, delete : bool = False) -> Dict[str, List[Dict]]:
+        return {
+            device_uuid : device.get_config_rules(network_instance_name, delete=delete)
+            for device_uuid, device in self.devices.items()
+        }
diff --git a/src/service/service/service_handlers/l3nm_gnmi_openconfig/L3NMGnmiOpenConfigServiceHandler.py b/src/service/service/service_handlers/l3nm_gnmi_openconfig/L3NMGnmiOpenConfigServiceHandler.py
new file mode 100644
index 0000000000000000000000000000000000000000..a9cec3f42cf75a27451e953f85342e299b642685
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_gnmi_openconfig/L3NMGnmiOpenConfigServiceHandler.py
@@ -0,0 +1,161 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+import json, logging
+from typing import Any, Dict, List, Optional, Tuple, Union
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.proto.context_pb2 import ConfigRule, DeviceId, Service
+from common.tools.object_factory.Device import json_device_id
+from common.type_checkers.Checkers import chk_type
+from service.service.service_handler_api.Tools import get_device_endpoint_uuids, get_endpoint_matching
+from service.service.service_handler_api._ServiceHandler import _ServiceHandler
+from service.service.service_handler_api.SettingsHandler import SettingsHandler
+from service.service.task_scheduler.TaskExecutor import TaskExecutor
+from .ConfigRuleComposer import ConfigRuleComposer
+
+LOGGER = logging.getLogger(__name__)
+
+METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'l3nm_gnmi_openconfig'})
+
+class L3NMGnmiOpenConfigServiceHandler(_ServiceHandler):
+    def __init__(   # pylint: disable=super-init-not-called
+        self, service : Service, task_executor : TaskExecutor, **settings
+    ) -> None:
+        self.__service = service
+        self.__task_executor = task_executor
+        self.__settings_handler = SettingsHandler(service.service_config, **settings)
+        self.__composer = ConfigRuleComposer()
+        self.__endpoint_map : Dict[Tuple[str, str], str] = dict()
+
+    def _compose_config_rules(self, endpoints : List[Tuple[str, str, Optional[str]]]) -> None:
+        for endpoint in endpoints:
+            device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint)
+
+            device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+            device_settings = self.__settings_handler.get_device_settings(device_obj)
+            _device = self.__composer.get_device(device_obj.name)
+            _device.configure(device_obj, device_settings)
+
+            endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid)
+            endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
+            _endpoint = _device.get_endpoint(endpoint_obj.name)
+            _endpoint.configure(endpoint_obj, endpoint_settings)
+
+            self.__endpoint_map[(device_uuid, endpoint_uuid)] = device_obj.name
+
+    def _do_configurations(
+        self, config_rules_per_device : Dict[str, List[Dict]], endpoints : List[Tuple[str, str, Optional[str]]],
+        delete : bool = False
+    ) -> List[Union[bool, Exception]]:
+        # Configuration is done atomically on each device, all OK / all KO per device
+        results_per_device = dict()
+        for device_name,json_config_rules in config_rules_per_device.items():
+            try:
+                device_obj = self.__composer.get_device(device_name).objekt
+                if len(json_config_rules) == 0: continue
+                del device_obj.device_config.config_rules[:]
+                for json_config_rule in json_config_rules:
+                    device_obj.device_config.config_rules.append(ConfigRule(**json_config_rule))
+                self.__task_executor.configure_device(device_obj)
+                results_per_device[device_name] = True
+            except Exception as e: # pylint: disable=broad-exception-caught
+                verb = 'deconfigure' if delete else 'configure'
+                MSG = 'Unable to {:s} Device({:s}) : ConfigRules({:s})'
+                LOGGER.exception(MSG.format(verb, str(device_name), str(json_config_rules)))
+                results_per_device[device_name] = e
+
+        results = []
+        for endpoint in endpoints:
+            device_uuid, endpoint_uuid = get_device_endpoint_uuids(endpoint)
+            device_name = self.__endpoint_map[(device_uuid, endpoint_uuid)]
+            results.append(results_per_device[device_name])
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetEndpoint(
+        self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None
+    ) -> List[Union[bool, Exception]]:
+        chk_type('endpoints', endpoints, list)
+        if len(endpoints) == 0: return []
+        service_uuid = self.__service.service_id.service_uuid.uuid
+        #settings = self.__settings_handler.get('/settings')
+        self._compose_config_rules(endpoints)
+        network_instance_name = service_uuid.split('-')[0]
+        config_rules_per_device = self.__composer.get_config_rules(network_instance_name, delete=False)
+        results = self._do_configurations(config_rules_per_device, endpoints)
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteEndpoint(
+        self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None
+    ) -> List[Union[bool, Exception]]:
+        chk_type('endpoints', endpoints, list)
+        if len(endpoints) == 0: return []
+        service_uuid = self.__service.service_id.service_uuid.uuid
+        #settings = self.__settings_handler.get('/settings')
+        self._compose_config_rules(endpoints)
+        network_instance_name = service_uuid.split('-')[0]
+        config_rules_per_device = self.__composer.get_config_rules(network_instance_name, delete=True)
+        results = self._do_configurations(config_rules_per_device, endpoints, delete=True)
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConstraint(self, constraints : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('constraints', constraints, list)
+        if len(constraints) == 0: return []
+
+        msg = '[SetConstraint] Method not implemented. Constraints({:s}) are being ignored.'
+        LOGGER.warning(msg.format(str(constraints)))
+        return [True for _ in range(len(constraints))]
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConstraint(self, constraints : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('constraints', constraints, list)
+        if len(constraints) == 0: return []
+
+        msg = '[DeleteConstraint] Method not implemented. Constraints({:s}) are being ignored.'
+        LOGGER.warning(msg.format(str(constraints)))
+        return [True for _ in range(len(constraints))]
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+
+        results = []
+        for resource in resources:
+            try:
+                resource_value = json.loads(resource[1])
+                self.__settings_handler.set(resource[0], resource_value)
+                results.append(True)
+            except Exception as e: # pylint: disable=broad-except
+                LOGGER.exception('Unable to SetConfig({:s})'.format(str(resource)))
+                results.append(e)
+
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConfig(self, resources : List[Tuple[str, Any]]) -> List[Union[bool, Exception]]:
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+
+        results = []
+        for resource in resources:
+            try:
+                self.__settings_handler.delete(resource[0])
+            except Exception as e: # pylint: disable=broad-except
+                LOGGER.exception('Unable to DeleteConfig({:s})'.format(str(resource)))
+                results.append(e)
+
+        return results
diff --git a/src/service/service/service_handlers/l3nm_gnmi_openconfig/__init__.py b/src/service/service/service_handlers/l3nm_gnmi_openconfig/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_gnmi_openconfig/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
diff --git a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py
index 5d260bf86b82c66be8eb2f0caa683a72d8bd0ba5..1e4425cdbcaa6ac1f423f2c3c65889e0e8017789 100644
--- a/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py
+++ b/src/service/service/service_handlers/l3nm_openconfig/ConfigRules.py
@@ -12,13 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Dict, List
+from typing import Dict, List, Tuple
 from common.tools.object_factory.ConfigRule import json_config_rule_delete, json_config_rule_set
 from service.service.service_handler_api.AnyTreeTools import TreeNode
 
 def setup_config_rules(
     service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str, endpoint_name : str,
-    service_settings : TreeNode, endpoint_settings : TreeNode
+    service_settings : TreeNode, endpoint_settings : TreeNode, endpoint_acls : List [Tuple]
 ) -> List[Dict]:
 
     if service_settings  is None: return []
@@ -27,22 +27,26 @@ def setup_config_rules(
     json_settings          : Dict = service_settings.value
     json_endpoint_settings : Dict = endpoint_settings.value
 
-    service_short_uuid        = service_uuid.split('-')[-1]
-    network_instance_name     = '{:s}-NetInst'.format(service_short_uuid)
-    network_interface_desc    = '{:s}-NetIf'.format(service_uuid)
-    network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid)
+    mtu                       = json_settings.get('mtu',                          1450     )  # 1512
+    #address_families         = json_settings.get('address_families',             []       )  # ['IPV4']
+    bgp_as                    = json_settings.get('bgp_as',                       65000    )  # 65000
 
-    mtu                 = json_settings.get('mtu',                          1450     )  # 1512
-    #address_families    = json_settings.get('address_families',             []       )  # ['IPV4']
-    bgp_as              = json_settings.get('bgp_as',                       65000    )  # 65000
-    route_distinguisher = json_settings.get('route_distinguisher',          '0:0'    )  # '60001:801'
-    sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
-    router_id           = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
-    vlan_id             = json_endpoint_settings.get('vlan_id',             1        )  # 400
-    address_ip          = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
-    address_prefix      = json_endpoint_settings.get('address_prefix',      24       )  # 30
-    policy_import       = json_endpoint_settings.get('policy_AZ',            '2'      )  # 2
-    policy_export       = json_endpoint_settings.get('policy_ZA',            '7'      )  # 30
+    router_id                 = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
+    route_distinguisher       = json_settings.get('route_distinguisher',          '65000:101'    )  # '60001:801'
+    sub_interface_index       = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
+    vlan_id                   = json_endpoint_settings.get('vlan_id',             1        )  # 400
+    address_ip                = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
+    address_prefix            = json_endpoint_settings.get('address_prefix',      24       )  # 30
+
+    policy_import             = json_endpoint_settings.get('policy_AZ',            '2'     )  # 2
+    policy_export             = json_endpoint_settings.get('policy_ZA',            '7'     )  # 30
+    #network_interface_desc    = '{:s}-NetIf'.format(service_uuid)
+    network_interface_desc    = json_endpoint_settings.get('ni_description','')
+    #network_subinterface_desc = '{:s}-NetSubIf'.format(service_uuid)
+    network_subinterface_desc = json_endpoint_settings.get('subif_description','')
+    #service_short_uuid       = service_uuid.split('-')[-1]
+    #network_instance_name    = '{:s}-NetInst'.format(service_short_uuid)
+    network_instance_name     = json_endpoint_settings.get('ni_name',          service_uuid.split('-')[-1])  #ELAN-AC:1
 
     if_subif_name       = '{:s}.{:d}'.format(endpoint_name, vlan_id)
 
@@ -50,7 +54,9 @@ def setup_config_rules(
         # Configure Interface (not used)
         #json_config_rule_set(
         #    '/interface[{:s}]'.format(endpoint_name), {
-        #        'name': endpoint_name, 'description': network_interface_desc, 'mtu': mtu,
+        #        'name': endpoint_name, 
+        #        'description': network_interface_desc, 
+        #        'mtu': mtu,
         #}),
 
         #Create network instance
@@ -177,6 +183,10 @@ def setup_config_rules(
         }),
 
     ]
+    for res_key, res_value in endpoint_acls:
+        json_config_rules.append(
+               {'action': 1, 'acl': res_value}
+            )
     return json_config_rules
 
 def teardown_config_rules(
diff --git a/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py b/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py
index b14a005e12947cc99b4d46ad0c58c9aae5778d05..3f8a6d9dd445fb4e5b9f051ac117ca71655446e3 100644
--- a/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py
+++ b/src/service/service/service_handlers/l3nm_openconfig/L3NMOpenConfigServiceHandler.py
@@ -54,11 +54,12 @@ class L3NMOpenConfigServiceHandler(_ServiceHandler):
                 device_obj = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
                 endpoint_obj = get_endpoint_matching(device_obj, endpoint_uuid)
                 endpoint_settings = self.__settings_handler.get_endpoint_settings(device_obj, endpoint_obj)
+                endpoint_acls = self.__settings_handler.get_endpoint_acls(device_obj, endpoint_obj)
                 endpoint_name = endpoint_obj.name
 
                 json_config_rules = setup_config_rules(
                     service_uuid, connection_uuid, device_uuid, endpoint_uuid, endpoint_name,
-                    settings, endpoint_settings)
+                    settings, endpoint_settings, endpoint_acls)
 
                 if len(json_config_rules) > 0:
                     del device_obj.device_config.config_rules[:]
diff --git a/src/service/service/tools/GeodesicDistance.py b/src/service/service/tools/GeodesicDistance.py
new file mode 100644
index 0000000000000000000000000000000000000000..b66d336f0f617aa834905785e2e49f95073a2df9
--- /dev/null
+++ b/src/service/service/tools/GeodesicDistance.py
@@ -0,0 +1,18 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+from geopy.distance import geodesic
+
+def gps_distance(gps1, gps2):
+    return geodesic((gps1.latitude, gps1.longitude), (gps2.latitude, gps2.longitude)).km
diff --git a/src/service/tests/PrepareTestScenario.py b/src/service/tests/PrepareTestScenario.py
index e4609ec416803312926422aca16cb02a6785a789..6397d95495d4e06cbb6fa2d055a293cfac0bf48f 100644
--- a/src/service/tests/PrepareTestScenario.py
+++ b/src/service/tests/PrepareTestScenario.py
@@ -22,30 +22,32 @@ from service.client.ServiceClient import ServiceClient
 from service.service.ServiceService import ServiceService
 from service.service.service_handler_api.ServiceHandlerFactory import ServiceHandlerFactory
 from service.service.service_handlers import SERVICE_HANDLERS
-from service.tests.MockService_Dependencies import MockService_Dependencies
+#from service.tests.MockService_Dependencies import MockService_Dependencies
 
 LOCAL_HOST = '127.0.0.1'
 MOCKSERVICE_PORT = 10000
-SERVICE_SERVICE_PORT = MOCKSERVICE_PORT + get_service_port_grpc(ServiceNameEnum.SERVICE) # avoid privileged ports
+SERVICE_SERVICE_PORT = MOCKSERVICE_PORT + int(get_service_port_grpc(ServiceNameEnum.SERVICE)) # avoid privileged ports
 os.environ[get_env_var_name(ServiceNameEnum.SERVICE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
 os.environ[get_env_var_name(ServiceNameEnum.SERVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(SERVICE_SERVICE_PORT)
 
-@pytest.fixture(scope='session')
-def mock_service():
-    _service = MockService_Dependencies(MOCKSERVICE_PORT)
-    _service.configure_env_vars()
-    _service.start()
-    yield _service
-    _service.stop()
+#@pytest.fixture(scope='session')
+#def mock_service():
+#    _service = MockService_Dependencies(MOCKSERVICE_PORT)
+#    _service.configure_env_vars()
+#    _service.start()
+#    yield _service
+#    _service.stop()
 
 @pytest.fixture(scope='session')
-def context_client(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name
+#def context_client(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name
+def context_client():
     _client = ContextClient()
     yield _client
     _client.close()
 
 @pytest.fixture(scope='session')
-def device_client(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name
+#def device_client(mock_service : MockService_Dependencies): # pylint: disable=redefined-outer-name
+def device_client():
     _client = DeviceClient()
     yield _client
     _client.close()
diff --git a/src/service/tests/ServiceHandler_L3NM_EMU.py b/src/service/tests/ServiceHandler_L3NM_EMU.py
index 3df27b439626dad652e443cca4195ce36f4ac86f..2f58aabd987eb391c195fb1f170959178ba40be6 100644
--- a/src/service/tests/ServiceHandler_L3NM_EMU.py
+++ b/src/service/tests/ServiceHandler_L3NM_EMU.py
@@ -13,63 +13,97 @@
 # limitations under the License.
 
 from typing import Dict, List, Tuple
+
+from common.tools.object_factory.Location import json_location, json_gps_position
 from common.tools.object_factory.ConfigRule import json_config_rule_set
-from common.tools.object_factory.Constraint import json_constraint_custom
+from common.tools.object_factory.Constraint import json_constraint_custom, json_constraint_endpoint_location_gps
 from common.tools.object_factory.Device import (
-    json_device_emulated_packet_router_disabled, json_device_emulated_tapi_disabled, json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
+    json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
+    json_device_emulated_tapi_disabled, json_device_id)
+from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_descriptor, json_endpoint_id
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Service import json_service_id, json_service_l3nm_planned
 from .CommonObjects import CONTEXT, CONTEXT_ID, PACKET_PORT_SAMPLE_TYPES, TOPOLOGY, TOPOLOGY_ID
 
 SERVICE_HANDLER_NAME = 'l3nm_emulated'
 
-def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Tuple[str, str]]):
+def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Dict]):
     return [
-        json_endpoint_id(device_id, ep_uuid)
-        for ep_uuid, _ in endpoint_descriptors
+        json_endpoint_id(device_id, ep_data['uuid'])
+        for ep_data in endpoint_descriptors
     ]
 
-def json_endpoints(device_id : Dict, endpoint_descriptors : List[Tuple[str, str]]):
+def json_endpoints(device_id : Dict, endpoint_descriptors : List[Dict]):
     return [
-        json_endpoint(device_id, ep_uuid, ep_type, kpi_sample_types=PACKET_PORT_SAMPLE_TYPES)
-        for ep_uuid, ep_type in endpoint_descriptors
+        json_endpoint(
+            device_id, ep_data['uuid'], ep_data['type'], kpi_sample_types=PACKET_PORT_SAMPLE_TYPES,
+            location=ep_data.get('location'))
+        for ep_data in endpoint_descriptors
     ]
 
+
+BARCELONA_GPS = (41.386726, 2.170107)
+MALAGA_GPS = (36.721162, -4.418339)
+ZARAGOZA_GPS = (41.655552, -0.876442)
+MADRID_GPS = (40.416741, -3.703285)
+TOLEDO_GPS = (39.862947, -4.027485)
+ANDORRA_GPS = (42.506017, 1.525923)
+SANTIAGO_GPS = (42.876254, -8.543588)
+GRANADA_GPS =    (37.178106, -3.599816)
+PONFERRADA_GPS = (42.550116, -6.597930)
+ALBACETE_GPS = (38.998249, -1.858145)
+
+
 # ----- Devices --------------------------------------------------------------------------------------------------------
 DEVICE_R1_UUID          = 'R1'
-DEVICE_R1_ENDPOINT_DEFS = [('EP1', 'optical'), ('EP100', 'copper')]
+DEVICE_R1_ENDPOINT_DEFS = [
+    json_endpoint_descriptor('EP1', 'optical', location=json_location(gps_position=json_gps_position(*BARCELONA_GPS))),
+    json_endpoint_descriptor('EP100', 'copper', location=json_location(gps_position=json_gps_position(*BARCELONA_GPS)))
+]
 DEVICE_R1_ID            = json_device_id(DEVICE_R1_UUID)
-DEVICE_R1_ENDPOINTS     = json_endpoints(DEVICE_R1_ID, DEVICE_R1_ENDPOINT_DEFS)
+DEVICE_R1_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R1_ENDPOINT_DEFS)
+DEVICE_R1               = json_device_emulated_packet_router_disabled(
+    DEVICE_R1_UUID, config_rules=DEVICE_R1_CONNECT_RULES)
 DEVICE_R1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R1_ID, DEVICE_R1_ENDPOINT_DEFS)
-DEVICE_R1               = json_device_emulated_packet_router_disabled(DEVICE_R1_UUID, endpoints=DEVICE_R1_ENDPOINTS)
 ENDPOINT_ID_R1_EP1      = DEVICE_R1_ENDPOINT_IDS[0]
 ENDPOINT_ID_R1_EP100    = DEVICE_R1_ENDPOINT_IDS[1]
 
 DEVICE_R2_UUID          = 'R2'
-DEVICE_R2_ENDPOINT_DEFS = [('EP1', 'optical'), ('EP100', 'copper')]
+DEVICE_R2_ENDPOINT_DEFS = [
+    json_endpoint_descriptor('EP1', 'optical', location=json_location(gps_position=json_gps_position(*MADRID_GPS))),
+    json_endpoint_descriptor('EP100', 'copper', location=json_location(gps_position=json_gps_position(*MADRID_GPS)))
+]
 DEVICE_R2_ID            = json_device_id(DEVICE_R2_UUID)
-DEVICE_R2_ENDPOINTS     = json_endpoints(DEVICE_R2_ID, DEVICE_R2_ENDPOINT_DEFS)
+DEVICE_R2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R2_ENDPOINT_DEFS)
+DEVICE_R2               = json_device_emulated_packet_router_disabled(
+    DEVICE_R2_UUID, config_rules=DEVICE_R2_CONNECT_RULES)
 DEVICE_R2_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R2_ID, DEVICE_R2_ENDPOINT_DEFS)
-DEVICE_R2               = json_device_emulated_packet_router_disabled(DEVICE_R2_UUID, endpoints=DEVICE_R2_ENDPOINTS)
 ENDPOINT_ID_R2_EP1      = DEVICE_R2_ENDPOINT_IDS[0]
 ENDPOINT_ID_R2_EP100    = DEVICE_R2_ENDPOINT_IDS[1]
 
 DEVICE_R3_UUID          = 'R3'
-DEVICE_R3_ENDPOINT_DEFS = [('EP1', 'optical'), ('EP100', 'copper')]
+DEVICE_R3_ENDPOINT_DEFS = [
+    json_endpoint_descriptor('EP1', 'optical', location=json_location(gps_position=json_gps_position(*MALAGA_GPS))),
+    json_endpoint_descriptor('EP100', 'copper', location=json_location(gps_position=json_gps_position(*MALAGA_GPS)))
+]
 DEVICE_R3_ID            = json_device_id(DEVICE_R3_UUID)
-DEVICE_R3_ENDPOINTS     = json_endpoints(DEVICE_R3_ID, DEVICE_R3_ENDPOINT_DEFS)
+DEVICE_R2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R2_ENDPOINT_DEFS)
+DEVICE_R3               = json_device_emulated_packet_router_disabled(
+    DEVICE_R3_UUID, config_rules=DEVICE_R2_CONNECT_RULES)
 DEVICE_R3_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R3_ID, DEVICE_R3_ENDPOINT_DEFS)
-DEVICE_R3               = json_device_emulated_packet_router_disabled(DEVICE_R3_UUID, endpoints=DEVICE_R3_ENDPOINTS)
 ENDPOINT_ID_R3_EP1      = DEVICE_R3_ENDPOINT_IDS[0]
 ENDPOINT_ID_R3_EP100    = DEVICE_R3_ENDPOINT_IDS[1]
 
 DEVICE_O1_UUID          = 'O1'
-DEVICE_O1_ENDPOINT_DEFS = [('EP1', 'optical'), ('EP2', 'optical'), ('EP3', 'optical')]
+DEVICE_O1_ENDPOINT_DEFS = [
+    json_endpoint_descriptor('EP1', 'optical', location=json_location(gps_position=json_gps_position(*PONFERRADA_GPS))),
+    json_endpoint_descriptor('EP2', 'optical', location=json_location(gps_position=json_gps_position(*PONFERRADA_GPS))),
+    json_endpoint_descriptor('EP3', 'optical', location=json_location(gps_position=json_gps_position(*PONFERRADA_GPS)))
+]
 DEVICE_O1_ID            = json_device_id(DEVICE_O1_UUID)
-DEVICE_O1_ENDPOINTS     = json_endpoints(DEVICE_O1_ID, DEVICE_O1_ENDPOINT_DEFS)
+DEVICE_O1_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_O1_ENDPOINT_DEFS)
+DEVICE_O1               = json_device_emulated_tapi_disabled(DEVICE_O1_UUID, config_rules=DEVICE_O1_CONNECT_RULES)
 DEVICE_O1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_O1_ID, DEVICE_O1_ENDPOINT_DEFS)
-DEVICE_O1               = json_device_emulated_tapi_disabled(DEVICE_O1_UUID, endpoints=DEVICE_O1_ENDPOINTS)
 ENDPOINT_ID_O1_EP1      = DEVICE_O1_ENDPOINT_IDS[0]
 ENDPOINT_ID_O1_EP2      = DEVICE_O1_ENDPOINT_IDS[1]
 ENDPOINT_ID_O1_EP3      = DEVICE_O1_ENDPOINT_IDS[2]
@@ -104,6 +138,16 @@ SERVICE_R1_R3_CONSTRAINTS  = [
     json_constraint_custom('latency_ms', 15.2),
     json_constraint_custom('jitter_us', 1.2),
 ]
+
+SERVICE_R1_R3_CONSTRAINTS_LOCATION = [
+    json_constraint_endpoint_location_gps(None, ZARAGOZA_GPS[0], ZARAGOZA_GPS[1]),
+    json_constraint_endpoint_location_gps(None, TOLEDO_GPS[0], TOLEDO_GPS[1]),
+]
+SERVICE_R1_R3_CONSTRAINTS_LOCATION_NEW = [
+    json_constraint_endpoint_location_gps(None, SANTIAGO_GPS[0], SANTIAGO_GPS[1]),
+    json_constraint_endpoint_location_gps(None, GRANADA_GPS[0], GRANADA_GPS[1]),
+]
+
 SERVICE_R1_R3_CONFIG_RULES = [
     json_config_rule_set(
         '/settings',
@@ -123,14 +167,15 @@ SERVICE_R1_R3_DESCRIPTOR   = json_service_l3nm_planned(SERVICE_R1_R3_UUID)
 
 # ----- Test Descriptor ------------------------------------------------------------------------------------------------
 TEST_SERVICE_HANDLER = (SERVICE_HANDLER_NAME, {
-    'contexts'              : [CONTEXT],
-    'topologies'            : [TOPOLOGY],
-    'devices'               : [DEVICE_R1, DEVICE_R2, DEVICE_R3, DEVICE_O1],
-    'links'                 : [LINK_R1_O1, LINK_R2_O1, LINK_R3_O1],
-
-    'service_id'            : SERVICE_R1_R3_ID,
-    'service_descriptor'    : SERVICE_R1_R3_DESCRIPTOR,
-    'service_endpoint_ids'  : SERVICE_R1_R3_ENDPOINT_IDS,
-    'service_config_rules'  : SERVICE_R1_R3_CONFIG_RULES,
-    'service_constraints'   : SERVICE_R1_R3_CONSTRAINTS,
+    'contexts'                          : [CONTEXT],
+    'topologies'                        : [TOPOLOGY],
+    'devices'                           : [DEVICE_R1, DEVICE_R2, DEVICE_R3, DEVICE_O1],
+    'links'                             : [LINK_R1_O1, LINK_R2_O1, LINK_R3_O1],
+    'service_id'                        : SERVICE_R1_R3_ID,
+    'service_descriptor'                : SERVICE_R1_R3_DESCRIPTOR,
+    'service_endpoint_ids'              : SERVICE_R1_R3_ENDPOINT_IDS,
+    'service_config_rules'              : SERVICE_R1_R3_CONFIG_RULES,
+    'service_constraints'               : SERVICE_R1_R3_CONSTRAINTS,
+    'service_constraints_location'      : SERVICE_R1_R3_CONSTRAINTS_LOCATION,
+    'service_constraints_location_new'  : SERVICE_R1_R3_CONSTRAINTS_LOCATION_NEW,
 })
diff --git a/src/service/tests/ServiceHandler_L3NM_OC.py b/src/service/tests/ServiceHandler_L3NM_OC.py
index a8f1e315a136838cdea4e2c7c4c9e444be250a4b..2dcf089e0263d77203adfc45e5d06dbe54727347 100644
--- a/src/service/tests/ServiceHandler_L3NM_OC.py
+++ b/src/service/tests/ServiceHandler_L3NM_OC.py
@@ -19,28 +19,31 @@ from common.tools.object_factory.Constraint import json_constraint_custom
 from common.tools.object_factory.Device import (
     json_device_connect_rules, json_device_emulated_packet_router_disabled, json_device_emulated_tapi_disabled,
     json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
+from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_descriptor, json_endpoint_id
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Service import json_service_id, json_service_l3nm_planned
 from .CommonObjects import CONTEXT, CONTEXT_ID, PACKET_PORT_SAMPLE_TYPES, TOPOLOGY, TOPOLOGY_ID
 
 SERVICE_HANDLER_NAME = 'l3nm_openconfig'
 
-def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Tuple[str, str]]):
+def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Dict]):
     return [
-        json_endpoint_id(device_id, ep_uuid)
-        for ep_uuid, _ in endpoint_descriptors
+        json_endpoint_id(device_id, ep_data['uuid'])
+        for ep_data in endpoint_descriptors
     ]
 
-def json_endpoints(device_id : Dict, endpoint_descriptors : List[Tuple[str, str]]):
+def json_endpoints(device_id : Dict, endpoint_descriptors : List[Dict]):
     return [
-        json_endpoint(device_id, ep_uuid, ep_type, kpi_sample_types=PACKET_PORT_SAMPLE_TYPES)
-        for ep_uuid, ep_type in endpoint_descriptors
+        json_endpoint(
+            device_id, ep_data['uuid'], ep_data['type'], kpi_sample_types=PACKET_PORT_SAMPLE_TYPES,
+            location=ep_data.get('location'))
+        for ep_data in endpoint_descriptors
     ]
 
 # ----- Devices --------------------------------------------------------------------------------------------------------
 DEVICE_R1_UUID          = 'R1'
-DEVICE_R1_ENDPOINT_DEFS = [('EP1', 'optical'), ('EP100', 'copper')]
+DEVICE_R1_ENDPOINT_DEFS = [json_endpoint_descriptor('EP1', 'optical'),
+                           json_endpoint_descriptor('EP100', 'copper')]
 DEVICE_R1_ADDRESS       = '10.0.0.1'
 DEVICE_R1_PORT          = 830
 DEVICE_R1_USERNAME      = 'admin'
@@ -60,7 +63,8 @@ DEVICE_R1_CONNECT_RULES = json_device_connect_rules(DEVICE_R1_ADDRESS, DEVICE_R1
 
 
 DEVICE_R2_UUID          = 'R2'
-DEVICE_R2_ENDPOINT_DEFS = [('EP1', 'optical'), ('EP100', 'copper')]
+DEVICE_R2_ENDPOINT_DEFS = [json_endpoint_descriptor('EP1', 'optical'),
+                           json_endpoint_descriptor('EP100', 'copper')]
 DEVICE_R2_ADDRESS       = '10.0.0.2'
 DEVICE_R2_PORT          = 830
 DEVICE_R2_USERNAME      = 'admin'
@@ -80,7 +84,8 @@ DEVICE_R2_CONNECT_RULES = json_device_connect_rules(DEVICE_R2_ADDRESS, DEVICE_R2
 
 
 DEVICE_O1_UUID          = 'O1'
-DEVICE_O1_ENDPOINT_DEFS = [(str(uuid.uuid4()), 'optical'), (str(uuid.uuid4()), 'optical')]
+DEVICE_O1_ENDPOINT_DEFS = [json_endpoint_descriptor(str(uuid.uuid4()), 'optical'),
+                           json_endpoint_descriptor(str(uuid.uuid4()), 'optical')]
 DEVICE_O1_ADDRESS       = '10.0.0.3'
 DEVICE_O1_PORT          = 4900
 DEVICE_O1_TIMEOUT       = 120
@@ -137,14 +142,15 @@ SERVICE_R1_R2_DESCRIPTOR   = json_service_l3nm_planned(SERVICE_R1_R2_UUID)
 
 # ----- Test Descriptor ------------------------------------------------------------------------------------------------
 TEST_SERVICE_HANDLER = (SERVICE_HANDLER_NAME, {
-    'contexts'              : [CONTEXT],
-    'topologies'            : [TOPOLOGY],
-    'devices'               : [DEVICE_R1, DEVICE_R2, DEVICE_O1],
-    'links'                 : [LINK_R1_O1, LINK_R2_O1],
-
-    'service_id'            : SERVICE_R1_R2_ID,
-    'service_descriptor'    : SERVICE_R1_R2_DESCRIPTOR,
-    'service_endpoint_ids'  : SERVICE_R1_R2_ENDPOINT_IDS,
-    'service_config_rules'  : SERVICE_R1_R2_CONFIG_RULES,
-    'service_constraints'   : SERVICE_R1_R2_CONSTRAINTS,
+    'contexts'                          : [CONTEXT],
+    'topologies'                        : [TOPOLOGY],
+    'devices'                           : [DEVICE_R1, DEVICE_R2, DEVICE_O1],
+    'links'                             : [LINK_R1_O1, LINK_R2_O1],
+    'service_id'                        : SERVICE_R1_R2_ID,
+    'service_descriptor'                : SERVICE_R1_R2_DESCRIPTOR,
+    'service_endpoint_ids'              : SERVICE_R1_R2_ENDPOINT_IDS,
+    'service_config_rules'              : SERVICE_R1_R2_CONFIG_RULES,
+    'service_constraints'               : SERVICE_R1_R2_CONSTRAINTS,
+    'service_constraints_location'      : [],
+    'service_constraints_location_new'  : [],
 })
diff --git a/src/service/tests/ServiceHandlersToTest.py b/src/service/tests/ServiceHandlersToTest.py
index c50a0b45774f15497578a9c5b365e1e331d6d95e..9b45cad7b9def99a5285f4a249af5cd608a91770 100644
--- a/src/service/tests/ServiceHandlersToTest.py
+++ b/src/service/tests/ServiceHandlersToTest.py
@@ -22,8 +22,8 @@ try:
 except ImportError:
     pass
 
-try:
-    from service.tests.ServiceHandler_L3NM_OC import TEST_SERVICE_HANDLER
-    SERVICE_HANDLERS_TO_TEST.append(TEST_SERVICE_HANDLER)
-except ImportError:
-    pass
+#try:
+#    from service.tests.ServiceHandler_L3NM_OC import TEST_SERVICE_HANDLER
+#    SERVICE_HANDLERS_TO_TEST.append(TEST_SERVICE_HANDLER)
+#except ImportError:
+#    pass
diff --git a/src/service/tests/test_unitary.py b/src/service/tests/test_unitary.py
index f99f9b191083db017486d03d0bc93b0d9152b35f..366add517994c255abd29056f2ab523de3752a37 100644
--- a/src/service/tests/test_unitary.py
+++ b/src/service/tests/test_unitary.py
@@ -22,7 +22,9 @@ from device.client.DeviceClient import DeviceClient
 from service.client.ServiceClient import ServiceClient
 from .PrepareTestScenario import ( # pylint: disable=unused-import
     # be careful, order of symbols is important here!
-    mock_service, service_service, context_client, device_client, service_client)
+    # mock_service,
+    service_service, context_client, device_client, service_client
+)
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
@@ -37,8 +39,8 @@ class TestServiceHandlers:
     scenarios = SERVICE_HANDLERS_TO_TEST
 
     def test_prepare_environment(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -50,8 +52,8 @@ class TestServiceHandlers:
 
 
     def test_service_create_error_cases(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -91,8 +93,8 @@ class TestServiceHandlers:
 
 
     def test_service_create_correct(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -101,8 +103,8 @@ class TestServiceHandlers:
 
 
     def test_service_get_created(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -112,8 +114,8 @@ class TestServiceHandlers:
 
 
     def test_service_update_configure(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -123,7 +125,6 @@ class TestServiceHandlers:
         service_with_settings['service_config']['config_rules'].extend(service_config_rules)
         service_with_settings['service_constraints'].extend(service_constraints)
         service_client.UpdateService(Service(**service_with_settings))
-
         for endpoint_id in service_endpoint_ids:
             device_id = endpoint_id['device_id']
             device_data = context_client.GetDevice(DeviceId(**device_id))
@@ -131,10 +132,9 @@ class TestServiceHandlers:
                 LOGGER.info('device_data[{:s}][#{:d}] => {:s}'.format(
                     str(device_id), i, grpc_message_to_json_string(config_rule)))
 
-
     def test_service_update_deconfigure(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -152,8 +152,8 @@ class TestServiceHandlers:
 
 
     def test_service_get_updated(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
@@ -162,19 +162,79 @@ class TestServiceHandlers:
         LOGGER.info('service_data = {:s}'.format(grpc_message_to_json_string(service_data)))
 
 
-    def test_service_delete(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+    def test_service_update_configure_loc(
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
 
-        service_client.DeleteService(ServiceId(**service_id))
+        service_with_settings = copy.deepcopy(service_descriptor)
+        service_with_settings['service_config']['config_rules'].extend(service_config_rules)
+        service_with_settings['service_constraints'].extend(service_constraints_location)
+        service_client.UpdateService(Service(**service_with_settings))
+
+        for endpoint_id in service_endpoint_ids:
+            device_id = endpoint_id['device_id']
+            device_data = context_client.GetDevice(DeviceId(**device_id))
+            for i,config_rule in enumerate(device_data.device_config.config_rules):
+                LOGGER.info('device_data[{:s}][#{:d}] => {:s}'.format(
+                    str(device_id), i, grpc_message_to_json_string(config_rule)))
 
 
+    def test_service_get_updated_1(
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
+        context_client : ContextClient,     # pylint: disable=redefined-outer-name
+        device_client : DeviceClient,       # pylint: disable=redefined-outer-name
+        service_client : ServiceClient):    # pylint: disable=redefined-outer-name
+
+        service_data = context_client.GetService(ServiceId(**service_id))
+        LOGGER.info('service_data = {:s}'.format(grpc_message_to_json_string(service_data)))
+
+
+    def test_service_update_configure_loc_new(
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
+        context_client : ContextClient,     # pylint: disable=redefined-outer-name
+        device_client : DeviceClient,       # pylint: disable=redefined-outer-name
+        service_client : ServiceClient):    # pylint: disable=redefined-outer-name
+    
+        service_with_settings = copy.deepcopy(service_descriptor)
+        service_with_settings['service_config']['config_rules'].extend(service_config_rules)
+        service_with_settings['service_constraints'].extend(service_constraints_location_new)
+        service_client.UpdateService(Service(**service_with_settings))
+
+        for endpoint_id in service_endpoint_ids:
+            device_id = endpoint_id['device_id']
+            device_data = context_client.GetDevice(DeviceId(**device_id))
+            for i,config_rule in enumerate(device_data.device_config.config_rules):
+                LOGGER.info('device_data[{:s}][#{:d}] => {:s}'.format(
+                    str(device_id), i, grpc_message_to_json_string(config_rule)))
+
+
+    def test_service_get_updated_2(
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
+        context_client : ContextClient,     # pylint: disable=redefined-outer-name
+        device_client : DeviceClient,       # pylint: disable=redefined-outer-name
+        service_client : ServiceClient):    # pylint: disable=redefined-outer-name
+
+        service_data = context_client.GetService(ServiceId(**service_id))
+        LOGGER.info('service_data = {:s}'.format(grpc_message_to_json_string(service_data)))
+
+    def test_service_delete_loc(
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
+        context_client : ContextClient,     # pylint: disable=redefined-outer-name
+        device_client : DeviceClient,       # pylint: disable=redefined-outer-name
+        service_client : ServiceClient):    # pylint: disable=redefined-outer-name
+
+        service_client.DeleteService(ServiceId(**service_id))
+
     def test_cleanup_environment(
-        self, service_id, service_descriptor, service_endpoint_ids, service_config_rules, service_constraints,
-        contexts, topologies, devices, links,
+        self, contexts, topologies, devices, links, service_id, service_descriptor, service_endpoint_ids,
+        service_config_rules, service_constraints, service_constraints_location, service_constraints_location_new,
         context_client : ContextClient,     # pylint: disable=redefined-outer-name
         device_client : DeviceClient,       # pylint: disable=redefined-outer-name
         service_client : ServiceClient):    # pylint: disable=redefined-outer-name
diff --git a/src/slice/service/SliceServiceServicerImpl.py b/src/slice/service/SliceServiceServicerImpl.py
index f91c55e281e8ed5f994dea3dce43a63184669795..cbe2dd5c715da21e0e8bbdead6fa60af746cd58f 100644
--- a/src/slice/service/SliceServiceServicerImpl.py
+++ b/src/slice/service/SliceServiceServicerImpl.py
@@ -18,7 +18,7 @@ from common.proto.context_pb2 import (
     Empty, Service, ServiceId, ServiceStatusEnum, ServiceTypeEnum, Slice, SliceId, SliceStatusEnum)
 from common.proto.slice_pb2_grpc import SliceServiceServicer
 from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method
-from common.tools.context_queries.InterDomain import is_multi_domain
+from common.tools.context_queries.InterDomain import is_inter_domain #, is_multi_domain
 from common.tools.context_queries.Slice import get_slice_by_id
 from common.tools.grpc.ConfigRules import copy_config_rules
 from common.tools.grpc.Constraints import copy_constraints
@@ -48,7 +48,7 @@ class SliceServiceServicerImpl(SliceServiceServicer):
 
         slice_rw = Slice()
         slice_rw.CopyFrom(request if slice_ro is None else slice_ro)
-        slice_rw.name = request.name
+        if len(request.name) > 0: slice_rw.name = request.name
         slice_rw.slice_owner.CopyFrom(request.slice_owner)                          # pylint: disable=no-member
         slice_rw.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED    # pylint: disable=no-member
 
@@ -74,7 +74,7 @@ class SliceServiceServicerImpl(SliceServiceServicer):
         #changes = deepdiff.DeepDiff(json_current_slice, json_updated_slice)
         #LOGGER.info('changes = {:s}'.format(str(changes)))
 
-        if is_multi_domain(context_client, slice_with_uuids.slice_endpoint_ids):
+        if is_inter_domain(context_client, slice_with_uuids.slice_endpoint_ids):
             interdomain_client = InterdomainClient()
             slice_id = interdomain_client.RequestSlice(slice_with_uuids)
             slice_ = context_client.GetSlice(slice_id)
@@ -203,29 +203,28 @@ class SliceServiceServicerImpl(SliceServiceServicer):
             context_client.close()
             return Empty()
 
-        if is_multi_domain(context_client, _slice.slice_endpoint_ids):
-            #interdomain_client = InterdomainClient()
-            #slice_id = interdomain_client.DeleteSlice(request)
-            raise NotImplementedError('Delete inter-domain slice')
-        else:
-            current_slice = Slice()
-            current_slice.CopyFrom(_slice)
-            current_slice.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_DEINIT # pylint: disable=no-member
-            context_client.SetSlice(current_slice)
+        _slice_rw = Slice()
+        _slice_rw.CopyFrom(_slice)
+        _slice_rw.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_DEINIT # pylint: disable=no-member
+        context_client.SetSlice(_slice_rw)
 
+        if is_inter_domain(context_client, _slice.slice_endpoint_ids):
+            interdomain_client = InterdomainClient()
+            slice_id = interdomain_client.DeleteSlice(request)
+            interdomain_client.close()
+        else:
             if self._slice_grouper.is_enabled:
-                ungrouped = self._slice_grouper.ungroup(current_slice) # pylint: disable=unused-variable
-
-            service_client = ServiceClient()
-            for service_id in _slice.slice_service_ids:
-                current_slice = Slice()
-                current_slice.slice_id.CopyFrom(_slice.slice_id) # pylint: disable=no-member
-                slice_service_id = current_slice.slice_service_ids.add() # pylint: disable=no-member
-                slice_service_id.CopyFrom(service_id)
-                context_client.UnsetSlice(current_slice)
-
-                service_client.DeleteService(service_id)
-            service_client.close()
+                ungrouped = self._slice_grouper.ungroup(_slice_rw) # pylint: disable=unused-variable
+
+        service_client = ServiceClient()
+        for service_id in _slice.slice_service_ids:
+            tmp_slice = Slice()
+            tmp_slice.slice_id.CopyFrom(_slice.slice_id) # pylint: disable=no-member
+            slice_service_id = tmp_slice.slice_service_ids.add() # pylint: disable=no-member
+            slice_service_id.CopyFrom(service_id)
+            context_client.UnsetSlice(tmp_slice)
+            service_client.DeleteService(service_id)
+        service_client.close()
 
         context_client.RemoveSlice(request)
         context_client.close()
diff --git a/src/te/.dockerignore b/src/te/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..558d2f3ece10e09c6a5ecd710c21e3f727bdd25c
--- /dev/null
+++ b/src/te/.dockerignore
@@ -0,0 +1,4 @@
+Dockerfile
+_build
+README.md
+.tool-versions
diff --git a/src/te/.gitignore b/src/te/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..eeb7cfc4aefeeb2f4fa86e208119ebc360c3f7af
--- /dev/null
+++ b/src/te/.gitignore
@@ -0,0 +1,21 @@
+.tool-versions
+.rebar3
+_*
+.eunit
+*.o
+*.beam
+*.plt
+*.swp
+*.swo
+.erlang.cookie
+ebin
+log
+erl_crash.dump
+.rebar
+logs
+_build
+.idea
+*.iml
+rebar3.crashdump
+*~
+config/dev.config
diff --git a/src/te/Dockerfile b/src/te/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..aaca9fe87ad330c2d43406d5b5df2a585617d937
--- /dev/null
+++ b/src/te/Dockerfile
@@ -0,0 +1,59 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+# Multi-stage Docker image build
+
+# Build stage 0
+FROM erlang:24.3-alpine
+
+RUN apk add --no-cache bash git
+
+RUN mkdir /var/teraflow
+WORKDIR /var/teraflow
+
+COPY proto proto
+RUN bash -c proto/generate_code_erlang.sh
+RUN mkdir src
+COPY src/te src/te
+WORKDIR src/te
+RUN rebar3 as prod release
+
+# Build stage 1
+FROM alpine
+
+# Install some libs
+RUN apk add --no-cache libgcc libstdc++ && \
+    apk add --no-cache openssl && \
+    apk add --no-cache libcrypto1.1 && \
+    apk add --no-cache ncurses-libs
+
+# Install the released application
+COPY --from=0 /var/teraflow/src/te/_build/prod/rel/tfte /tfte
+
+# Expose relevant ports
+EXPOSE 10030
+EXPOSE 4189
+
+ARG ERLANG_LOGGER_LEVEL_DEFAULT=debug
+ARG ERLANG_COOKIE_DEFAULT=tfte-unsafe-cookie
+ARG ERLANG_NODE_IP_DEFAULT=127.0.0.1
+ARG ERLANG_NODE_NAME_DEFAULT=tfte
+
+ENV ERLANG_LOGGER_LEVEL=$ERLANG_LOGGER_LEVEL_DEFAULT
+ENV ERLANG_COOKIE=$ERLANG_COOKIE_DEFAULT
+ENV ERLANG_NODE_IP=$ERLANG_NODE_IP_DEFAULT
+ENV ERLANG_NODE_NAME=$ERLANG_NODE_NAME_DEFAULT
+
+ENTRYPOINT ["/tfte/bin/tfte"]
+CMD ["foreground"]
diff --git a/src/te/README.md b/src/te/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..5da478e61ca7f88182e757c80ea7b2916de9998d
--- /dev/null
+++ b/src/te/README.md
@@ -0,0 +1,81 @@
+TeraFlow Traffic Engineering Service
+====================================
+
+This service is mean as an example of a Teraflow Service made in Erlang.
+
+The Traffic Engineering service is tested on Ubuntu 20.04. Follow the instructions below to build, test, and run this service on your local environment.
+
+
+## Build
+
+First the TeraFlow protocol buffer code must have been generated:
+
+    $ ../../proto/generate_code_erlang.sh
+
+Then the TE service can be built:
+
+    $ rebar3 compile
+
+
+## Execute Unit Tests
+
+    $ rebar3 eunit
+
+
+## Run Service Console
+
+First you need to crete a configuration file if not already done, and customize it if required:
+
+	$ cp config/dev.config.template config/dev.config
+
+Then you  can start the service in console mode:
+
+    $ rebar3 shell
+
+
+## Docker
+
+### Build Image
+
+The docker image must be built from the root of the Teraflow project:
+
+    $ docker build -t te:dev -f src/te/Dockerfile .
+
+
+### Run a shell from inside the container
+
+    $ docker run -ti --rm --entrypoint sh te:dev
+
+
+### Run Docker Container
+
+    $ docker run -d --name te --init te:dev
+
+
+### Open a Console to a Docker Container's Service
+
+    $ docker exec -it te /tfte/bin/tfte remote_console
+
+
+### Show Logs
+
+    $ docker logs te
+
+
+## Kubernetes
+
+### Open a Console
+
+    $ kubectl --namespace tfs exec -ti $(kubectl --namespace tfs get pods --selector=app=teservice -o name) -c server -- /tfte/bin/tfte remote_console
+
+
+### Show Logs
+
+    $ kubectl --namespace tfs logs $(kubectl --namespace tfs get pods --selector=app=teservice -o name) -c server
+
+
+## Teraflow
+
+To build and deploy the TE service as part of Teraflow, the following line must be added or uncomented in your `my_deploy.sh`:
+
+    export TFS_COMPONENTS="${TFS_COMPONENTS} te"
diff --git a/src/te/apps/epce/src/epce.app.src b/src/te/apps/epce/src/epce.app.src
new file mode 100644
index 0000000000000000000000000000000000000000..13324fd2fd68567623543b16affdd5b4a0241ad4
--- /dev/null
+++ b/src/te/apps/epce/src/epce.app.src
@@ -0,0 +1,30 @@
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+
+{application, epce,
+ [{description, "An Erlang PCE"},
+  {vsn, "0.1.0"},
+  {registered, []},
+  {mod, {epce_app, []}},
+  {applications,
+   [kernel,
+    stdlib,
+    pcep_server
+   ]},
+  {env,[]},
+  {modules, []},
+
+  {licenses, ["Apache 2.0"]},
+  {links, []}
+ ]}.
diff --git a/src/te/apps/epce/src/epce_app.erl b/src/te/apps/epce/src/epce_app.erl
new file mode 100644
index 0000000000000000000000000000000000000000..19f574f38eb93080beca9b3cc7c47a78994fce57
--- /dev/null
+++ b/src/te/apps/epce/src/epce_app.erl
@@ -0,0 +1,34 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(epce_app).
+
+-behaviour(application).
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Behaviour application functions
+-export([start/2, stop/1]).
+
+
+%%% BEHAVIOUR application FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start(_StartType, _StartArgs) ->
+    epce_sup:start_link().
+
+stop(_State) ->
+    ok.
diff --git a/src/te/apps/epce/src/epce_pcep_server_handler.erl b/src/te/apps/epce/src/epce_pcep_server_handler.erl
new file mode 100644
index 0000000000000000000000000000000000000000..dea88b5d0b253573b956aabcf240ffed0caf15be
--- /dev/null
+++ b/src/te/apps/epce/src/epce_pcep_server_handler.erl
@@ -0,0 +1,90 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(epce_pcep_server_handler).
+
+-behaviour(gen_pcep_handler).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+-include_lib("pcep_codec/include/pcep_codec_te.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API functions
+
+% Behaviour gen_pcep_handler functions
+-export([init/1]).
+-export([opened/4]).
+-export([flow_added/2]).
+-export([flow_initiated/2]).
+-export([ready/1]).
+-export([request_route/2]).
+-export([flow_delegated/2]).
+-export([flow_status_changed/3]).
+-export([terminate/2]).
+
+
+%%% RECORDS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(state, {}).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%%% BEHAVIOUR gen_pcep_handler FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    {ok, #{}, #state{}}.
+
+opened(Id, Caps, Sess, State) ->
+    case epce_server:session_opened(Id, Caps, Sess) of
+        ok -> {ok, State};
+        {error, Reason} -> {error, Reason}
+    end.
+
+flow_added(Flow, State) ->
+    case epce_server:flow_added(Flow) of
+        {error, _Reason} = Error -> Error;
+        ok -> {ok, State}
+    end.
+
+flow_initiated(Flow, State) ->
+    ok = epce_server:flow_initiated(Flow),
+    {ok, State}.
+
+ready(State) ->
+    {ok, State}.
+
+request_route(RouteReq, State) ->
+    case epce_server:request_route(RouteReq) of
+        {error, _Reason} = Error -> Error;
+        {ok, Route} -> {ok, Route, State}
+    end.
+
+flow_delegated(_Flow, State) ->
+    {ok, State}.
+
+flow_status_changed(FlowId, NewStatus, State) ->
+    epce_server:flow_status_changed(FlowId, NewStatus),
+    {ok, State}.
+
+terminate(_Reason, _State) ->
+    ok.
diff --git a/src/te/apps/epce/src/epce_server.erl b/src/te/apps/epce/src/epce_server.erl
new file mode 100644
index 0000000000000000000000000000000000000000..d1d86b5766a3f8d8fe31b873dddbf7c8076ca0f5
--- /dev/null
+++ b/src/te/apps/epce/src/epce_server.erl
@@ -0,0 +1,346 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(epce_server).
+
+-behaviour(gen_server).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+-include_lib("pcep_server/include/pcep_server.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API Functions
+-export([start_link/0]).
+-export([get_flows/0]).
+-export([update_flow/2]).
+-export([initiate_flow/4]).
+
+% Handler Functions
+-export([session_opened/3]).
+-export([flow_added/1]).
+-export([flow_initiated/1]).
+-export([request_route/1]).
+-export([flow_status_changed/2]).
+
+% Behaviour gen_server functions
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_continue/2]).
+-export([handle_info/2]).
+-export([code_change/3]).
+-export([terminate/2]).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(LARGE_TIMEOUT, infinity).
+
+
+%%% RECORDS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(sess, {
+        id,
+        caps,
+        monref,
+        pid
+}).
+
+-record(state, {
+        bouncer,
+        sessions = #{},
+        sess_pids = #{},
+        flows = #{}
+}).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+get_flows() ->
+    gen_server:call(?MODULE, get_flows).
+
+update_flow(FlowId, LabelStack) ->
+    gen_server:call(?MODULE, {update_flow, FlowId, LabelStack}).
+
+initiate_flow(Name, From, To, BindingLabel) ->
+    gen_server:call(?MODULE, {initiate_flow, Name, From, To,
+                              BindingLabel}, ?LARGE_TIMEOUT).
+
+
+%%% HANDLER FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+session_opened(Id, Caps, Pid) ->
+    gen_server:call(?MODULE, {session_opened, Id, Caps, Pid}).
+
+flow_added(Flow) ->
+    gen_server:call(?MODULE, {flow_added, Flow}).
+
+flow_initiated(Flow) ->
+    gen_server:call(?MODULE, {flow_initiated, Flow}).
+
+request_route(RouteReq) ->
+    gen_server:call(?MODULE, {request_route, RouteReq}).
+
+flow_status_changed(FlowId, NewStatus) ->
+    gen_server:call(?MODULE, {flow_status_changed, FlowId, NewStatus}).
+
+
+%%% BEHAVIOUR gen_server FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    {ok, bouncer_start(#state{})}.
+
+handle_call(get_flows, _From, #state{flows = Flows} = State) ->
+    {reply, {ok, Flows}, State};
+handle_call({update_flow, FlowId, Labels}, From,
+            #state{flows = Flows, sessions = SessMap} = State) ->
+    case maps:find(FlowId, Flows) of
+        error -> {reply, {error, flow_not_found}, State};
+        {ok, #{owner := Owner, route := #{} = R}} ->
+            case maps:find(Owner, SessMap) of
+                error -> {reply, {error, session_not_found}, State};
+                {ok, #sess{pid = Pid}} ->
+                    #{source := S, destination := D, constraints := C} = R,
+                    ReqRoute = routereq_from_labels(S, D, C, Labels),
+                    session_update_flow(State, Pid, FlowId, ReqRoute, From),
+                    {noreply, State}
+            end
+    end;
+handle_call({initiate_flow, Name, FromKey, ToKey, Binding}, From,
+            #state{sessions = SessMap} = State) ->
+    case {pcc_address(FromKey), pcc_address(ToKey)} of
+        {{error, Reason}, _} ->
+            {reply, {error, Reason}, State};
+        {_, {error, Reason}} ->
+            {reply, {error, Reason}, State};
+        {{ok, FromAddr}, {ok, ToAddr}} ->
+            case maps:find(FromAddr, SessMap) of
+                error -> {reply, {error, session_not_found}, State};
+                {ok, #sess{pid = Pid}} ->
+                    case compute_path(FromAddr, ToAddr) of
+                        {error, Reason} ->
+                            {reply, {error, Reason}, State};
+                        {ok, Labels} ->
+                            InitRoute = routeinit_from_labels(Name, FromAddr,
+                                            ToAddr, [], Binding, Labels),
+                            session_initiate_flow(State, Pid, InitRoute, From),
+                            {noreply, State}
+                    end
+            end
+    end;
+handle_call({session_opened, Id, Caps, Pid}, _From,
+            #state{sessions = SessMap, sess_pids = SessPids} = State) ->
+    logger:debug("Session with capabilities ~w open to ~w", [Caps, Id]),
+    case maps:find(Id, SessMap) of
+        {ok, _} -> {reply, {error, already_opened}, State};
+        error ->
+            MonRef = erlang:monitor(process, Pid),
+            SessRec = #sess{id = Id, caps = Caps, monref = MonRef, pid = Pid},
+            {reply, ok, State#state{
+                sessions = SessMap#{Id => SessRec},
+                sess_pids = SessPids#{Pid => SessRec}
+            }}
+    end;
+handle_call({flow_added, #{id := Id, route := Route} = Flow},
+            _From, #state{flows = Flows} = State) ->
+    logger:debug("Flow ~w with route ~w added", [Id, route_to_labels(Route)]),
+    {reply, ok, State#state{flows = Flows#{Id => Flow}}};
+handle_call({flow_initiated, #{id := Id, route := Route} = Flow},
+            _From, #state{flows = Flows} = State) ->
+    logger:debug("Flow ~w with route ~p initiated",
+                 [Id, route_to_labels(Route)]),
+    {reply, ok, State#state{flows = Flows#{Id => Flow}}};
+handle_call({request_route, RouteReq}, _From, State) ->
+    logger:info("Route from ~w to ~w requested",
+                [maps:get(source, RouteReq), maps:get(destination, RouteReq)]),
+    #{source := S, destination := D, constraints := C} = RouteReq,
+    case compute_path(S, D) of
+        {error, _Reason} = Error ->
+            {reply, Error, State};
+        {ok, Labels} ->
+            Route = routereq_from_labels(S, D, C, Labels),
+            {reply, {ok, Route}, State}
+    end;
+handle_call({flow_status_changed, FlowId, NewStatus}, _From,
+            #state{flows = Flows} = State) ->
+    logger:info("Flow ~w status changed to ~w", [FlowId, NewStatus]),
+    Flow = maps:get(FlowId, Flows),
+    {reply, ok, State#state{
+        flows = maps:put(FlowId, Flow#{status := NewStatus}, Flows)}};
+handle_call(Request, From, State) ->
+    logger:warning("Unexpected call from ~w: ~p", [From, Request]),
+    {reply, {error, unexpected_call}, State}.
+
+
+handle_cast(Request, State) ->
+    logger:warning("Unexpected cast: ~p", [Request]),
+    {noreply, State}.
+
+handle_continue(_Continue, State) ->
+    {noreply, State}.
+
+handle_info({flow_updated, FlowId, NewRoute, From},
+            #state{flows = Flows} = State) ->
+    logger:info("Flow ~w updated to ~w", [FlowId, route_to_labels(NewRoute)]),
+    case maps:find(FlowId, Flows) of
+        error -> {noreply, State};
+        {ok, Flow} ->
+            Flows2 = Flows#{FlowId => Flow#{route => NewRoute}},
+            gen_server:reply(From, ok),
+            {noreply, State#state{flows = Flows2}}
+    end;
+handle_info({flow_update_error, FlowId, Reason, From}, State) ->
+    logger:error("Flow ~w updated error: ~p", [FlowId, Reason]),
+    gen_server:reply(From, {error, Reason}),
+    {noreply, State};
+handle_info({flow_initiated, #{id := FlowId, route := Route} = Flow, From},
+            #state{flows = Flows} = State) ->
+    logger:info("Flow ~w initiated to ~p",
+                [FlowId, route_to_labels(Route)]),
+    gen_server:reply(From, {ok, FlowId}),
+    {noreply, State#state{flows = Flows#{FlowId => Flow}}};
+handle_info({flow_init_error, Reason, From}, State) ->
+    logger:error("Flow initialisation error: ~p", [Reason]),
+    gen_server:reply(From, {error, Reason}),
+    {noreply, State};
+handle_info({'DOWN', MonRef, process, Pid, _Reason},
+            #state{sessions = SessMap, sess_pids = PidMap} = State) ->
+    case maps:take(Pid, PidMap) of
+        {#sess{id = Id, monref = MonRef}, PidMap2} ->
+            SessMap2 = maps:remove(Id, SessMap),
+            %TODO: Do something about the flows from this session ?
+            {noreply, State#state{
+                sessions = SessMap2,
+                sess_pids = PidMap2
+            }};
+        _X ->
+            {noreply, State}
+    end;
+handle_info(Info, State) ->
+    logger:warning("Unexpected message: ~p", [Info]),
+    {noreply, State}.
+
+code_change(_OldVsn, State, _Extra) ->
+    {ok, State}.
+
+terminate(_Reason, _State) ->
+    ok.
+
+
+%%% INTERNAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+ted_index(Id) when is_binary(Id) -> id;
+ted_index({_, _, _, _}) -> pcc_address.
+
+pcc_address(Key) ->
+    case epce_ted:lookup(ted_index(Key), Key) of
+        {error, Reason} ->
+            logger:warning("Failed to find a PCC address for router ~p: ~p",
+                           [Key, Reason]),
+            {error, router_not_found};
+        {ok, #{pcc_address := Addr}} ->
+            {ok, Addr}
+    end.
+
+compute_path(From, To) when is_binary(From), is_binary(To) ->
+    compute_path_result(From, To, epce_ted:compute_path(id, From, To));
+compute_path({_, _, _, _} = From, {_, _, _, _} = To) ->
+    compute_path_result(From, To, epce_ted:compute_path(pcc_address, From, To)).
+
+compute_path_result(From, To, {error, Reason}) ->
+    logger:warning("Failed to find a route from ~p to ~p: ~p",
+                   [From, To, Reason]),
+    {error, route_not_found};
+compute_path_result(From, To, {ok, Devices}) ->
+    Labels = tl([L || #{mpls_label := L} <- Devices, L =/= undefined]),
+    logger:debug("Route from ~p to ~p: ~p", [From, To, Labels]),
+    {ok, Labels}.
+
+routereq_from_labels(Source, Destination, Constraints, Labels) ->
+    #{
+        source => Source,
+        destination => Destination,
+        constraints => Constraints,
+        steps => [
+            #{
+                is_loose => false,
+                nai_type => absent,
+                sid => #mpls_stack_entry{label = L}
+            }
+          || L <- Labels
+        ]
+    }.
+
+routeinit_from_labels(Name, Source, Destination, Constraints, Binding, Labels) ->
+    Route = routereq_from_labels(Source, Destination, Constraints, Labels),
+    Route#{
+        name => Name,
+        binding_label => Binding
+    }.
+
+route_to_labels(#{steps := Steps}) ->
+    [Sid#mpls_stack_entry.label || #{sid := Sid} <- Steps].
+
+
+%-- Session Interface Functions ------------------------------------------------
+
+session_update_flow(#state{bouncer = Pid}, SessPid, FlowId, Route, Args) ->
+    Pid ! {update_flow, SessPid, FlowId, Route, Args}.
+
+session_initiate_flow(#state{bouncer = Pid}, SessPid, Route, Args) ->
+    Pid ! {initiate_flow, SessPid, Route, Args}.
+
+bouncer_start(#state{bouncer = undefined} = State) ->
+    Self = self(),
+    Pid = erlang:spawn_link(fun() ->
+        bouncer_bootstrap(Self)
+    end),
+    receive bouncer_ready -> ok end,
+    State#state{bouncer = Pid}.
+
+bouncer_bootstrap(Parent) ->
+    Parent ! bouncer_ready,
+    bouncer_loop(Parent).
+
+bouncer_loop(Parent) ->
+    receive
+        {update_flow, SessPid, FlowId, ReqRoute, Args} ->
+            case pcep_server_session:update_flow(SessPid, FlowId, ReqRoute) of
+                {ok, NewRoute} ->
+                    Parent ! {flow_updated, FlowId, NewRoute, Args},
+                    bouncer_loop(Parent);
+                {error, Reason} ->
+                    Parent ! {flow_update_error, FlowId, Reason, Args},
+                    bouncer_loop(Parent)
+            end;
+        {initiate_flow, SessPid, InitRoute, Args} ->
+            case pcep_server_session:initiate_flow(SessPid, InitRoute) of
+                {ok, Flow} ->
+                    Parent ! {flow_initiated, Flow, Args},
+                    bouncer_loop(Parent);
+                {error, Reason} ->
+                    Parent ! {flow_init_error, Reason, Args},
+                    bouncer_loop(Parent)
+            end
+    end.
diff --git a/src/te/apps/epce/src/epce_sup.erl b/src/te/apps/epce/src/epce_sup.erl
new file mode 100644
index 0000000000000000000000000000000000000000..79c17c9a869a5bdba078e225a7187c0ebcdbcd92
--- /dev/null
+++ b/src/te/apps/epce/src/epce_sup.erl
@@ -0,0 +1,59 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(epce_sup).
+
+-behaviour(supervisor).
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Behaviour supervisor functions
+-export([start_link/0]).
+-export([init/1]).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(TED_WORKER, epce_ted).
+-define(PCE_WORKER, epce_server).
+
+
+%%% BEHAVIOUR SUPERVISOR FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
+
+start_link() ->
+    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+init([]) ->
+    SupFlags = #{
+        strategy => one_for_all,
+        intensity => 0,
+        period => 1
+    },
+    TEDSpec = #{
+        id => ?TED_WORKER,
+        start => {?TED_WORKER, start_link, []},
+        restart => permanent,
+        shutdown => brutal_kill
+    },
+    ServerSpec = #{
+        id => ?PCE_WORKER,
+        start => {?PCE_WORKER, start_link, []},
+        restart => permanent,
+        shutdown => brutal_kill
+    },
+    {ok, {SupFlags, [TEDSpec, ServerSpec]}}.
+
diff --git a/src/te/apps/epce/src/epce_ted.erl b/src/te/apps/epce/src/epce_ted.erl
new file mode 100644
index 0000000000000000000000000000000000000000..8313bec1ca6b3b75e374dfef7b8fd23d29690d68
--- /dev/null
+++ b/src/te/apps/epce/src/epce_ted.erl
@@ -0,0 +1,239 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(epce_ted).
+
+-behaviour(gen_server).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API Functions
+-export([start_link/0]).
+-export([device_added/2]).
+-export([device_updated/2]).
+-export([device_deleted/1]).
+-export([link_added/2]).
+-export([link_updated/2]).
+-export([link_deleted/1]).
+-export([compute_path/3]).
+-export([lookup/2]).
+
+-export([get_graph/0]).
+
+% Behaviour gen_server functions
+-export([init/1]).
+-export([handle_call/3]).
+-export([handle_cast/2]).
+-export([handle_continue/2]).
+-export([handle_info/2]).
+-export([code_change/3]).
+-export([terminate/2]).
+
+
+%%% RECORDS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(state, {
+    graph :: diagraph:graph(),
+    pcc_address_to_id = #{} :: map()
+}).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+device_added(Id, Device) ->
+    gen_server:call(?MODULE, {device_added, Id, Device}).
+
+device_updated(Id, Device) ->
+    gen_server:call(?MODULE, {device_updated, Id, Device}).
+
+device_deleted(Id) ->
+    gen_server:call(?MODULE, {device_deleted, Id}).
+
+link_added(Id, Link) ->
+    gen_server:call(?MODULE, {link_added, Id, Link}).
+
+link_updated(Id, Link) ->
+    gen_server:call(?MODULE, {link_updated, Id, Link}).
+
+link_deleted(Id) ->
+    gen_server:call(?MODULE, {link_deleted, Id}).
+
+compute_path(Index, From, To)
+  when Index =:= id; Index =:= pcc_address ->
+    gen_server:call(?MODULE, {compute_path, Index, From, To});
+compute_path(Index, _From, _To) ->
+    {error, {invalid_index, Index}}.
+
+lookup(Index, Key)
+  when Index =:= id; Index =:= pcc_address ->
+    gen_server:call(?MODULE, {lookup, Index, Key});
+lookup(Index, _Key) ->
+    {error, {invalid_index, Index}}.
+
+
+get_graph() ->
+    gen_server:call(?MODULE, get_graph).
+
+
+%%% BEHAVIOUR gen_server FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    ?LOG_INFO("Starting TED process...", []),
+    % {ok, #state{graph = digraph:new([private, cyclic])}}.
+    {ok, #state{graph = digraph:new([protected, cyclic])}}.
+
+handle_call({device_added, Id, Device}, _From, State) ->
+    ?LOG_DEBUG("Adding TED device ~p: ~p", [Id, Device]),
+    {reply, ok, do_update_device(State, Id, Device)};
+handle_call({device_updated, Id, Device}, _From, State) ->
+    ?LOG_DEBUG("Updating TED device ~p: ~p", [Id, Device]),
+    {reply, ok, do_update_device(State, Id, Device)};
+handle_call({device_deleted, Id}, _From, State) ->
+    ?LOG_DEBUG("Deleting TED device ~p", [Id]),
+    {reply, ok, do_delete_device(State, Id)};
+handle_call({link_added, Id, Link}, _From, State) ->
+    ?LOG_DEBUG("Adding TED link ~p: ~p", [Id, Link]),
+    {reply, ok, do_update_link(State, Id, Link)};
+handle_call({link_updated, Id, Link}, _From, State) ->
+    ?LOG_DEBUG("Updating TED link ~p: ~p", [Id, Link]),
+    {reply, ok, do_update_link(State, Id, Link)};
+handle_call({link_deleted, Id}, _From, State) ->
+    ?LOG_DEBUG("Deleting TED link ~p", [Id]),
+    {reply, ok, do_delete_link(State, Id)};
+handle_call({compute_path, Index, From, To}, _From, #state{graph = G} = State) ->
+    case as_ids(State, Index, [From, To]) of
+        {ok, [FromId, ToId]} ->
+            {reply, do_compute_path(G, FromId, ToId), State};
+        {error, Reason} ->
+            {reply, {error, Reason}, State}
+    end;
+handle_call({lookup, Index, Key}, _From, #state{graph = G} = State) ->
+    case as_ids(State, Index, [Key]) of
+        {ok, [Id]} ->
+            {reply, do_lookup(G, Id), State};
+        {error, Reason} ->
+            {reply, {error, Reason}, State}
+    end;
+handle_call(get_graph, _From, #state{graph = G} = State) ->
+    {reply, G, State};
+handle_call(Request, _From, State) ->
+    logger:warning("Unexpected call to TED process ~w", [Request]),
+    {reply, {error, unexpected_call}, State}.
+
+handle_cast(Request, State) ->
+    logger:warning("Unexpected cast to TED process ~w", [Request]),
+    {noreply, State}.
+
+handle_continue(_Continue, State) ->
+    {noreply, State}.
+
+handle_info(Info, State) ->
+    logger:warning("Unexpected message to TED process ~w", [Info]),
+    {noreply, State}.
+
+code_change(_OldVsn, State, _Extra) ->
+    {ok, State}.
+
+terminate(_Reason, _State) ->
+    ?LOG_INFO("Terminating TED process...", []),
+    ok.
+
+
+%%% INTERNAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+as_ids(_State, id, Keys) ->
+    {ok, Keys};
+as_ids(State, IndexType, Keys) ->
+    as_ids(State, IndexType, Keys, []).
+
+as_ids(_State, _IndexType, [], Acc) ->
+    {ok, lists:reverse(Acc)};
+as_ids(#state{pcc_address_to_id = Index} = State, pcc_address, [Key | Rest], Acc) ->
+    case maps:find(Key, Index) of
+        error -> {error, {unknown_key, Key}};
+        {ok, Id} -> as_ids(State, pcc_address, Rest, [Id | Acc])
+    end.
+
+do_update_device(#state{graph = G} = State, Id, NewDevice) ->
+    State2 = case digraph:vertex(G, Id) of
+        false -> State;
+        {Id, OldDevice} -> index_remove_device(State, OldDevice)
+    end,
+    digraph:add_vertex(G, Id, NewDevice),
+    index_add_device(State2, NewDevice).
+
+do_delete_device(#state{graph = G} = State, Id) ->
+    case digraph:vertex(G, Id) of
+        false -> State;
+        {Id, OldDevice} ->
+            digraph:del_vertex(G, Id),
+            index_remove_device(State, OldDevice)
+    end.
+
+index_remove_device(#state{pcc_address_to_id = Index} = State,
+                    #{pcc_address := OldAddress}) ->
+    Index2 = maps:remove(OldAddress, Index),
+    State#state{pcc_address_to_id = Index2}.
+
+index_add_device(State, #{pcc_address := undefined}) ->
+    State;
+index_add_device(#state{pcc_address_to_id = Index} = State,
+                 #{id := Id, pcc_address := NewAddress}) ->
+    Index2 = Index#{NewAddress => Id},
+    State#state{pcc_address_to_id = Index2}.
+
+do_update_link(#state{graph = G} = State, Id, Link) ->
+    #{endpoints := [EP1, EP2]} = Link,
+    #{device := D1} = EP1,
+    #{device := D2} = EP2,
+    digraph:add_edge(G, {Id, a}, D1, D2, Link),
+    digraph:add_edge(G, {Id, b}, D2, D1, Link),
+    State.
+
+do_delete_link(#state{graph = G} = State, Id) ->
+    digraph:del_edge(G, {Id, a}),
+    digraph:del_edge(G, {Id, b}),
+    State.
+
+do_compute_path(G, FromId, ToId) ->
+    case digraph:get_short_path(G, FromId, ToId) of
+        false -> {error, not_found};
+        Ids -> {ok, retrieve_devices(G, Ids, [])}
+    end.
+
+do_lookup(G, Id) ->
+    case digraph:vertex(G, Id) of
+        {_, Info} -> {ok, Info};
+        false -> {error, not_found}
+    end.
+
+retrieve_devices(_G, [], Acc) ->
+    lists:reverse(Acc);
+retrieve_devices(G, [Id | Rest], Acc) ->
+    case digraph:vertex(G, Id) of
+        false -> {error, invalid_path};
+        {Id, Device} ->
+            retrieve_devices(G, Rest, [Device | Acc])
+    end.
diff --git a/src/te/apps/tfte/src/tfte.app.src b/src/te/apps/tfte/src/tfte.app.src
new file mode 100644
index 0000000000000000000000000000000000000000..abebf116975d5a820d2da462c319f67fdbf93118
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte.app.src
@@ -0,0 +1,32 @@
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+
+{application, tfte,
+ [{description, "Teraflow Traffic Engineering Service"},
+  {vsn, "0.1.0"},
+  {registered, []},
+  {mod, {tfte_app, []}},
+  {applications,
+   [kernel,
+    stdlib,
+    tfpb,
+    jsx,
+    epce
+   ]},
+  {env,[]},
+  {modules, []},
+
+  {licenses, ["Apache 2.0"]},
+  {links, []}
+ ]}.
diff --git a/src/te/apps/tfte/src/tfte_app.erl b/src/te/apps/tfte/src/tfte_app.erl
new file mode 100644
index 0000000000000000000000000000000000000000..a629a1b139d4d2a2965ff724676f23b6734ddd11
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_app.erl
@@ -0,0 +1,110 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%
+%% @doc tfte public API
+%% @end
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_app).
+
+-behaviour(application).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Behaviour application callback functions
+-export([start/2, stop/1]).
+
+
+%%% BEHAVIOUR applicaation CALLBACK FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start(_StartType, _StartArgs) ->
+    case tfte_sup:start_link() of
+        {ok, Pid} ->
+            add_services(),
+            {ok, Pid};
+        Other ->
+            Other
+    end.
+
+stop(_State) ->
+    ok.
+
+
+%%% INTERNAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+add_services() ->
+    case application:get_env(tfte, services) of
+        {ok, Services} -> add_services(Services);
+        _ -> ok
+    end.
+
+add_services([]) -> ok;
+add_services([{Name, EndpointsSpecs, GrpcOpts} | Rest]) ->
+    try resolve_endpoints(Name, EndpointsSpecs, []) of
+        Endpoints ->
+            case grpcbox_channel_sup:start_child(Name, Endpoints, GrpcOpts) of
+                {ok, _Pid} ->
+                    ?LOG_INFO("GRPC channel to ~s service started", [Name]),
+                    ok;
+                {error, Reason} ->
+                    ?LOG_WARNING("GRPC channel to ~s service failed to start: ~p",
+                                 [Name, Reason]),
+                    ok
+            end
+    catch
+        throw:{Name, Reason, Extra} ->
+            ?LOG_WARNING("Failed to resolve ~s service configuration: ~s ~p",
+                         [Name, Reason, Extra])
+    end,
+    add_services(Rest).
+
+resolve_endpoints(_Name, [], Acc) ->
+    lists:reverse(Acc);
+resolve_endpoints(Name, [{Transport, HostSpec, PortSpec, SslOpts} | Rest], Acc) ->
+    Acc2 = [{Transport, resolve_host_spec(Name, HostSpec),
+             resolve_port_spec(Name, PortSpec), SslOpts} | Acc],
+    resolve_endpoints(Name, Rest, Acc2).
+
+resolve_host_spec(_Name, Hostname) when is_list(Hostname) -> Hostname;
+resolve_host_spec(Name, {env, Key}) when is_list(Key) ->
+    try os:getenv(Key) of
+        false -> throw({Name, service_hostname_not_found, Key});
+        Hostname -> Hostname
+    catch
+        _:Reason ->
+            throw({Name, service_hostname_error, Reason})
+    end.
+
+resolve_port_spec(_Name, Port) when is_integer(Port) -> Port;
+resolve_port_spec(Name, {env, Key}) when is_list(Key) ->
+    try os:getenv(Key) of
+        false -> throw({Name, service_port_not_found, Key});
+        PortStr ->
+            try list_to_integer(PortStr) of
+                Port -> Port
+            catch
+                _:Reason ->
+                    throw({Name, service_port_error, Reason})
+            end
+    catch
+        _:Reason ->
+            throw({Name, service_port_error, Reason})
+    end.
diff --git a/src/te/apps/tfte/src/tfte_context.erl b/src/te/apps/tfte/src/tfte_context.erl
new file mode 100644
index 0000000000000000000000000000000000000000..453852f34dd5210b8c7d407d967a3da36f635349
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_context.erl
@@ -0,0 +1,187 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_context).
+
+-behaviour(gen_statem).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API functions
+-export([start_link/0]).
+-export([is_ready/0]).
+
+% Behaviour gen_statem functions
+-export([init/1]).
+-export([callback_mode/0]).
+-export([handle_event/4]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+
+%%% Records %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(data, {
+    uuid :: map(),
+    sub :: term() | undefined,
+    obj :: map() | undefined
+}).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(SUBSCRIBE_RETRY_TIMEOUT, 1000).
+-define(RETRIEVE_RETRY_TIMEOUT, 10000).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    gen_statem:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+is_ready() ->
+    case whereis(?MODULE) of
+        undefined -> false;
+        _ -> gen_statem:call(?MODULE, is_ready)
+    end.
+
+
+%%% BEHAVIOUR gen_statem FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    {ok, Name} = application:get_env(tfte, context),
+    ?LOG_INFO("Starting context ~s service handler...", [Name]),
+    UUID = #{context_uuid => #{uuid => Name}},
+    {ok, subscribe, #data{uuid = UUID}}.
+
+callback_mode() -> [handle_event_function, state_enter].
+
+%-- SUBSCRIBE STATE ------------------------------------------------------------
+handle_event(enter, _, subscribe, #data{sub = undefined}) ->
+    {keep_state_and_data, [{state_timeout, 0, do_suscribe}]};
+handle_event(enter, _, subscribe, Data) ->
+    % We already have a context subscription
+    {next_state, ready, Data};
+handle_event(state_timeout, do_suscribe, subscribe, Data) ->
+    ?LOG_DEBUG("Subscribing to context events...", []),
+    case do_subscribe() of
+        {ok, Sub} ->
+            ?LOG_INFO("Subscribed to context events", []),
+            Data2 = Data#data{sub = Sub},
+            {next_state, retrieve, Data2};
+        {error, Reason} ->
+            ?LOG_ERROR("Failed to subscribe to context service events: ~p", [Reason]),
+            {keep_state_and_data, [{state_timeout, ?SUBSCRIBE_RETRY_TIMEOUT, do_suscribe}]}
+    end;
+%-- RETRIEVE STATE -------------------------------------------------------------
+handle_event(enter, _, retrieve, _Data) ->
+    {keep_state_and_data, [{state_timeout, 0, do_retrieve}]};
+handle_event(state_timeout, do_retrieve, retrieve, #data{uuid = UUID} = Data) ->
+    ?LOG_DEBUG("Retrieving context ~p...", [UUID]),
+    case get_object(UUID) of
+        error ->
+            {keep_state_and_data, [{state_timeout, ?RETRIEVE_RETRY_TIMEOUT, do_retrieve}]};
+        {ok, Context} ->
+            ?LOG_DEBUG("Got context: ~p", [Context]),
+            tfte_server:context_ready(Context),
+            {next_state, ready, Data#data{obj = Context}}
+    end;
+handle_event(info, {headers, Id, Value}, retrieve,
+             #data{sub = #{stream_id := Id}}) ->
+    %TODO: Handle HTTP errors ???
+    ?LOG_DEBUG("Received context stream header: ~p", [Value]),
+    keep_state_and_data;
+handle_event(info, {data, Id, Value}, retrieve,
+             #data{sub = #{stream_id := Id}}) ->
+    ?LOG_DEBUG("Received context event, retrying context: ~p", [Value]),
+    {keep_state_and_data, [{state_timeout, 0, do_retrieve}]};
+handle_event(info, {'DOWN', Ref, process, Pid, Reason}, retrieve,
+             #data{sub = #{stream_id := Id, monitor_ref := Ref, stream_pid := Pid}} = Data) ->
+    ?LOG_DEBUG("Context subscription is down: ~p", [Reason]),
+    Data2 = Data#data{sub = undefined},
+    Info = receive
+        {trailers, Id, {Status, Message, Metadata}} ->
+            {Reason, Status, Message, Metadata}
+    after 0 ->
+        Reason
+    end,
+    ?LOG_ERROR("Context subscription error: ~p", [Info]),
+    {next_state, subscribe, Data2};
+%-- READY STATE ----------------------------------------------------------------
+handle_event(enter, _, ready, _Data) ->
+    keep_state_and_data;
+handle_event(info, {headers, Id, Value}, ready,
+             #data{sub = #{stream_id := Id}}) ->
+    %TODO: Handle HTTP errors ???
+    ?LOG_DEBUG("Received context stream header: ~p", [Value]),
+    keep_state_and_data;
+handle_event(info, {data, Id, #{context_id := UUID, event := Event}}, ready,
+             #data{uuid = UUID, sub = #{stream_id := Id}}) ->
+    ?LOG_DEBUG("Received context event: ~p", [Event]),
+    tfte_server:context_event(Event),
+    keep_state_and_data;
+handle_event(info, {'DOWN', Ref, process, Pid, Reason}, ready,
+             #data{sub = #{stream_id := Id, monitor_ref := Ref, stream_pid := Pid}} = Data) ->
+    ?LOG_DEBUG("Context subscription is down: ~p", [Reason]),
+    Data2 = Data#data{sub = undefined},
+    Info = receive
+        {trailers, Id, {Status, Message, Metadata}} ->
+            {Reason, Status, Message, Metadata}
+    after 0 ->
+        Reason
+    end,
+    ?LOG_ERROR("Context subscription error: ~p", [Info]),
+    {next_state, subscribe, Data2};
+%-- ANY STATE ------------------------------------------------------------------
+handle_event({call, _From}, is_ready, State, _Data) ->
+    {keep_state_and_data, [{reply, State =:= ready}]};
+handle_event(info, Msg, StateName, _Data) ->
+    ?LOG_WARNING("Unexpected context message in state ~w: ~p", [StateName, Msg]),
+    keep_state_and_data.
+
+terminate(Reason, _State, _Data) ->
+    ?LOG_INFO("Context service handler terminated: ~p", [Reason]),
+    ok.
+
+code_change(_OldVsn, OldState, OldData, _Extra) ->
+    {ok, OldState, OldData}.
+
+
+%%% INTERNAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+grpc_opts() ->
+    #{channel => context}.
+
+do_subscribe() ->
+    context_context_service_client:get_context_events(#{}, grpc_opts()).
+
+get_object(UUID) ->
+    case context_context_service_client:get_context(UUID, grpc_opts()) of
+        {error, Reason} -> 
+            ?LOG_ERROR("Local error while retrieving the context object: ~p", [Reason]),
+            error;
+        {error, Reason, _Headers} ->
+            ?LOG_ERROR("Remote error while retrieving the context object: ~p", [Reason]),
+            error;
+        {ok, Result, _Headers} ->
+            {ok, Result}
+    end.
\ No newline at end of file
diff --git a/src/te/apps/tfte/src/tfte_server.erl b/src/te/apps/tfte/src/tfte_server.erl
new file mode 100644
index 0000000000000000000000000000000000000000..002bda810e901debddd72a3cfa7ec50bab8e3f97
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_server.erl
@@ -0,0 +1,189 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_server).
+
+-behaviour(gen_statem).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API functions
+-export([start_link/0]).
+-export([context_ready/1]).
+-export([context_event/1]).
+-export([topology_ready/1]).
+-export([topology_event/1]).
+-export([request_lsp/1]).
+-export([delete_lsp/1]).
+
+% Behaviour gen_statem functions
+-export([init/1]).
+-export([callback_mode/0]).
+-export([handle_event/4]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+
+%%% Records %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(data, {
+    services = #{}
+}).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    gen_statem:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+context_ready(Context) ->
+    gen_statem:cast(?MODULE, {context_ready, Context}).
+
+context_event(Event) ->
+    gen_statem:cast(?MODULE, {context_event, Event}).
+
+topology_ready(Topology) ->
+    gen_statem:cast(?MODULE, {topology_ready, Topology}).
+
+topology_event(Event) ->
+    gen_statem:cast(?MODULE, {topology_event, Event}).
+
+request_lsp(ServiceMap) ->
+    gen_statem:call(?MODULE, {request_lsp, ServiceMap}).
+
+delete_lsp(ServiceId) ->
+    gen_statem:call(?MODULE, {delete_lsp, ServiceId}).
+
+
+%%% BEHAVIOUR gen_statem FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    ?LOG_INFO("Starting server...", []),
+    case tfte_context:is_ready() of
+        false -> {ok, wait_context, #data{}};
+        true -> {ok, ready, #data{}}
+    end.
+
+callback_mode() -> [handle_event_function, state_enter].
+
+%-- WAIT_CONTEXT STATE ---------------------------------------------------------
+handle_event(enter, _, wait_context, _Data) ->
+    keep_state_and_data;
+handle_event(cast, {context_ready, _Context}, wait_context, Data) ->
+    ?LOG_DEBUG("Teraflow context initialized: ~p", [_Context]),
+    tfte_topology:context_updated(),
+    {next_state, ready, Data};
+%-- READY STATE ----------------------------------------------------------------
+handle_event(enter, _, ready, _Data) ->
+    keep_state_and_data;
+handle_event(cast, {context_ready, _Context}, ready, _Data) ->
+    ?LOG_DEBUG("Teraflow context updated: ~p", [_Context]),
+    tfte_topology:context_updated(),
+    keep_state_and_data;
+handle_event(cast, {context_event, _Event}, ready, _Data) ->
+    ?LOG_DEBUG("Teraflow context event: ~p", [_Event]),
+    keep_state_and_data;
+handle_event(cast, {topology_ready, _Topology}, ready, _Data) ->
+    ?LOG_DEBUG("Teraflow topology updated: ~p", [_Topology]),
+    keep_state_and_data;
+handle_event(cast, {topology_event, _Event}, ready, _Data) ->
+    ?LOG_DEBUG("Teraflow topology event: ~p", [_Event]),
+    keep_state_and_data;
+handle_event({call, From}, {request_lsp, ServiceMap}, ready, Data) ->
+    ?LOG_DEBUG("Teraflow service ~s requested its LSPs",
+               [format_service_id(maps:get(service_id, ServiceMap, undefined))]),
+    {Result, Data2} = do_request_lsp(Data, ServiceMap),
+    {keep_state, Data2, [{reply, From, Result}]};
+handle_event({call, From}, {delete_lsp, ServiceId}, ready, Data) ->
+    ?LOG_DEBUG("Teraflow service ~s delete its LSPs",
+              [format_service_id(ServiceId)]),
+    {Result, Data2} = do_delete_lsp(Data, ServiceId),
+    {keep_state, Data2, [{reply, From, Result}]};
+%-- ANY STATE ------------------------------------------------------------------
+handle_event(EventType, EventContent, State, _Data) ->
+    ?LOG_WARNING("Unexpected tfte_server ~w event in state ~w: ~w",
+                 [EventType, State, EventContent]),
+    keep_state_and_data.
+
+terminate(Reason, _State, _Data) ->
+    ?LOG_INFO("Server terminated: ~p", [Reason]),
+    ok.
+
+code_change(_OldVsn, OldState, OldData, _Extra) ->
+    {ok, OldState, OldData}.
+
+
+%%% INTERNAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+format_service_id(undefined) -> <<"undefined">>;
+format_service_id(#{context_id := #{context_uuid := #{uuid := ContextName}},
+                    service_uuid := #{uuid := ServiceUUID}}) ->
+    iolist_to_binary(io_lib:format("~s:~s", [ContextName, ServiceUUID])).
+
+do_request_lsp(#data{services = Services} = Data,
+               #{service_type := 'SERVICETYPE_TE'} = ServiceMap) ->
+    try
+
+    #{service_config := Config,
+      service_endpoint_ids := Endpoints,
+      service_id := ServiceId} = ServiceMap,
+    #{<<"binding_label">> := BindingLabel1, <<"symbolic_name">> := SymbolicName1}
+        = tfte_util:custom_config(Config, <<"/lsp-fw">>),
+    #{<<"binding_label">> := BindingLabel2, <<"symbolic_name">> := SymbolicName2}
+        = tfte_util:custom_config(Config, <<"/lsp-bw">>),
+    [#{device_id := #{device_uuid := #{uuid := Id1}}},
+     #{device_id := #{device_uuid := #{uuid := Id2}}}] = Endpoints,
+    case epce_server:initiate_flow(SymbolicName1, Id1, Id2, BindingLabel1) of
+        {error, Reason} ->
+            ?LOG_ERROR("Error while setting up service ~s forward LSP: ~p",
+                       [format_service_id(ServiceId), Reason]),
+            {{error, Reason}, Data};
+        {ok, ForwardFlow} ->
+            case epce_server:initiate_flow(SymbolicName2, Id2, Id1, BindingLabel2) of
+                {error, Reason} ->
+                    ?LOG_ERROR("Error while setting up service ~s backward LSP: ~p",
+                               [format_service_id(ServiceId), Reason]),
+                    %TODO: Cleanup forward flow ?
+                    {{error, Reason}, Data};
+                {ok, BackwardFlow} ->
+                    ServiceData = {ServiceMap, ForwardFlow, BackwardFlow},
+                    Services2 = Services#{ServiceId => ServiceData},
+                    Data2 = Data#data{services = Services2},
+                    {{ok, 'SERVICESTATUS_ACTIVE'}, Data2}
+            end
+    end
+
+    catch T:E:S ->
+        ?LOG_ERROR("Error while requesintg LSP: ~p:~p", [T, E]),
+        ?LOG_ERROR("Stacktrace: ~p", [S]),
+        {{error, internal_error}, Data}
+    end;
+do_request_lsp(Data, ServiceMap) ->
+    ?LOG_ERROR("Invalid arguments to RequestLSP call: ~p", [ServiceMap]),
+    {{error, badarg}, Data}.
+
+do_delete_lsp(Data, ServiceId) ->
+    ?LOG_INFO("LSP DELETION REQUESTED ~p", [ServiceId]),
+    {{error, not_implemented}, Data}.
\ No newline at end of file
diff --git a/src/te/apps/tfte/src/tfte_service_sup.erl b/src/te/apps/tfte/src/tfte_service_sup.erl
new file mode 100644
index 0000000000000000000000000000000000000000..6ec5d09b069ca856f6298fdc8effa2bb01cf115a
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_service_sup.erl
@@ -0,0 +1,64 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%
+%% @doc tfte service supervisor.
+%% @end
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_service_sup).
+
+-behaviour(supervisor).
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API Functions
+-export([start_link/0]).
+
+% Behaviour supervisor callback functions
+-export([init/1]).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(SERVER, ?MODULE).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    supervisor:start_link({local, ?SERVER}, ?MODULE, []).
+
+
+%%% BEHAVIOUR supervisor CALLBACK FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    SupFlags = #{strategy => one_for_one,
+                 intensity => 0,
+                 period => 1},
+    ContextSpec = #{
+        id => tfte_context,
+        start => {tfte_context, start_link, []},
+        restart => permanent,
+        shutdown => brutal_kill
+    },
+    TopologySpec = #{
+        id => tfte_topology,
+        start => {tfte_topology, start_link, []},
+        restart => permanent,
+        shutdown => brutal_kill
+    },
+    ChildSpecs = [ContextSpec, TopologySpec],
+    {ok, {SupFlags, ChildSpecs}}.
diff --git a/src/te/apps/tfte/src/tfte_sup.erl b/src/te/apps/tfte/src/tfte_sup.erl
new file mode 100644
index 0000000000000000000000000000000000000000..4630511d6fec909b002acd57bec61790e54f7e94
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_sup.erl
@@ -0,0 +1,66 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%
+%% @doc tfte top level supervisor.
+%% @end
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_sup).
+
+-behaviour(supervisor).
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API Functions
+-export([start_link/0]).
+
+% Behaviour supervisor callback functions
+-export([init/1]).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(SERVER, ?MODULE).
+-define(ROOT_SERVER, tfte_server).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    supervisor:start_link({local, ?SERVER}, ?MODULE, []).
+
+
+%%% BEHAVIOUR supervisor CALLBACK FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    SupFlags = #{strategy => one_for_all,
+                 intensity => 0,
+                 period => 1},
+    ServiceSupSpec = #{
+        id => service_sup,
+        start => {tfte_service_sup, start_link, []},
+        restart => permanent,
+        type => supervisor,
+        shutdown => brutal_kill
+    },
+    ServerSpec = #{
+        id => ?ROOT_SERVER,
+        start => {?ROOT_SERVER, start_link, []},
+        restart => permanent,
+        shutdown => brutal_kill
+    },
+    ChildSpecs = [ServerSpec, ServiceSupSpec],
+    {ok, {SupFlags, ChildSpecs}}.
diff --git a/src/te/apps/tfte/src/tfte_te_service.erl b/src/te/apps/tfte/src/tfte_te_service.erl
new file mode 100644
index 0000000000000000000000000000000000000000..b9911ee37a5719c838baca7f86dd326b810f9bc8
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_te_service.erl
@@ -0,0 +1,66 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_te_service).
+
+-behaviour(te_te_service_bhvr).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("grpcbox/include/grpcbox.hrl").
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Behaviour te_te_service_bhvr callback functions
+-export([request_lsp/2]).
+-export([update_lsp/2]).
+-export([delete_lsp/2]).
+
+
+%%% BEHAVIOUR te_te_service_bhvr CALLBACK FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+request_lsp(Ctx, Service) ->
+    ?LOG_INFO("Requesting LSP: ~p", [Service]),
+    try tfte_server:request_lsp(Service) of
+        {ok, Status} ->
+            {ok, #{service_status => Status}, Ctx};
+        {error, Reason} ->
+            ?LOG_INFO("Error while requesting LSP: ~p", [Reason]),
+            {ok, #{service_status => 'SERVICESTATUS_UNDEFINED'}, Ctx}
+    catch E:R:S ->
+        ?LOG_ERROR("Error while requesting LSP: ~p:~p ~p", [E, R, S]),
+        {ok, #{service_status => 'SERVICESTATUS_UNDEFINED'}, Ctx}
+    end.
+
+update_lsp(_Ctx, _ServiceId) ->
+    {error, {?GRPC_STATUS_UNIMPLEMENTED, <<"Not yet implemented">>},
+             #{headers => #{}, trailers => #{}}}.
+
+delete_lsp(Ctx, ServiceId) ->
+    ?LOG_ERROR("Deleting LSP: ~p", [ServiceId]),
+    try tfte_server:delete_lsp(ServiceId) of
+        {ok, Status} ->
+            {ok, Status, Ctx};
+        {error, Reason} ->
+            ?LOG_INFO("Error while deleting LSP: ~p", [Reason]),
+            {ok, #{service_status => 'SERVICESTATUS_UNDEFINED'}, Ctx}
+    catch E:R:S ->
+        ?LOG_ERROR("Error while deleting LSP: ~p:~p ~p", [E, R, S]),
+        {ok, #{service_status => 'SERVICESTATUS_UNDEFINED'}, Ctx}
+    end.
diff --git a/src/te/apps/tfte/src/tfte_topology.erl b/src/te/apps/tfte/src/tfte_topology.erl
new file mode 100644
index 0000000000000000000000000000000000000000..39897caa800ebed291d34d91b4a6b154c90f0f2e
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_topology.erl
@@ -0,0 +1,405 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_topology).
+
+-behaviour(gen_statem).
+
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API functions
+-export([start_link/0]).
+-export([context_updated/0]).
+
+% Behaviour gen_statem functions
+-export([init/1]).
+-export([callback_mode/0]).
+-export([handle_event/4]).
+-export([terminate/3]).
+-export([code_change/4]).
+
+
+%%% Records %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(data, {
+    uuid :: map(),
+    sub :: term() | undefined,
+    obj :: map() | undefined,
+    devices = #{} :: map(),
+    links = #{} :: map(),
+    names = #{} :: map()
+}).
+
+
+%%% MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(SUBSCRIBE_RETRY_TIMEOUT, 1000).
+-define(RETRIEVE_RETRY_TIMEOUT, 10000).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+start_link() ->
+    gen_statem:start_link({local, ?MODULE}, ?MODULE, [], []).
+
+context_updated() ->
+    gen_statem:cast(?MODULE, context_updated).
+
+
+%%% BEHAVIOUR gen_statem FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+init([]) ->
+    {ok, ContextName} = application:get_env(tfte, context),
+    {ok, TopoName} = application:get_env(tfte, topology),
+    ContextUUID = #{context_uuid => #{uuid => ContextName}},
+    TopoUUID = #{context_id => ContextUUID,
+                 topology_uuid => #{uuid => TopoName}},
+    ?LOG_INFO("Starting topology ~s service handler...", [TopoName]),
+    {ok, retrieve, #data{uuid = TopoUUID}}.
+
+callback_mode() -> [handle_event_function, state_enter].
+
+%-- RETRIEVE STATE -------------------------------------------------------------
+handle_event(enter, _, retrieve, _Data) ->
+    {keep_state_and_data, [{state_timeout, 0, do_retrieve}]};
+handle_event(state_timeout, do_retrieve, retrieve, #data{uuid = UUID} = Data) ->
+    ?LOG_DEBUG("Retrieving topology ~p...", [UUID]),
+    case get_object(UUID) of
+        error ->
+            {keep_state_and_data, [{state_timeout, ?RETRIEVE_RETRY_TIMEOUT, do_retrieve}]};
+        {ok, #{device_ids := Devices, link_ids := Links } = Topology} ->
+            case {length(Devices), length(Links)} of
+                {D, L} when D =:= 0; L =:= 0 ->
+                    ?LOG_WARNING("Got topology, but there is missing devices or links", []),
+                    {keep_state_and_data, [{state_timeout, 1000, do_retrieve}]};
+                _ ->
+                    ?LOG_DEBUG("Got topology: ~p", [Topology]),
+                    {next_state, subscribe, Data#data{obj = Topology}}
+            end
+    end;
+handle_event(cast, context_updated, retrieve, _Data) ->
+    {keep_state_and_data, [{state_timeout, 0, do_retrieve}]};
+%-- SUBSCRIBE STATE ------------------------------------------------------------
+handle_event(enter, _, subscribe, #data{sub = undefined}) ->
+    {keep_state_and_data, [{state_timeout, 0, do_suscribe}]};
+handle_event(enter, _, subscribe, Data) ->
+    % We already have a topology subscription
+    {next_state, ready, Data};
+handle_event(state_timeout, do_suscribe, subscribe, #data{uuid = UUID} = Data) ->
+    ?LOG_DEBUG("Subscribing to topology events...", []),
+    case do_subscribe(UUID) of
+        {ok, Sub} ->
+            ?LOG_INFO("Subscribed to topology events", []),
+            Data2 = #data{obj = Obj} = Data#data{sub = Sub},
+            #{device_ids := DeviceIds, link_ids := LinkIds} = Obj,
+            case update_topology(Data2, DeviceIds, LinkIds) of
+                {ok, Data3} ->
+                    tfte_server:topology_ready(Obj),
+                    {next_state, ready, Data3};
+                {error, Reason} ->
+                    ?LOG_ERROR("Failed to load topology: ~p", [Reason]),
+                    statem_rollback_to_retrieve(Data2)
+            end;
+        {error, Reason} ->
+            ?LOG_ERROR("Failed to subscribe to topology service events: ~p", [Reason]),
+            {next_state, retrieve, [{state_timeout, ?SUBSCRIBE_RETRY_TIMEOUT, do_retrieve}]}
+    end;
+%-- READY STATE ----------------------------------------------------------------
+handle_event(enter, _, ready, _Data) ->
+    keep_state_and_data;
+handle_event(info, {headers, Id, Value}, ready,
+             #data{sub = #{stream_id := Id}}) ->
+    %TODO: Handle HTTP errors ???
+    ?LOG_DEBUG("Received topology stream header: ~p", [Value]),
+    keep_state_and_data;
+handle_event(info, {data, Id, #{event := Event}}, ready,
+             #data{sub = #{stream_id := Id}} = Data) ->
+    ?LOG_DEBUG("Received topology event: ~p", [Event]),
+    handle_topology_event(Data, Event);
+handle_event(info, {'DOWN', Ref, process, Pid, Reason}, ready,
+             #data{sub = #{stream_id := Id, monitor_ref := Ref, stream_pid := Pid}} = Data) ->
+    ?LOG_DEBUG("Topology subscription is down: ~p", [Reason]),
+    Data2 = Data#data{sub = undefined},
+    Info = receive
+        {trailers, Id, {Status, Message, Metadata}} ->
+            {Reason, Status, Message, Metadata}
+    after 0 ->
+        Reason
+    end,
+    ?LOG_ERROR("Topology subscription error: ~p", [Info]),
+    {next_state, retrieve, Data2};
+handle_event(cast, context_updated, ready, _Data) ->
+    keep_state_and_data;
+%-- ANY STATE ------------------------------------------------------------------
+handle_event(info, Msg, StateName, _Data) ->
+    ?LOG_WARNING("Unexpected topology message in state ~w: ~p", [StateName, Msg]),
+    keep_state_and_data.
+
+terminate(Reason, _State, _Data) ->
+    ?LOG_INFO("Topology service handler terminated: ~p", [Reason]),
+    ok.
+
+code_change(_OldVsn, OldState, OldData, _Extra) ->
+    {ok, OldState, OldData}.
+
+
+%%% INTERNAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+statem_rollback_to_retrieve(#data{sub = undefined} = Data) ->
+    {next_state, retrieve, Data, [{state_timeout, ?RETRIEVE_RETRY_TIMEOUT, do_retrieve}]};
+statem_rollback_to_retrieve(#data{sub = Sub} = Data) ->
+    grpcbox_client:close_send_and_recv(Sub),
+    Data2 = Data#data{sub = undefined},
+    {next_state, retrieve, Data2, [{state_timeout, ?RETRIEVE_RETRY_TIMEOUT, do_retrieve}]}.
+
+handle_topology_event(#data{uuid = UUID} = Data,
+                      #{event_type := 'EVENTTYPE_UPDATE'} = Event) ->
+    case get_object(UUID) of
+        error ->
+            statem_rollback_to_retrieve(Data);
+        {ok, #{device_ids := DeviceIds, link_ids := LinkIds} = Topology} ->
+            ?LOG_DEBUG("Got new topology: ~p", [Topology]),
+            Data2 = Data#data{obj = Topology},
+            case update_topology(Data2, DeviceIds, LinkIds) of
+                {ok, Data3} ->
+                    tfte_server:topology_event(Event),
+                    {keep_state, Data3};
+                {error, Reason} ->
+                    ?LOG_ERROR("Failed to update topology: ~p", [Reason]),
+                    statem_rollback_to_retrieve(Data2)
+            end
+    end;
+handle_topology_event(_Data, Event) ->
+    tfte_server:topology_event(Event),
+    keep_state_and_data.
+
+update_topology(Data, DeviceIds, LinkIds) ->
+    try
+        {Data2, Events} = update_devices(Data, DeviceIds, []),
+        {Data3, Events2} = update_links(Data2, LinkIds, Events),
+        post_topology_events(lists:reverse(Events2)),
+        {ok, Data3}
+    catch
+        throw:Reason ->
+            {error, Reason}
+    end.
+
+post_topology_events(Events) ->
+    lists:foreach(fun post_topology_event/1, Events).
+
+post_topology_event({device_added, Id, Device}) ->
+    epce_ted:device_added(Id, Device);
+post_topology_event({device_updated, Id, Device}) ->
+    epce_ted:device_updated(Id, Device);
+post_topology_event({device_deleted, Id}) ->
+    epce_ted:device_deleted(Id);
+post_topology_event({link_added, Id, Link}) ->
+    epce_ted:link_added(Id, Link);
+post_topology_event({link_updated, Id, Link}) ->
+    epce_ted:link_updated(Id, Link);
+post_topology_event({link_deleted, Id}) ->
+    epce_ted:link_deleted(Id).
+
+update_devices(#data{devices = OldDevices} = Data, DeviceIds, Events) ->
+    update_devices(Data, OldDevices, #{}, DeviceIds, Events).
+
+update_devices(Data, OldDevices, NewDevices, [], Events) ->
+    #data{names = Names} = Data,
+    Events2 = [{device_deleted, maps:get(I, Names, undefined)}
+               || I <- maps:keys(OldDevices)] ++ Events,
+    {Data#data{devices = NewDevices}, Events2};
+update_devices(Data, OldDevices, NewDevices, [GivenId | Rest], Events) ->
+    case get_device(GivenId) of
+        error -> throw({device_retrieval_error, GivenId});
+        {ok, Device} ->
+            Device2 = #{id := Id, real_id := RealId} = post_process_device(Device),
+            #data{names = Names} = Data,
+            Data2 = Data#data{names = Names#{RealId => Id}},
+            NewDevices2 = NewDevices#{Id => Device},
+            case maps:take(Id, OldDevices) of
+                error ->
+                    % New device
+                    Events2 = [{device_added, Id, Device2} | Events],
+                    update_devices(Data2, OldDevices, NewDevices2, Rest, Events2);
+                {Device, OldDevices2} ->
+                    % Device did not change
+                    update_devices(Data2, OldDevices2, NewDevices2, Rest, Events);
+                {_OldDevice, OldDevices2} ->
+                    % Device changed
+                    Events2 = [{device_updated, Id, Device2} | Events],
+                    update_devices(Data2, OldDevices2, NewDevices2, Rest, Events2)
+            end
+    end.
+
+update_links(#data{links = OldLinks} = Data, LinksIds, Events) ->
+    update_links(Data, OldLinks, #{}, LinksIds, Events).
+
+update_links(Data, OldLinks, NewLinks, [], Events) ->
+    Events2 = [{link_deleted, post_process_link_id(I)}
+               || I <- maps:keys(OldLinks)] ++ Events,
+    {Data#data{links = NewLinks}, Events2};
+update_links(Data, OldLinks, NewLinks, [Id | Rest], Events) ->
+    case get_link(Id) of
+        error -> throw({link_retrieval_error, Id});
+        {ok, Link} ->
+            Id2 = post_process_link_id(Id),
+            Link2 = post_process_link(Data, Link),
+            NewLinks2 = NewLinks#{Id => Link},
+            case maps:take(Id, OldLinks) of
+                error ->
+                    % New Link
+                    Events2 = [{link_added, Id2, Link2} | Events],
+                    update_links(Data, OldLinks, NewLinks2, Rest, Events2);
+                {Link, OldLinks2} ->
+                    % Link did not change
+                    update_links(Data, OldLinks2, NewLinks2, Rest, Events);
+                {_OldLink, OldLinks2} ->
+                    % Link changed
+                    Events2 = [{link_updated, Id2, Link2} | Events],
+                    update_links(Data, OldLinks2, NewLinks2, Rest, Events2)
+            end
+    end.
+
+post_process_device(#{device_id := Id, name :=  Name} = Device) ->
+    #{id => Name,
+      real_id => Id,
+      type => device_type(Device),
+      pcc_address => device_pcc_address(Device),
+      mpls_label => device_mpls_label(Device),
+      status => device_status(Device),
+      endpoints => device_endpoints(Device)}.
+
+device_type(#{device_type := Type}) ->
+    Type.
+
+device_status(#{device_operational_status := 'DEVICEOPERATIONALSTATUS_UNDEFINED'}) ->
+    undefined;
+device_status(#{device_operational_status := 'DEVICEOPERATIONALSTATUS_DISABLED'}) ->
+    disabled;
+device_status(#{device_operational_status := 'DEVICEOPERATIONALSTATUS_ENABLED'}) ->
+    enabled.
+
+device_mpls_label(Device) ->
+    try device_config_value(<<"/te_data">>, Device) of
+        Map when is_map(Map) -> maps:get(<<"mpls_label">>, Map, undefined);
+        _ -> undefined
+    catch error:badarg -> undefined
+    end.
+
+device_pcc_address(Device) ->
+    try device_config_value(<<"/te_data">>, Device) of
+        Map when is_map(Map) ->
+            case maps:get(<<"pcc_address">>, Map, undefined) of
+                AddressBin ->
+                    case inet_parse:address(binary_to_list(AddressBin)) of
+                        {ok, Address} -> Address;
+                        {error,einval} -> undefined
+                    end
+            end;
+        _ -> undefined
+    catch
+        error:badarg -> undefined
+    end.
+
+device_config_value(Key, #{device_config := Config}) ->
+    tfte_util:custom_config(Config, Key).
+
+device_endpoints(Device) ->
+    device_endpoints(Device, []).
+
+device_endpoints(#{device_endpoints := Endpoints}, Acc) ->
+    device_endpoints(Endpoints, Acc);
+device_endpoints([], Acc) ->
+    lists:reverse(Acc);
+device_endpoints([#{name := Name} | Rest], Acc) ->
+    device_endpoints(Rest, [Name | Acc]).
+
+post_process_link_id(#{link_uuid := #{uuid := Name}}) ->
+    Name.
+
+post_process_link(Data, Link) ->
+    #{id => link_id(Link),
+      endpoints => link_endpoints(Data, Link)}.
+
+link_id(#{link_id := Id}) ->
+    post_process_link_id(Id).
+
+link_endpoints(Data, Link) ->
+    link_endpoints(Data, Link, []).
+
+link_endpoints(Data, #{link_endpoint_ids := Endpoints}, Acc) ->
+    link_endpoints(Data, Endpoints, Acc);
+link_endpoints(_Data, [], Acc) ->
+    lists:reverse(Acc);
+link_endpoints(Data, [#{device_id := RealId,
+                        endpoint_uuid := #{uuid := EndpointName}} | Rest], Acc) ->
+    #data{names = Names} = Data,
+    Endpoint = #{
+        device => maps:get(RealId, Names, undefined),
+        endpoint => EndpointName
+    },
+    link_endpoints(Data, Rest, [Endpoint | Acc]).
+
+
+%-- GRPC UNTILITY FUNCTION -----------------------------------------------------
+
+grpc_opts() ->
+    #{channel => context}.
+
+do_subscribe(UUID) ->
+    context_context_service_client:get_topology_events(UUID, grpc_opts()).
+
+get_object(UUID) ->
+    case context_context_service_client:get_topology(UUID, grpc_opts()) of
+        {error, Reason} -> 
+            ?LOG_ERROR("Local error while retrieving the topology object: ~p", [Reason]),
+            error;
+        {error, Reason, _Headers} ->
+            ?LOG_ERROR("Remote error while retrieving the topology object: ~p", [Reason]),
+            error;
+        {ok, Result, _Headers} ->
+            {ok, Result}
+    end.
+
+get_device(UUID) ->
+    case context_context_service_client:get_device(UUID, grpc_opts()) of
+        {error, Reason} -> 
+            ?LOG_ERROR("Local error while retrieving a device object: ~p", [Reason]),
+            error;
+        {error, Reason, _Headers} ->
+            ?LOG_ERROR("Remote error while retrieving a device object: ~p", [Reason]),
+            error;
+        {ok, Result, _Headers} ->
+            {ok, Result}
+    end.
+
+get_link(UUID) ->
+    case context_context_service_client:get_link(UUID, grpc_opts()) of
+        {error, Reason} -> 
+            ?LOG_ERROR("Local error while retrieving a link object: ~p", [Reason]),
+            error;
+        {error, Reason, _Headers} ->
+            ?LOG_ERROR("Remote error while retrieving a link object: ~p", [Reason]),
+            error;
+        {ok, Result, _Headers} ->
+            {ok, Result}
+    end.
diff --git a/src/te/apps/tfte/src/tfte_util.erl b/src/te/apps/tfte/src/tfte_util.erl
new file mode 100644
index 0000000000000000000000000000000000000000..fb058c7cf6b247c13bd95f2f0c5696eec30da8bf
--- /dev/null
+++ b/src/te/apps/tfte/src/tfte_util.erl
@@ -0,0 +1,43 @@
+%%%-----------------------------------------------------------------------------
+%% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%%
+%% 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
+%%
+%%      http://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.
+%%%-----------------------------------------------------------------------------
+
+-module(tfte_util).
+
+%%% INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-include_lib("kernel/include/logger.hrl").
+
+
+%%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% API functions
+-export([custom_config/2]).
+
+
+%%% API FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+custom_config(#{config_rules := Rules}, Key) ->
+    custom_config(Rules, Key);
+custom_config([], _Key) ->
+    undefined;
+custom_config([#{action := 'CONFIGACTION_SET',
+                 config_rule := {custom, Rule}} | Rest], Key) ->
+    case Rule of
+        #{resource_key := Key, resource_value := Value} -> jsx:decode(Value);
+        _ -> custom_config(Rest, Key)
+    end;
+custom_config([_Rule | Rest], Key) ->
+    custom_config(Rest, Key).
diff --git a/src/te/config/dev.config.template b/src/te/config/dev.config.template
new file mode 100644
index 0000000000000000000000000000000000000000..6e21dc0d2d021447cf5eb84869d97b7a3662f58c
--- /dev/null
+++ b/src/te/config/dev.config.template
@@ -0,0 +1,78 @@
+% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%
+% 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
+%
+%      http://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.
+
+[
+    {tfte, [
+        {services, [
+            {te, [{http, "localhost", 10030, []}], #{}}
+        ]}
+    ]},
+
+    {pcep_server, [
+        {handler, {epce_pcep_server_handler, []}}
+    ]},
+
+	{epce, [
+	]},
+
+    {grpcbox, [
+        {servers, [#{
+            grpc_opts => #{
+                service_protos => [te_pb, grpcbox_health_pb, grpcbox_reflection_pb],
+                %client_cert_dir => "",
+                services => #{
+                    'te.TEService' => tfte_te_service,
+                    'grpc.health.v1.Health' => grpcbox_health_service,
+                    'grpc.reflection.v1alpha.ServerReflection' => grpcbox_reflection_service
+                }
+            },
+            transport_opts => #{
+                ssl => false
+                %keyfile => "",
+                %certfile => "",
+                %cacertfile => ""
+            },
+            listen_opts => #{
+                port => 10030,
+                ip => {0,0,0,0}
+            },
+            pool_opts => #{
+                size => 10
+            },
+            server_opts => #{
+                header_table_size => 4096,
+                enable_push => 1,
+                max_concurrent_streams => unlimited,
+                initial_window_size => 65535,
+                max_frame_size => 16384,
+                max_header_list_size => unlimited
+            }
+        }]}
+    ]},
+
+    {kernel, [
+        {logger_level, debug},
+        {logger, [
+            {handler, default, logger_std_h, #{
+                level => debug,
+                filter_default => log,
+                config => #{type => standard_io},
+                formatter => {logger_formatter, #{
+                    legacy_header => false,
+                    single_line => true
+                }}
+            }}
+        ]}
+    ]}
+].
\ No newline at end of file
diff --git a/src/te/config/sys.config.src b/src/te/config/sys.config.src
new file mode 100644
index 0000000000000000000000000000000000000000..edcd4384a3236df42b1e530c8b3a92b96c80e09e
--- /dev/null
+++ b/src/te/config/sys.config.src
@@ -0,0 +1,101 @@
+% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%
+% 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
+%
+%      http://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.
+
+[
+
+    {tfte, [
+        {context, <<"admin">>},
+        {topology, <<"admin">>},
+        {services, [
+            {te, [
+                {http, {env, "TESERVICE_SERVICE_HOST"}, {env, "TESERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}},
+            {service, [
+                {http, {env, "SERVICESERVICE_SERVICE_HOST"}, {env, "SERVICESERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}},
+            {monitoring, [
+                {http, {env, "MONITORINGSERVICE_SERVICE_HOST"}, {env, "MONITORINGSERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}},
+            {compute, [
+                {http, {env, "COMPUTESERVICE_SERVICE_HOST"}, {env, "COMPUTESERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}},
+            {device, [
+                {http, {env, "DEVICESERVICE_SERVICE_HOST"}, {env, "DEVICESERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}},
+            {context, [
+                {http, {env, "CONTEXTSERVICE_SERVICE_HOST"}, {env, "CONTEXTSERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}},
+            {automation, [
+                {http, {env, "AUTOMATIONSERVICE_SERVICE_HOST"}, {env, "AUTOMATIONSERVICE_SERVICE_PORT_GRPC"}, []}
+            ], #{}}
+        ]}
+    ]},
+
+    {pcep_server, [
+        {handler, {epce_pcep_server_handler, []}}
+    ]},
+
+	{epce, [
+	]},
+
+    {grpcbox, [
+        {servers, [#{
+            grpc_opts => #{
+                service_protos => [te_pb, grpcbox_health_pb, grpcbox_reflection_pb],
+                %client_cert_dir => "",
+                services => #{
+                    'te.TEService' => tfte_te_service,
+                    'grpc.health.v1.Health' => grpcbox_health_service,
+                    'grpc.reflection.v1alpha.ServerReflection' => grpcbox_reflection_service
+                }
+            },
+            transport_opts => #{
+                ssl => false
+                %keyfile => "",
+                %certfile => "",
+                %cacertfile => ""
+            },
+            listen_opts => #{
+                port => 10030,
+                ip => {0,0,0,0}
+            },
+            pool_opts => #{
+                size => 10
+            },
+            server_opts => #{
+                header_table_size => 4096,
+                enable_push => 1,
+                max_concurrent_streams => unlimited,
+                initial_window_size => 65535,
+                max_frame_size => 16384,
+                max_header_list_size => unlimited
+            }
+        }]}
+    ]},
+
+    {kernel, [
+        {logger_level, ${ERLANG_LOGGER_LEVEL}},
+        {logger, [
+            {handler, default, logger_std_h, #{
+                level => ${ERLANG_LOGGER_LEVEL},
+                filter_default => log,
+                config => #{type => standard_io},
+                formatter => {logger_formatter, #{
+                    legacy_header => false,
+                    single_line => true
+                }}
+            }}
+        ]}
+    ]}
+].
\ No newline at end of file
diff --git a/src/te/config/vm.args.src b/src/te/config/vm.args.src
new file mode 100644
index 0000000000000000000000000000000000000000..899705ce169a8302bdd201751342db58b5c85421
--- /dev/null
+++ b/src/te/config/vm.args.src
@@ -0,0 +1,4 @@
++C multi_time_warp
++sbwt none
+-name ${ERLANG_NODE_NAME}@${ERLANG_NODE_IP}
+-setcookie ${ERLANG_COOKIE}
diff --git a/src/te/rebar.config b/src/te/rebar.config
new file mode 100644
index 0000000000000000000000000000000000000000..01f7a899ee6fb69970bd38d6b75c47450887f313
--- /dev/null
+++ b/src/te/rebar.config
@@ -0,0 +1,54 @@
+% Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+%
+% 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
+%
+%      http://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.
+
+{erl_opts, [debug_info]}.
+
+{deps, [
+    grpcbox,
+    jsx,
+    {pcep_server, {git, "https://github.com/stritzinger/pcep_server.git", {branch, "master"}}}
+]}.
+
+{shell, [
+    {config, "config/dev.config"},
+    {apps, [epce, tfte, tfpb, grpcbox]}
+]}.
+
+{project_app_dirs, ["apps/*", "../../proto/src/erlang"]}.
+
+{relx, [
+    {release, {tfte, "1.0.0"}, [
+        runtime_tools,
+        epce,
+        grpcbox,
+        jsx,
+        tfpb,
+        tfte
+    ]},
+    {vm_args_src, "config/vm.args.src"},
+    {sys_config_src, "config/sys.config.src"},
+    {dev_mode, true},
+    {include_erts, false},
+    {extended_start_script, true}
+]}.
+
+{profiles, [
+    {prod, [
+        {relx, [
+            {dev_mode, false},
+            {include_erts, true},
+            {include_src, false}
+        ]}
+    ]}
+]}.
diff --git a/src/te/rebar.lock b/src/te/rebar.lock
new file mode 100644
index 0000000000000000000000000000000000000000..c435b045661e26b84495269c3ba79406990d09fb
--- /dev/null
+++ b/src/te/rebar.lock
@@ -0,0 +1,41 @@
+{"1.2.0",
+[{<<"acceptor_pool">>,{pkg,<<"acceptor_pool">>,<<"1.0.0">>},1},
+ {<<"chatterbox">>,{pkg,<<"ts_chatterbox">>,<<"0.12.0">>},1},
+ {<<"codec_sequencer">>,
+  {git,"https://github.com/stritzinger/codec_sequencer.git",
+       {ref,"fc8760894f7962ef1497bf6ce4247eb75db9d5ca"}},
+  2},
+ {<<"ctx">>,{pkg,<<"ctx">>,<<"0.6.0">>},1},
+ {<<"gproc">>,{pkg,<<"gproc">>,<<"0.8.0">>},1},
+ {<<"grpcbox">>,{pkg,<<"grpcbox">>,<<"0.15.0">>},0},
+ {<<"hpack">>,{pkg,<<"hpack_erl">>,<<"0.2.3">>},2},
+ {<<"jsx">>,{pkg,<<"jsx">>,<<"3.1.0">>},0},
+ {<<"pcep_codec">>,
+  {git,"https://github.com/stritzinger/pcep_codec.git",
+       {ref,"ca5eb0822d9971ec4bcfb427a49b2e516081a126"}},
+  1},
+ {<<"pcep_server">>,
+  {git,"https://github.com/stritzinger/pcep_server.git",
+       {ref,"ea751fa807f4c1f5635f781431fe384610166b0a"}},
+  0},
+ {<<"ranch">>,{pkg,<<"ranch">>,<<"2.0.0">>},1}]}.
+[
+{pkg_hash,[
+ {<<"acceptor_pool">>, <<"43C20D2ACAE35F0C2BCD64F9D2BDE267E459F0F3FD23DAB26485BF518C281B21">>},
+ {<<"chatterbox">>, <<"4E54F199E15C0320B85372A24E35554A2CCFC4342E0B7CD8DAED9A04F9B8EF4A">>},
+ {<<"ctx">>, <<"8FF88B70E6400C4DF90142E7F130625B82086077A45364A78D208ED3ED53C7FE">>},
+ {<<"gproc">>, <<"CEA02C578589C61E5341FCE149EA36CCEF236CC2ECAC8691FBA408E7EA77EC2F">>},
+ {<<"grpcbox">>, <<"97C7126296A091602D372EBF5860A04F7BC795B45B33A984CAD2B8E362774FD8">>},
+ {<<"hpack">>, <<"17670F83FF984AE6CD74B1C456EDDE906D27FF013740EE4D9EFAA4F1BF999633">>},
+ {<<"jsx">>, <<"D12516BAA0BB23A59BB35DCCAF02A1BD08243FCBB9EFE24F2D9D056CCFF71268">>},
+ {<<"ranch">>, <<"FBF3D79661C071543256F9051CAF19D65DAA6DF1CF6824D8F37A49B19A66F703">>}]},
+{pkg_hash_ext,[
+ {<<"acceptor_pool">>, <<"0CBCD83FDC8B9AD2EEE2067EF8B91A14858A5883CB7CD800E6FCD5803E158788">>},
+ {<<"chatterbox">>, <<"6478C161BC60244F41CD5847CC3ACCD26D997883E9F7FACD36FF24533B2FA579">>},
+ {<<"ctx">>, <<"A14ED2D1B67723DBEBBE423B28D7615EB0BDCBA6FF28F2D1F1B0A7E1D4AA5FC2">>},
+ {<<"gproc">>, <<"580ADAFA56463B75263EF5A5DF4C86AF321F68694E7786CB057FD805D1E2A7DE">>},
+ {<<"grpcbox">>, <<"161ABE9E17E7D1982EFA6488ADEAA13C3E847A07984A6E6B224E553368918647">>},
+ {<<"hpack">>, <<"06F580167C4B8B8A6429040DF36CC93BBA6D571FAEAEC1B28816523379CBB23A">>},
+ {<<"jsx">>, <<"0C5CC8FDC11B53CC25CF65AC6705AD39E54ECC56D1C22E4ADB8F5A53FB9427F3">>},
+ {<<"ranch">>, <<"C20A4840C7D6623C19812D3A7C828B2F1BD153EF0F124CB69C54FE51D8A42AE0">>}]}
+].
diff --git a/src/te/tests/deploy_specs.sh b/src/te/tests/deploy_specs.sh
new file mode 100644
index 0000000000000000000000000000000000000000..818fb2b0d69ae63b197a83683e68aed96e50d6e2
--- /dev/null
+++ b/src/te/tests/deploy_specs.sh
@@ -0,0 +1,147 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+
+# ----- TeraFlowSDN ------------------------------------------------------------
+
+# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
+
+# Set the list of components, separated by spaces, you want to build images for, and deploy.
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice webui"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate TE
+export TFS_COMPONENTS="${TFS_COMPONENTS} te"
+
+# Set the tag you want to use for your images.
+export TFS_IMAGE_TAG="dev"
+
+# Set the name of the Kubernetes namespace to deploy TFS to.
+export TFS_K8S_NAMESPACE="tfs"
+
+# Set additional manifest files to be applied after the deployment
+export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
+
+# Uncomment to monitor performance of components
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
+# Set the new Grafana admin password
+export TFS_GRAFANA_PASSWORD="admin123+"
+
+# Disable skip-build flag to rebuild the Docker images.
+export TFS_SKIP_BUILD=""
+
+
+# ----- CockroachDB ------------------------------------------------------------
+
+# Set the namespace where CockroackDB will be deployed.
+export CRDB_NAMESPACE="crdb"
+
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
+# Set the database username to be used by Context.
+export CRDB_USERNAME="tfs"
+
+# Set the database user's password to be used by Context.
+export CRDB_PASSWORD="tfs123"
+
+# Set the database name to be used by Context.
+export CRDB_DATABASE="tfs"
+
+# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/crdb.sh for additional details
+export CRDB_DEPLOY_MODE="single"
+
+# Disable flag for dropping database, if it exists.
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
+
+# Disable flag for re-deploying CockroachDB from scratch.
+export CRDB_REDEPLOY=""
+
+
+# ----- NATS -------------------------------------------------------------------
+
+# Set the namespace where NATS will be deployed.
+export NATS_NAMESPACE="nats"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4222"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8222"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8812"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9009"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9000"
+
+# Set the database username to be used for QuestDB.
+export QDB_USERNAME="admin"
+
+# Set the database user's password to be used for QuestDB.
+export QDB_PASSWORD="quest"
+
+# Set the table name to be used by Monitoring for KPIs.
+export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
+
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
+# Disable flag for dropping tables if they exist.
+export QDB_DROP_TABLES_IF_EXIST="YES"
+
+# Disable flag for re-deploying QuestDB from scratch.
+export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/te/tests/netgen-config.yml b/src/te/tests/netgen-config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d037088ce6cafdf95110ce5eadd31e8fb7a302ed
--- /dev/null
+++ b/src/te/tests/netgen-config.yml
@@ -0,0 +1,115 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+# Directory used for Netgen's operation.
+# Default: "/tmp/netgen"
+# netgen_runstatedir:
+
+# Clean exit.
+# Default: 'false'
+# clean_exit:
+
+# Valgrind parameters.
+# Default: "--tool=memcheck"
+# valgrind_params: "--tool=memcheck --leak-check=full --trace-children=yes"
+# valgrind_params: "--tool=memcheck --leak-check=full"
+# valgrind_params: "--tool=memcheck --leak-check=full --show-leak-kinds=all"
+# valgrind_params: "--tool=callgrind --dump-instr=yes --collect-jumps=yes"
+
+# Perf directory
+# Default: [netgen_runstatedir]/perf
+# perf_dir:
+
+# Plugins configuration.
+plugins:
+  frr:
+    # FRR's sysconfdir (--sysconfdir).
+    # Default: "/etc/frr"
+    # sysconfdir:
+
+    # FRR's localstatedir (--localstatedir).
+    # Default: "/var/run/frr"
+    # localstatedir:
+
+    # FRR's user (--enable-user).
+    # Default: "frr"
+    # user:
+    user: "root"
+
+    # FRR's group (--enable-group).
+    # Default: "frr"
+    # group:
+    group: "root"
+
+    # Directory to store FRR logs.
+    # Default: [netgen_runstatedir]/frrlogs
+    # logdir:
+
+  tcpdump:
+    # Directory to store tcpdump captures.
+    # Default: [netgen_runstatedir]/pcaps
+    # pcap_dir:
+
+    # Filter on which nodes tcpdump should run.
+    # Default: []
+    # whitelist:
+
+    # Filter on which nodes tcpdump should not run.
+    # Default: []
+    # blacklist:
+
+  tmux:
+    # Path of tmux script used to open a shell on all routers.
+    # Default: [netgen_runstatedir]/tmux.sh
+    # file:
+
+    # Panels per node.
+    # Default: 1
+    # panels-per-node:
+
+  bird:
+    # BIRD's sysconfdir (--sysconfdir).
+    # Default: "/etc/bird"
+    # sysconfdir:
+
+    # BIRD's localstatedir (--localstatedir).
+    # Default: "/var/run/bird"
+    # localstatedir:
+
+    # BIRD's user (--enable-user).
+    # Default: "bird"
+    # user:
+
+    # BIRD's group (--enable-group).
+    # Default: "bird"
+    # group:
+
+    # Directory to store BIRD logs.
+    # Default: [netgen_runstatedir]/birdlogs
+    # logdir:
+
+  bgpsimple:
+    # Path to bgp_simple script
+    # Default: "bgp_simple.pl"
+    # path:
+
+  iou:
+    # IOU working directory.
+    # Default: [netgen_runstatedir]/iou
+    # dir:
+
+  dynamips:
+    # dynamips working directory.
+    # Default: [netgen_runstatedir]/dynamips
+    # dir:
diff --git a/src/te/tests/netgen-topology.yml.template b/src/te/tests/netgen-topology.yml.template
new file mode 100644
index 0000000000000000000000000000000000000000..fd21c436324f03e59e37b7cb5cd829245782e133
--- /dev/null
+++ b/src/te/tests/netgen-topology.yml.template
@@ -0,0 +1,548 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+#
+#                          +---------+
+#                          |         |
+#                          |   SRC   |
+#                          | 9.9.9.1 |
+#                          |         |
+#                          +---------+
+#                               |eth-rt1 (.1)
+#                               |
+#                               |10.0.10.0/24
+#                               |
+#                               |eth-src (.2)
+#                          +---------+                      .
+#                          |         |                      .
+#                          |   RT1   |eth-rt1-pce (???)     .
+#                          | 1.1.1.1 +----------------------------------+
+#                          |  16010  |                      .       ??? |
+#                          +---------+                      .           |
+#                               |eth-sw1                    .           |
+#                               |                           .           |
+#                               |                           .           |
+#                               |                           .           |
+#          +---------+          |          +---------+      .           |
+#          |         |          |          |         |      .           |
+#          |   RT2   |eth-sw1   |   eth-sw1|   RT3   |      .           |
+#          | 2.2.2.2 +----------+----------+ 3.3.3.3 |      .           |
+#          |  16020  |     10.0.1.0/24     |  16030  |      .           |
+#          +---------+                     +---------+      .eth-pce-rt1|(???)
+#     eth-rt4-1|  |eth-rt4-2          eth-rt5-1|  |eth-rt5-2.      +----+----+
+#              |  |                            |  |         .      |         |
+#   10.0.2.0/24|  |10.0.3.0/24      10.0.4.0/24|  |10.0.5.0/24     |   PCE   |
+#              |  |                            |  |         .      |   ????  |
+#     eth-rt2-1|  |eth-rt2-2          eth-rt3-1|  |eth-rt3-2.      |         |
+#          +---------+                     +---------+      .      +----+----+
+#          |         |                     |         |      .eth-pce-rt6|(???)
+#          |   RT4   |     10.0.6.0/24     |   RT5   |      .           |
+#          | 4.4.4.4 +---------------------+ 5.5.5.5 |      .           |
+#          |  16040  |eth-rt5       eth-rt4|  16050  |      .           |
+#          +---------+                     +---------+      .           |
+#        eth-rt6|                                |eth-rt6   .           |
+#               |                                |          .           |
+#    10.0.7.0/24|                                |10.0.8.0/24           |
+#               |          +---------+           |          .           |
+#               +----------|         |-----------+          .           |
+#                   eth-rt4|   RT6   |eth-rt5               .           |
+#                          | 6.6.6.6 |eth-rt6-pce (????)    .      ???? |
+#                          |  16060  +----------------------------------+
+#                          +---------+                      .
+#                               |eth-dst (.1)               .
+#                               |                           .
+#                               |10.0.11.0/24
+#                               |
+#                               |eth-rt6 (.2)
+#                          +---------+
+#                          |         |
+#                          |   DST   |
+#                          | 9.9.9.2 |
+#                          |         |
+#                          +---------+
+#
+
+---
+
+routers:
+
+  src:
+    links:
+      lo:
+        ipv4: 9.9.9.1/32
+        ipv6: 2001:db8:1066::1/128
+        mpls: yes
+      eth-rt1:
+        peer: [rt1, eth-src]
+        ipv4: 10.0.10.1/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+    shell: |
+      ip route add 9.9.9.2/32 encap mpls 1111 via inet 10.0.10.2 src 9.9.9.1
+
+  rt1:
+    links:
+      lo:
+        ipv4: 1.1.1.1/32
+        mpls: yes
+      eth-sw1:
+        peer: [sw1, sw1-rt1]
+        ipv4: 10.0.1.1/24
+        mpls: yes
+      eth-src:
+        peer: [src, eth-rt1]
+        ipv4: 10.0.10.2/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+      pathd:
+        args: "-M pathd_pcep"
+        config: |
+          debug pathd pcep basic
+          segment-routing
+           traffic-eng
+            pcep
+             pce-config CONFIG
+              source-address ip 1.1.1.1
+             pce PCE
+              pce-initiated
+              address ip ${PCE_IP}
+              config CONFIG
+             pcc
+              peer PCE
+          !
+      isisd:
+        run: yes
+        config: |
+          interface lo
+           ip router isis 1
+           ipv6 router isis 1
+           isis passive
+          !
+          interface eth-sw1
+           ip router isis 1
+           ipv6 router isis 1
+           isis hello-multiplier 3
+          !
+          router isis 1
+           net 49.0000.0000.0000.0001.00
+           is-type level-1
+           redistribute ipv4 static level-1
+           redistribute ipv4 connected level-1
+           topology ipv6-unicast
+           segment-routing on
+           segment-routing global-block 16000 23999
+           segment-routing node-msd 8
+           segment-routing prefix 1.1.1.1/32 index 10 explicit-null
+           segment-routing prefix 2001:db8:1000::1/128 index 11 explicit-null
+          !
+    shell: |
+      ip route add 9.9.9.1/32 dev eth-src
+      ip link add eth-rt1-pce type veth peer name eth-pce-rt1
+      ip addr add ${RT1_PCE_INT_IF_IP}/24 dev eth-rt1-pce
+      ip link set eth-pce-rt1 netns ${PCE_NETNS}
+      ip -n ${PCE_NETNS} addr add ${RT1_PCE_EXT_IF_IP}/24 dev eth-pce-rt1
+      ip link set eth-rt1-pce up
+      ip -n ${PCE_NETNS} link set eth-pce-rt1 up
+      ip route add ${RT1_PCE_EXT_IF_IP}/24 via ${RT1_PCE_INT_IF_IP} dev eth-rt1-pce src 1.1.1.1
+      ip -n ${PCE_NETNS} route add ${RT1_PCE_INT_IF_IP}/32 via ${RT1_PCE_EXT_IF_IP} dev eth-pce-rt1
+      ip -n ${PCE_NETNS} route add 1.1.1.1/32 via ${RT1_PCE_EXT_IF_IP} dev eth-pce-rt1
+
+  rt2:
+    links:
+      lo:
+        ipv4: 2.2.2.2/32
+        ipv6: 2001:db8:1000::2/128
+        mpls: yes
+      eth-sw1:
+        peer: [sw1, sw1-rt2]
+        ipv4: 10.0.1.2/24
+        mpls: yes
+      eth-rt4-1:
+        peer: [rt4, eth-rt2-1]
+        ipv4: 10.0.2.2/24
+        mpls: yes
+      eth-rt4-2:
+        peer: [rt4, eth-rt2-2]
+        ipv4: 10.0.3.2/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+      isisd:
+        run: yes
+        config: |
+          interface lo
+           ip router isis 1
+           ipv6 router isis 1
+           isis passive
+          !
+          interface eth-sw1
+           ip router isis 1
+           ipv6 router isis 1
+           isis hello-multiplier 3
+          !
+          interface eth-rt4-1
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt4-2
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          router isis 1
+           net 49.0000.0000.0000.0002.00
+           is-type level-1
+           topology ipv6-unicast
+           segment-routing on
+           segment-routing global-block 16000 23999
+           segment-routing node-msd 8
+           segment-routing prefix 2.2.2.2/32 index 20 no-php-flag
+           segment-routing prefix 2001:db8:1000::2/128 index 21 no-php-flag
+          !
+
+  rt3:
+    links:
+      lo:
+        ipv4: 3.3.3.3/32
+        ipv6: 2001:db8:1000::3/128
+        mpls: yes
+      eth-sw1:
+        peer: [sw1, sw1-rt3]
+        ipv4: 10.0.1.3/24
+        mpls: yes
+      eth-rt5-1:
+        peer: [rt5, eth-rt3-1]
+        ipv4: 10.0.4.3/24
+        mpls: yes
+      eth-rt5-2:
+        peer: [rt5, eth-rt3-2]
+        ipv4: 10.0.5.3/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+      isisd:
+        run: yes
+        config: |
+          interface lo
+           ip router isis 1
+           ipv6 router isis 1
+           isis passive
+          !
+          interface eth-sw1
+           ip router isis 1
+           ipv6 router isis 1
+           isis hello-multiplier 3
+          !
+          interface eth-rt5-1
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt5-2
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          router isis 1
+           net 49.0000.0000.0000.0003.00
+           is-type level-1
+           topology ipv6-unicast
+           segment-routing on
+           segment-routing global-block 16000 23999
+           segment-routing node-msd 8
+           segment-routing prefix 3.3.3.3/32 index 30 no-php-flag
+           segment-routing prefix 2001:db8:1000::3/128 index 31 no-php-flag
+          !
+
+  rt4:
+    links:
+      lo:
+        ipv4: 4.4.4.4/32
+        ipv6: 2001:db8:1000::4/128
+        mpls: yes
+      eth-rt2-1:
+        peer: [rt2, eth-rt4-1]
+        ipv4: 10.0.2.4/24
+        mpls: yes
+      eth-rt2-2:
+        peer: [rt2, eth-rt4-2]
+        ipv4: 10.0.3.4/24
+        mpls: yes
+      eth-rt5:
+        peer: [rt5, eth-rt4]
+        ipv4: 10.0.6.4/24
+        mpls: yes
+      eth-rt6:
+        peer: [rt6, eth-rt4]
+        ipv4: 10.0.7.4/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+      isisd:
+        run: yes
+        config: |
+          interface lo
+           ip router isis 1
+           ipv6 router isis 1
+           isis passive
+          !
+          interface eth-rt2-1
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt2-2
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt5
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt6
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          router isis 1
+           net 49.0000.0000.0000.0004.00
+           is-type level-1
+           topology ipv6-unicast
+           segment-routing on
+           segment-routing global-block 16000 23999
+           segment-routing node-msd 8
+           segment-routing prefix 4.4.4.4/32 index 40 no-php-flag
+           segment-routing prefix 2001:db8:1000::4/128 index 41 no-php-flag
+          !
+
+  rt5:
+    links:
+      lo:
+        ipv4: 5.5.5.5/32
+        ipv6: 2001:db8:1000::5/128
+        mpls: yes
+      eth-rt3-1:
+        peer: [rt3, eth-rt5-1]
+        ipv4: 10.0.4.5/24
+        mpls: yes
+      eth-rt3-2:
+        peer: [rt3, eth-rt5-2]
+        ipv4: 10.0.5.5/24
+        mpls: yes
+      eth-rt4:
+        peer: [rt4, eth-rt5]
+        ipv4: 10.0.6.5/24
+        mpls: yes
+      eth-rt6:
+        peer: [rt6, eth-rt5]
+        ipv4: 10.0.8.5/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+      isisd:
+        run: yes
+        config: |
+          interface lo
+           ip router isis 1
+           ipv6 router isis 1
+           isis passive
+          !
+          interface eth-rt3-1
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt3-2
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt4
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt6
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          router isis 1
+           net 49.0000.0000.0000.0005.00
+           is-type level-1
+           topology ipv6-unicast
+           segment-routing on
+           segment-routing global-block 16000 23999
+           segment-routing node-msd 8
+           segment-routing prefix 5.5.5.5/32 index 50 no-php-flag
+           segment-routing prefix 2001:db8:1000::5/128 index 51 no-php-flag
+          !
+
+  rt6:
+    links:
+      lo:
+        ipv4: 6.6.6.6/32
+        ipv6: 2001:db8:1000::6/128
+        mpls: yes
+      eth-rt4:
+        peer: [rt4, eth-rt6]
+        ipv4: 10.0.7.6/24
+        mpls: yes
+      eth-rt5:
+        peer: [rt5, eth-rt6]
+        ipv4: 10.0.8.6/24
+        mpls: yes
+      eth-dst:
+        peer: [dst, eth-rt6]
+        ipv4: 10.0.11.1/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+      pathd:
+        args: "-M pathd_pcep"
+        config: |
+          debug pathd pcep
+          segment-routing
+           traffic-eng
+            pcep
+             pce-config CONFIG
+              source-address ip 6.6.6.6
+             pce PCE
+              pce-initiated
+              address ip ${PCE_IP}
+              config CONFIG
+             pcc
+              peer PCE
+          !
+      isisd:
+        run: yes
+        config: |
+          interface lo
+           ip router isis 1
+           ipv6 router isis 1
+           isis passive
+          !
+          interface eth-rt4
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          interface eth-rt5
+           ip router isis 1
+           ipv6 router isis 1
+           isis network point-to-point
+           isis hello-multiplier 3
+          !
+          router isis 1
+           net 49.0000.0000.0000.0006.00
+           is-type level-1
+           redistribute ipv4 static level-1
+           redistribute ipv4 connected level-1
+           topology ipv6-unicast
+           segment-routing on
+           segment-routing global-block 16000 23999
+           segment-routing node-msd 8
+           segment-routing prefix 6.6.6.6/32 index 60 explicit-null
+           segment-routing prefix 2001:db8:1000::6/128 index 61 explicit-null
+          !
+    shell: |
+      ip route add 9.9.9.2/32 dev eth-dst
+      ip link add eth-rt6-pce type veth peer name eth-pce-rt6
+      ip addr add ${RT6_PCE_INT_IF_IP}/24 dev eth-rt6-pce
+      ip link set eth-pce-rt6 netns ${PCE_NETNS}
+      ip -n ${PCE_NETNS} addr add ${RT6_PCE_EXT_IF_IP}/24 dev eth-pce-rt6
+      ip link set eth-rt6-pce up
+      ip -n ${PCE_NETNS} link set eth-pce-rt6 up
+      ip route add ${RT6_PCE_EXT_IF_IP}/24 via ${RT6_PCE_INT_IF_IP} dev eth-rt6-pce src 6.6.6.6
+      ip -n ${PCE_NETNS} route add ${RT6_PCE_INT_IF_IP}/32 via ${RT6_PCE_EXT_IF_IP} dev eth-pce-rt6
+      ip -n ${PCE_NETNS} route add 6.6.6.6/32 via ${RT6_PCE_EXT_IF_IP} dev eth-pce-rt6
+
+  dst:
+    links:
+      lo:
+        ipv4: 9.9.9.2/32
+        ipv6: 2001:db8:1066::2/128
+        mpls: yes
+      eth-rt6:
+        peer: [rt6, eth-dst]
+        ipv4: 10.0.11.2/24
+        mpls: yes
+    frr:
+      zebra:
+        run: yes
+        config:
+    shell: |
+      ip route add 9.9.9.1/32 encap mpls 6666 via inet 10.0.11.1
+
+switches:
+  sw1:
+    links:
+      sw1-rt1:
+        peer: [rt1, rt1-sw1]
+      sw1-rt2:
+        peer: [rt2, rt2-sw1]
+      sw1-rt3:
+        peer: [rt3, rt3-sw1]
+
+frr:
+  #perf: yes
+  #valgrind: yes
+  base-configs:
+    all: |
+      hostname %(node)
+      password 1
+      log file %(logdir)/%(node)-%(daemon).log
+      log commands
+    zebra: |
+      debug zebra kernel
+      debug zebra packet
+      debug zebra mpls
+    isisd: |
+      debug isis events
+      debug isis route-events
+      debug isis spf-events
+      debug isis sr-events
+      debug isis lsp-gen
diff --git a/src/te/tests/service-descriptors.json b/src/te/tests/service-descriptors.json
new file mode 100644
index 0000000000000000000000000000000000000000..15023ac9da8ff443bad6274af9de8246db524358
--- /dev/null
+++ b/src/te/tests/service-descriptors.json
@@ -0,0 +1,24 @@
+{
+    "services": [
+        {
+            "service_id": {
+                "context_id": {"context_uuid": {"uuid": "admin"}},
+                "service_uuid": {"uuid": "2c025055-bf6c-4250-8560-cf62f2d29e72"}
+            },
+            "service_type": 4, "service_status": {"service_status": 1},
+            "service_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid":"RT1"}}, "endpoint_uuid": {"uuid":"eth-src"}},
+                {"device_id": {"device_uuid": {"uuid":"RT6"}}, "endpoint_uuid": {"uuid":"eth-dst"}}
+            ],
+            "service_constraints": [],
+            "service_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/lsp-fw", "resource_value": {
+                    "symbolic_name": "foo", "binding_label": 1111
+                }}},
+                {"action": 1, "custom": {"resource_key": "/lsp-bw", "resource_value": {
+                    "symbolic_name": "bar", "binding_label": 6666
+                }}}
+            ]}
+        }
+    ]
+}
diff --git a/src/te/tests/start-testbed.sh b/src/te/tests/start-testbed.sh
new file mode 100755
index 0000000000000000000000000000000000000000..07a30e091252f753ff3c89c65378c6bbcde8bae3
--- /dev/null
+++ b/src/te/tests/start-testbed.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+set -e
+
+ROOTDIR="$( cd $( dirname $0 ); pwd )"
+RUNDIR="$( pwd )"
+NETGENDIR="${RUNDIR}/netgen"
+
+if [[ ! -f "${NETGENDIR}/exe/netgen" ]]; then
+    echo "Failed to find Netgen binary at ${NETGENDIR}/exe/netgen"
+    exit 1
+fi
+
+PCE_IP=$( kubectl --namespace tfs get $(kubectl --namespace tfs get pods --selector=app=teservice -o name) --template '{{.status.podIP}}' )
+echo "Teraflow PCE IP address: $PCE_IP"
+NAMESPACES=$( ip netns list | cut -d' ' -f1 )
+PCE_NETNS=""
+for n in $NAMESPACES; do
+    if sudo ip -n $n addr list | grep $PCE_IP > /dev/null; then
+        echo "Teraflow TE service namespace: $n"
+        PCE_NETNS=$n
+        break
+    fi    
+done
+if [[ -z $PCE_NETNS ]]; then
+    echo "Teraflow network namespace for TE service not found"
+    exit1
+fi
+
+IFS=. read PCE_IP1 PCE_IP2 PCE_IP3 PCE_IP4 <<< "$PCE_IP"
+
+export PCE_IP
+export PCE_NETNS
+export RT1_PCE_INT_IF_IP="$PCE_IP1.$PCE_IP2.$PCE_IP3.10"
+export RT1_PCE_EXT_IF_IP="$PCE_IP1.$PCE_IP2.$PCE_IP3.11"
+export RT6_PCE_INT_IF_IP="$PCE_IP1.$PCE_IP2.$PCE_IP3.12"
+export RT6_PCE_EXT_IF_IP="$PCE_IP1.$PCE_IP2.$PCE_IP3.13"
+
+cp "${ROOTDIR}/netgen-config.yml" "${RUNDIR}/config.yml"
+cat "${ROOTDIR}/netgen-topology.yml.template" | envsubst > "${RUNDIR}/topology.yml"
+
+sudo -i bash -c "\
+    cd ${RUNDIR}/netgen;\
+    sysctl -w net.ipv4.conf.all.rp_filter=0;\
+    PATH=/usr/lib/frr:\$PATH ./exe/netgen ../topology.yml -c ../config.yml"
diff --git a/src/te/tests/test_te_service.py b/src/te/tests/test_te_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..6237049d4ed7c69f2a6f12efc1ce0365fca7133b
--- /dev/null
+++ b/src/te/tests/test_te_service.py
@@ -0,0 +1,108 @@
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+# Simple script to test GRPC calls to the TE service.
+# First get the TE service IP using:
+# > kubectl -n tfs get services
+# Change it in this script and run with:
+# > PYTHONPATH=./src python test_te_service.py
+
+import json, sys
+from common.proto.context_pb2 import ConfigActionEnum, Service, ServiceStatusEnum, ServiceTypeEnum
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from service.client.TEServiceClient import TEServiceClient
+
+#  {"name": "", 
+#     "service_config": {
+#        "config_rules": [
+#           {
+#             "action": "CONFIGACTION_SET",
+#              "custom": {
+#                 "resource_key": "/lsp-fw",
+#                 "resource_value": "{\n\"binding_label\": 1111,\n\"symbolic_name\": \"foo\"\n}"}},
+#           {
+#              "action": "CONFIGACTION_SET",
+#              "custom": {
+#                 "resource_key": "/lsp-bw",
+#                 "resource_value": "{\n\"binding_label\": 6666,\n\"symbolic_name\": \"bar\"\n}"}}]},
+#        "service_constraints": [],
+#        "service_endpoint_ids": [
+#           {"device_id": {"device_uuid": {"uuid": "RT1"}}, "endpoint_uuid": {"uuid": "eth-src"}},
+#           {"device_id": {"device_uuid": {"uuid": "RT6"}}, "endpoint_uuid": {"uuid": "eth-dst"}}],
+#        "service_id": {"context_id": {"context_uuid": {"uuid": "admin"}},
+#        "service_uuid": {"uuid": "2c025055-bf6c-4250-8560-cf62f2d29e72"}},
+#        "service_status": {"service_status": "SERVICESTATUS_PLANNED"},
+#        "service_type": "SERVICETYPE_TE"}
+
+service = Service()
+service.service_id.context_id.context_uuid.uuid = 'admin'
+service.service_id.service_uuid.uuid = 'test-te-service'
+
+service.service_type = ServiceTypeEnum.SERVICETYPE_TE
+service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_PLANNED
+
+# SRC Endpoint:
+src_endpoint_id = service.service_endpoint_ids.add()
+src_endpoint_id.device_id.device_uuid.uuid = 'RT1'
+src_endpoint_id.endpoint_uuid.uuid = 'eth-src'
+
+# DST Endpoint:
+dst_endpoint_id = service.service_endpoint_ids.add()
+dst_endpoint_id.device_id.device_uuid.uuid = 'RT6'
+dst_endpoint_id.endpoint_uuid.uuid = 'eth-dst'
+
+# # Capacity SLA
+# sla_capacity = service.service_constraints.add()
+# sla_capacity.sla_capacity.capacity_gbps = 10.0
+
+# # Latency SLA
+# sla_latency = service.service_constraints.add()
+# sla_latency.sla_latency.e2e_latency_ms = 20.0
+
+# Example config rules:
+config_rule_1 = service.service_config.config_rules.add()
+config_rule_1.action = ConfigActionEnum.CONFIGACTION_SET
+config_rule_1.custom.resource_key = '/lsp-fw'
+config_rule_1.custom.resource_value = json.dumps({
+    'binding_label': 1111, 'symbolic_name': "foo"
+})
+
+config_rule_2 = service.service_config.config_rules.add()
+config_rule_2.action = ConfigActionEnum.CONFIGACTION_SET
+config_rule_2.custom.resource_key = '/lsp-bw'
+config_rule_2.custom.resource_value = json.dumps({
+    'binding_label': 6666, 'symbolic_name': "bar"
+})
+
+def main():
+    # Connect:
+    te_service_client = TEServiceClient(host='XXX.XXX.XXX.XXX', port=10030)
+
+    # RequestLSP
+    print('request:', grpc_message_to_json_string(service))
+    service_status = te_service_client.RequestLSP(service)
+    print('response:', grpc_message_to_json_string(service_status))
+
+    # DeleteLSP
+    #print('request:', grpc_message_to_json_string(service))
+    #service_status = te_service_client.DeleteLSP(service)
+    #print('response:', grpc_message_to_json_string(service_status))
+
+    # Close:
+    te_service_client.close()
+
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/src/te/tests/topology-descriptors.json b/src/te/tests/topology-descriptors.json
new file mode 100644
index 0000000000000000000000000000000000000000..a34d8ce09b3367bce0943ef3de8565baec776842
--- /dev/null
+++ b/src/te/tests/topology-descriptors.json
@@ -0,0 +1,195 @@
+{
+    "contexts": [
+        {
+            "context_id": {"context_uuid": {"uuid": "admin"}},
+            "topology_ids": [],
+            "service_ids": []
+        }
+    ],
+    "topologies": [
+        {
+            "topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}},
+            "device_ids": [
+                {"device_uuid": {"uuid": "SW1"}},
+                {"device_uuid": {"uuid": "RT1"}},
+                {"device_uuid": {"uuid": "RT2"}},
+                {"device_uuid": {"uuid": "RT3"}},
+                {"device_uuid": {"uuid": "RT4"}},
+                {"device_uuid": {"uuid": "RT5"}},
+                {"device_uuid": {"uuid": "RT6"}}
+            ],
+            "link_ids": [
+                {"link_uuid": {"uuid": "RT1/SW1"}},
+                {"link_uuid": {"uuid": "RT2/SW1"}},
+                {"link_uuid": {"uuid": "RT3/SW1"}},
+                {"link_uuid": {"uuid": "RT2/RT4/1"}},
+                {"link_uuid": {"uuid": "RT2/RT4/2"}},
+                {"link_uuid": {"uuid": "RT3/RT5/1"}},
+                {"link_uuid": {"uuid": "RT3/RT5/2"}},
+                {"link_uuid": {"uuid": "RT4/RT5"}},
+                {"link_uuid": {"uuid": "RT4/RT6"}},
+                {"link_uuid": {"uuid": "RT5/RT6"}}
+            ]
+        }
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "SW1"}}, "device_type": "emu-packet-switch",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "df8bb169-2013-4b82-9455-69777f7a01d6"},
+                    {"sample_types": [], "type": "copper", "uuid": "061119c1-2aa4-48e9-be64-3ddf465fc80a"},
+                    {"sample_types": [], "type": "copper", "uuid": "495ea3f8-e67f-46a0-84bd-a230a4b7067d"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "RT1"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "1.1.1.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "eth-src"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-sw1"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/te_data", "resource_value": {"mpls_label": 16010, "pcc_address": "1.1.1.1"}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "RT2"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "2.2.2.2"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "eth-sw1"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt4-1"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt4-2"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/te_data", "resource_value": {"mpls_label": 16020, "pcc_address": "2.2.2.2"}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "RT3"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "3.3.3.3"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "eth-sw1"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt5-1"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt5-2"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/te_data", "resource_value": {"mpls_label": 16030, "pcc_address": "3.3.3.3"}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "RT4"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "4.4.4.4"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt2-1"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt2-2"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt5"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt6"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/te_data", "resource_value": {"mpls_label": 16040, "pcc_address": "4.4.4.4"}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "RT5"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "5.5.5.5"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt3-1"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt3-2"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt4"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt6"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/te_data", "resource_value": {"mpls_label": 16050, "pcc_address": "5.5.5.5"}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "RT6"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "6.6.6.6"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt4"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-rt5"},
+                    {"sample_types": [], "type": "copper", "uuid": "eth-dst"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/te_data", "resource_value": {"mpls_label": 16060, "pcc_address": "6.6.6.6"}}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "RT1/SW1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT1"}}, "endpoint_uuid": {"uuid": "eth-sw1"}},
+                {"device_id": {"device_uuid": {"uuid": "SW1"}}, "endpoint_uuid": {"uuid": "df8bb169-2013-4b82-9455-69777f7a01d6"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT2/SW1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT2"}}, "endpoint_uuid": {"uuid": "eth-sw1"}},
+                {"device_id": {"device_uuid": {"uuid": "SW1"}}, "endpoint_uuid": {"uuid": "061119c1-2aa4-48e9-be64-3ddf465fc80a"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT3/SW1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT3"}}, "endpoint_uuid": {"uuid": "eth-sw1"}},
+                {"device_id": {"device_uuid": {"uuid": "SW1"}}, "endpoint_uuid": {"uuid": "495ea3f8-e67f-46a0-84bd-a230a4b7067d"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT2/RT4/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT2"}}, "endpoint_uuid": {"uuid": "eth-rt4-1"}},
+                {"device_id": {"device_uuid": {"uuid": "RT4"}}, "endpoint_uuid": {"uuid": "eth-rt2-1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT2/RT4/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT2"}}, "endpoint_uuid": {"uuid": "eth-rt4-2"}},
+                {"device_id": {"device_uuid": {"uuid": "RT4"}}, "endpoint_uuid": {"uuid": "eth-rt2-2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT3/RT5/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT3"}}, "endpoint_uuid": {"uuid": "eth-rt5-1"}},
+                {"device_id": {"device_uuid": {"uuid": "RT5"}}, "endpoint_uuid": {"uuid": "eth-rt3-1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT3/RT5/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT3"}}, "endpoint_uuid": {"uuid": "eth-rt5-2"}},
+                {"device_id": {"device_uuid": {"uuid": "RT5"}}, "endpoint_uuid": {"uuid": "eth-rt3-2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT4/RT5"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT4"}}, "endpoint_uuid": {"uuid": "eth-rt5"}},
+                {"device_id": {"device_uuid": {"uuid": "RT5"}}, "endpoint_uuid": {"uuid": "eth-rt4"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT4/RT6"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT4"}}, "endpoint_uuid": {"uuid": "eth-rt6"}},
+                {"device_id": {"device_uuid": {"uuid": "RT6"}}, "endpoint_uuid": {"uuid": "eth-rt4"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "RT5/RT6"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "RT5"}}, "endpoint_uuid": {"uuid": "eth-rt6"}},
+                {"device_id": {"device_uuid": {"uuid": "RT6"}}, "endpoint_uuid": {"uuid": "eth-rt5"}}
+            ]
+        }
+    ]
+}
diff --git a/src/te/tutorial/1-6-setup-erlang-environmnet.md b/src/te/tutorial/1-6-setup-erlang-environmnet.md
new file mode 100644
index 0000000000000000000000000000000000000000..2d1519a6f3dc0e4bb686bfa107c0ca5b16eb6cd2
--- /dev/null
+++ b/src/te/tutorial/1-6-setup-erlang-environmnet.md
@@ -0,0 +1,56 @@
+# 1.5. Setup Erlang Environment
+
+First we need to install Erlang. There is multiple way, for development we will
+be using *ASDF*, a tool that allows the installation of multiple version of Erlang
+at the same time, and switch from one version to the other at will.
+
+
+## 1.5.1. Setup Erlang using asdf
+
+First, install any missing dependencies:
+
+    sudo apt install curl git autoconf libncurses-dev build-essential m4 libssl-dev 
+
+Download *ASDF* tool to the local account:
+
+    git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2
+
+Make *ASDF* activate on login by adding these lines at the end of the `~/.bashrc` file:
+
+    . $HOME/.asdf/asdf.sh
+    . $HOME/.asdf/completions/asdf.bash
+
+Logout and log back in to activate *ASDF*.
+
+*ASDF* supports multiple tools by installing there corresponding plugins.
+Install *ASDF* plugin for Erlang:
+
+    asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
+
+Install a version of Erlang:
+
+    asdf install erlang 24.3.4.2
+
+Activate Erlang locally for TFS controller. This will create a local file
+called `.tool-versions` defining which version of the tools to use when
+running under the current directory:
+
+    cd tfs-ctrl/
+    asdf local erlang 24.3.4.2
+
+Erlang projects uses a build tool called rebar3. It is used to manager project
+dependenecies, compile a project and generate project releases.
+Install rebar3 localy from source:
+
+    cd ~
+    git clone https://github.com/erlang/rebar3.git
+    cd rebar3
+    asdf local erlang 24.3.4.2
+    ./bootstrap
+    ./rebar3 local install
+
+Update `~/.bashrc` to use rebar3 by adding this line at the end:
+
+    export PATH=$HOME/.cache/rebar3/bin:$PATH
+
+Logout and log back in.
diff --git a/src/te/tutorial/2-6-te-demo.md b/src/te/tutorial/2-6-te-demo.md
new file mode 100644
index 0000000000000000000000000000000000000000..c53a60c51cf20717e51fb514c5b02d6594ce7904
--- /dev/null
+++ b/src/te/tutorial/2-6-te-demo.md
@@ -0,0 +1,130 @@
+# 2.6. Traffic Engineering Demo
+
+## Setup Test-Bed
+
+### Setup libyang
+
+    $ sudo apt update
+    $ sudo apt-get install cmake libpcre2-dev git make build-essential
+    $ mkdir -p ~/testbed
+    $ cd ~/testbed
+    $ git clone git@github.com:CESNET/libyang.git
+    $ cd libyang
+    $ git checkout v2.0.0
+    $ mkdir build; cd build
+    $ cmake -D CMAKE_INSTALL_PREFIX:PATH=/usr -D CMAKE_BUILD_TYPE:String="Release" ..
+    $ make
+    $ sudo make install
+
+
+### Setup Free Range Routing
+
+    $ sudo apt update
+    $ sudo apt-get install git autoconf automake libtool make libreadline-dev texinfo pkg-config libpam0g-dev libjson-c-dev bison flex libc-ares-dev python3-dev python3-sphinx install-info build-essential libsnmp-dev perl libcap-dev python2 libelf-dev libunwind-dev protobuf-c-compiler libprotobuf-c-dev libsystemd-dev
+    $ mkdir -p ~/testbed
+    $ cd ~/testbed
+    $ git clone git@github.com:opensourcerouting/frr.git
+    $ cd frr
+    $ curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
+    $ sudo python2 ./get-pip.py
+    $ export CFLAGS="-I /usr/local/include -g -O2"
+    $ sudo rm -rf /usr/lib/frr
+    $ sudo rm -rf /var/run/frr
+    $ sudo mkdir -p /etc/frr
+    $ sudo mkdir -p /var/run/frr
+    $ sudo chown -R root:root /etc/frr
+    $ ./bootstrap.sh
+    $ ./configure \
+        --prefix=/usr \
+        --includedir=\${prefix}/include \
+        --enable-exampledir=\${prefix}/share/doc/frr/examples \
+        --bindir=\${prefix}/bin \
+        --sbindir=\${prefix}/lib/frr \
+        --libdir=\${prefix}/lib/frr \
+        --libexecdir=\${prefix}/lib/frr \
+        --localstatedir=/var/run/frr \
+        --sysconfdir=/etc/frr \
+        --with-moduledir=\${prefix}/lib/frr/modules \
+        --enable-configfile-mask=0640 \
+        --enable-logfile-mask=0640 \
+        --enable-snmp=agentx \
+        --enable-multipath=64 \
+        --enable-user=root \
+        --enable-group=root \
+        --enable-vty-group=root \
+        --enable-vtysh \
+        --with-pkg-git-version \
+        --with-pkg-extra-version=-MyOwnFRRVersion \
+        --enable-systemd=yes \
+        --enable-config-rollbacks \
+        --enable-pathd \
+        --enable-pcep
+    $ make
+    $ sudo make install
+
+
+### Setup NetGen
+
+    $ sudo apt update
+    $ sudo apt-get install git ruby ruby-dev tmux gettext-base
+    $ mkdir -p ~/testbed
+    $ cd ~/testbed
+    $ git clone git@github.com:sylane/netgen.git
+    $ cd netgen
+    $ git checkout teraflow
+    $ sudo gem install bundler:1.15
+    $ bundle _1.15_ install
+
+
+### Run the Test-Bed
+
+First load the [teraflow configuration file](~/tfs-ctrl/src/te/tests/topology-descriptors.json) using the webui.
+
+In first console:
+    $ cd ~/testbed
+    $ ../tfs-ctrl/src/te/tests/start-testbed.sh
+
+Then in second console:
+    $ sudo -i
+    # cd /tmp/negen
+    # ./tmux.sh
+
+Be sure that both PCC connected to the TE service before going further.
+This can be done by looking at the TE service log:
+
+    $ kubectl --namespace tfs logs $(kubectl --namespace tfs get pods --selector=app=teservice -o name) -c server
+
+### Setup a flow from the Erlang console
+
+We will setup two unidirectional flow between router 1 and 6.
+We will use the binding label 1111 for the flow from router 1 to router 6, and the binding label 6666 for the flow from router 6 to router 1.
+
+    $ kubectl --namespace tfs exec -ti $(kubectl --namespace tfs get pods --selector=app=teservice -o name) -c server -- /tfte/bin/tfte remote_console
+    1> {ok, Flow1to6} = epce_server:initiate_flow(<<"foo">>, {1, 1, 1, 1}, {6, 6, 6, 6}, 1111).
+    2> {ok, Flow6to1} = epce_server:initiate_flow(<<"bar">>, {6, 6, 6, 6}, {1, 1, 1, 1}, 6666).
+
+Another option is to use the router names:
+
+    1> {ok, Flow1to6} = epce_server:initiate_flow(<<"foo">>, <<"RT1">>, <<"RT6">>, 1111).
+    2> {ok, Flow6to1} = epce_server:initiate_flow(<<"bar">>, <<"RT6">>, <<"RT1">>, 6666).
+
+Now if we go to the tmux session src (Ctrl-B 0) we can ping dst:
+
+    $ ping 9.9.9.2
+
+From the Erlang console we can update the initiated flows to change the path the packets are flowing through:
+
+    3> epce_server:update_flow(Flow6to1, [16050, 16030, 16010]).
+
+### Setup a flow using the GRPC test script
+
+This does the same as the the setup from the Erlang console, but through GRPC.
+After deploying Teraflow (with te), get the te service ip using:
+
+    $ kubectl -n tfs get services
+
+Replace the IP in the python script `src/te/tests/test_te_service.py`.
+Be sure the topology as been loaded, and netgen started as described previously,
+and run the following command from the root of the teraflow controller:
+
+    $ PYTHONPATH=./src python src/te/tests/test_te_service.py
diff --git a/src/tests/benchmark/automation/tests/Objects.py b/src/tests/benchmark/automation/tests/Objects.py
index 8558d1fe7af84f1e312bc44eb458a3624ed694ae..a364abdc9d5dadec25e44e497f36db0c90e98e0b 100644
--- a/src/tests/benchmark/automation/tests/Objects.py
+++ b/src/tests/benchmark/automation/tests/Objects.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
     json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled)
-from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
+from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_descriptor, json_endpoint_id
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
@@ -40,7 +40,8 @@ PACKET_PORT_SAMPLE_TYPES = [
 ]
 
 # ----- Devices --------------------------------------------------------------------------------------------------------
-DEVICE_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                        json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_ENDPOINT_DEFS)
 
 # ----- Object Collections ---------------------------------------------------------------------------------------------
diff --git a/src/tests/ecoc22/deploy_specs.sh b/src/tests/ecoc22/deploy_specs.sh
index 6c3d9db662a8232f1fcccf3835b98d69571b6337..b1ee5ef6d6e500078bf0e170af5dfb32f01df088 100755
--- a/src/tests/ecoc22/deploy_specs.sh
+++ b/src/tests/ecoc22/deploy_specs.sh
@@ -20,7 +20,20 @@
 export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device automation monitoring pathcomp service slice compute webui"
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice compute webui"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
@@ -31,6 +44,12 @@ export TFS_K8S_NAMESPACE="tfs"
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
 
+# Uncomment to monitor performance of components
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
@@ -43,6 +62,12 @@ export TFS_SKIP_BUILD=""
 # Set the namespace where CockroackDB will be deployed.
 export CRDB_NAMESPACE="crdb"
 
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
 # Set the database username to be used by Context.
 export CRDB_USERNAME="tfs"
 
@@ -57,7 +82,7 @@ export CRDB_DATABASE="tfs"
 export CRDB_DEPLOY_MODE="single"
 
 # Disable flag for dropping database, if it exists.
-export CRDB_DROP_DATABASE_IF_EXISTS=""
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
 
 # Disable flag for re-deploying CockroachDB from scratch.
 export CRDB_REDEPLOY=""
@@ -68,6 +93,12 @@ export CRDB_REDEPLOY=""
 # Set the namespace where NATS will be deployed.
 export NATS_NAMESPACE="nats"
 
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4222"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8222"
+
 # Disable flag for re-deploying NATS from scratch.
 export NATS_REDEPLOY=""
 
@@ -77,6 +108,15 @@ export NATS_REDEPLOY=""
 # Set the namespace where QuestDB will be deployed.
 export QDB_NAMESPACE="qdb"
 
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8812"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9009"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9000"
+
 # Set the database username to be used for QuestDB.
 export QDB_USERNAME="admin"
 
@@ -86,8 +126,20 @@ export QDB_PASSWORD="quest"
 # Set the table name to be used by Monitoring for KPIs.
 export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
 
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
 # Disable flag for dropping tables if they exist.
-export QDB_DROP_TABLES_IF_EXIST=""
+export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/ecoc22/tests/Tools.py b/src/tests/ecoc22/tests/Tools.py
index 26a3eda7101907f63fc51bc042bd59dee463d7d9..ea83d06bbe19c05d8f1932c03fd595ae760cc83f 100644
--- a/src/tests/ecoc22/tests/Tools.py
+++ b/src/tests/ecoc22/tests/Tools.py
@@ -16,16 +16,18 @@ from typing import Dict, List, Tuple
 from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
 from common.tools.object_factory.Link import json_link, json_link_id
 
-def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Dict]]):
     return [
-        json_endpoint_id(device_id, ep_uuid, topology_id=None)
-        for ep_uuid, _, _ in endpoint_descriptors
+        json_endpoint_id(device_id, ep_data['uuid'], topology_id=None)
+        for ep_data in endpoint_descriptors
     ]
 
-def json_endpoints(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoints(device_id : Dict, endpoint_descriptors : List[Dict]]):
     return [
-        json_endpoint(device_id, ep_uuid, ep_type, topology_id=None, kpi_sample_types=ep_sample_types)
-        for ep_uuid, ep_type, ep_sample_types in endpoint_descriptors
+        json_endpoint(
+            device_id, ep_data['uuid'], ep_data['type'], topology_id=None,
+            kpi_sample_types=ep_data['sample_types'])
+        for ep_data in endpoint_descriptors
     ]
 
 def get_link_uuid(a_endpoint_id : Dict, z_endpoint_id : Dict) -> str:
diff --git a/src/tests/ecoc22/tests/old_code/Objects_BigNet.py b/src/tests/ecoc22/tests/old_code/Objects_BigNet.py
index fb96914678e646840400e5270892b82428c428ee..f52d4fa2bde90ef0cc4bf7fad01625e782d2b086 100644
--- a/src/tests/ecoc22/tests/old_code/Objects_BigNet.py
+++ b/src/tests/ecoc22/tests/old_code/Objects_BigNet.py
@@ -17,6 +17,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_datacenter_disabled,
     json_device_emulated_packet_router_disabled, json_device_id)
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from .Tools import compose_bearer, compose_service_endpoint_id, json_endpoint_ids, link
 
@@ -32,7 +33,7 @@ TOPOLOGY    = json_topology(DEFAULT_TOPOLOGY_NAME, context_id=CONTEXT_ID)
 
 # ----- Customer Equipment (CE) Devices --------------------------------------------------------------------------------
 DEVICE_CE1_UUID          = 'CE1'
-DEVICE_CE1_ENDPOINT_DEFS = [('1/1', 'copper', [])]
+DEVICE_CE1_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper')]
 DEVICE_CE1_ID            = json_device_id(DEVICE_CE1_UUID)
 DEVICE_CE1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_CE1_ID, DEVICE_CE1_ENDPOINT_DEFS)
 DEVICE_CE1               = json_device_emulated_packet_router_disabled(DEVICE_CE1_UUID)
@@ -40,7 +41,7 @@ ENDPOINT_ID_CE1_1_1      = DEVICE_CE1_ENDPOINT_IDS[0]
 DEVICE_CE1_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_CE1_ENDPOINT_DEFS)
 
 DEVICE_CE2_UUID          = 'CE2'
-DEVICE_CE2_ENDPOINT_DEFS = [('1/1', 'copper', [])]
+DEVICE_CE2_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper')]
 DEVICE_CE2_ID            = json_device_id(DEVICE_CE2_UUID)
 DEVICE_CE2_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_CE2_ID, DEVICE_CE2_ENDPOINT_DEFS)
 DEVICE_CE2               = json_device_emulated_packet_router_disabled(DEVICE_CE2_UUID)
@@ -48,7 +49,7 @@ ENDPOINT_ID_CE2_1_1      = DEVICE_CE2_ENDPOINT_IDS[0]
 DEVICE_CE2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_CE2_ENDPOINT_DEFS)
 
 DEVICE_CE3_UUID          = 'CE3'
-DEVICE_CE3_ENDPOINT_DEFS = [('1/1', 'copper', [])]
+DEVICE_CE3_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper')]
 DEVICE_CE3_ID            = json_device_id(DEVICE_CE3_UUID)
 DEVICE_CE3_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_CE3_ID, DEVICE_CE3_ENDPOINT_DEFS)
 DEVICE_CE3               = json_device_emulated_packet_router_disabled(DEVICE_CE3_UUID)
@@ -56,7 +57,7 @@ ENDPOINT_ID_CE3_1_1      = DEVICE_CE3_ENDPOINT_IDS[0]
 DEVICE_CE3_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_CE3_ENDPOINT_DEFS)
 
 DEVICE_CE4_UUID          = 'CE4'
-DEVICE_CE4_ENDPOINT_DEFS = [('1/1', 'copper', [])]
+DEVICE_CE4_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper')]
 DEVICE_CE4_ID            = json_device_id(DEVICE_CE4_UUID)
 DEVICE_CE4_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_CE4_ID, DEVICE_CE4_ENDPOINT_DEFS)
 DEVICE_CE4               = json_device_emulated_packet_router_disabled(DEVICE_CE4_UUID)
@@ -65,8 +66,9 @@ DEVICE_CE4_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_CE4_ENDPOIN
 
 # ----- Provider Equipment (PE) Devices --------------------------------------------------------------------------------
 DEVICE_PE1_UUID          = 'PE1'
-DEVICE_PE1_ENDPOINT_DEFS = [('1/1', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', [])]
+DEVICE_PE1_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper')]
 DEVICE_PE1_ID            = json_device_id(DEVICE_PE1_UUID)
 DEVICE_PE1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_PE1_ID, DEVICE_PE1_ENDPOINT_DEFS)
 DEVICE_PE1               = json_device_emulated_packet_router_disabled(DEVICE_PE1_UUID)
@@ -76,8 +78,9 @@ ENDPOINT_ID_PE1_2_2      = DEVICE_PE1_ENDPOINT_IDS[2]
 DEVICE_PE1_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_PE1_ENDPOINT_DEFS)
 
 DEVICE_PE2_UUID          = 'PE2'
-DEVICE_PE2_ENDPOINT_DEFS = [('1/1', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', [])]
+DEVICE_PE2_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper')]
 DEVICE_PE2_ID            = json_device_id(DEVICE_PE2_UUID)
 DEVICE_PE2_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_PE2_ID, DEVICE_PE2_ENDPOINT_DEFS)
 DEVICE_PE2               = json_device_emulated_packet_router_disabled(DEVICE_PE2_UUID)
@@ -87,8 +90,9 @@ ENDPOINT_ID_PE2_2_2      = DEVICE_PE2_ENDPOINT_IDS[2]
 DEVICE_PE2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_PE2_ENDPOINT_DEFS)
 
 DEVICE_PE3_UUID          = 'PE3'
-DEVICE_PE3_ENDPOINT_DEFS = [('1/1', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', [])]
+DEVICE_PE3_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper')]
 DEVICE_PE3_ID            = json_device_id(DEVICE_PE3_UUID)
 DEVICE_PE3_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_PE3_ID, DEVICE_PE3_ENDPOINT_DEFS)
 DEVICE_PE3               = json_device_emulated_packet_router_disabled(DEVICE_PE3_UUID)
@@ -98,8 +102,9 @@ ENDPOINT_ID_PE3_2_2      = DEVICE_PE3_ENDPOINT_IDS[2]
 DEVICE_PE3_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_PE3_ENDPOINT_DEFS)
 
 DEVICE_PE4_UUID          = 'PE4'
-DEVICE_PE4_ENDPOINT_DEFS = [('1/1', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', [])]
+DEVICE_PE4_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper')]
 DEVICE_PE4_ID            = json_device_id(DEVICE_PE4_UUID)
 DEVICE_PE4_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_PE4_ID, DEVICE_PE4_ENDPOINT_DEFS)
 DEVICE_PE4               = json_device_emulated_packet_router_disabled(DEVICE_PE4_UUID)
@@ -110,8 +115,11 @@ DEVICE_PE4_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_PE4_ENDPOIN
 
 # ----- BackBone (BB) Devices ------------------------------------------------------------------------------------------
 DEVICE_BB1_UUID          = 'BB1'
-DEVICE_BB1_ENDPOINT_DEFS = [('1/1', 'copper', []), ('1/2', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', [])]
+DEVICE_BB1_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('1/2', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper')]
 DEVICE_BB1_ID            = json_device_id(DEVICE_BB1_UUID)
 DEVICE_BB1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB1_ID, DEVICE_BB1_ENDPOINT_DEFS)
 DEVICE_BB1               = json_device_emulated_packet_router_disabled(DEVICE_BB1_UUID)
@@ -123,8 +131,11 @@ ENDPOINT_ID_BB1_2_3      = DEVICE_BB1_ENDPOINT_IDS[4]
 DEVICE_BB1_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_BB1_ENDPOINT_DEFS)
 
 DEVICE_BB2_UUID          = 'BB2'
-DEVICE_BB2_ENDPOINT_DEFS = [('1/1', 'copper', []), ('1/2', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', [])]
+DEVICE_BB2_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('1/2', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper')]
 DEVICE_BB2_ID            = json_device_id(DEVICE_BB2_UUID)
 DEVICE_BB2_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB2_ID, DEVICE_BB2_ENDPOINT_DEFS)
 DEVICE_BB2               = json_device_emulated_packet_router_disabled(DEVICE_BB2_UUID)
@@ -136,7 +147,9 @@ ENDPOINT_ID_BB2_2_3      = DEVICE_BB2_ENDPOINT_IDS[4]
 DEVICE_BB2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_BB2_ENDPOINT_DEFS)
 
 DEVICE_BB3_UUID          = 'BB3'
-DEVICE_BB3_ENDPOINT_DEFS = [('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', [])]
+DEVICE_BB3_ENDPOINT_DEFS = [json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper')]
 DEVICE_BB3_ID            = json_device_id(DEVICE_BB3_UUID)
 DEVICE_BB3_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB3_ID, DEVICE_BB3_ENDPOINT_DEFS)
 DEVICE_BB3               = json_device_emulated_packet_router_disabled(DEVICE_BB3_UUID)
@@ -146,8 +159,11 @@ ENDPOINT_ID_BB3_2_3      = DEVICE_BB3_ENDPOINT_IDS[2]
 DEVICE_BB3_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_BB3_ENDPOINT_DEFS)
 
 DEVICE_BB4_UUID          = 'BB4'
-DEVICE_BB4_ENDPOINT_DEFS = [('1/1', 'copper', []), ('1/2', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', [])]
+DEVICE_BB4_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('1/2', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper')]
 DEVICE_BB4_ID            = json_device_id(DEVICE_BB4_UUID)
 DEVICE_BB4_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB4_ID, DEVICE_BB4_ENDPOINT_DEFS)
 DEVICE_BB4               = json_device_emulated_packet_router_disabled(DEVICE_BB4_UUID)
@@ -159,8 +175,11 @@ ENDPOINT_ID_BB4_2_3      = DEVICE_BB4_ENDPOINT_IDS[4]
 DEVICE_BB4_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_BB4_ENDPOINT_DEFS)
 
 DEVICE_BB5_UUID          = 'BB5'
-DEVICE_BB5_ENDPOINT_DEFS = [('1/1', 'copper', []), ('1/2', 'copper', []),
-                            ('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', [])]
+DEVICE_BB5_ENDPOINT_DEFS = [json_endpoint_descriptor('1/1', 'copper'),
+                            json_endpoint_descriptor('1/2', 'copper'),
+                            json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper')]
 DEVICE_BB5_ID            = json_device_id(DEVICE_BB5_UUID)
 DEVICE_BB5_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB5_ID, DEVICE_BB5_ENDPOINT_DEFS)
 DEVICE_BB5               = json_device_emulated_packet_router_disabled(DEVICE_BB5_UUID)
@@ -172,7 +191,9 @@ ENDPOINT_ID_BB5_2_3      = DEVICE_BB5_ENDPOINT_IDS[4]
 DEVICE_BB5_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_BB5_ENDPOINT_DEFS)
 
 DEVICE_BB6_UUID          = 'BB6'
-DEVICE_BB6_ENDPOINT_DEFS = [('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', [])]
+DEVICE_BB6_ENDPOINT_DEFS = [json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper')]
 DEVICE_BB6_ID            = json_device_id(DEVICE_BB6_UUID)
 DEVICE_BB6_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB6_ID, DEVICE_BB6_ENDPOINT_DEFS)
 DEVICE_BB6               = json_device_emulated_packet_router_disabled(DEVICE_BB6_UUID)
@@ -182,8 +203,12 @@ ENDPOINT_ID_BB6_2_3      = DEVICE_BB6_ENDPOINT_IDS[2]
 DEVICE_BB6_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_BB6_ENDPOINT_DEFS)
 
 DEVICE_BB7_UUID          = 'BB7'
-DEVICE_BB7_ENDPOINT_DEFS = [('2/1', 'copper', []), ('2/2', 'copper', []), ('2/3', 'copper', []), ('2/4', 'copper', []),
-                            ('2/5', 'copper', []), ('2/6', 'copper', [])]
+DEVICE_BB7_ENDPOINT_DEFS = [json_endpoint_descriptor('2/1', 'copper'),
+                            json_endpoint_descriptor('2/2', 'copper'),
+                            json_endpoint_descriptor('2/3', 'copper'),
+                            json_endpoint_descriptor('2/4', 'copper'),
+                            json_endpoint_descriptor('2/5', 'copper'),
+                            json_endpoint_descriptor('2/6', 'copper')]
 DEVICE_BB7_ID            = json_device_id(DEVICE_BB7_UUID)
 DEVICE_BB7_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_BB7_ID, DEVICE_BB7_ENDPOINT_DEFS)
 DEVICE_BB7               = json_device_emulated_packet_router_disabled(DEVICE_BB7_UUID)
diff --git a/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_OLS.py b/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_OLS.py
index 522c25d6b272247093edb72cdbfa0ba515ed8cf8..ce16b9bf3241011f1326ae7bccb533c3201608fe 100644
--- a/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_OLS.py
+++ b/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_OLS.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_datacenter_disabled,
     json_device_emulated_packet_router_disabled, json_device_emulated_tapi_disabled, json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
 from common.tools.object_factory.Topology import json_topology, json_topology_id
@@ -30,7 +30,7 @@ ADD_CONNECT_RULES_TO_DEVICES = ADD_CONNECT_RULES_TO_DEVICES.upper() in {'T', 'TR
 
 def compose_router(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -39,7 +39,7 @@ def compose_router(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_ols(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'optical', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'optical') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -48,7 +48,7 @@ def compose_ols(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_datacenter(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
diff --git a/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN.py b/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN.py
index c02f5d0c880f4bf570b7d14278c4bcbb1cffe72d..1de362a91665b73e36d4b3e9fd22ddfad184e50a 100644
--- a/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN.py
+++ b/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_datacenter_disabled,
     json_device_emulated_packet_router_disabled, json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
 from common.tools.object_factory.Topology import json_topology, json_topology_id
@@ -30,7 +30,7 @@ ADD_CONNECT_RULES_TO_DEVICES = ADD_CONNECT_RULES_TO_DEVICES.upper() in {'T', 'TR
 
 def compose_router(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -39,7 +39,7 @@ def compose_router(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_datacenter(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
diff --git a/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN_OLS.py b/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN_OLS.py
index 6c34ec01d4c9b466aa81d306078a0ab242a334ad..2a19b7f1880f31c3e315fcd4383bc36d1fd74385 100644
--- a/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN_OLS.py
+++ b/src/tests/ecoc22/tests/old_code/Objects_DC_CSGW_TN_OLS.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_datacenter_disabled,
     json_device_emulated_packet_router_disabled, json_device_emulated_tapi_disabled, json_device_id)
-from common.tools.object_factory.EndPoint import json_endpoints
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor, json_endpoints
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Service import get_service_uuid, json_service_l3nm_planned
 from common.tools.object_factory.Topology import json_topology, json_topology_id
@@ -30,7 +30,7 @@ ADD_CONNECT_RULES_TO_DEVICES = ADD_CONNECT_RULES_TO_DEVICES.upper() in {'T', 'TR
 
 def compose_router(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -39,7 +39,7 @@ def compose_router(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_ols(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'optical', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'optical') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
@@ -48,7 +48,7 @@ def compose_ols(device_uuid, endpoint_uuids, topology_id=None):
 
 def compose_datacenter(device_uuid, endpoint_uuids, topology_id=None):
     device_id = json_device_id(device_uuid)
-    r_endpoints = [(endpoint_uuid, 'copper', []) for endpoint_uuid in endpoint_uuids]
+    r_endpoints = [json_endpoint_descriptor(endpoint_uuid, 'copper') for endpoint_uuid in endpoint_uuids]
     config_rules = json_device_emulated_connect_rules(r_endpoints) if ADD_CONNECT_RULES_TO_DEVICES else []
     endpoints = json_endpoints(device_id, r_endpoints, topology_id=topology_id)
     j_endpoints = [] if ADD_CONNECT_RULES_TO_DEVICES else endpoints
diff --git a/src/tests/oeccpsc22/deploy_specs_dom1.sh b/src/tests/oeccpsc22/deploy_specs_dom1.sh
index b269236b0bd7ac6ac21a743205157fd9aec42c37..7db9159e00e3044ddeb571b03cf3e05de33a8150 100755
--- a/src/tests/oeccpsc22/deploy_specs_dom1.sh
+++ b/src/tests/oeccpsc22/deploy_specs_dom1.sh
@@ -30,7 +30,7 @@ export TFS_IMAGE_TAG="dev"
 export TFS_K8S_NAMESPACE="tfs-dom1"
 
 # Set additional manifest files to be applied after the deployment
-export TFS_EXTRA_MANIFESTS="oeccpsc22/nginx-ingress-http-dom1.yaml oeccpsc22/expose-services-dom1.yaml"
+export TFS_EXTRA_MANIFESTS="oeccpsc22/nginx-ingress-http-dom1.yaml"
 
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
@@ -64,7 +64,7 @@ export CRDB_DATABASE="tfs_dom1"
 export CRDB_DEPLOY_MODE="single"
 
 # Disable flag for dropping database, if it exists.
-export CRDB_DROP_DATABASE_IF_EXISTS=""
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
 
 # Disable flag for re-deploying CockroachDB from scratch.
 export CRDB_REDEPLOY=""
@@ -112,7 +112,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
 export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
 
 # Disable flag for dropping tables if they exist.
-export QDB_DROP_TABLES_IF_EXIST=""
+export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
diff --git a/src/tests/oeccpsc22/deploy_specs_dom2.sh b/src/tests/oeccpsc22/deploy_specs_dom2.sh
index 112142437ed172f3b773ae148b57b5e0732676fb..3e23c56feb3247a1b1bcef1a82feeac049654cb6 100755
--- a/src/tests/oeccpsc22/deploy_specs_dom2.sh
+++ b/src/tests/oeccpsc22/deploy_specs_dom2.sh
@@ -30,7 +30,7 @@ export TFS_IMAGE_TAG="dev"
 export TFS_K8S_NAMESPACE="tfs-dom2"
 
 # Set additional manifest files to be applied after the deployment
-export TFS_EXTRA_MANIFESTS="oeccpsc22/nginx-ingress-http-dom2.yaml oeccpsc22/expose-services-dom2.yaml"
+export TFS_EXTRA_MANIFESTS="oeccpsc22/nginx-ingress-http-dom2.yaml"
 
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
@@ -64,7 +64,7 @@ export CRDB_DATABASE="tfs_dom2"
 export CRDB_DEPLOY_MODE="single"
 
 # Disable flag for dropping database, if it exists.
-export CRDB_DROP_DATABASE_IF_EXISTS=""
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
 
 # Disable flag for re-deploying CockroachDB from scratch.
 export CRDB_REDEPLOY=""
@@ -112,7 +112,7 @@ export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
 export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
 
 # Disable flag for dropping tables if they exist.
-export QDB_DROP_TABLES_IF_EXIST=""
+export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
diff --git a/src/tests/oeccpsc22/descriptors/domain1.json b/src/tests/oeccpsc22/descriptors/domain1.json
index 2db10b4d1f2e7a702e6da99d1da28fc2fc21c288..3e12b2b3107d76828f42ecd445755ddce1d9f251 100644
--- a/src/tests/oeccpsc22/descriptors/domain1.json
+++ b/src/tests/oeccpsc22/descriptors/domain1.json
@@ -4,6 +4,7 @@
     ],
     "topologies": [
         {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}},
+        {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
         {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
     ],
     "devices": [
@@ -15,7 +16,8 @@
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "int", "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
                     {"uuid": "D1",  "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  }
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.0.1"}}}
             ]}
         },
         {
@@ -26,13 +28,14 @@
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "int", "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
                     {"uuid": "D2",  "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  }
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.0.2"}}}
             ]}
         },
         {
             "device_id": {"device_uuid": {"uuid": "D2"}}, "device_type": "network", "device_drivers": [0],
             "device_endpoints": [], "device_operational_status": 2, "device_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}},
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "interdomainservice.tfs-dom2"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "10010"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "D1",  "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  },
@@ -46,10 +49,14 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "5",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "DC1", "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  }
-                ]}}}
+                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "5",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "DC1", "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/border"  }
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.1.1"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.1.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[5]/settings", "resource_value": {"remote_router": "10.0.1.5"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[DC1]/settings", "resource_value": {"remote_router": "10.0.0.1"}}}
             ]}
         },
         {
@@ -58,10 +65,14 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "1",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "3",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "5",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"}
-                ]}}}
+                    {"uuid": "1",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "3",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "5",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.1.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[1]/settings", "resource_value": {"remote_router": "10.0.1.1"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[3]/settings", "resource_value": {"remote_router": "10.0.1.3"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[5]/settings", "resource_value": {"remote_router": "10.0.1.5"}}}
             ]}
         },
         {
@@ -70,9 +81,12 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "4",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"}
-                ]}}}
+                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "4",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.1.3"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.1.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[4]/settings", "resource_value": {"remote_router": "10.0.1.4"}}}
             ]}
         },
         {
@@ -81,10 +95,15 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "3",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "5",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "D2",  "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  }
-                ]}}}
+                    {"uuid": "3",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "5",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "D2",  "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/border"  }
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.1.4"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[3]/settings", "resource_value": {"remote_router": "10.0.1.3"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[5]/settings", "resource_value": {"remote_router": "10.0.1.5"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[D2]/settings", "resource_value": {"remote_router": "10.0.2.2"}}}
+
             ]}
         },
         {
@@ -93,22 +112,27 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "1",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "4",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"}
-                ]}}}
+                    {"uuid": "1",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"},
+                    {"uuid": "4",   "context_uuid": "admin", "topology_uuid": "D1", "type": "copper/internal"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.1.5"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[1]/settings", "resource_value": {"remote_router": "10.0.1.1"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.1.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[4]/settings", "resource_value": {"remote_router": "10.0.1.4"}}}
             ]}
         }
     ],
     "links": [
         {"link_id": {"link_uuid": {"uuid": "DC1/D1==R1@D1/DC1"}}, "link_endpoint_ids": [
             {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "D1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}},
-            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "DC1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
+            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "DC1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R1@D1/DC1==DC1/D1"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "DC1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}},
+            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "DC1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
             {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "D1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
         ]},
+
         {"link_id": {"link_uuid": {"uuid": "DC2/D2==D2/DC2"}}, "link_endpoint_ids": [
             {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "D2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}},
             {"device_id": {"device_uuid": {"uuid": "D2"}}, "endpoint_uuid": {"uuid": "DC2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
@@ -118,61 +142,61 @@
             {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "D2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R4@D1/D2==D2/D1"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "D2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}},
+            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "D2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
             {"device_id": {"device_uuid": {"uuid": "D2"}}, "endpoint_uuid": {"uuid": "D1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "D2/D1==R4@D1/D2"}}, "link_endpoint_ids": [
             {"device_id": {"device_uuid": {"uuid": "D2"}}, "endpoint_uuid": {"uuid": "D1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}},
-            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "D2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
+            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "D2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
 
         {"link_id": {"link_uuid": {"uuid": "R1@D1/2==R2@D1/1"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "2"}},
-            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "1"}}
+            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R1@D1/5==R5@D1/1"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "5"}},
-            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "1"}}
+            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "5"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R2@D1/1==R1@D1/2"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "1"}},
-            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "2"}}
+            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R2@D1/3==R3@D1/2"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "3"}},
-            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "2"}}
+            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R2@D1/5==R5@D1/2"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "5"}},
-            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "2"}}
+            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "5"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R3@D1/2==R2@D1/3"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "2"}},
-            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "3"}}
+            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R3@D1/4==R4@D1/3"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "4"}},
-            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "3"}}
+            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "4"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R4@D1/3==R3@D1/4"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "3"}},
-            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "4"}}
+            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R3@D1"}}, "endpoint_uuid": {"uuid": "4"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R4@D1/5==R5@D1/4"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "5"}},
-            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "4"}}
+            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "5"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "4"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R5@D1/1==R1@D1/5"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "1"}},
-            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "5"}}
+            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R1@D1"}}, "endpoint_uuid": {"uuid": "5"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R5@D1/2==R2@D1/5"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "2"}},
-            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "5"}}
+            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R2@D1"}}, "endpoint_uuid": {"uuid": "5"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R5@D1/4==R4@D1/5"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "4"}},
-            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "5"}}
+            {"device_id": {"device_uuid": {"uuid": "R5@D1"}}, "endpoint_uuid": {"uuid": "4"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}},
+            {"device_id": {"device_uuid": {"uuid": "R4@D1"}}, "endpoint_uuid": {"uuid": "5"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D1"}}}
         ]}
     ]
 }
diff --git a/src/tests/oeccpsc22/descriptors/domain2.json b/src/tests/oeccpsc22/descriptors/domain2.json
index e7a00f74e7cc14c9db6d7be6fa89ef538f9cfa34..6e282ca7aadc10d1a62e9c6d20db6be45dfbb352 100644
--- a/src/tests/oeccpsc22/descriptors/domain2.json
+++ b/src/tests/oeccpsc22/descriptors/domain2.json
@@ -4,6 +4,7 @@
     ],
     "topologies": [
         {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "admin"}}},
+        {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"   }}},
         {"topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "inter"}}}
     ],
     "devices": [
@@ -13,9 +14,12 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "2", "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "3", "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"}
-                ]}}}
+                    {"uuid": "2", "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/internal"},
+                    {"uuid": "3", "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/internal"}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.2.1"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.2.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[3]/settings", "resource_value": {"remote_router": "10.0.2.3"}}}
             ]}
         },
         {
@@ -24,10 +28,14 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "1",  "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "3",  "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "D1", "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  }
-                ]}}}
+                    {"uuid": "1",  "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/internal"},
+                    {"uuid": "3",  "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/internal"},
+                    {"uuid": "D1", "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/border"  }
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.2.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[1]/settings", "resource_value": {"remote_router": "10.0.2.1"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[3]/settings", "resource_value": {"remote_router": "10.0.2.3"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[D1]/settings", "resource_value": {"remote_router": "10.0.1.4"}}}
             ]}
         },
         {
@@ -36,37 +44,41 @@
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
-                    {"uuid": "1",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "admin", "type": "copper/internal"},
-                    {"uuid": "DC2", "context_uuid": "admin", "topology_uuid": "inter", "type": "copper/border"  }
-                ]}}}
+                    {"uuid": "1",   "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/internal"},
+                    {"uuid": "2",   "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/internal"},
+                    {"uuid": "DC2", "context_uuid": "admin", "topology_uuid": "D2", "type": "copper/border"  }
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"router_id": "10.0.2.3"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[1]/settings", "resource_value": {"remote_router": "10.0.2.1"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.2.2"}}},
+                {"action": 1, "custom": {"resource_key": "/endpoints/endpoint[DC2]/settings", "resource_value": {"remote_router": "10.0.0.2"}}}
             ]}
         }
     ],
     "links": [
         {"link_id": {"link_uuid": {"uuid": "R1@D2/2==R2@D2/1"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "2"}},
-            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "1"}}
+            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}},
+            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R1@D2/3==R3@D2/1"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "3"}},
-            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "1"}}
+            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}},
+            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R2@D2/1==R1@D2/2"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "1"}},
-            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "2"}}
+            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}},
+            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R2@D2/3==R3@D2/2"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "3"}},
-            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "2"}}
+            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}},
+            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R3@D2/1==R1@D2/3"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "1"}},
-            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "3"}}
+            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "1"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}},
+            {"device_id": {"device_uuid": {"uuid": "R1@D2"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}}
         ]},
         {"link_id": {"link_uuid": {"uuid": "R3@D2/2==R2@D2/3"}}, "link_endpoint_ids": [
-            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "2"}},
-            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "3"}}
+            {"device_id": {"device_uuid": {"uuid": "R3@D2"}}, "endpoint_uuid": {"uuid": "2"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}},
+            {"device_id": {"device_uuid": {"uuid": "R2@D2"}}, "endpoint_uuid": {"uuid": "3"}, "topology_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "topology_uuid": {"uuid": "D2"}}}
         ]}
     ]
 }
diff --git a/src/tests/oeccpsc22/descriptors/inter-domain-service.json b/src/tests/oeccpsc22/descriptors/inter-domain-service.json
deleted file mode 100644
index 4b53c433aba16845b703b72a3fe4ef1f9e54c0f2..0000000000000000000000000000000000000000
--- a/src/tests/oeccpsc22/descriptors/inter-domain-service.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-    "services": [
-        {
-            "service_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "service_uuid": {"uuid": "idc-l2-svc"}},
-            "service_type": 2,
-            "service_status": {"service_status": 1},
-            "service_endpoint_ids": [
-                {"device_id":{"device_uuid":{"uuid":"DC1"}},"endpoint_uuid":{"uuid":"int"}},
-                {"device_id":{"device_uuid":{"uuid":"DC2"}},"endpoint_uuid":{"uuid":"int"}}
-            ],
-            "service_constraints": [
-                {"sla_capacity": {"capacity_gbps": 10.0}},
-                {"sla_latency": {"e2e_latency_ms": 15.2}}
-            ],
-            "service_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"mtu": 1512, "vlan_id": 300}}},
-                {"action": 1, "custom": {"resource_key": "/device[R1@D1]/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.0.2"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R1@D1]/endpoint[5]/settings", "resource_value": {"remote_router": "10.0.0.5"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R2@D1]/endpoint[1]/settings", "resource_value": {"remote_router": "10.0.0.1"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R2@D1]/endpoint[3]/settings", "resource_value": {"remote_router": "10.0.0.3"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R2@D1]/endpoint[5]/settings", "resource_value": {"remote_router": "10.0.0.5"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R3@D1]/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.0.2"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R3@D1]/endpoint[4]/settings", "resource_value": {"remote_router": "10.0.0.4"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R4@D1]/endpoint[3]/settings", "resource_value": {"remote_router": "10.0.0.3"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R4@D1]/endpoint[5]/settings", "resource_value": {"remote_router": "10.0.0.5"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R5@D1]/endpoint[1]/settings", "resource_value": {"remote_router": "10.0.0.1"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R5@D1]/endpoint[2]/settings", "resource_value": {"remote_router": "10.0.0.2"}}},
-                {"action": 1, "custom": {"resource_key": "/device[R5@D1]/endpoint[4]/settings", "resource_value": {"remote_router": "10.0.0.4"}}}
-            ]}
-        }
-    ]
-}
diff --git a/src/tests/oeccpsc22/descriptors/inter-domain-slice.json b/src/tests/oeccpsc22/descriptors/inter-domain-slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..3651f569c8316be8ad7438d4e41c96021b742443
--- /dev/null
+++ b/src/tests/oeccpsc22/descriptors/inter-domain-slice.json
@@ -0,0 +1,19 @@
+{
+    "slices": [
+        {
+            "slice_id": {"context_id": {"context_uuid": {"uuid": "admin"}}, "slice_uuid": {"uuid": "idc-l2-slice"}},
+            "slice_status": {"slice_status": 1},
+            "slice_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DC1"}}, "endpoint_uuid": {"uuid": "int"}},
+                {"device_id": {"device_uuid": {"uuid": "DC2"}}, "endpoint_uuid": {"uuid": "int"}}
+            ],
+            "slice_constraints": [
+                {"sla_capacity": {"capacity_gbps": 10.0}},
+                {"sla_latency": {"e2e_latency_ms": 15.2}}
+            ],
+            "slice_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "/settings", "resource_value": {"mtu": 1512, "vlan_id": 300}}}
+            ]}
+        }
+    ]
+}
diff --git a/src/tests/oeccpsc22/dump_logs.sh b/src/tests/oeccpsc22/dump_logs.sh
index 3a2e51a56b9346a254995d935fd45d8b5e7a1396..db96640b24d1e311b229fd86290ad0732b568b42 100755
--- a/src/tests/oeccpsc22/dump_logs.sh
+++ b/src/tests/oeccpsc22/dump_logs.sh
@@ -17,29 +17,27 @@
 rm -rf tmp/exec
 
 echo "Collecting logs for Domain 1..."
-mkdir -p tmp/exec/dom1
-kubectl --namespace tfs-dom1 logs deployments/contextservice server > tmp/exec/dom1/context.log
-kubectl --namespace tfs-dom1 logs deployments/deviceservice server > tmp/exec/dom1/device.log
-kubectl --namespace tfs-dom1 logs deployments/serviceservice server > tmp/exec/dom1/service.log
-kubectl --namespace tfs-dom1 logs deployments/pathcompservice frontend > tmp/exec/dom1/pathcomp-frontend.log
-kubectl --namespace tfs-dom1 logs deployments/pathcompservice backend > tmp/exec/dom1/pathcomp-backend.log
-kubectl --namespace tfs-dom1 logs deployments/sliceservice server > tmp/exec/dom1/slice.log
-kubectl --namespace tfs-dom1 logs deployment/computeservice server > tmp/exec/dom1/compute.log
-kubectl --namespace tfs-dom1 logs deployment/interdomainservice server > tmp/exec/dom1/interdomain.log
-kubectl --namespace tfs-dom1 logs deployment/monitoringservice server > tmp/exec/dom1/monitoring.log
+mkdir -p tmp/tfs-dom1/exec
+kubectl --namespace tfs-dom1 logs deployments/contextservice server > tmp/tfs-dom1/exec/context.log
+kubectl --namespace tfs-dom1 logs deployments/deviceservice server > tmp/tfs-dom1/exec/device.log
+kubectl --namespace tfs-dom1 logs deployments/serviceservice server > tmp/tfs-dom1/exec/service.log
+kubectl --namespace tfs-dom1 logs deployments/pathcompservice frontend > tmp/tfs-dom1/exec/pathcomp-frontend.log
+kubectl --namespace tfs-dom1 logs deployments/pathcompservice backend > tmp/tfs-dom1/exec/pathcomp-backend.log
+kubectl --namespace tfs-dom1 logs deployments/sliceservice server > tmp/tfs-dom1/exec/slice.log
+kubectl --namespace tfs-dom1 logs deployment/interdomainservice server > tmp/tfs-dom1/exec/interdomain.log
+kubectl --namespace tfs-dom1 logs deployment/webuiservice server > tmp/tfs-dom1/exec/webui.log
 printf "\n"
 
 echo "Collecting logs for Domain 2..."
-mkdir -p tmp/exec/dom2
-kubectl --namespace tfs-dom2 logs deployments/contextservice server > tmp/exec/dom2/context.log
-kubectl --namespace tfs-dom2 logs deployments/deviceservice server > tmp/exec/dom2/device.log
-kubectl --namespace tfs-dom2 logs deployments/serviceservice server > tmp/exec/dom2/service.log
-kubectl --namespace tfs-dom2 logs deployments/pathcompservice frontend > tmp/exec/dom2/pathcomp-frontend.log
-kubectl --namespace tfs-dom2 logs deployments/pathcompservice backend > tmp/exec/dom2/pathcomp-backend.log
-kubectl --namespace tfs-dom2 logs deployments/sliceservice server > tmp/exec/dom2/slice.log
-kubectl --namespace tfs-dom2 logs deployment/computeservice server > tmp/exec/dom2/compute.log
-kubectl --namespace tfs-dom2 logs deployment/interdomainservice server > tmp/exec/dom2/interdomain.log
-kubectl --namespace tfs-dom2 logs deployment/monitoringservice server > tmp/exec/dom2/monitoring.log
+mkdir -p tmp/tfs-dom2/exec
+kubectl --namespace tfs-dom2 logs deployments/contextservice server > tmp/tfs-dom2/exec/context.log
+kubectl --namespace tfs-dom2 logs deployments/deviceservice server > tmp/tfs-dom2/exec/device.log
+kubectl --namespace tfs-dom2 logs deployments/serviceservice server > tmp/tfs-dom2/exec/service.log
+kubectl --namespace tfs-dom2 logs deployments/pathcompservice frontend > tmp/tfs-dom2/exec/pathcomp-frontend.log
+kubectl --namespace tfs-dom2 logs deployments/pathcompservice backend > tmp/tfs-dom2/exec/pathcomp-backend.log
+kubectl --namespace tfs-dom2 logs deployments/sliceservice server > tmp/tfs-dom2/exec/slice.log
+kubectl --namespace tfs-dom2 logs deployment/interdomainservice server > tmp/tfs-dom2/exec/interdomain.log
+kubectl --namespace tfs-dom2 logs deployment/webuiservice server > tmp/tfs-dom2/exec/webui.log
 printf "\n"
 
 echo "Done!"
diff --git a/src/tests/oeccpsc22/expose_interdomain_dom2.sh b/src/tests/oeccpsc22/expose_interdomain_dom2.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c4ab728fe9c1de32e12578fde4e3ce3329409f6b
--- /dev/null
+++ b/src/tests/oeccpsc22/expose_interdomain_dom2.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#     http://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.
+
+PATCH='{"data": {"10010": "tfs-dom2/interdomainservice:10010"}}'
+kubectl patch configmap nginx-ingress-tcp-microk8s-conf-dom2 --namespace ingress --patch "${PATCH}"
+
+CONTAINER='{"name": "nginx-ingress-microk8s", "ports": [{"containerPort": 10010, "hostPort": 10010, "protocol": "TCP"}]}'
+PATCH='{"spec": {"template": {"spec": {"containers": ['${CONTAINER}']}}}}'
+kubectl patch daemonset nginx-ingress-microk8s-controller-dom2 --namespace ingress --patch "${PATCH}"
diff --git a/src/tests/oeccpsc22/expose-services-dom1.yaml b/src/tests/oeccpsc22/old/expose-services-dom1.yaml
similarity index 90%
rename from src/tests/oeccpsc22/expose-services-dom1.yaml
rename to src/tests/oeccpsc22/old/expose-services-dom1.yaml
index ebfb38fc4781240887fa52163224607da661b952..f7eab1372793290f607422f167e06a85c0026724 100644
--- a/src/tests/oeccpsc22/expose-services-dom1.yaml
+++ b/src/tests/oeccpsc22/old/expose-services-dom1.yaml
@@ -12,17 +12,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: Service
-metadata:
-  name: remote-teraflow
-spec:
-  type: ExternalName
-  externalName: interdomainservice.dom2.svc.cluster.local
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 10010
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: remote-teraflow
+#spec:
+#  type: ExternalName
+#  externalName: interdomainservice.dom2.svc.cluster.local
+#  ports:
+#  - name: grpc
+#    protocol: TCP
+#    port: 10010
 #---
 #apiVersion: v1
 #kind: Service
diff --git a/src/tests/oeccpsc22/expose-services-dom2.yaml b/src/tests/oeccpsc22/old/expose-services-dom2.yaml
similarity index 90%
rename from src/tests/oeccpsc22/expose-services-dom2.yaml
rename to src/tests/oeccpsc22/old/expose-services-dom2.yaml
index cf04f3f5eb4b029cc4cb03e41df9c8ced23d92f8..3ef4fd8795e76504be001dab5bc562a4edf92df2 100644
--- a/src/tests/oeccpsc22/expose-services-dom2.yaml
+++ b/src/tests/oeccpsc22/old/expose-services-dom2.yaml
@@ -12,17 +12,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-apiVersion: v1
-kind: Service
-metadata:
-  name: remote-teraflow
-spec:
-  type: ExternalName
-  externalName: interdomainservice.dom1.svc.cluster.local
-  ports:
-  - name: grpc
-    protocol: TCP
-    port: 10010
+#apiVersion: v1
+#kind: Service
+#metadata:
+#  name: remote-teraflow
+#spec:
+#  type: ExternalName
+#  externalName: interdomainservice.dom1.svc.cluster.local
+#  ports:
+#  - name: grpc
+#    protocol: TCP
+#    port: 10010
 #---
 #apiVersion: v1
 #kind: Service
diff --git a/src/tests/oeccpsc22/tests/Objects_Domain_1.py b/src/tests/oeccpsc22/tests/Objects_Domain_1.py
index 2f35aa76eea8f7adfc89011cbc4822daecbd1d14..19c9324d232ef927ec7ab6ce8419eb5cfa9743d4 100644
--- a/src/tests/oeccpsc22/tests/Objects_Domain_1.py
+++ b/src/tests/oeccpsc22/tests/Objects_Domain_1.py
@@ -16,6 +16,7 @@ from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
 from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled, json_device_id)
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from .Tools import get_link_uuid, json_endpoint_ids
@@ -32,12 +33,24 @@ D1_TOPOLOGY    = json_topology(DEFAULT_TOPOLOGY_NAME, context_id=D1_CONTEXT_ID)
 # Assume all devices have the same architecture of endpoints
 D1_DEVICE_ENDPOINT_DEFS = [
     # Trunk ports
-    ('1/1', '25Gbps', []), ('1/2', '25Gbps', []), ('1/3', '25Gbps', []), ('1/4', '25Gbps', []),
+    json_endpoint_descriptor('1/1', '25Gbps'),
+    json_endpoint_descriptor('1/2', '25Gbps'),
+    json_endpoint_descriptor('1/3', '25Gbps'),
+    json_endpoint_descriptor('1/4', '25Gbps'),
+
     # Inter-domain ports
-    ('2/1', '100Gbps', []), ('2/2', '100Gbps', []),
+    json_endpoint_descriptor('2/1', '100Gbps'),
+    json_endpoint_descriptor('2/2', '100Gbps'),
+
     # Access ports
-    ('3/1', '10Gbps', []), ('3/2', '10Gbps', []), ('3/3', '10Gbps', []), ('3/4', '10Gbps', []),
-    ('3/5', '10Gbps', []), ('3/6', '10Gbps', []), ('3/7', '10Gbps', []), ('3/8', '10Gbps', []),
+    json_endpoint_descriptor('3/1', '10Gbps'),
+    json_endpoint_descriptor('3/2', '10Gbps'),
+    json_endpoint_descriptor('3/3', '10Gbps'),
+    json_endpoint_descriptor('3/4', '10Gbps'),
+    json_endpoint_descriptor('3/5', '10Gbps'),
+    json_endpoint_descriptor('3/6', '10Gbps'),
+    json_endpoint_descriptor('3/7', '10Gbps'),
+    json_endpoint_descriptor('3/8', '10Gbps'),
 ]
 
 D1_DEVICE_D1R1_UUID          = 'R1@D1'
diff --git a/src/tests/oeccpsc22/tests/Objects_Domain_2.py b/src/tests/oeccpsc22/tests/Objects_Domain_2.py
index 0e5065c3b6ec3e1d44a16f0ee8231aca28e2c2d1..7235290b3823eb6f99b7e8246071623381612a40 100644
--- a/src/tests/oeccpsc22/tests/Objects_Domain_2.py
+++ b/src/tests/oeccpsc22/tests/Objects_Domain_2.py
@@ -16,6 +16,7 @@ from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME
 from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled, json_device_id)
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from .Tools import get_link_uuid, json_endpoint_ids
@@ -32,12 +33,24 @@ D2_TOPOLOGY    = json_topology(DEFAULT_TOPOLOGY_NAME, context_id=D2_CONTEXT_ID)
 # Assume all devices have the same architecture of endpoints
 D2_DEVICE_ENDPOINT_DEFS = [
     # Trunk ports
-    ('1/1', '25Gbps', []), ('1/2', '25Gbps', []), ('1/3', '25Gbps', []), ('1/4', '25Gbps', []),
+    json_endpoint_descriptor('1/1', '25Gbps'),
+    json_endpoint_descriptor('1/2', '25Gbps'),
+    json_endpoint_descriptor('1/3', '25Gbps'),
+    json_endpoint_descriptor('1/4', '25Gbps'),
+
     # Inter-domain ports
-    ('2/1', '100Gbps', []), ('2/2', '100Gbps', []),
+    json_endpoint_descriptor('2/1', '100Gbps'),
+    json_endpoint_descriptor('2/2', '100Gbps'),
+
     # Access ports
-    ('3/1', '10Gbps', []), ('3/2', '10Gbps', []), ('3/3', '10Gbps', []), ('3/4', '10Gbps', []),
-    ('3/5', '10Gbps', []), ('3/6', '10Gbps', []), ('3/7', '10Gbps', []), ('3/8', '10Gbps', []),
+    json_endpoint_descriptor('3/1', '10Gbps'),
+    json_endpoint_descriptor('3/2', '10Gbps'),
+    json_endpoint_descriptor('3/3', '10Gbps'),
+    json_endpoint_descriptor('3/4', '10Gbps'),
+    json_endpoint_descriptor('3/5', '10Gbps'),
+    json_endpoint_descriptor('3/6', '10Gbps'),
+    json_endpoint_descriptor('3/7', '10Gbps'),
+    json_endpoint_descriptor('3/8', '10Gbps'),
 ]
 
 D2_DEVICE_D2R1_UUID          = 'R1@D2'
diff --git a/src/tests/oeccpsc22/tests/Tools.py b/src/tests/oeccpsc22/tests/Tools.py
index 30333b6f47b31bda76626545b78aaa3c96bff7c0..483090f8b8c0e1524bbdf98a5f3208b485c9ddaa 100644
--- a/src/tests/oeccpsc22/tests/Tools.py
+++ b/src/tests/oeccpsc22/tests/Tools.py
@@ -12,14 +12,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Dict, List, Tuple
+from typing import Dict, List
 from common.tools.object_factory.EndPoint import json_endpoint_id
 
-def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Dict]):
     return {
         device_id['device_uuid']['uuid']: {
-            ep_uuid: json_endpoint_id(device_id, ep_uuid, topology_id=None)
-            for ep_uuid, _, _ in endpoint_descriptors
+            ep_data['uuid']: json_endpoint_id(device_id, ep_data['uuid'], topology_id=None)
+            for ep_data in endpoint_descriptors
         }
     }
 
diff --git a/src/tests/ofc22/deploy_specs.sh b/src/tests/ofc22/deploy_specs.sh
index 08a8dfaad5cdb0cb28fafb618f9b932e630bd114..0c1f57387ee66ed9809695d14a9a8dad7ccda4c5 100755
--- a/src/tests/ofc22/deploy_specs.sh
+++ b/src/tests/ofc22/deploy_specs.sh
@@ -20,7 +20,24 @@
 export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device automation monitoring pathcomp service slice compute webui"
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice compute webui"
+
+# Uncomment to activate Monitoring
+export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+export TFS_COMPONENTS="${TFS_COMPONENTS} automation"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
@@ -31,6 +48,12 @@ export TFS_K8S_NAMESPACE="tfs"
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
 
+# Uncomment to monitor performance of components
+export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
@@ -43,6 +66,12 @@ export TFS_SKIP_BUILD=""
 # Set the namespace where CockroackDB will be deployed.
 export CRDB_NAMESPACE="crdb"
 
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
 # Set the database username to be used by Context.
 export CRDB_USERNAME="tfs"
 
@@ -68,6 +97,12 @@ export CRDB_REDEPLOY=""
 # Set the namespace where NATS will be deployed.
 export NATS_NAMESPACE="nats"
 
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4222"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8222"
+
 # Disable flag for re-deploying NATS from scratch.
 export NATS_REDEPLOY=""
 
@@ -77,6 +112,15 @@ export NATS_REDEPLOY=""
 # Set the namespace where QuestDB will be deployed.
 export QDB_NAMESPACE="qdb"
 
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8812"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9009"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9000"
+
 # Set the database username to be used for QuestDB.
 export QDB_USERNAME="admin"
 
@@ -86,8 +130,20 @@ export QDB_PASSWORD="quest"
 # Set the table name to be used by Monitoring for KPIs.
 export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
 
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
 # Disable flag for dropping tables if they exist.
 export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/ofc22/descriptors_emulated.json b/src/tests/ofc22/descriptors_emulated.json
index b68b9636d58d9c80c4774e4ade557f83796ac5b5..e0ac8b3ecee916fa1c7e57adcd5d32f0b180924b 100644
--- a/src/tests/ofc22/descriptors_emulated.json
+++ b/src/tests/ofc22/descriptors_emulated.json
@@ -8,55 +8,63 @@
     "devices": [
         {
             "device_id": {"device_uuid": {"uuid": "R1-EMU"}}, "device_type": "emu-packet-router",
-            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
             "device_config": {"config_rules": [
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "13/0/0", "type": "optical", "sample_types": []},
                     {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/0/0]/settings", "resource_value": {"name": "13/0/0", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/1/2]/settings", "resource_value": {"name": "13/1/2", "enabled": true}}}
             ]}
         },
         {
             "device_id": {"device_uuid": {"uuid": "R2-EMU"}}, "device_type": "emu-packet-router",
-            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
             "device_config": {"config_rules": [
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "13/0/0", "type": "optical", "sample_types": []},
                     {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/0/0]/settings", "resource_value": {"name": "13/0/0", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/1/2]/settings", "resource_value": {"name": "13/1/2", "enabled": true}}}
             ]}
         },
         {
             "device_id": {"device_uuid": {"uuid": "R3-EMU"}}, "device_type": "emu-packet-router",
-            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
             "device_config": {"config_rules": [
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "13/0/0", "type": "optical", "sample_types": []},
                     {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/0/0]/settings", "resource_value": {"name": "13/0/0", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/1/2]/settings", "resource_value": {"name": "13/1/2", "enabled": true}}}
             ]}
         },
         {
             "device_id": {"device_uuid": {"uuid": "R4-EMU"}}, "device_type": "emu-packet-router",
-            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
             "device_config": {"config_rules": [
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
                     {"uuid": "13/0/0", "type": "optical", "sample_types": []},
                     {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/0/0]/settings", "resource_value": {"name": "13/0/0", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/1/2]/settings", "resource_value": {"name": "13/1/2", "enabled": true}}}
             ]}
         },
         {
             "device_id": {"device_uuid": {"uuid": "O1-OLS"}}, "device_type": "emu-open-line-system",
-            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_operational_status": 2, "device_drivers": [0], "device_endpoints": [],
             "device_config": {"config_rules": [
                 {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
@@ -65,7 +73,11 @@
                     {"uuid": "eb287d83-f05e-53ec-ab5a-adf6bd2b5418", "type": "optical", "sample_types": []},
                     {"uuid": "0ef74f99-1acc-57bd-ab9d-4b958b06c513", "type": "optical", "sample_types": []},
                     {"uuid": "50296d99-58cc-5ce7-82f5-fc8ee4eec2ec", "type": "optical", "sample_types": []}
-                ]}}}
+                ]}}},
+                {"action": 1, "custom": {"resource_key": "/interface[aade6001-f00b-5e2f-a357-6a0a9d3de870]/settings", "resource_value": {"name": "aade6001-f00b-5e2f-a357-6a0a9d3de870", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[eb287d83-f05e-53ec-ab5a-adf6bd2b5418]/settings", "resource_value": {"name": "eb287d83-f05e-53ec-ab5a-adf6bd2b5418", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[0ef74f99-1acc-57bd-ab9d-4b958b06c513]/settings", "resource_value": {"name": "0ef74f99-1acc-57bd-ab9d-4b958b06c513", "enabled": true}}},
+                {"action": 1, "custom": {"resource_key": "/interface[50296d99-58cc-5ce7-82f5-fc8ee4eec2ec]/settings", "resource_value": {"name": "50296d99-58cc-5ce7-82f5-fc8ee4eec2ec", "enabled": true}}}
             ]}
         }
     ],
diff --git a/src/tests/ofc22/tests/ObjectsXr.py b/src/tests/ofc22/tests/ObjectsXr.py
index 9871a50b8181b53cfbb767be76a1a0978eaf1d27..89c6cb7ce56644332af046606b6b5774afeb4e42 100644
--- a/src/tests/ofc22/tests/ObjectsXr.py
+++ b/src/tests/ofc22/tests/ObjectsXr.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
     json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled)
-from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
+from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_descriptor, json_endpoint_id
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
@@ -63,16 +63,17 @@ DEVICE_X1_PORT     = 443
 
 #USE_REAL_DEVICES = False     # Uncomment to force to use emulated devices
 
-def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Dict]):
     return [
-        json_endpoint_id(device_id, ep_uuid, topology_id=None)
-        for ep_uuid, _, _ in endpoint_descriptors
+        json_endpoint_id(device_id, ep_data['uuid'], topology_id=None)
+        for ep_data in endpoint_descriptors
     ]
 
-def json_endpoints(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoints(device_id : Dict, endpoint_descriptors : List[Dict]):
     return [
-        json_endpoint(device_id, ep_uuid, ep_type, topology_id=None, kpi_sample_types=ep_sample_types)
-        for ep_uuid, ep_type, ep_sample_types in endpoint_descriptors
+        json_endpoint(
+            device_id, ep_data['uuid'], ep_data['type'], topology_id=None, kpi_sample_types=ep_data['sample_types'])
+        for ep_data in endpoint_descriptors
     ]
 
 def get_link_uuid(a_device_id : Dict, a_endpoint_id : Dict, z_device_id : Dict, z_endpoint_id : Dict) -> str:
@@ -88,7 +89,8 @@ if not USE_REAL_DEVICES:
 
 DEVICE_R1_UUID          = 'R1-EMU'
 DEVICE_R1_TIMEOUT       = 120
-DEVICE_R1_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R1_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R1_ID            = json_device_id(DEVICE_R1_UUID)
 #DEVICE_R1_ENDPOINTS     = json_endpoints(DEVICE_R1_ID, DEVICE_R1_ENDPOINT_DEFS)
 DEVICE_R1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R1_ID, DEVICE_R1_ENDPOINT_DEFS)
@@ -103,7 +105,8 @@ DEVICE_R1_CONNECT_RULES = json_device_connect_rules(DEVICE_R1_ADDRESS, DEVICE_R1
 
 
 DEVICE_R2_UUID          = 'R2-EMU'
-DEVICE_R2_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R2_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R2_ID            = json_device_id(DEVICE_R2_UUID)
 #DEVICE_R2_ENDPOINTS     = json_endpoints(DEVICE_R2_ID, DEVICE_R2_ENDPOINT_DEFS)
 DEVICE_R2_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R2_ID, DEVICE_R2_ENDPOINT_DEFS)
@@ -115,7 +118,8 @@ DEVICE_R2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R2_ENDPOINT_
 
 DEVICE_R3_UUID          = 'R3-EMU'
 DEVICE_R3_TIMEOUT       = 120
-DEVICE_R3_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R3_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R3_ID            = json_device_id(DEVICE_R3_UUID)
 #DEVICE_R3_ENDPOINTS     = json_endpoints(DEVICE_R3_ID, DEVICE_R3_ENDPOINT_DEFS)
 DEVICE_R3_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R3_ID, DEVICE_R3_ENDPOINT_DEFS)
@@ -130,7 +134,8 @@ DEVICE_R3_CONNECT_RULES = json_device_connect_rules(DEVICE_R3_ADDRESS, DEVICE_R3
 
 
 DEVICE_R4_UUID          = 'R4-EMU'
-DEVICE_R4_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R4_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R4_ID            = json_device_id(DEVICE_R4_UUID)
 #DEVICE_R4_ENDPOINTS     = json_endpoints(DEVICE_R4_ID, DEVICE_R4_ENDPOINT_DEFS)
 DEVICE_R4_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R4_ID, DEVICE_R4_ENDPOINT_DEFS)
@@ -143,12 +148,12 @@ DEVICE_R4_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R4_ENDPOINT_
 DEVICE_X1_UUID          = 'X1-XR-CONSTELLATION'
 DEVICE_X1_TIMEOUT       = 120
 DEVICE_X1_ENDPOINT_DEFS = [
-    ('XR HUB 1|XR-T1', 'optical', []),
-    ('XR HUB 1|XR-T2', 'optical', []),
-    ('XR HUB 1|XR-T3', 'optical', []),
-    ('XR HUB 1|XR-T4', 'optical', []),
-    ('XR LEAF 1|XR-T1', 'optical', []),
-    ('XR LEAF 2|XR-T1', 'optical', []),
+    json_endpoint_descriptor('XR HUB 1|XR-T1', 'optical'),
+    json_endpoint_descriptor('XR HUB 1|XR-T2', 'optical'),
+    json_endpoint_descriptor('XR HUB 1|XR-T3', 'optical'),
+    json_endpoint_descriptor('XR HUB 1|XR-T4', 'optical'),
+    json_endpoint_descriptor('XR LEAF 1|XR-T1', 'optical'),
+    json_endpoint_descriptor('XR LEAF 2|XR-T1', 'optical'),
 ]
 DEVICE_X1_ID            = json_device_id(DEVICE_X1_UUID)
 DEVICE_X1               = json_device_tapi_disabled(DEVICE_X1_UUID)
diff --git a/src/tests/ofc22/tests/test_functional_bootstrap.py b/src/tests/ofc22/tests/test_functional_bootstrap.py
index ca1882aaa22ff1ac20d0b1927199a6594a6c441a..f149604929bfa305377545b2fdab50751dded7a1 100644
--- a/src/tests/ofc22/tests/test_functional_bootstrap.py
+++ b/src/tests/ofc22/tests/test_functional_bootstrap.py
@@ -14,7 +14,7 @@
 
 import logging, time
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import ContextId, Empty
+from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty
 from common.proto.monitoring_pb2 import KpiDescriptorList
 from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario
 from common.tools.object_factory.Context import json_context_id
@@ -46,6 +46,27 @@ def test_scenario_bootstrap(
     assert len(response.service_ids) == 0
     assert len(response.slice_ids) == 0
 
+def test_scenario_devices_enabled(
+    context_client : ContextClient,         # pylint: disable=redefined-outer-name
+) -> None:
+    """
+    This test validates that the devices are enabled.
+    """
+    DEVICE_OP_STATUS_ENABLED = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
+
+    num_devices = -1
+    num_devices_enabled, num_retry = 0, 0
+    while (num_devices != num_devices_enabled) and (num_retry < 10):
+        time.sleep(1.0)
+        response = context_client.ListDevices(Empty())
+        num_devices = len(response.devices)
+        num_devices_enabled = 0
+        for device in response.devices:
+            if device.device_operational_status != DEVICE_OP_STATUS_ENABLED: continue
+            num_devices_enabled += 1
+        LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices))
+        num_retry += 1
+    assert num_devices_enabled == num_devices
 
 def test_scenario_kpis_created(
     context_client : ContextClient,         # pylint: disable=redefined-outer-name
@@ -67,7 +88,7 @@ def test_scenario_kpis_created(
     LOGGER.info('Num KPIs expected: {:d}'.format(num_kpis_expected))
 
     num_kpis_created, num_retry = 0, 0
-    while (num_kpis_created != num_kpis_expected) and (num_retry < 5):
+    while (num_kpis_created != num_kpis_expected) and (num_retry < 10):
         response: KpiDescriptorList = monitoring_client.GetKpiDescriptorList(Empty())
         num_kpis_created = len(response.kpi_descriptor_list)
         LOGGER.info('Num KPIs created: {:d}'.format(num_kpis_created))
diff --git a/src/tests/ofc23/deploy_specs_child.sh b/src/tests/ofc23/deploy_specs_child.sh
index 4d2b3502294925d82f675263fd6bddea62ec181a..94c0d4de00c56c8b9b435eb734e112c4f34ab25e 100755
--- a/src/tests/ofc23/deploy_specs_child.sh
+++ b/src/tests/ofc23/deploy_specs_child.sh
@@ -20,8 +20,22 @@
 export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-#automation monitoring load_generator
-export TFS_COMPONENTS="context device pathcomp service slice compute webui"
+export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
@@ -32,6 +46,12 @@ export TFS_K8S_NAMESPACE="tfs-child"
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="ofc23/tfs-ingress-child.yaml"
 
+# Uncomment to monitor performance of components
+export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
@@ -116,3 +136,12 @@ export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/ofc23/deploy_specs_parent.sh b/src/tests/ofc23/deploy_specs_parent.sh
index 808f4e28734be71e6eb7fb2aced39211fd8e7f24..6bd4dc33b324fb7a301c13695901c28d2375d2d7 100755
--- a/src/tests/ofc23/deploy_specs_parent.sh
+++ b/src/tests/ofc23/deploy_specs_parent.sh
@@ -20,8 +20,22 @@
 export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-#automation monitoring load_generator
-export TFS_COMPONENTS="context device pathcomp service slice compute webui"
+export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
@@ -32,6 +46,12 @@ export TFS_K8S_NAMESPACE="tfs-parent"
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="ofc23/tfs-ingress-parent.yaml"
 
+# Uncomment to monitor performance of components
+export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
@@ -116,3 +136,12 @@ export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/ofc23/deploy_specs_sligrp.sh b/src/tests/ofc23/deploy_specs_sligrp.sh
index 90bea4567bd35d845abf943670f8aa33070dff57..0422c7b103f0fd07cfa9e3b0ea69dcb9a4f7cd05 100755
--- a/src/tests/ofc23/deploy_specs_sligrp.sh
+++ b/src/tests/ofc23/deploy_specs_sligrp.sh
@@ -20,9 +20,23 @@
 export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-#automation monitoring load_generator
 export TFS_COMPONENTS="context device pathcomp service slice webui load_generator"
 
+# Uncomment to activate Monitoring
+export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
+
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
 
@@ -32,6 +46,12 @@ export TFS_K8S_NAMESPACE="tfs-sligrp"
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
 
+# Uncomment to monitor performance of components
+export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
 # Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
@@ -116,3 +136,12 @@ export QDB_DROP_TABLES_IF_EXIST="YES"
 
 # Disable flag for re-deploying QuestDB from scratch.
 export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/p4/tests/Objects.py b/src/tests/p4/tests/Objects.py
index 9a9b230170fb492e94bac7cb19172f623daa3394..fcf618308a1e56a6e9e68205bdc0566408e26b65 100644
--- a/src/tests/p4/tests/Objects.py
+++ b/src/tests/p4/tests/Objects.py
@@ -25,6 +25,7 @@ from common.tools.object_factory.Service import (
 from common.tools.object_factory.ConfigRule import (
     json_config_rule_set, json_config_rule_delete)
 from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_ids, json_endpoints, json_endpoint_id
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
@@ -68,7 +69,10 @@ DEVICE_SW1_SW_VER           = 'Stratum'
 DEVICE_SW1_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW1_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW1_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', []), ('3', 'port', []), ('4', 'port', [])]
+DEVICE_SW1_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port'),
+                               json_endpoint_descriptor('3', 'port'),
+                               json_endpoint_descriptor('4', 'port')]
 DEVICE_SW1_ENDPOINTS        = json_endpoints(DEVICE_SW1_ID, DEVICE_SW1_ENDPOINT_DEFS)
 DEVICE_SW1_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW1_ID, DEVICE_SW1_ENDPOINT_DEFS)
 ENDPOINT_ID_SW1_1           = DEVICE_SW1_ENDPOINTS[0]['endpoint_id']
@@ -107,7 +111,8 @@ DEVICE_SW2_SW_VER           = 'Stratum'
 DEVICE_SW2_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW2_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW2_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW2_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW2_ENDPOINTS        = json_endpoints(DEVICE_SW2_ID, DEVICE_SW2_ENDPOINT_DEFS)
 DEVICE_SW2_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW2_ID, DEVICE_SW2_ENDPOINT_DEFS)
 ENDPOINT_ID_SW2_1           = DEVICE_SW2_ENDPOINTS[0]['endpoint_id']
@@ -144,7 +149,8 @@ DEVICE_SW3_SW_VER           = 'Stratum'
 DEVICE_SW3_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW3_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW3_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW3_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW3_ENDPOINTS        = json_endpoints(DEVICE_SW3_ID, DEVICE_SW3_ENDPOINT_DEFS)
 DEVICE_SW3_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW3_ID, DEVICE_SW3_ENDPOINT_DEFS)
 ENDPOINT_ID_SW3_1           = DEVICE_SW3_ENDPOINTS[0]['endpoint_id']
@@ -181,7 +187,8 @@ DEVICE_SW4_SW_VER           = 'Stratum'
 DEVICE_SW4_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW4_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW4_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW4_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW4_ENDPOINTS        = json_endpoints(DEVICE_SW4_ID, DEVICE_SW4_ENDPOINT_DEFS)
 DEVICE_SW4_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW4_ID, DEVICE_SW4_ENDPOINT_DEFS)
 ENDPOINT_ID_SW4_1           = DEVICE_SW4_ENDPOINTS[0]['endpoint_id']
@@ -218,7 +225,8 @@ DEVICE_SW5_SW_VER           = 'Stratum'
 DEVICE_SW5_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW5_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW5_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW5_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW5_ENDPOINTS        = json_endpoints(DEVICE_SW5_ID, DEVICE_SW5_ENDPOINT_DEFS)
 DEVICE_SW5_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW5_ID, DEVICE_SW5_ENDPOINT_DEFS)
 ENDPOINT_ID_SW5_1           = DEVICE_SW5_ENDPOINTS[0]['endpoint_id']
@@ -255,7 +263,8 @@ DEVICE_SW6_SW_VER           = 'Stratum'
 DEVICE_SW6_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW6_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW6_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW6_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW6_ENDPOINTS        = json_endpoints(DEVICE_SW6_ID, DEVICE_SW6_ENDPOINT_DEFS)
 DEVICE_SW6_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW6_ID, DEVICE_SW6_ENDPOINT_DEFS)
 ENDPOINT_ID_SW6_1           = DEVICE_SW6_ENDPOINTS[0]['endpoint_id']
@@ -292,7 +301,8 @@ DEVICE_SW7_SW_VER           = 'Stratum'
 DEVICE_SW7_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW7_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW7_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW7_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW7_ENDPOINTS        = json_endpoints(DEVICE_SW7_ID, DEVICE_SW7_ENDPOINT_DEFS)
 DEVICE_SW7_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW7_ID, DEVICE_SW7_ENDPOINT_DEFS)
 ENDPOINT_ID_SW7_1           = DEVICE_SW7_ENDPOINTS[0]['endpoint_id']
@@ -329,7 +339,10 @@ DEVICE_SW8_SW_VER           = 'Stratum'
 DEVICE_SW8_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW8_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW8_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', []), ('3', 'port', []), ('4', 'port', [])]
+DEVICE_SW8_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port'),
+                               json_endpoint_descriptor('3', 'port'),
+                               json_endpoint_descriptor('4', 'port')]
 DEVICE_SW8_ENDPOINTS        = json_endpoints(DEVICE_SW8_ID, DEVICE_SW8_ENDPOINT_DEFS)
 DEVICE_SW8_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW8_ID, DEVICE_SW8_ENDPOINT_DEFS)
 ENDPOINT_ID_SW8_1           = DEVICE_SW8_ENDPOINTS[0]['endpoint_id']
diff --git a/src/tests/p4/tests/topologies/6switchObjects.py b/src/tests/p4/tests/topologies/6switchObjects.py
index 29f01cd61aca58712cb0bc27b7f80c04b2f37d52..c5e4b616cdf3cfe0757514ac78f958837591a36c 100644
--- a/src/tests/p4/tests/topologies/6switchObjects.py
+++ b/src/tests/p4/tests/topologies/6switchObjects.py
@@ -25,6 +25,7 @@ from common.tools.object_factory.Service import (
 from common.tools.object_factory.ConfigRule import (
     json_config_rule_set, json_config_rule_delete)
 from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_ids, json_endpoints, json_endpoint_id
+from common.tools.object_factory.EndPoint import json_endpoint_descriptor
 from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
@@ -68,7 +69,9 @@ DEVICE_SW1_SW_VER           = 'Stratum'
 DEVICE_SW1_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW1_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW1_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', []), ('3', 'port', [])]
+DEVICE_SW1_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port'),
+                               json_endpoint_descriptor('3', 'port')]
 DEVICE_SW1_ENDPOINTS        = json_endpoints(DEVICE_SW1_ID, DEVICE_SW1_ENDPOINT_DEFS)
 DEVICE_SW1_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW1_ID, DEVICE_SW1_ENDPOINT_DEFS)
 ENDPOINT_ID_SW1_1           = DEVICE_SW1_ENDPOINTS[0]['endpoint_id']
@@ -106,7 +109,8 @@ DEVICE_SW2_SW_VER           = 'Stratum'
 DEVICE_SW2_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW2_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW2_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW2_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW2_ENDPOINTS        = json_endpoints(DEVICE_SW2_ID, DEVICE_SW2_ENDPOINT_DEFS)
 DEVICE_SW2_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW2_ID, DEVICE_SW2_ENDPOINT_DEFS)
 ENDPOINT_ID_SW2_1           = DEVICE_SW2_ENDPOINTS[0]['endpoint_id']
@@ -143,7 +147,8 @@ DEVICE_SW3_SW_VER           = 'Stratum'
 DEVICE_SW3_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW3_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW3_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW3_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW3_ENDPOINTS        = json_endpoints(DEVICE_SW3_ID, DEVICE_SW3_ENDPOINT_DEFS)
 DEVICE_SW3_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW3_ID, DEVICE_SW3_ENDPOINT_DEFS)
 ENDPOINT_ID_SW3_1           = DEVICE_SW3_ENDPOINTS[0]['endpoint_id']
@@ -180,7 +185,8 @@ DEVICE_SW4_SW_VER           = 'Stratum'
 DEVICE_SW4_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW4_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW4_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW4_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW4_ENDPOINTS        = json_endpoints(DEVICE_SW4_ID, DEVICE_SW4_ENDPOINT_DEFS)
 DEVICE_SW4_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW4_ID, DEVICE_SW4_ENDPOINT_DEFS)
 ENDPOINT_ID_SW4_1           = DEVICE_SW4_ENDPOINTS[0]['endpoint_id']
@@ -217,7 +223,8 @@ DEVICE_SW5_SW_VER           = 'Stratum'
 DEVICE_SW5_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW5_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW5_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW5_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port')]
 DEVICE_SW5_ENDPOINTS        = json_endpoints(DEVICE_SW5_ID, DEVICE_SW5_ENDPOINT_DEFS)
 DEVICE_SW5_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW5_ID, DEVICE_SW5_ENDPOINT_DEFS)
 ENDPOINT_ID_SW5_1           = DEVICE_SW5_ENDPOINTS[0]['endpoint_id']
@@ -254,7 +261,9 @@ DEVICE_SW6_SW_VER           = 'Stratum'
 DEVICE_SW6_BIN_PATH         = '/root/p4/bmv2.json'
 DEVICE_SW6_INFO_PATH        = '/root/p4/p4info.txt'
 
-DEVICE_SW6_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', []), ('3', 'port', [])]
+DEVICE_SW6_ENDPOINT_DEFS    = [json_endpoint_descriptor('1', 'port'),
+                               json_endpoint_descriptor('2', 'port'),
+                               json_endpoint_descriptor('3', 'port')]
 DEVICE_SW6_ENDPOINTS        = json_endpoints(DEVICE_SW6_ID, DEVICE_SW6_ENDPOINT_DEFS)
 DEVICE_SW6_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW6_ID, DEVICE_SW6_ENDPOINT_DEFS)
 ENDPOINT_ID_SW6_1           = DEVICE_SW6_ENDPOINTS[0]['endpoint_id']
diff --git a/src/tests/scenario2/Scenario.md b/src/tests/scenario2/Scenario.md
index 8dad4691ade669522b5c82a5e4ed07e5d0279492..964c8b2d089cd9316dd5d7f8061712160408bc48 100644
--- a/src/tests/scenario2/Scenario.md
+++ b/src/tests/scenario2/Scenario.md
@@ -1,47 +1,64 @@
-# Scenario:
-
-- 4 TFS instances
-
-    - domain D1 (source for e-2-e service)
-        5 routers + 1 DC
-        R1@D1/2 <--> R2@D1/1
-        R2@D1/3 <--> R3@D1/2
-        R2@D1/5 <--> R5@D1/2
-        R3@D1/4 <--> R4@D1/3
-        R4@D1/5 <--> R5@D1/4
-        R5@D1/1 <--> R1@D1/5
-        R1@D1/100 <--> DCGW@D1/eth1
-
-    - domain D2 (transit for e-2-e service)
-        6 routers
-        R1@D2/2 <--> R2@D2/1
-        R1@D2/6 <--> R6@D2/1
-        R1@D2/5 <--> R5@D2/1
-        R2@D2/3 <--> R3@D2/2
-        R2@D2/4 <--> R4@D2/2
-        R2@D2/5 <--> R5@D2/2
-        R2@D2/6 <--> R6@D2/2
-        R3@D2/6 <--> R6@D2/3
-        R4@D2/5 <--> R5@D2/4
-
-    - domain D3 (transit for e-2-e service)
-        4 routers
-        R1@D3/2 <--> R2@D3/1
-        R2@D3/3 <--> R3@D3/2
-        R3@D3/4 <--> R4@D3/3
-        R4@D3/1 <--> R1@D3/4
-        R2@D3/4 <--> R4@D3/2
-
-    - domain D4 (end for e-2-e service)
-        3 routers
-        R1@D4/2 <--> R2@D4/1
-        R1@D4/3 <--> R3@D4/1
-        R2@D4/3 <--> R3@D4/2
-        R3@D4/100 <--> DCGW@D4/eth1
-
-    - interdomain links
-        R4@D1/10 <--> R1@D2/10
-        R5@D1/10 <--> R1@D3/10
-        R4@D2/10 <--> R2@D4/10
-        R5@D2/10 <--> R2@D3/10
-        R3@D3/10 <--> R1@D4/10
+# Scenario Description
+
+This scenario is composed of 4 TeraFlowSDN instances.
+Each instance has its own local network topology detailed below.
+Besides, each instance exposes an abstracted view of its local network domain.
+Finally, the different domains are interconnected among them by means of the inter-domain links detailed below.
+
+## Domain D1 (end for the end-to-end interdomain slice)
+
+Domain D1 is composed of 5 emulated packet routers (Rx@D1) and 1 emulated DataCenter (DCGW@D1).
+The DCGW@D1 is a termination endpoint for the end-to-end interdomain slice.
+The internal domain connectivity is defined as follows:
+- R1@D1/2 <--> R2@D1/1
+- R2@D1/3 <--> R3@D1/2
+- R2@D1/5 <--> R5@D1/2
+- R3@D1/4 <--> R4@D1/3
+- R4@D1/5 <--> R5@D1/4
+- R5@D1/1 <--> R1@D1/5
+- R1@D1/100 <--> DCGW@D1/eth1
+
+## Domain D2 (transit for the end-to-end interdomain slice)
+
+Domain D2 is composed of 6 emulated packet routers (Rx@D2).
+This domain behaves as a transit domain for the end-to-end interdomain slice.
+The internal domain connectivity is defined as follows:
+- R1@D2/2 <--> R2@D2/1
+- R1@D2/6 <--> R6@D2/1
+- R1@D2/5 <--> R5@D2/1
+- R2@D2/3 <--> R3@D2/2
+- R2@D2/4 <--> R4@D2/2
+- R2@D2/5 <--> R5@D2/2
+- R2@D2/6 <--> R6@D2/2
+- R3@D2/6 <--> R6@D2/3
+- R4@D2/5 <--> R5@D2/4
+
+## Domain D3 (transit for the end-to-end interdomain slice)
+
+Domain D3 is composed of 6 emulated packet routers (Rx@D3).
+This domain behaves as a transit domain for the end-to-end interdomain slice.
+The internal domain connectivity is defined as follows:
+- R1@D3/2 <--> R2@D3/1
+- R2@D3/3 <--> R3@D3/2
+- R3@D3/4 <--> R4@D3/3
+- R4@D3/1 <--> R1@D3/4
+- R2@D3/4 <--> R4@D3/2
+
+## Domain D4 (end for the end-to-end interdomain slice)
+
+Domain D4 is composed of 3 emulated packet routers (Rx@D4) and 1 emulated DataCenter (DCGW@D4).
+The DCGW@D4 is a termination endpoint for the end-to-end interdomain slice.
+The internal domain connectivity is defined as follows:
+- R1@D4/2 <--> R2@D4/1
+- R1@D4/3 <--> R3@D4/1
+- R2@D4/3 <--> R3@D4/2
+- R3@D4/100 <--> DCGW@D4/eth1
+
+## Inter-domain Connectivity
+
+The 4 domains are interconnected among them by means of the following inter-domain links:
+- R4@D1/10 <--> R1@D2/10
+- R5@D1/10 <--> R1@D3/10
+- R4@D2/10 <--> R2@D4/10
+- R5@D2/10 <--> R2@D3/10
+- R3@D3/10 <--> R1@D4/10
diff --git a/src/tests/scenario2/deploy_all.sh b/src/tests/scenario2/deploy_all.sh
index 541612db431fd73e58fd7c1699df97342c11ea70..1eac2e4da701d2f2c60f8690c4784b59522a8b72 100755
--- a/src/tests/scenario2/deploy_all.sh
+++ b/src/tests/scenario2/deploy_all.sh
@@ -23,8 +23,8 @@ kubectl delete -f nfvsdn22/nginx-ingress-controller-dom2.yaml
 kubectl delete -f nfvsdn22/nginx-ingress-controller-dom3.yaml
 kubectl delete -f nfvsdn22/nginx-ingress-controller-dom4.yaml
 
-# Delete MockBlockchain
-#kubectl delete namespace tfs-bchain
+# Delete MockBlockchain (comment out if using a real blockchain)
+kubectl delete namespace tfs-bchain
 
 # Create secondary ingress controllers
 kubectl apply -f nfvsdn22/nginx-ingress-controller-dom1.yaml
@@ -32,8 +32,8 @@ kubectl apply -f nfvsdn22/nginx-ingress-controller-dom2.yaml
 kubectl apply -f nfvsdn22/nginx-ingress-controller-dom3.yaml
 kubectl apply -f nfvsdn22/nginx-ingress-controller-dom4.yaml
 
-# Create MockBlockchain
-#./deploy_mock_blockchain.sh
+# Create MockBlockchain (comment out if using a real blockchain)
+./deploy/mock_blockchain.sh
 
 # Deploy TFS for Domain 1
 source nfvsdn22/deploy_specs_dom1.sh
diff --git a/src/tests/scenario2/deploy_specs_dom1.sh b/src/tests/scenario2/deploy_specs_dom1.sh
index cfe8a3bf63d875b4c579e36ff6a904e0f4b62e02..7dd777fbee12537729e8408fe671074a1e9b19f1 100755
--- a/src/tests/scenario2/deploy_specs_dom1.sh
+++ b/src/tests/scenario2/deploy_specs_dom1.sh
@@ -1,10 +1,11 @@
+#!/bin/bash
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # 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
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#      http://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,
@@ -12,24 +13,142 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Set the URL of your local Docker registry where the images will be uploaded to.
-export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/"
+
+# ----- TeraFlowSDN ------------------------------------------------------------
+
+# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device pathcomp service slice dlt interdomain webui"
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice webui"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate InterDomain
+export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain"
+
+# Uncomment to activate DLT
+export TFS_COMPONENTS="${TFS_COMPONENTS} dlt"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
 
-# Set the name of the Kubernetes namespace to deploy to.
+# Set the name of the Kubernetes namespace to deploy TFS to.
 export TFS_K8S_NAMESPACE="tfs-dom1"
 
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="nfvsdn22/tfs-ingress-dom1.yaml"
 
-# Set the neew Grafana admin password
+# Uncomment to monitor performance of components
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
+# Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
-# If not already set, disable skip-build flag.
-# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used.
-export TFS_SKIP_BUILD="NO"
+# Disable skip-build flag to rebuild the Docker images.
+export TFS_SKIP_BUILD=""
+
+
+# ----- CockroachDB ------------------------------------------------------------
+
+# Set the namespace where CockroackDB will be deployed.
+export CRDB_NAMESPACE="crdb"
+
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
+# Set the database username to be used by Context.
+export CRDB_USERNAME="tfs"
+
+# Set the database user's password to be used by Context.
+export CRDB_PASSWORD="tfs123"
+
+# Set the database name to be used by Context.
+export CRDB_DATABASE="tfs_dom1"
+
+# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/crdb.sh for additional details
+export CRDB_DEPLOY_MODE="single"
+
+# Disable flag for dropping database, if it exists.
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
+
+# Disable flag for re-deploying CockroachDB from scratch.
+export CRDB_REDEPLOY=""
+
+
+# ----- NATS -------------------------------------------------------------------
+
+# Set the namespace where NATS will be deployed.
+export NATS_NAMESPACE="nats-dom1"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4223"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8223"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb-dom1"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8813"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9011"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9001"
+
+# Set the database username to be used for QuestDB.
+export QDB_USERNAME="admin"
+
+# Set the database user's password to be used for QuestDB.
+export QDB_PASSWORD="quest"
+
+# Set the table name to be used by Monitoring for KPIs.
+export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
+
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
+# Disable flag for dropping tables if they exist.
+export QDB_DROP_TABLES_IF_EXIST="YES"
+
+# Disable flag for re-deploying QuestDB from scratch.
+export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/scenario2/deploy_specs_dom2.sh b/src/tests/scenario2/deploy_specs_dom2.sh
index 7034c22cdcdc93b6c6fc0e5227e0ef38bda95a55..bb6ce2f0c390d3253696e62bf23aa85b0d16782e 100755
--- a/src/tests/scenario2/deploy_specs_dom2.sh
+++ b/src/tests/scenario2/deploy_specs_dom2.sh
@@ -1,10 +1,11 @@
+#!/bin/bash
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # 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
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#      http://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,
@@ -12,24 +13,142 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Set the URL of your local Docker registry where the images will be uploaded to.
-export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/"
+
+# ----- TeraFlowSDN ------------------------------------------------------------
+
+# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device pathcomp service slice dlt interdomain webui"
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice webui"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate InterDomain
+export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain"
+
+# Uncomment to activate DLT
+export TFS_COMPONENTS="${TFS_COMPONENTS} dlt"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
 
-# Set the name of the Kubernetes namespace to deploy to.
+# Set the name of the Kubernetes namespace to deploy TFS to.
 export TFS_K8S_NAMESPACE="tfs-dom2"
 
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="nfvsdn22/tfs-ingress-dom2.yaml"
 
-# Set the neew Grafana admin password
+# Uncomment to monitor performance of components
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
+# Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
-# If not already set, disable skip-build flag.
-# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used.
+# Disable skip-build flag to rebuild the Docker images.
 export TFS_SKIP_BUILD="YES"
+
+
+# ----- CockroachDB ------------------------------------------------------------
+
+# Set the namespace where CockroackDB will be deployed.
+export CRDB_NAMESPACE="crdb"
+
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
+# Set the database username to be used by Context.
+export CRDB_USERNAME="tfs"
+
+# Set the database user's password to be used by Context.
+export CRDB_PASSWORD="tfs123"
+
+# Set the database name to be used by Context.
+export CRDB_DATABASE="tfs_dom2"
+
+# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/crdb.sh for additional details
+export CRDB_DEPLOY_MODE="single"
+
+# Disable flag for dropping database, if it exists.
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
+
+# Disable flag for re-deploying CockroachDB from scratch.
+export CRDB_REDEPLOY=""
+
+
+# ----- NATS -------------------------------------------------------------------
+
+# Set the namespace where NATS will be deployed.
+export NATS_NAMESPACE="nats-dom2"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4224"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8224"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb-dom2"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8814"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9012"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9002"
+
+# Set the database username to be used for QuestDB.
+export QDB_USERNAME="admin"
+
+# Set the database user's password to be used for QuestDB.
+export QDB_PASSWORD="quest"
+
+# Set the table name to be used by Monitoring for KPIs.
+export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
+
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
+# Disable flag for dropping tables if they exist.
+export QDB_DROP_TABLES_IF_EXIST="YES"
+
+# Disable flag for re-deploying QuestDB from scratch.
+export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/scenario2/deploy_specs_dom3.sh b/src/tests/scenario2/deploy_specs_dom3.sh
index 044301418405ba20dfaf00cd58f9a1a15e7e62a7..797d55894a143308935664f2c879260dfd2760ec 100755
--- a/src/tests/scenario2/deploy_specs_dom3.sh
+++ b/src/tests/scenario2/deploy_specs_dom3.sh
@@ -1,10 +1,11 @@
+#!/bin/bash
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # 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
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#      http://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,
@@ -12,24 +13,142 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Set the URL of your local Docker registry where the images will be uploaded to.
-export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/"
+
+# ----- TeraFlowSDN ------------------------------------------------------------
+
+# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device pathcomp service slice dlt interdomain webui"
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice webui"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate InterDomain
+export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain"
+
+# Uncomment to activate DLT
+export TFS_COMPONENTS="${TFS_COMPONENTS} dlt"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
 
-# Set the name of the Kubernetes namespace to deploy to.
+# Set the name of the Kubernetes namespace to deploy TFS to.
 export TFS_K8S_NAMESPACE="tfs-dom3"
 
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="nfvsdn22/tfs-ingress-dom3.yaml"
 
-# Set the neew Grafana admin password
+# Uncomment to monitor performance of components
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
+# Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
-# If not already set, disable skip-build flag.
-# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used.
+# Disable skip-build flag to rebuild the Docker images.
 export TFS_SKIP_BUILD="YES"
+
+
+# ----- CockroachDB ------------------------------------------------------------
+
+# Set the namespace where CockroackDB will be deployed.
+export CRDB_NAMESPACE="crdb"
+
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
+# Set the database username to be used by Context.
+export CRDB_USERNAME="tfs"
+
+# Set the database user's password to be used by Context.
+export CRDB_PASSWORD="tfs123"
+
+# Set the database name to be used by Context.
+export CRDB_DATABASE="tfs_dom3"
+
+# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/crdb.sh for additional details
+export CRDB_DEPLOY_MODE="single"
+
+# Disable flag for dropping database, if it exists.
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
+
+# Disable flag for re-deploying CockroachDB from scratch.
+export CRDB_REDEPLOY=""
+
+
+# ----- NATS -------------------------------------------------------------------
+
+# Set the namespace where NATS will be deployed.
+export NATS_NAMESPACE="nats-dom3"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4225"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8225"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb-dom3"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8815"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9013"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9003"
+
+# Set the database username to be used for QuestDB.
+export QDB_USERNAME="admin"
+
+# Set the database user's password to be used for QuestDB.
+export QDB_PASSWORD="quest"
+
+# Set the table name to be used by Monitoring for KPIs.
+export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
+
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
+# Disable flag for dropping tables if they exist.
+export QDB_DROP_TABLES_IF_EXIST="YES"
+
+# Disable flag for re-deploying QuestDB from scratch.
+export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/scenario2/deploy_specs_dom4.sh b/src/tests/scenario2/deploy_specs_dom4.sh
index 9e26ace470c81b0bdccfa83bf4eb7369970c981b..d2fe2abfa981d498558d263ca053093e017225d2 100755
--- a/src/tests/scenario2/deploy_specs_dom4.sh
+++ b/src/tests/scenario2/deploy_specs_dom4.sh
@@ -1,10 +1,11 @@
+#!/bin/bash
 # Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
 #
 # 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
 #
-#     http://www.apache.org/licenses/LICENSE-2.0
+#      http://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,
@@ -12,24 +13,142 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Set the URL of your local Docker registry where the images will be uploaded to.
-export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/"
+
+# ----- TeraFlowSDN ------------------------------------------------------------
+
+# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device pathcomp service slice dlt interdomain webui"
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice webui"
+
+# Uncomment to activate Monitoring
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate InterDomain
+export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain"
+
+# Uncomment to activate DLT
+export TFS_COMPONENTS="${TFS_COMPONENTS} dlt"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
 
 # Set the tag you want to use for your images.
 export TFS_IMAGE_TAG="dev"
 
-# Set the name of the Kubernetes namespace to deploy to.
+# Set the name of the Kubernetes namespace to deploy TFS to.
 export TFS_K8S_NAMESPACE="tfs-dom4"
 
 # Set additional manifest files to be applied after the deployment
 export TFS_EXTRA_MANIFESTS="nfvsdn22/tfs-ingress-dom4.yaml"
 
-# Set the neew Grafana admin password
+# Uncomment to monitor performance of components
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
+# Set the new Grafana admin password
 export TFS_GRAFANA_PASSWORD="admin123+"
 
-# If not already set, disable skip-build flag.
-# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used.
+# Disable skip-build flag to rebuild the Docker images.
 export TFS_SKIP_BUILD="YES"
+
+
+# ----- CockroachDB ------------------------------------------------------------
+
+# Set the namespace where CockroackDB will be deployed.
+export CRDB_NAMESPACE="crdb"
+
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
+# Set the database username to be used by Context.
+export CRDB_USERNAME="tfs"
+
+# Set the database user's password to be used by Context.
+export CRDB_PASSWORD="tfs123"
+
+# Set the database name to be used by Context.
+export CRDB_DATABASE="tfs_dom4"
+
+# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/crdb.sh for additional details
+export CRDB_DEPLOY_MODE="single"
+
+# Disable flag for dropping database, if it exists.
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
+
+# Disable flag for re-deploying CockroachDB from scratch.
+export CRDB_REDEPLOY=""
+
+
+# ----- NATS -------------------------------------------------------------------
+
+# Set the namespace where NATS will be deployed.
+export NATS_NAMESPACE="nats-dom4"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4226"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8226"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb-dom4"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8816"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9014"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9004"
+
+# Set the database username to be used for QuestDB.
+export QDB_USERNAME="admin"
+
+# Set the database user's password to be used for QuestDB.
+export QDB_PASSWORD="quest"
+
+# Set the table name to be used by Monitoring for KPIs.
+export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
+
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
+# Disable flag for dropping tables if they exist.
+export QDB_DROP_TABLES_IF_EXIST="YES"
+
+# Disable flag for re-deploying QuestDB from scratch.
+export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/scenario2/dump_logs.sh b/src/tests/scenario2/dump_logs.sh
index 7b1dc9d17aabcf8866b76ed1acdb367eee0e3b51..c7acedbf613b66f3ec08bd1628e8e1ab76b9bc5e 100755
--- a/src/tests/scenario2/dump_logs.sh
+++ b/src/tests/scenario2/dump_logs.sh
@@ -13,64 +13,70 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
-rm -rf tmp/exec
-
 echo "Collecting logs for MockBlockChain..."
-mkdir -p tmp/exec/mbc
-kubectl --namespace tfs-bchain logs deployments/mock-blockchain server > tmp/exec/mbc/mock-blockchain.log
+rm -rf tmp/tfs-bchain/exec
+mkdir -p tmp/tfs-bchain/exec
+kubectl --namespace tfs-bchain logs deployments/mock-blockchain server > tmp/tfs-bchain/exec/mock-blockchain.log
 printf "\n"
 
 echo "Collecting logs for Domain 1..."
-mkdir -p tmp/exec/dom1
-kubectl --namespace tfs-dom1 logs deployments/contextservice server > tmp/exec/dom1/context.log
-kubectl --namespace tfs-dom1 logs deployments/deviceservice server > tmp/exec/dom1/device.log
-kubectl --namespace tfs-dom1 logs deployments/serviceservice server > tmp/exec/dom1/service.log
-kubectl --namespace tfs-dom1 logs deployments/pathcompservice frontend > tmp/exec/dom1/pathcomp-frontend.log
-kubectl --namespace tfs-dom1 logs deployments/pathcompservice backend > tmp/exec/dom1/pathcomp-backend.log
-kubectl --namespace tfs-dom1 logs deployments/sliceservice server > tmp/exec/dom1/slice.log
-kubectl --namespace tfs-dom1 logs deployments/interdomainservice server > tmp/exec/dom1/interdomain.log
-kubectl --namespace tfs-dom1 logs deployments/dltservice connector > tmp/exec/dom1/dlt-connector.log
-kubectl --namespace tfs-dom1 logs deployments/dltservice gateway > tmp/exec/dom1/dlt-gateway.log
+rm -rf tmp/tfs-dom1/exec
+mkdir -p tmp/tfs-dom1/exec
+kubectl --namespace tfs-dom1 logs deployments/contextservice server > tmp/tfs-dom1/exec/context.log
+kubectl --namespace tfs-dom1 logs deployments/deviceservice server > tmp/tfs-dom1/exec/device.log
+kubectl --namespace tfs-dom1 logs deployments/serviceservice server > tmp/tfs-dom1/exec/service.log
+kubectl --namespace tfs-dom1 logs deployments/pathcompservice frontend > tmp/tfs-dom1/exec/pathcomp-frontend.log
+kubectl --namespace tfs-dom1 logs deployments/pathcompservice backend > tmp/tfs-dom1/exec/pathcomp-backend.log
+kubectl --namespace tfs-dom1 logs deployments/sliceservice server > tmp/tfs-dom1/exec/slice.log
+kubectl --namespace tfs-dom1 logs deployments/interdomainservice server > tmp/tfs-dom1/exec/interdomain.log
+kubectl --namespace tfs-dom1 logs deployments/dltservice connector > tmp/tfs-dom1/exec/dlt-connector.log
+kubectl --namespace tfs-dom1 logs deployments/dltservice gateway > tmp/tfs-dom1/exec/dlt-gateway.log
+kubectl --namespace tfs-dom1 logs deployments/webuiservice server > tmp/tfs-dom1/exec/webui.log
 printf "\n"
 
 echo "Collecting logs for Domain 2..."
-mkdir -p tmp/exec/dom2
-kubectl --namespace tfs-dom2 logs deployments/contextservice server > tmp/exec/dom2/context.log
-kubectl --namespace tfs-dom2 logs deployments/deviceservice server > tmp/exec/dom2/device.log
-kubectl --namespace tfs-dom2 logs deployments/serviceservice server > tmp/exec/dom2/service.log
-kubectl --namespace tfs-dom2 logs deployments/pathcompservice frontend > tmp/exec/dom2/pathcomp-frontend.log
-kubectl --namespace tfs-dom2 logs deployments/pathcompservice backend > tmp/exec/dom2/pathcomp-backend.log
-kubectl --namespace tfs-dom2 logs deployments/sliceservice server > tmp/exec/dom2/slice.log
-kubectl --namespace tfs-dom2 logs deployments/interdomainservice server > tmp/exec/dom2/interdomain.log
-kubectl --namespace tfs-dom2 logs deployments/dltservice connector > tmp/exec/dom2/dlt-connector.log
-kubectl --namespace tfs-dom2 logs deployments/dltservice gateway > tmp/exec/dom2/dlt-gateway.log
+rm -rf tmp/tfs-dom2/exec
+mkdir -p tmp/tfs-dom2/exec
+kubectl --namespace tfs-dom2 logs deployments/contextservice server > tmp/tfs-dom2/exec/context.log
+kubectl --namespace tfs-dom2 logs deployments/deviceservice server > tmp/tfs-dom2/exec/device.log
+kubectl --namespace tfs-dom2 logs deployments/serviceservice server > tmp/tfs-dom2/exec/service.log
+kubectl --namespace tfs-dom2 logs deployments/pathcompservice frontend > tmp/tfs-dom2/exec/pathcomp-frontend.log
+kubectl --namespace tfs-dom2 logs deployments/pathcompservice backend > tmp/tfs-dom2/exec/pathcomp-backend.log
+kubectl --namespace tfs-dom2 logs deployments/sliceservice server > tmp/tfs-dom2/exec/slice.log
+kubectl --namespace tfs-dom2 logs deployments/interdomainservice server > tmp/tfs-dom2/exec/interdomain.log
+kubectl --namespace tfs-dom2 logs deployments/dltservice connector > tmp/tfs-dom2/exec/dlt-connector.log
+kubectl --namespace tfs-dom2 logs deployments/dltservice gateway > tmp/tfs-dom2/exec/dlt-gateway.log
+kubectl --namespace tfs-dom2 logs deployments/webuiservice server > tmp/tfs-dom2/exec/webui.log
 printf "\n"
 
 echo "Collecting logs for Domain 3..."
-mkdir -p tmp/exec/dom3
-kubectl --namespace tfs-dom3 logs deployments/contextservice server > tmp/exec/dom3/context.log
-kubectl --namespace tfs-dom3 logs deployments/deviceservice server > tmp/exec/dom3/device.log
-kubectl --namespace tfs-dom3 logs deployments/serviceservice server > tmp/exec/dom3/service.log
-kubectl --namespace tfs-dom3 logs deployments/pathcompservice frontend > tmp/exec/dom3/pathcomp-frontend.log
-kubectl --namespace tfs-dom3 logs deployments/pathcompservice backend > tmp/exec/dom3/pathcomp-backend.log
-kubectl --namespace tfs-dom3 logs deployments/sliceservice server > tmp/exec/dom3/slice.log
-kubectl --namespace tfs-dom3 logs deployments/interdomainservice server > tmp/exec/dom3/interdomain.log
-kubectl --namespace tfs-dom3 logs deployments/dltservice connector > tmp/exec/dom3/dlt-connector.log
-kubectl --namespace tfs-dom3 logs deployments/dltservice gateway > tmp/exec/dom3/dlt-gateway.log
+rm -rf tmp/tfs-dom3/exec
+mkdir -p tmp/tfs-dom3/exec
+kubectl --namespace tfs-dom3 logs deployments/contextservice server > tmp/tfs-dom3/exec/context.log
+kubectl --namespace tfs-dom3 logs deployments/deviceservice server > tmp/tfs-dom3/exec/device.log
+kubectl --namespace tfs-dom3 logs deployments/serviceservice server > tmp/tfs-dom3/exec/service.log
+kubectl --namespace tfs-dom3 logs deployments/pathcompservice frontend > tmp/tfs-dom3/exec/pathcomp-frontend.log
+kubectl --namespace tfs-dom3 logs deployments/pathcompservice backend > tmp/tfs-dom3/exec/pathcomp-backend.log
+kubectl --namespace tfs-dom3 logs deployments/sliceservice server > tmp/tfs-dom3/exec/slice.log
+kubectl --namespace tfs-dom3 logs deployments/interdomainservice server > tmp/tfs-dom3/exec/interdomain.log
+kubectl --namespace tfs-dom3 logs deployments/dltservice connector > tmp/tfs-dom3/exec/dlt-connector.log
+kubectl --namespace tfs-dom3 logs deployments/dltservice gateway > tmp/tfs-dom3/exec/dlt-gateway.log
+kubectl --namespace tfs-dom3 logs deployments/webuiservice server > tmp/tfs-dom3/exec/webui.log
 printf "\n"
 
 echo "Collecting logs for Domain 4..."
-mkdir -p tmp/exec/dom4
-kubectl --namespace tfs-dom4 logs deployments/contextservice server > tmp/exec/dom4/context.log
-kubectl --namespace tfs-dom4 logs deployments/deviceservice server > tmp/exec/dom4/device.log
-kubectl --namespace tfs-dom4 logs deployments/serviceservice server > tmp/exec/dom4/service.log
-kubectl --namespace tfs-dom4 logs deployments/pathcompservice frontend > tmp/exec/dom4/pathcomp-frontend.log
-kubectl --namespace tfs-dom4 logs deployments/pathcompservice backend > tmp/exec/dom4/pathcomp-backend.log
-kubectl --namespace tfs-dom4 logs deployments/sliceservice server > tmp/exec/dom4/slice.log
-kubectl --namespace tfs-dom4 logs deployments/interdomainservice server > tmp/exec/dom4/interdomain.log
-kubectl --namespace tfs-dom4 logs deployments/dltservice connector > tmp/exec/dom4/dlt-connector.log
-kubectl --namespace tfs-dom4 logs deployments/dltservice gateway > tmp/exec/dom4/dlt-gateway.log
+rm -rf tmp/tfs-dom4/exec
+mkdir -p tmp/tfs-dom4/exec
+kubectl --namespace tfs-dom4 logs deployments/contextservice server > tmp/tfs-dom4/exec/context.log
+kubectl --namespace tfs-dom4 logs deployments/deviceservice server > tmp/tfs-dom4/exec/device.log
+kubectl --namespace tfs-dom4 logs deployments/serviceservice server > tmp/tfs-dom4/exec/service.log
+kubectl --namespace tfs-dom4 logs deployments/pathcompservice frontend > tmp/tfs-dom4/exec/pathcomp-frontend.log
+kubectl --namespace tfs-dom4 logs deployments/pathcompservice backend > tmp/tfs-dom4/exec/pathcomp-backend.log
+kubectl --namespace tfs-dom4 logs deployments/sliceservice server > tmp/tfs-dom4/exec/slice.log
+kubectl --namespace tfs-dom4 logs deployments/interdomainservice server > tmp/tfs-dom4/exec/interdomain.log
+kubectl --namespace tfs-dom4 logs deployments/dltservice connector > tmp/tfs-dom4/exec/dlt-connector.log
+kubectl --namespace tfs-dom4 logs deployments/dltservice gateway > tmp/tfs-dom4/exec/dlt-gateway.log
+kubectl --namespace tfs-dom4 logs deployments/webuiservice server > tmp/tfs-dom4/exec/webui.log
 printf "\n"
 
 echo "Done!"
diff --git a/src/tests/scenario2/old_tests/tests/Objects.py b/src/tests/scenario2/old_tests/tests/Objects.py
index 7eea0f4c3262793e9ba00ae80c66cc5b1ed0b8dc..43df127495d16b8494ff74cdf7dea64e44b072e1 100644
--- a/src/tests/scenario2/old_tests/tests/Objects.py
+++ b/src/tests/scenario2/old_tests/tests/Objects.py
@@ -18,7 +18,7 @@ from common.tools.object_factory.Context import json_context, json_context_id
 from common.tools.object_factory.Device import (
     json_device_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
     json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled)
-from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
+from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_descriptor, json_endpoint_id
 from common.tools.object_factory.Link import json_link, json_link_id
 from common.tools.object_factory.Topology import json_topology, json_topology_id
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
@@ -63,16 +63,18 @@ except ImportError:
 
 #USE_REAL_DEVICES = False     # Uncomment to force to use emulated devices
 
-def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoint_ids(device_id : Dict, endpoint_descriptors : List[Dict]]):
     return [
-        json_endpoint_id(device_id, ep_uuid, topology_id=None)
-        for ep_uuid, _, _ in endpoint_descriptors
+        json_endpoint_id(device_id, ep_data['uuid'], topology_id=None)
+        for ep_data in endpoint_descriptors
     ]
 
-def json_endpoints(device_id : Dict, endpoint_descriptors : List[Tuple[str, str, List[int]]]):
+def json_endpoints(device_id : Dict, endpoint_descriptors : List[Dict]]):
     return [
-        json_endpoint(device_id, ep_uuid, ep_type, topology_id=None, kpi_sample_types=ep_sample_types)
-        for ep_uuid, ep_type, ep_sample_types in endpoint_descriptors
+        json_endpoint(
+            device_id, ep_data['uuid'], ep_data['type'], topology_id=None,
+            kpi_sample_types=ep_data['sample_types'])
+        for ep_data in endpoint_descriptors
     ]
 
 def get_link_uuid(a_device_id : Dict, a_endpoint_id : Dict, z_device_id : Dict, z_endpoint_id : Dict) -> str:
@@ -88,7 +90,8 @@ if not USE_REAL_DEVICES:
 
 DEVICE_R1_UUID          = 'R1-EMU'
 DEVICE_R1_TIMEOUT       = 120
-DEVICE_R1_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R1_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R1_ID            = json_device_id(DEVICE_R1_UUID)
 #DEVICE_R1_ENDPOINTS     = json_endpoints(DEVICE_R1_ID, DEVICE_R1_ENDPOINT_DEFS)
 DEVICE_R1_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R1_ID, DEVICE_R1_ENDPOINT_DEFS)
@@ -103,7 +106,8 @@ DEVICE_R1_CONNECT_RULES = json_device_connect_rules(DEVICE_R1_ADDRESS, DEVICE_R1
 
 
 DEVICE_R2_UUID          = 'R2-EMU'
-DEVICE_R2_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R2_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R2_ID            = json_device_id(DEVICE_R2_UUID)
 #DEVICE_R2_ENDPOINTS     = json_endpoints(DEVICE_R2_ID, DEVICE_R2_ENDPOINT_DEFS)
 DEVICE_R2_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R2_ID, DEVICE_R2_ENDPOINT_DEFS)
@@ -115,7 +119,8 @@ DEVICE_R2_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R2_ENDPOINT_
 
 DEVICE_R3_UUID          = 'R3-EMU'
 DEVICE_R3_TIMEOUT       = 120
-DEVICE_R3_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R3_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R3_ID            = json_device_id(DEVICE_R3_UUID)
 #DEVICE_R3_ENDPOINTS     = json_endpoints(DEVICE_R3_ID, DEVICE_R3_ENDPOINT_DEFS)
 DEVICE_R3_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R3_ID, DEVICE_R3_ENDPOINT_DEFS)
@@ -130,7 +135,8 @@ DEVICE_R3_CONNECT_RULES = json_device_connect_rules(DEVICE_R3_ADDRESS, DEVICE_R3
 
 
 DEVICE_R4_UUID          = 'R4-EMU'
-DEVICE_R4_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_R4_ENDPOINT_DEFS = [json_endpoint_descriptor('13/0/0', 'optical'),
+                           json_endpoint_descriptor('13/1/2', 'copper', sample_types=PACKET_PORT_SAMPLE_TYPES)]
 DEVICE_R4_ID            = json_device_id(DEVICE_R4_UUID)
 #DEVICE_R4_ENDPOINTS     = json_endpoints(DEVICE_R4_ID, DEVICE_R4_ENDPOINT_DEFS)
 DEVICE_R4_ENDPOINT_IDS  = json_endpoint_ids(DEVICE_R4_ID, DEVICE_R4_ENDPOINT_DEFS)
@@ -143,10 +149,10 @@ DEVICE_R4_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_R4_ENDPOINT_
 DEVICE_O1_UUID          = 'O1-OLS'
 DEVICE_O1_TIMEOUT       = 120
 DEVICE_O1_ENDPOINT_DEFS = [
-    ('aade6001-f00b-5e2f-a357-6a0a9d3de870', 'optical', []), # node_1_port_13
-    ('eb287d83-f05e-53ec-ab5a-adf6bd2b5418', 'optical', []), # node_2_port_13
-    ('0ef74f99-1acc-57bd-ab9d-4b958b06c513', 'optical', []), # node_3_port_13
-    ('50296d99-58cc-5ce7-82f5-fc8ee4eec2ec', 'optical', []), # node_4_port_13
+    json_endpoint_descriptor('aade6001-f00b-5e2f-a357-6a0a9d3de870', 'optical', endpoint_name='node_1_port_13'),
+    json_endpoint_descriptor('eb287d83-f05e-53ec-ab5a-adf6bd2b5418', 'optical', endpoint_name='node_2_port_13'),
+    json_endpoint_descriptor('0ef74f99-1acc-57bd-ab9d-4b958b06c513', 'optical', endpoint_name='node_3_port_13'),
+    json_endpoint_descriptor('50296d99-58cc-5ce7-82f5-fc8ee4eec2ec', 'optical', endpoint_name='node_4_port_13'),
 ]
 DEVICE_O1_ID            = json_device_id(DEVICE_O1_UUID)
 DEVICE_O1               = json_device_tapi_disabled(DEVICE_O1_UUID)
diff --git a/src/tests/scenario2/reset.sh b/src/tests/scenario2/reset.sh
index 5f4a3b8e5b8a58d8f2acf7c60cde1e77c2e1873a..f9e7ecab2d4693ef161ae9349e13a3ad0200c97c 100755
--- a/src/tests/scenario2/reset.sh
+++ b/src/tests/scenario2/reset.sh
@@ -14,10 +14,38 @@
 # limitations under the License.
 
 
+# Destroy all replicas of all microservices
+
 kubectl --namespace tfs-dom1 scale --replicas=0 \
     deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
     deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
 
+kubectl --namespace tfs-dom2 scale --replicas=0 \
+    deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
+    deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
+
+kubectl --namespace tfs-dom3 scale --replicas=0 \
+    deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
+    deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
+
+kubectl --namespace tfs-dom4 scale --replicas=0 \
+    deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
+    deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
+
+# Create a single replica per microservice
+
 kubectl --namespace tfs-dom1 scale --replicas=1 \
     deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
     deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
+
+kubectl --namespace tfs-dom2 scale --replicas=1 \
+    deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
+    deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
+
+kubectl --namespace tfs-dom3 scale --replicas=1 \
+    deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
+    deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
+
+kubectl --namespace tfs-dom4 scale --replicas=1 \
+    deployment/contextservice deployment/deviceservice deployment/pathcompservice deployment/serviceservice \
+    deployment/sliceservice deployment/dltservice deployment/interdomainservice deployment/webuiservice
diff --git a/src/tests/scenario2/show_deploy.sh b/src/tests/scenario2/show_deploy.sh
index 2aa8de873cf22e75be830c713fc379df9df154a4..20bbfaacef39b7b9b9c18facc3e20382e526377a 100755
--- a/src/tests/scenario2/show_deploy.sh
+++ b/src/tests/scenario2/show_deploy.sh
@@ -24,3 +24,27 @@ printf "\n"
 echo "Deployment Ingress:"
 kubectl --namespace tfs-dom1 get ingress
 printf "\n"
+
+echo "Deployment Resources:"
+kubectl --namespace tfs-dom2 get all
+printf "\n"
+
+echo "Deployment Ingress:"
+kubectl --namespace tfs-dom2 get ingress
+printf "\n"
+
+echo "Deployment Resources:"
+kubectl --namespace tfs-dom3 get all
+printf "\n"
+
+echo "Deployment Ingress:"
+kubectl --namespace tfs-dom3 get ingress
+printf "\n"
+
+echo "Deployment Resources:"
+kubectl --namespace tfs-dom4 get all
+printf "\n"
+
+echo "Deployment Ingress:"
+kubectl --namespace tfs-dom4 get ingress
+printf "\n"
diff --git a/src/tests/scenario3/l3/README.md b/src/tests/scenario3/l3/README.md
index f66d8e351033d2762a77269243b6d3bb2a1d7022..2e243997d29b70436d1a1b88e2a3177951bfe970 100644
--- a/src/tests/scenario3/l3/README.md
+++ b/src/tests/scenario3/l3/README.md
@@ -1,3 +1,9 @@
-# Scripts to automatically run the "Attack Detection & Mitigation at the L3 Layer" workflow (Scenario 3).
-"launch_l3_attack_detection_and_mitigation.sh" launches the TeraFlow OS components, which includes the CentralizedAttackDetector and AttackMitigator componentes necessary to perform this workflow.
-"launch_l3_attack_detection_and_mitigation_complete.sh" also launches the DistributedAttackDetector, which monitors the network data plane and passively collects traffic packets and aggregates them in network flows, which are then provided to the CentralizedAttackDetector to detect attacks that may be occurring in the network.
+# Demonstration of a L3 Cybersecurity Components for Attack Detection and Mitigation
+
+__Authors__: Partners of Universidad Politécnica de Madrid and Telefónica I+D
+
+## Executing
+
+```bash
+python src/tests/scenario3/l3/run.sh
+```
\ No newline at end of file
diff --git a/src/tests/scenario3/l3/copy_protos_to_dad.sh b/src/tests/scenario3/l3/copy_protos_to_dad.sh
deleted file mode 100755
index 6735d9cf95d2243e6f87b5508c2e3f7b9756c474..0000000000000000000000000000000000000000
--- a/src/tests/scenario3/l3/copy_protos_to_dad.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# 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
-#
-#      http://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.
-
-# Set the variables for the remote host and destination directory
-REMOTE_HOST="192.168.165.73"
-DEST_DIR="/home/ubuntu/TeraflowDockerDistributed/l3_distributedattackdetector/proto"
-
-# Copy the files to the remote host
-sshpass -p "ubuntu" scp /home/ubuntu/tfs-ctrl-new/proto/src/python/l3_centralizedattackdetector_pb2.py "$REMOTE_HOST:$DEST_DIR"
-sshpass -p "ubuntu" scp /home/ubuntu/tfs-ctrl-new/proto/src/python/l3_centralizedattackdetector_pb2_grpc.py "$REMOTE_HOST:$DEST_DIR"
-
-sshpass -p "ubuntu" scp /home/ubuntu/tfs-ctrl-new/proto/src/python/l3_attackmitigator_pb2.py "$REMOTE_HOST:$DEST_DIR"
-sshpass -p "ubuntu" scp /home/ubuntu/tfs-ctrl-new/proto/src/python/l3_attackmitigator_pb2_grpc.py "$REMOTE_HOST:$DEST_DIR"
diff --git a/src/tests/scenario3/l3/launch_l3_attack_detection_and_mitigation.sh b/src/tests/scenario3/l3/deploy.sh
old mode 100644
new mode 100755
similarity index 90%
rename from src/tests/scenario3/l3/launch_l3_attack_detection_and_mitigation.sh
rename to src/tests/scenario3/l3/deploy.sh
index a22d98bad6c203c825d3343c44e3d31674a41ec0..4f4f8baed2c29b290142f30960f8432926cef6a8
--- a/src/tests/scenario3/l3/launch_l3_attack_detection_and_mitigation.sh
+++ b/src/tests/scenario3/l3/deploy.sh
@@ -13,12 +13,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cd /home/ubuntu/tfs-ctrl
-source my_deploy.sh
-./deploy.sh
-./show_deploy.sh
-
+source src/tests/scenario3/l3/deploy_specs.sh
+./deploy/all.sh
 source tfs_runtime_env_vars.sh
-
 ofc22/run_test_01_bootstrap.sh
 ofc22/run_test_02_create_service.sh
diff --git a/src/tests/scenario3/l3/deploy_l3_component.sh b/src/tests/scenario3/l3/deploy_l3_component.sh
deleted file mode 100755
index 8e468c9067c93a06c6716ac618f5c9fdba860d34..0000000000000000000000000000000000000000
--- a/src/tests/scenario3/l3/deploy_l3_component.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/bash
-# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
-#
-# 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
-#
-#      http://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.
-
-component=$1
-
-source "my_deploy.sh"
-
-echo "Deploying $component..."
-
-# check if component == "CAD"
-if [ $component == "CAD" ]; then
-    # find kubernetes pod that contains "centralizedattackdetectorservice"
-    pod=$(kubectl --namespace $TFS_K8S_NAMESPACE get pods | grep l3-centralizedattackdetectorservice | awk '{print $1}')
-    
-    # delete pod
-    kubectl --namespace $TFS_K8S_NAMESPACE delete pod $pod --force --grace-period=0
-    
-    # # wait for pod to be deleted
-    # while [ $(kubectl --namespace $TFS_K8S_NAMESPACE get pods | grep l3-centralizedattackdetectorservice | wc -l) -gt 0 ]; do
-    #     sleep 1
-    # done
-    
-    # deploy l3_centralizedattackdetector component
-    ./deploy_component.sh "l3_centralizedattackdetector"
-fi
-
-# check if component == "AM"
-if [ $component == "AM" ]; then
-    # find kubernetes pod that contains "l3-attackmitigatorservice"
-    pod=$(kubectl --namespace $TFS_K8S_NAMESPACE get pods | grep l3-attackmitigatorservice | awk '{print $1}')
-    
-    # delete pod
-    kubectl --namespace $TFS_K8S_NAMESPACE delete pod $pod --force --grace-period=0
-    
-    # # wait for pod to be deleted
-    # while [ $(kubectl --namespace $TFS_K8S_NAMESPACE get pods | grep l3-attackmitigatorservice | wc -l) -gt 0 ]; do
-    #     sleep 1
-    # done
-    
-    # deploy l3_attackmitigator component
-    ./deploy_component.sh "l3_attackmitigator"
-fi
-
-echo "Component $component deployed"
-
-echo "Restarting DAD..."
-sshpass -p "ubuntu" ssh -o StrictHostKeyChecking=no -n -f ubuntu@192.168.165.73 "sh -c 'nohup /home/ubuntu/TeraflowDockerDistributed/restart.sh > /dev/null 2>&1 &'"
-echo "DAD restarted"
diff --git a/src/tests/scenario3/l3/deploy_specs.sh b/src/tests/scenario3/l3/deploy_specs.sh
new file mode 100644
index 0000000000000000000000000000000000000000..8c8264fca75d471c3bbbf0cb523c7a17bcffa5a0
--- /dev/null
+++ b/src/tests/scenario3/l3/deploy_specs.sh
@@ -0,0 +1,148 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+
+# ----- TeraFlowSDN ------------------------------------------------------------
+
+# Set the URL of the internal MicroK8s Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
+
+# Set the list of components, separated by spaces, you want to build images for, and deploy.
+#export TFS_COMPONENTS="context device pathcomp service slice compute webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice webui"
+
+# Uncomment to activate Monitoring
+export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Automation and Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} automation policy"
+
+# Uncomment to activate Optical CyberSecurity
+#export TFS_COMPONENTS="${TFS_COMPONENTS} dbscanserving opticalattackmitigator opticalattackdetector opticalattackmanager"
+
+# Uncomment to activate L3 CyberSecurity
+export TFS_COMPONENTS="${TFS_COMPONENTS} l3_attackmitigator l3_centralizedattackdetector"
+
+# Uncomment to activate TE
+#export TFS_COMPONENTS="${TFS_COMPONENTS} te"
+
+# Set the tag you want to use for your images.
+export TFS_IMAGE_TAG="dev"
+
+# Set the name of the Kubernetes namespace to deploy TFS to.
+export TFS_K8S_NAMESPACE="tfs"
+
+# Set additional manifest files to be applied after the deployment
+export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
+
+# Uncomment to monitor performance of components
+export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/servicemonitors.yaml"
+
+# Uncomment when deploying Optical CyberSecurity
+#export TFS_EXTRA_MANIFESTS="${TFS_EXTRA_MANIFESTS} manifests/cachingservice.yaml"
+
+# Set the new Grafana admin password
+export TFS_GRAFANA_PASSWORD="admin123+"
+
+# Disable skip-build flag to rebuild the Docker images.
+export TFS_SKIP_BUILD=""
+
+
+# ----- CockroachDB ------------------------------------------------------------
+
+# Set the namespace where CockroackDB will be deployed.
+export CRDB_NAMESPACE="crdb"
+
+# Set the external port CockroackDB Postgre SQL interface will be exposed to.
+export CRDB_EXT_PORT_SQL="26257"
+
+# Set the external port CockroackDB HTTP Mgmt GUI interface will be exposed to.
+export CRDB_EXT_PORT_HTTP="8081"
+
+# Set the database username to be used by Context.
+export CRDB_USERNAME="tfs"
+
+# Set the database user's password to be used by Context.
+export CRDB_PASSWORD="tfs123"
+
+# Set the database name to be used by Context.
+export CRDB_DATABASE="tfs"
+
+# Set CockroachDB installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/crdb.sh for additional details
+export CRDB_DEPLOY_MODE="single"
+
+# Disable flag for dropping database, if it exists.
+export CRDB_DROP_DATABASE_IF_EXISTS="YES"
+
+# Disable flag for re-deploying CockroachDB from scratch.
+export CRDB_REDEPLOY=""
+
+
+# ----- NATS -------------------------------------------------------------------
+
+# Set the namespace where NATS will be deployed.
+export NATS_NAMESPACE="nats"
+
+# Set the external port NATS Client interface will be exposed to.
+export NATS_EXT_PORT_CLIENT="4222"
+
+# Set the external port NATS HTTP Mgmt GUI interface will be exposed to.
+export NATS_EXT_PORT_HTTP="8222"
+
+# Disable flag for re-deploying NATS from scratch.
+export NATS_REDEPLOY=""
+
+
+# ----- QuestDB ----------------------------------------------------------------
+
+# Set the namespace where QuestDB will be deployed.
+export QDB_NAMESPACE="qdb"
+
+# Set the external port QuestDB Postgre SQL interface will be exposed to.
+export QDB_EXT_PORT_SQL="8812"
+
+# Set the external port QuestDB Influx Line Protocol interface will be exposed to.
+export QDB_EXT_PORT_ILP="9009"
+
+# Set the external port QuestDB HTTP Mgmt GUI interface will be exposed to.
+export QDB_EXT_PORT_HTTP="9000"
+
+# Set the database username to be used for QuestDB.
+export QDB_USERNAME="admin"
+
+# Set the database user's password to be used for QuestDB.
+export QDB_PASSWORD="quest"
+
+# Set the table name to be used by Monitoring for KPIs.
+export QDB_TABLE_MONITORING_KPIS="tfs_monitoring_kpis"
+
+# Set the table name to be used by Slice for plotting groups.
+export QDB_TABLE_SLICE_GROUPS="tfs_slice_groups"
+
+# Disable flag for dropping tables if they exist.
+export QDB_DROP_TABLES_IF_EXIST="YES"
+
+# Disable flag for re-deploying QuestDB from scratch.
+export QDB_REDEPLOY=""
+
+
+# ----- K8s Observability ------------------------------------------------------
+
+# Set the external port Prometheus Mgmt HTTP GUI interface will be exposed to.
+export PROM_EXT_PORT_HTTP="9090"
+
+# Set the external port Grafana HTTP Dashboards will be exposed to.
+export GRAF_EXT_PORT_HTTP="3000"
diff --git a/src/tests/scenario3/l3/grafana_dashboard.json b/src/tests/scenario3/l3/grafana_dashboard.json
new file mode 100644
index 0000000000000000000000000000000000000000..3376931290b3a63ca9ee70ca8ad558b21e732f6a
--- /dev/null
+++ b/src/tests/scenario3/l3/grafana_dashboard.json
@@ -0,0 +1,1211 @@
+{
+  "overwrite": true,
+  "folderId": 0,
+  "dashboard": {
+    "id": null,
+    "annotations": {
+      "list": [
+        {
+          "builtIn": 1,
+          "datasource": {
+            "type": "datasource",
+            "uid": "grafana"
+          },
+          "enable": true,
+          "hide": true,
+          "iconColor": "rgba(0, 211, 255, 1)",
+          "name": "Annotations & Alerts",
+          "target": {
+            "limit": 100,
+            "matchAny": false,
+            "tags": [],
+            "type": "dashboard"
+          },
+          "type": "dashboard"
+        }
+      ]
+    },
+    "editable": true,
+    "fiscalYearStartMonth": 0,
+    "graphTooltip": 0,
+    "iteration": 1675103296430,
+    "links": [],
+    "liveNow": false,
+    "panels": [
+      {
+        "datasource": {
+          "type": "postgres",
+          "uid": "questdb"
+        },
+        "fieldConfig": {
+          "defaults": {
+            "color": {
+              "mode": "palette-classic"
+            },
+            "custom": {
+              "axisLabel": "",
+              "axisPlacement": "auto",
+              "barAlignment": 0,
+              "drawStyle": "line",
+              "fillOpacity": 0,
+              "gradientMode": "none",
+              "hideFrom": {
+                "legend": false,
+                "tooltip": false,
+                "viz": false
+              },
+              "lineInterpolation": "smooth",
+              "lineWidth": 1,
+              "pointSize": 5,
+              "scaleDistribution": {
+                "type": "linear"
+              },
+              "showPoints": "always",
+              "spanNulls": true,
+              "stacking": {
+                "group": "A",
+                "mode": "none"
+              },
+              "thresholdsStyle": {
+                "mode": "off"
+              }
+            },
+            "mappings": [],
+            "thresholds": {
+              "mode": "absolute",
+              "steps": [
+                {
+                  "color": "green",
+                  "value": null
+                },
+                {
+                  "color": "red",
+                  "value": 80
+                }
+              ]
+            }
+          },
+          "overrides": [
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*PACKETS_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "left"
+                },
+                {
+                  "id": "unit",
+                  "value": "pps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Packets / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            },
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*BYTES_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "right"
+                },
+                {
+                  "id": "unit",
+                  "value": "Bps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Bytes / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            }
+          ]
+        },
+        "gridPos": {
+          "h": 9,
+          "w": 8,
+          "x": 0,
+          "y": 0
+        },
+        "id": 2,
+        "options": {
+          "legend": {
+            "calcs": [
+              "first",
+              "min",
+              "mean",
+              "max",
+              "lastNotNull"
+            ],
+            "displayMode": "table",
+            "placement": "bottom"
+          },
+          "tooltip": {
+            "mode": "multi",
+            "sort": "none"
+          }
+        },
+        "targets": [
+          {
+            "datasource": {
+              "type": "postgres",
+              "uid": "questdb"
+            },
+            "format": "time_series",
+            "group": [],
+            "hide": false,
+            "metricColumn": "kpi_value",
+            "rawQuery": true,
+            "rawSql": "SELECT\r\n  $__time(timestamp), kpi_value AS metric, service_id, kpi_sample_type\r\nFROM\r\n  tfs_monitoring\r\nWHERE\r\n  $__timeFilter(timestamp) AND device_name IN (${device_name}) AND endpoint_name IN (${endpoint_name}) AND kpi_sample_type IN (${kpi_sample_type}) AND kpi_sample_type LIKE 'L3_SECURITY_STATUS_CRYPTO'\r\nGROUP BY\r\n  device_name, endpoint_name, kpi_sample_type\r\nORDER BY\r\n  timestamp",
+            "refId": "A",
+            "select": [
+              [
+                {
+                  "params": [
+                    "kpi_value"
+                  ],
+                  "type": "column"
+                }
+              ]
+            ],
+            "table": "monitoring",
+            "timeColumn": "timestamp",
+            "where": [
+              {
+                "name": "",
+                "params": [
+                  "device_id",
+                  "IN",
+                  "$device_id"
+                ],
+                "type": "expression"
+              }
+            ]
+          }
+        ],
+        "title": "L3 Security Status Crypto",
+        "transformations": [
+          {
+            "id": "renameByRegex",
+            "options": {
+              "regex": "metric {kpi_sample_type=\\\"([^\\\"]+)\\\", service_id=\\\"([^\\\"]+)\\\"}",
+              "renamePattern": "Security Status Crypto - L3 (Service Id: $2)"
+            }
+          }
+        ],
+        "type": "timeseries"
+      },
+      {
+        "datasource": {
+          "type": "postgres",
+          "uid": "questdb"
+        },
+        "fieldConfig": {
+          "defaults": {
+            "color": {
+              "fixedColor": "#2635d4",
+              "mode": "fixed"
+            },
+            "custom": {
+              "axisLabel": "",
+              "axisPlacement": "auto",
+              "barAlignment": 0,
+              "drawStyle": "line",
+              "fillOpacity": 0,
+              "gradientMode": "none",
+              "hideFrom": {
+                "legend": false,
+                "tooltip": false,
+                "viz": false
+              },
+              "lineInterpolation": "smooth",
+              "lineWidth": 1,
+              "pointSize": 5,
+              "scaleDistribution": {
+                "type": "linear"
+              },
+              "showPoints": "always",
+              "spanNulls": true,
+              "stacking": {
+                "group": "A",
+                "mode": "none"
+              },
+              "thresholdsStyle": {
+                "mode": "off"
+              }
+            },
+            "mappings": [],
+            "thresholds": {
+              "mode": "absolute",
+              "steps": [
+                {
+                  "color": "green",
+                  "value": null
+                },
+                {
+                  "color": "red",
+                  "value": 80
+                }
+              ]
+            }
+          },
+          "overrides": [
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*PACKETS_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "left"
+                },
+                {
+                  "id": "unit",
+                  "value": "pps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Packets / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            },
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*BYTES_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "right"
+                },
+                {
+                  "id": "unit",
+                  "value": "Bps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Bytes / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            }
+          ]
+        },
+        "gridPos": {
+          "h": 9,
+          "w": 8,
+          "x": 8,
+          "y": 0
+        },
+        "id": 3,
+        "options": {
+          "legend": {
+            "calcs": [
+              "first",
+              "min",
+              "mean",
+              "max",
+              "lastNotNull"
+            ],
+            "displayMode": "table",
+            "placement": "bottom"
+          },
+          "tooltip": {
+            "mode": "multi",
+            "sort": "none"
+          }
+        },
+        "targets": [
+          {
+            "datasource": {
+              "type": "postgres",
+              "uid": "questdb"
+            },
+            "format": "time_series",
+            "group": [],
+            "hide": false,
+            "metricColumn": "kpi_value",
+            "rawQuery": true,
+            "rawSql": "SELECT\r\n  $__time(timestamp), kpi_value AS metric, service_id, kpi_sample_type\r\nFROM\r\n  tfs_monitoring\r\nWHERE\r\n  $__timeFilter(timestamp) AND device_name IN (${device_name}) AND endpoint_name IN (${endpoint_name}) AND kpi_sample_type IN (${kpi_sample_type}) AND kpi_sample_type LIKE 'ML_CONFIDENCE'\r\nGROUP BY\r\n  device_name, endpoint_name, kpi_sample_type\r\nORDER BY\r\n  timestamp",
+            "refId": "A",
+            "select": [
+              [
+                {
+                  "params": [
+                    "kpi_value"
+                  ],
+                  "type": "column"
+                }
+              ]
+            ],
+            "table": "monitoring",
+            "timeColumn": "timestamp",
+            "where": [
+              {
+                "name": "",
+                "params": [
+                  "device_id",
+                  "IN",
+                  "$device_id"
+                ],
+                "type": "expression"
+              }
+            ]
+          }
+        ],
+        "title": "L3 ML Confidence",
+        "transformations": [
+          {
+            "id": "renameByRegex",
+            "options": {
+              "regex": "metric {kpi_sample_type=\\\"([^\\\"]+)\\\", service_id=\\\"([^\\\"]+)\\\"}",
+              "renamePattern": "ML Confidence - L3 (Service Id: $2)"
+            }
+          }
+        ],
+        "type": "timeseries"
+      },
+      {
+        "datasource": {
+          "type": "postgres",
+          "uid": "questdb"
+        },
+        "fieldConfig": {
+          "defaults": {
+            "color": {
+              "fixedColor": "dark-orange",
+              "mode": "fixed"
+            },
+            "custom": {
+              "axisLabel": "",
+              "axisPlacement": "auto",
+              "barAlignment": 0,
+              "drawStyle": "line",
+              "fillOpacity": 0,
+              "gradientMode": "none",
+              "hideFrom": {
+                "legend": false,
+                "tooltip": false,
+                "viz": false
+              },
+              "lineInterpolation": "smooth",
+              "lineWidth": 1,
+              "pointSize": 5,
+              "scaleDistribution": {
+                "type": "linear"
+              },
+              "showPoints": "always",
+              "spanNulls": true,
+              "stacking": {
+                "group": "A",
+                "mode": "none"
+              },
+              "thresholdsStyle": {
+                "mode": "off"
+              }
+            },
+            "mappings": [],
+            "thresholds": {
+              "mode": "absolute",
+              "steps": [
+                {
+                  "color": "green",
+                  "value": null
+                },
+                {
+                  "color": "red",
+                  "value": 80
+                }
+              ]
+            }
+          },
+          "overrides": [
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*PACKETS_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "left"
+                },
+                {
+                  "id": "unit",
+                  "value": "pps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Packets / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            },
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*BYTES_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "right"
+                },
+                {
+                  "id": "unit",
+                  "value": "Bps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Bytes / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            }
+          ]
+        },
+        "gridPos": {
+          "h": 9,
+          "w": 8,
+          "x": 16,
+          "y": 0
+        },
+        "id": 4,
+        "options": {
+          "legend": {
+            "calcs": [
+              "first",
+              "min",
+              "mean",
+              "max",
+              "lastNotNull"
+            ],
+            "displayMode": "table",
+            "placement": "bottom"
+          },
+          "tooltip": {
+            "mode": "multi",
+            "sort": "none"
+          }
+        },
+        "targets": [
+          {
+            "datasource": {
+              "type": "postgres",
+              "uid": "questdb"
+            },
+            "format": "time_series",
+            "group": [],
+            "hide": false,
+            "metricColumn": "kpi_value",
+            "rawQuery": true,
+            "rawSql": "SELECT\r\n  $__time(timestamp), kpi_value AS metric, service_id, kpi_sample_type\r\nFROM\r\n  tfs_monitoring\r\nWHERE\r\n  $__timeFilter(timestamp) AND device_name IN (${device_name}) AND endpoint_name IN (${endpoint_name}) AND kpi_sample_type IN (${kpi_sample_type}) AND kpi_sample_type LIKE 'L3_UNIQUE_ATTACK_CONNS'\r\nGROUP BY\r\n  device_name, endpoint_name, kpi_sample_type\r\nORDER BY\r\n  timestamp",
+            "refId": "A",
+            "select": [
+              [
+                {
+                  "params": [
+                    "kpi_value"
+                  ],
+                  "type": "column"
+                }
+              ]
+            ],
+            "table": "monitoring",
+            "timeColumn": "timestamp",
+            "where": [
+              {
+                "name": "",
+                "params": [
+                  "device_id",
+                  "IN",
+                  "$device_id"
+                ],
+                "type": "expression"
+              }
+            ]
+          }
+        ],
+        "title": "L3 Unique Attack Connections",
+        "transformations": [
+          {
+            "id": "renameByRegex",
+            "options": {
+              "regex": "metric {kpi_sample_type=\\\"([^\\\"]+)\\\", service_id=\\\"([^\\\"]+)\\\"}",
+              "renamePattern": "Unique Attack Connections - L3 (Service Id: $2)"
+            }
+          }
+        ],
+        "type": "timeseries"
+      },
+      {
+        "datasource": {
+          "type": "postgres",
+          "uid": "questdb"
+        },
+        "fieldConfig": {
+          "defaults": {
+            "color": {
+              "fixedColor": "#ad3fe3",
+              "mode": "fixed"
+            },
+            "custom": {
+              "axisLabel": "",
+              "axisPlacement": "auto",
+              "barAlignment": 0,
+              "drawStyle": "line",
+              "fillOpacity": 0,
+              "gradientMode": "none",
+              "hideFrom": {
+                "legend": false,
+                "tooltip": false,
+                "viz": false
+              },
+              "lineInterpolation": "smooth",
+              "lineWidth": 1,
+              "pointSize": 5,
+              "scaleDistribution": {
+                "type": "linear"
+              },
+              "showPoints": "always",
+              "spanNulls": true,
+              "stacking": {
+                "group": "A",
+                "mode": "none"
+              },
+              "thresholdsStyle": {
+                "mode": "off"
+              }
+            },
+            "mappings": [],
+            "thresholds": {
+              "mode": "absolute",
+              "steps": [
+                {
+                  "color": "green",
+                  "value": null
+                },
+                {
+                  "color": "red",
+                  "value": 80
+                }
+              ]
+            }
+          },
+          "overrides": [
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*PACKETS_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "left"
+                },
+                {
+                  "id": "unit",
+                  "value": "pps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Packets / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            },
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*BYTES_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "right"
+                },
+                {
+                  "id": "unit",
+                  "value": "Bps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Bytes / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            }
+          ]
+        },
+        "gridPos": {
+          "h": 9,
+          "w": 12,
+          "x": 0,
+          "y": 9
+        },
+        "id": 5,
+        "options": {
+          "legend": {
+            "calcs": [
+              "first",
+              "min",
+              "mean",
+              "max",
+              "lastNotNull"
+            ],
+            "displayMode": "table",
+            "placement": "bottom"
+          },
+          "tooltip": {
+            "mode": "multi",
+            "sort": "none"
+          }
+        },
+        "targets": [
+          {
+            "datasource": {
+              "type": "postgres",
+              "uid": "questdb"
+            },
+            "format": "time_series",
+            "group": [],
+            "hide": false,
+            "metricColumn": "kpi_value",
+            "rawQuery": true,
+            "rawSql": "SELECT\r\n  $__time(timestamp), kpi_value AS metric, service_id, kpi_sample_type\r\nFROM\r\n  tfs_monitoring\r\nWHERE\r\n  $__timeFilter(timestamp) AND device_name IN (${device_name}) AND endpoint_name IN (${endpoint_name}) AND kpi_sample_type IN (${kpi_sample_type}) AND kpi_sample_type LIKE 'L3_UNIQUE_COMPROMISED_CLIENTS'\r\nGROUP BY\r\n  device_name, endpoint_name, kpi_sample_type\r\nORDER BY\r\n  timestamp",
+            "refId": "A",
+            "select": [
+              [
+                {
+                  "params": [
+                    "kpi_value"
+                  ],
+                  "type": "column"
+                }
+              ]
+            ],
+            "table": "monitoring",
+            "timeColumn": "timestamp",
+            "where": [
+              {
+                "name": "",
+                "params": [
+                  "device_id",
+                  "IN",
+                  "$device_id"
+                ],
+                "type": "expression"
+              }
+            ]
+          }
+        ],
+        "title": "L3 Unique Compromised Clients",
+        "transformations": [
+          {
+            "id": "renameByRegex",
+            "options": {
+              "regex": "metric {kpi_sample_type=\\\"([^\\\"]+)\\\", service_id=\\\"([^\\\"]+)\\\"}",
+              "renamePattern": "Unique Compromised Clients - L3 (Service Id: $2)"
+            }
+          }
+        ],
+        "type": "timeseries"
+      },
+      {
+        "datasource": {
+          "type": "postgres",
+          "uid": "questdb"
+        },
+        "fieldConfig": {
+          "defaults": {
+            "color": {
+              "fixedColor": "#f6ca1b",
+              "mode": "fixed"
+            },
+            "custom": {
+              "axisLabel": "",
+              "axisPlacement": "auto",
+              "barAlignment": 0,
+              "drawStyle": "line",
+              "fillOpacity": 0,
+              "gradientMode": "none",
+              "hideFrom": {
+                "legend": false,
+                "tooltip": false,
+                "viz": false
+              },
+              "lineInterpolation": "smooth",
+              "lineWidth": 1,
+              "pointSize": 5,
+              "scaleDistribution": {
+                "type": "linear"
+              },
+              "showPoints": "always",
+              "spanNulls": true,
+              "stacking": {
+                "group": "A",
+                "mode": "none"
+              },
+              "thresholdsStyle": {
+                "mode": "off"
+              }
+            },
+            "mappings": [],
+            "thresholds": {
+              "mode": "absolute",
+              "steps": [
+                {
+                  "color": "green",
+                  "value": null
+                },
+                {
+                  "color": "red",
+                  "value": 80
+                }
+              ]
+            }
+          },
+          "overrides": [
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*PACKETS_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "left"
+                },
+                {
+                  "id": "unit",
+                  "value": "pps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Packets / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            },
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*BYTES_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "right"
+                },
+                {
+                  "id": "unit",
+                  "value": "Bps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Bytes / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            }
+          ]
+        },
+        "gridPos": {
+          "h": 9,
+          "w": 12,
+          "x": 12,
+          "y": 9
+        },
+        "id": 6,
+        "options": {
+          "legend": {
+            "calcs": [
+              "first",
+              "min",
+              "mean",
+              "max",
+              "lastNotNull"
+            ],
+            "displayMode": "table",
+            "placement": "bottom"
+          },
+          "tooltip": {
+            "mode": "multi",
+            "sort": "none"
+          }
+        },
+        "targets": [
+          {
+            "datasource": {
+              "type": "postgres",
+              "uid": "questdb"
+            },
+            "format": "time_series",
+            "group": [],
+            "hide": false,
+            "metricColumn": "kpi_value",
+            "rawQuery": true,
+            "rawSql": "SELECT\r\n  $__time(timestamp), kpi_value AS metric, service_id, kpi_sample_type\r\nFROM\r\n  tfs_monitoring\r\nWHERE\r\n  $__timeFilter(timestamp) AND device_name IN (${device_name}) AND endpoint_name IN (${endpoint_name}) AND kpi_sample_type IN (${kpi_sample_type}) AND kpi_sample_type LIKE 'L3_UNIQUE_ATTACKERS'\r\nGROUP BY\r\n  device_name, endpoint_name, kpi_sample_type\r\nORDER BY\r\n  timestamp",
+            "refId": "A",
+            "select": [
+              [
+                {
+                  "params": [
+                    "kpi_value"
+                  ],
+                  "type": "column"
+                }
+              ]
+            ],
+            "table": "monitoring",
+            "timeColumn": "timestamp",
+            "where": [
+              {
+                "name": "",
+                "params": [
+                  "device_id",
+                  "IN",
+                  "$device_id"
+                ],
+                "type": "expression"
+              }
+            ]
+          }
+        ],
+        "title": "L3 Unique Attackers",
+        "transformations": [
+          {
+            "id": "renameByRegex",
+            "options": {
+              "regex": "metric {kpi_sample_type=\\\"([^\\\"]+)\\\", service_id=\\\"([^\\\"]+)\\\"}",
+              "renamePattern": "Unique Attackers - L3 (Service Id: $2)"
+            }
+          }
+        ],
+        "type": "timeseries"
+      },
+      {
+        "datasource": {
+          "type": "postgres",
+          "uid": "questdb"
+        },
+        "fieldConfig": {
+          "defaults": {
+            "color": {
+              "mode": "palette-classic"
+            },
+            "custom": {
+              "axisLabel": "",
+              "axisPlacement": "auto",
+              "barAlignment": 0,
+              "drawStyle": "line",
+              "fillOpacity": 0,
+              "gradientMode": "none",
+              "hideFrom": {
+                "legend": false,
+                "tooltip": false,
+                "viz": false
+              },
+              "lineInterpolation": "smooth",
+              "lineWidth": 1,
+              "pointSize": 5,
+              "scaleDistribution": {
+                "type": "linear"
+              },
+              "showPoints": "always",
+              "spanNulls": true,
+              "stacking": {
+                "group": "A",
+                "mode": "none"
+              },
+              "thresholdsStyle": {
+                "mode": "off"
+              }
+            },
+            "mappings": [],
+            "thresholds": {
+              "mode": "absolute",
+              "steps": [
+                {
+                  "color": "green",
+                  "value": null
+                },
+                {
+                  "color": "red",
+                  "value": 80
+                }
+              ]
+            }
+          },
+          "overrides": [
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*PACKETS_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "left"
+                },
+                {
+                  "id": "unit",
+                  "value": "pps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Packets / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            },
+            {
+              "matcher": {
+                "id": "byRegexp",
+                "options": ".*BYTES_.*"
+              },
+              "properties": [
+                {
+                  "id": "custom.axisPlacement",
+                  "value": "right"
+                },
+                {
+                  "id": "unit",
+                  "value": "Bps"
+                },
+                {
+                  "id": "custom.axisLabel",
+                  "value": "Bytes / sec"
+                },
+                {
+                  "id": "custom.axisSoftMin",
+                  "value": 0
+                }
+              ]
+            }
+          ]
+        },
+        "gridPos": {
+          "h": 19,
+          "w": 24,
+          "x": 0,
+          "y": 18
+        },
+        "id": 7,
+        "options": {
+          "legend": {
+            "calcs": [
+              "first",
+              "min",
+              "mean",
+              "max",
+              "lastNotNull"
+            ],
+            "displayMode": "table",
+            "placement": "bottom"
+          },
+          "tooltip": {
+            "mode": "multi",
+            "sort": "none"
+          }
+        },
+        "targets": [
+          {
+            "datasource": {
+              "type": "postgres",
+              "uid": "questdb"
+            },
+            "format": "time_series",
+            "group": [],
+            "hide": false,
+            "metricColumn": "kpi_value",
+            "rawQuery": true,	
+            "rawSql": "SELECT\r\n  $__time(timestamp), kpi_value AS metric, device_name, endpoint_name, kpi_sample_type\r\nFROM\r\n  tfs_monitoring\r\nWHERE\r\n  $__timeFilter(timestamp) AND device_name IN (${device_name}) AND endpoint_name IN (${endpoint_name}) AND kpi_sample_type IN (${kpi_sample_type})\r\nGROUP BY\r\n  device_name, endpoint_name, kpi_sample_type\r\nORDER BY\r\n  timestamp",	
+            "refId": "A",
+            "select": [
+              [
+                {
+                  "params": [
+                    "kpi_value"
+                  ],
+                  "type": "column"
+                }
+              ]
+            ],
+            "table": "monitoring",
+            "timeColumn": "timestamp",
+            "where": [
+              {
+                "name": "",
+                "params": [
+                  "device_id",
+                  "IN",
+                  "$device_id"
+                ],
+                "type": "expression"
+              }
+            ]
+          }
+        ],
+        "title": "L3 Monitoring Packets/Bytes Received/Sent",
+        "transformations": [
+          {
+            "id": "renameByRegex",
+            "options": {	
+              "regex": "metric {device_name=\\\"([^\\\"]+)\\\", endpoint_name=\\\"([^\\\"]+)\\\", kpi_sample_type=\\\"([^\\\"]+)\\\"}",	
+              "renamePattern": "$3 ($1 : $2)"	
+            }
+          }
+        ],
+        "type": "timeseries"
+      }
+    ],
+    "refresh": "5s",
+    "schemaVersion": 36,
+    "style": "dark",
+    "tags": [],
+    "templating": {
+      "list": [
+        {
+          "current": {
+            "selected": true,
+            "text": [
+              "All"
+            ],
+            "value": [
+              "$__all"
+            ]
+          },
+          "datasource": {
+            "type": "postgres",
+            "uid": "questdb"
+          },
+          "definition": "SELECT DISTINCT device_name FROM tfs_monitoring;",
+          "hide": 0,
+          "includeAll": true,
+          "label": "Device",
+          "multi": true,
+          "name": "device_name",
+          "options": [],
+          "query": "SELECT DISTINCT device_name FROM tfs_monitoring;",
+          "refresh": 2,
+          "regex": "",
+          "skipUrlSync": false,
+          "sort": 0,
+          "type": "query"
+        },
+        {
+          "current": {
+            "selected": true,
+            "text": [
+              "All"
+            ],
+            "value": [
+              "$__all"
+            ]
+          },
+          "datasource": {
+            "type": "postgres",
+            "uid": "questdb"
+          },
+          "definition": "SELECT DISTINCT endpoint_name FROM tfs_monitoring WHERE device_name IN (${device_name})",
+          "hide": 0,
+          "includeAll": true,
+          "label": "EndPoint",
+          "multi": true,
+          "name": "endpoint_name",
+          "options": [],
+          "query": "SELECT DISTINCT endpoint_name FROM tfs_monitoring WHERE device_name IN (${device_name})",
+          "refresh": 2,
+          "regex": "",
+          "skipUrlSync": false,
+          "sort": 0,
+          "type": "query"
+        },
+        {
+          "current": {
+            "selected": true,
+            "text": [
+              "All"
+            ],
+            "value": [
+              "$__all"
+            ]
+          },
+          "datasource": {
+            "type": "postgres",
+            "uid": "questdb"
+          },
+          "definition": "SELECT DISTINCT kpi_sample_type FROM tfs_monitoring;",
+          "hide": 0,
+          "includeAll": true,
+          "label": "Kpi Sample Type",
+          "multi": true,
+          "name": "kpi_sample_type",
+          "options": [],
+          "query": "SELECT DISTINCT kpi_sample_type FROM tfs_monitoring;",
+          "refresh": 2,
+          "regex": "",
+          "skipUrlSync": false,
+          "sort": 0,
+          "type": "query"
+        }
+      ]
+    },
+    "time": {
+      "from": "now-5m",
+      "to": "now"
+    },
+    "timepicker": {},
+    "timezone": "utc",
+    "title": "L3 Monitoring",
+    "uid": "tf-l3-monit",
+    "version": 6,
+    "weekStart": ""
+  }
+}
\ No newline at end of file
diff --git a/src/tests/scenario3/l3/run.sh b/src/tests/scenario3/l3/run.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c62ea89ea7e9bfd15e387af56ec19f23206df945
--- /dev/null
+++ b/src/tests/scenario3/l3/run.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# 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
+#
+#      http://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.
+
+# Deploy TeraFlowSDN with L3 Cybersecurity Components for Attack Detection and Mitigation
+echo "Deploying TFS with L3 Cybersecurity Components for Attack Detection and Mitigation..."
+./deploy.sh
+echo "TFS deployed."
+
+# Deploy Distributed Attack Detector
+if $DAD_NODE_PASSWORD == "" || $DAD_NODE_IP == ""; then
+    echo "Please set the DAD_NODE_PASSWORD and DAD_NODE_IP environment variables."
+    exit 1
+fi
+
+echo "Deploying Distributed Attack Detector..."
+sshpass -p $DAD_NODE_PASSWORD ssh -o StrictHostKeyChecking=no -n -f ubuntu@$DAD_NODE_IP "sh -c 'nohup /home/ubuntu/TeraflowDockerDistributed/restart.sh > /dev/null 2>&1 &'"
+echo "Distributed Attack Detector deployed."
\ No newline at end of file
diff --git a/src/tests/scenario3/optical/ofc23/run_experiment_demo.py b/src/tests/scenario3/optical/ofc23/run_experiment_demo.py
index 16ddb9c315784c39258aaf0f342ebd8da35b17e8..2f09f8d5aba38c865a20a2e57d22630d380a2b1b 100644
--- a/src/tests/scenario3/optical/ofc23/run_experiment_demo.py
+++ b/src/tests/scenario3/optical/ofc23/run_experiment_demo.py
@@ -21,8 +21,7 @@ import threading
 import redis
 from kubernetes import client, config
 
-from common.Constants import ServiceNameEnum
-from common.Settings import get_service_host, get_setting, wait_for_environment_variables
+from common.Settings import get_setting, wait_for_environment_variables
 
 # Configs can be set in Configuration class directly or using helper utility
 namespace = get_setting("TFS_K8S_NAMESPACE", default="tfs")
diff --git a/src/webui/grafana_db_mon_kpis_psql.json b/src/webui/grafana_db_mon_kpis_psql.json
index 845ed4296605b6a0d15f38c9a20576a93195543e..df72f9ab052c02d5a4af7e7923a96fe968116103 100644
--- a/src/webui/grafana_db_mon_kpis_psql.json
+++ b/src/webui/grafana_db_mon_kpis_psql.json
@@ -144,7 +144,6 @@
         "options": {
           "legend": {
             "calcs": [
-              "first",
               "min",
               "mean",
               "max",
diff --git a/src/webui/service/device/forms.py b/src/webui/service/device/forms.py
index 24bc92b3a5a4aec4321c07b17830f6111be7176d..e884e96a511ab90625bda257075c80adce4406cd 100644
--- a/src/webui/service/device/forms.py
+++ b/src/webui/service/device/forms.py
@@ -18,10 +18,10 @@ from wtforms.validators import DataRequired, Length, NumberRange, ValidationErro
 from common.proto.context_pb2 import DeviceOperationalStatusEnum
 
 class AddDeviceForm(FlaskForm):
-    device_id = StringField('ID', 
-                           validators=[DataRequired(), Length(min=5)])
+    device_id = StringField('ID', validators=[DataRequired(), Length(min=5)])
     device_type = SelectField('Type')
     operational_status = SelectField('Operational Status', coerce=int, validators=[NumberRange(min=0)])
+
     device_drivers_undefined = BooleanField('UNDEFINED / EMULATED')
     device_drivers_openconfig = BooleanField('OPENCONFIG')
     device_drivers_transport_api = BooleanField('TRANSPORT_API')
@@ -30,9 +30,12 @@ class AddDeviceForm(FlaskForm):
     device_drivers_onf_tr_352 = BooleanField('ONF_TR_352')
     device_drivers_xr = BooleanField('XR')
     device_drivers_ietf_l2vpn = BooleanField('IETF L2VPN')
+    device_drivers_gnmi_openconfig = BooleanField('GNMI OPENCONFIG')
+
     device_config_address = StringField('connect/address',default='127.0.0.1',validators=[DataRequired(), Length(min=5)])
     device_config_port = StringField('connect/port',default='0',validators=[DataRequired(), Length(min=1)])
     device_config_settings = TextAreaField('connect/settings',default='{}',validators=[DataRequired(), Length(min=2)])
+
     submit = SubmitField('Add')
 
     def validate_operational_status(form, field):
diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py
index bc46847704b28fb6ef44de0aae030ccb67935928..4590c7f01a24e801ecc775ad0b22cf0dcdea3452 100644
--- a/src/webui/service/device/routes.py
+++ b/src/webui/service/device/routes.py
@@ -122,6 +122,8 @@ def add():
             device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_XR)
         if form.device_drivers_ietf_l2vpn.data:
             device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_IETF_L2VPN)
+        if form.device_drivers_gnmi_openconfig.data:
+            device_drivers.append(DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG)
         device_obj.device_drivers.extend(device_drivers) # pylint: disable=no-member
 
         try:
diff --git a/src/webui/service/templates/device/add.html b/src/webui/service/templates/device/add.html
index 6b11a19208cc9c10daa4b7615ff46ac627162573..c9165667dd8c089e91400f652177b4ca4ec98010 100644
--- a/src/webui/service/templates/device/add.html
+++ b/src/webui/service/templates/device/add.html
@@ -81,20 +81,17 @@
                     {% endfor %}
                 </div>
                 {% else %}
-                {{ form.device_drivers_undefined }} {{ form.device_drivers_undefined.label(class="col-sm-3
-                col-form-label") }}
-                {{ form.device_drivers_openconfig }} {{ form.device_drivers_openconfig.label(class="col-sm-3
-                col-form-label") }}
-                {{ form.device_drivers_transport_api }} {{ form.device_drivers_transport_api.label(class="col-sm-3
-                col-form-label") }}
-                <br />{{ form.device_drivers_p4 }} {{ form.device_drivers_p4.label(class="col-sm-3 col-form-label") }}
-                {{ form.device_drivers_ietf_network_topology }} {{
-                form.device_drivers_ietf_network_topology.label(class="col-sm-3
-                col-form-label") }}
-                {{ form.device_drivers_onf_tr_352 }} {{ form.device_drivers_onf_tr_352.label(class="col-sm-3
-                col-form-label") }}<br />
-                {{ form.device_drivers_xr }} {{ form.device_drivers_xr.label(class="col-sm-3
-                col-form-label") }}
+                {{ form.device_drivers_undefined }} {{ form.device_drivers_undefined.label(class="col-sm-3 col-form-label") }}
+                {{ form.device_drivers_openconfig }} {{ form.device_drivers_openconfig.label(class="col-sm-3 col-form-label") }}
+                {{ form.device_drivers_transport_api }} {{ form.device_drivers_transport_api.label(class="col-sm-3 col-form-label") }}
+                <br />
+                {{ form.device_drivers_p4 }} {{ form.device_drivers_p4.label(class="col-sm-3 col-form-label") }}
+                {{ form.device_drivers_ietf_network_topology }} {{form.device_drivers_ietf_network_topology.label(class="col-sm-3 col-form-label") }}
+                {{ form.device_drivers_onf_tr_352 }} {{ form.device_drivers_onf_tr_352.label(class="col-sm-3 col-form-label") }}
+                <br />
+                {{ form.device_drivers_xr }} {{ form.device_drivers_xr.label(class="col-sm-3 col-form-label") }}
+                {{ form.device_drivers_ietf_l2vpn }} {{ form.device_drivers_ietf_l2vpn.label(class="col-sm-3 col-form-label") }}
+                {{ form.device_drivers_gnmi_openconfig }} {{ form.device_drivers_gnmi_openconfig.label(class="col-sm-3 col-form-label") }}
                 {% endif %}
             </div>
         </div>
diff --git a/src/webui/service/templates/device/detail.html b/src/webui/service/templates/device/detail.html
index 4d33578e2532c26b4062565bd2cbb52106773a1a..c35ae163d3f8344f1ebb49241cc15a4afa3401d5 100644
--- a/src/webui/service/templates/device/detail.html
+++ b/src/webui/service/templates/device/detail.html
@@ -63,6 +63,7 @@
                     <th scope="col">Endpoint UUID</th>
                     <th scope="col">Name</th>
                     <th scope="col">Type</th>
+                    <th scope="col">Location</th>
                 </tr>
             </thead>
             <tbody>
@@ -77,6 +78,9 @@
                     <td>
                         {{ endpoint.endpoint_type }}
                     </td>
+                    <td>
+                        {{ endpoint.endpoint_location }}
+                    </td>
                 </tr>
                 {% endfor %}
             </tbody>