diff --git a/.gitignore b/.gitignore
index e0f9e5485d5425ab6fd4e1f45420364c64a93f82..f60aea166219ad25508111e1a6704dd89de93370 100644
--- a/.gitignore
+++ b/.gitignore
@@ -179,5 +179,3 @@ libyang/
 # Other logs
 **/logs/*.log.*
 
-# PySpark checkpoints
-src/analytics/.spark/*
diff --git a/common_requirements.in b/common_requirements.in
index e1bcad78bfc23217633fb28ef28a2d70d070644a..b277265768c9726f17ab046d8aa932167615f523 100644
--- a/common_requirements.in
+++ b/common_requirements.in
@@ -15,6 +15,7 @@
 coverage==6.3
 grpcio==1.47.*
 grpcio-health-checking==1.47.*
+grpcio-reflection==1.47.*
 grpcio-tools==1.47.*
 grpclib==0.4.4
 prettytable==3.5.0
diff --git a/deploy/all.sh b/deploy/all.sh
index 97f4db37d53f4a7fcca850c51a5bfe6cc7653cb4..f3075949e036c5fee17969f20199c20ed7d983d3 100755
--- a/deploy/all.sh
+++ b/deploy/all.sh
@@ -215,6 +215,9 @@ export GRAF_EXT_PORT_HTTP=${GRAF_EXT_PORT_HTTP:-"3000"}
 # Deploy Apache Kafka
 ./deploy/kafka.sh
 
+#Deploy Monitoring (Prometheus, Mimir, Grafana)
+./deploy/monitoring.sh
+
 # Expose Dashboard
 ./deploy/expose_dashboard.sh
 
diff --git a/deploy/monitoring.sh b/deploy/monitoring.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6fa633a378d133d258b96a4b41dbd7de833690d9
--- /dev/null
+++ b/deploy/monitoring.sh
@@ -0,0 +1,132 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 -euo pipefail
+
+# -----------------------------------------------------------
+# Global namespace for all deployments
+# -----------------------------------------------------------
+NAMESPACE="monitoring"
+VALUES_FILE_PATH="manifests/monitoring"
+
+# -----------------------------------------------------------
+# Prometheus Configuration
+# -----------------------------------------------------------
+RELEASE_NAME_PROM="mon-prometheus"
+CHART_REPO_NAME_PROM="prometheus-community"
+CHART_REPO_URL_PROM="https://prometheus-community.github.io/helm-charts"
+CHART_NAME_PROM="prometheus"
+VALUES_FILE_PROM="$VALUES_FILE_PATH/prometheus_values.yaml"
+
+# -----------------------------------------------------------
+# Mimir Configuration
+# -----------------------------------------------------------
+# RELEASE_NAME_MIMIR="mon-mimir"
+# CHART_REPO_NAME_MIMIR="grafana"
+# CHART_REPO_URL_MIMIR="https://grafana.github.io/helm-charts"
+# CHART_NAME_MIMIR="mimir-distributed"
+# VALUES_FILE_MIMIR="$VALUES_FILE_PATH/mimir_values.yaml"
+
+# -----------------------------------------------------------
+# Grafana Configuration
+# -----------------------------------------------------------
+# RELEASE_NAME_GRAFANA="mon-grafana"
+# CHART_REPO_NAME_GRAFANA="grafana"
+# CHART_REPO_URL_GRAFANA="https://grafana.github.io/helm-charts"
+# CHART_NAME_GRAFANA="grafana"
+# VALUES_FILE_GRAFANA="$VALUES_FILE_PATH/grafana_values.yaml"
+
+
+# -----------------------------------------------------------
+# Function to deploy or upgrade a Helm chart
+# -----------------------------------------------------------
+deploy_chart() {
+  local release_name="$1"
+  local chart_repo_name="$2"
+  local chart_repo_url="$3"
+  local chart_name="$4"
+  local values_file="$5"
+  local namespace="$6"
+
+  echo ">>> Deploying [${release_name}] from repo [${chart_repo_name}]..."
+
+  # Add or update the Helm repo
+  echo "Adding/updating Helm repo: $chart_repo_name -> $chart_repo_url"
+  helm repo add "$chart_repo_name" "$chart_repo_url" || true
+  helm repo update
+
+  # Create namespace if needed
+  echo "Creating namespace '$namespace' if it doesn't exist..."
+  kubectl get namespace "$namespace" >/dev/null 2>&1 || kubectl create namespace "$namespace"
+
+  # Install or upgrade the chart
+  if [ -n "$values_file" ] && [ -f "$values_file" ]; then
+    echo "Installing/Upgrading $release_name using custom values from $values_file..."
+    helm upgrade --install "$release_name" "$chart_repo_name/$chart_name" \
+      --namespace "$namespace" \
+      --values "$values_file"
+  else
+    echo "Installing/Upgrading $release_name with default chart values..."
+    helm upgrade --install "$release_name" "$chart_repo_name/$chart_name" \
+      --namespace "$namespace"
+  fi
+
+  echo "<<< Deployment initiated for [$release_name]."
+  echo
+}
+
+
+# -----------------------------------------------------------
+# Actual Deployments
+# -----------------------------------------------------------
+
+# 1) Deploy Prometheus
+deploy_chart "$RELEASE_NAME_PROM" \
+             "$CHART_REPO_NAME_PROM" \
+             "$CHART_REPO_URL_PROM" \
+             "$CHART_NAME_PROM" \
+             "$VALUES_FILE_PROM" \
+             "$NAMESPACE"
+
+# Optionally wait for Prometheus server pod to become ready
+kubectl rollout status deployment/"$RELEASE_NAME_PROM-server" -n "$NAMESPACE" || true
+
+
+# 2) Deploy Mimir
+# deploy_chart "$RELEASE_NAME_MIMIR" \
+#              "$CHART_REPO_NAME_MIMIR" \
+#              "$CHART_REPO_URL_MIMIR" \
+#              "$CHART_NAME_MIMIR" \
+#              "$VALUES_FILE_MIMIR" \
+#              "$NAMESPACE"
+
+# Depending on how Mimir runs (StatefulSets, Deployments), you can wait for
+# the correct resource to be ready. For example:
+# kubectl rollout status statefulset/"$RELEASE_NAME_MIMIR-distributor" -n "$NAMESPACE" || true
+
+
+# 3) Deploy Grafana
+# deploy_chart "$RELEASE_NAME_GRAFANA" \
+#              "$CHART_REPO_NAME_GRAFANA" \
+#              "$CHART_REPO_URL_GRAFANA" \
+#              "$CHART_NAME_GRAFANA" \
+#              "$VALUES_FILE_GRAFANA" \
+#              "$NAMESPACE"
+
+# kubectl rollout status deployment/"$RELEASE_NAME_GRAFANA" -n "$NAMESPACE" || true
+
+# -----------------------------------------------------------
+echo "All deployments completed!"
+
diff --git a/manifests/kpi_value_writerservice.yaml b/manifests/kpi_value_writerservice.yaml
index f98be462990fff4d678e41144511a284e2dd4f6c..27c61c9331606cc3e404a5b928696674a53356c0 100644
--- a/manifests/kpi_value_writerservice.yaml
+++ b/manifests/kpi_value_writerservice.yaml
@@ -39,6 +39,8 @@ spec:
           env:
             - name: LOG_LEVEL
               value: "INFO"
+            - name: PUSHGATEWAY_URL
+              value: "http://mon-prometheus-prometheus-pushgateway.monitoring.svc.cluster.local:9091"
           envFrom:
             - secretRef:
                 name: kfk-kpi-data
diff --git a/manifests/monitoring/grafana_values.yaml b/manifests/monitoring/grafana_values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a2dbd7971159fa2b506e1f875eb8484f96850f38
--- /dev/null
+++ b/manifests/monitoring/grafana_values.yaml
@@ -0,0 +1,235 @@
+rbac:
+  create: true
+  ## Use an existing ClusterRole/Role (depending on rbac.namespaced false/true)
+  # useExistingRole: name-of-some-role
+  # useExistingClusterRole: name-of-some-clusterRole
+  pspEnabled: false
+  pspUseAppArmor: false
+  namespaced: false
+
+serviceAccount:
+  create: true
+  name:
+  nameTest:
+  ## ServiceAccount labels.
+  automountServiceAccountToken: false
+
+replicas: 1
+
+## Create a headless service for the deployment
+headlessService: false
+
+## Should the service account be auto mounted on the pod
+automountServiceAccountToken: true
+
+## Create HorizontalPodAutoscaler object for deployment type
+#
+autoscaling:
+  enabled: false
+  minReplicas: 1
+  maxReplicas: 3
+  targetCPU: "60"
+  targetMemory: ""
+  behavior: {}
+
+deploymentStrategy:
+  type: RollingUpdate
+
+readinessProbe:
+  httpGet:
+    path: /api/health
+    port: 3000
+
+livenessProbe:
+  httpGet:
+    path: /api/health
+    port: 3000
+  initialDelaySeconds: 60
+  timeoutSeconds: 30
+  failureThreshold: 10
+
+image:
+  registry: docker.io
+  repository: grafana/grafana
+  # Overrides the Grafana image tag whose default is the chart appVersion
+  tag: ""
+  sha: ""
+  pullPolicy: IfNotPresent
+
+  ## Optionally specify an array of imagePullSecrets.
+  ## Secrets must be manually created in the namespace.
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## Can be templated.
+  ##
+  pullSecrets: []
+  #   - myRegistrKeySecretName
+
+testFramework:
+  enabled: true
+  ## The type of Helm hook used to run this test. Defaults to test.
+  ## ref: https://helm.sh/docs/topics/charts_hooks/#the-available-hooks
+  ##
+  # hookType: test
+  image:
+    # -- The Docker registry
+    registry: docker.io
+    repository: bats/bats
+    tag: "v1.4.1"
+  imagePullPolicy: IfNotPresent
+
+# dns configuration for pod
+dnsPolicy: ~
+dnsConfig: {}
+  # nameservers:
+  #   - 8.8.8.8
+  #   options:
+  #   - name: ndots
+  #     value: "2"
+  #   - name: edns0
+
+securityContext:
+  runAsNonRoot: true
+  runAsUser: 472
+  runAsGroup: 472
+  fsGroup: 472
+
+containerSecurityContext:
+  allowPrivilegeEscalation: false
+  capabilities:
+    drop:
+    - ALL
+  seccompProfile:
+    type: RuntimeDefault
+
+# Enable creating the grafana configmap
+createConfigmap: true
+
+downloadDashboardsImage:
+  registry: docker.io
+  repository: curlimages/curl
+  tag: 8.9.1
+  sha: ""
+  pullPolicy: IfNotPresent
+
+downloadDashboards:
+  env: {}
+  envFromSecret: ""
+  resources: {}
+  securityContext:
+    allowPrivilegeEscalation: false
+    capabilities:
+      drop:
+      - ALL
+    seccompProfile:
+      type: RuntimeDefault
+  envValueFrom: {}
+  #  ENV_NAME:
+  #    configMapKeyRef:
+  #      name: configmap-name
+  #      key: value_key
+
+## Pod Annotations
+# podAnnotations: {}
+
+## ConfigMap Annotations
+# configMapAnnotations: {}
+  # argocd.argoproj.io/sync-options: Replace=true
+
+## Pod Labels
+# podLabels: {}
+
+podPortName: grafana
+gossipPortName: gossip
+## Deployment annotations
+# annotations: {}
+
+service:
+  enabled: true
+  type: NodePort
+  port: 80
+  targetPort: 3000
+  nodePort: 30080
+  portName: service
+
+## Enable persistence using Persistent Volume Claims
+## ref: https://kubernetes.io/docs/user-guide/persistent-volumes/
+##
+persistence:
+  type: pvc
+  enabled: true
+  # storageClassName: default
+  accessModes:
+    - ReadWriteOnce
+  size: 10Gi
+  # annotations: {}
+  finalizers:
+    - kubernetes.io/pvc-protection
+
+  disableWarning: false
+
+  ## If 'lookupVolumeName' is set to true, Helm will attempt to retrieve
+  ## the current value of 'spec.volumeName' and incorporate it into the template.
+  lookupVolumeName: true
+
+# Administrator credentials when not using an existing secret (see below)
+adminUser: admin
+# adminPassword: strongpassword
+
+# Use an existing secret for the admin user.
+admin:
+  ## Name of the secret. Can be templated.
+  existingSecret: ""
+  userKey: admin-user
+  passwordKey: admin-password
+
+## Configure grafana datasources
+## ref: http://docs.grafana.org/administration/provisioning/#datasources
+##
+datasources: 
+ datasources.yaml:
+   apiVersion: 1
+   datasources:
+   - name: Prometheus
+     type: prometheus
+     url: http://mon-prometheus-server.monitoring.svc.cluster.local
+     access: proxy
+     isDefault: true
+   - name: Mimir
+     type: prometheus
+     url: http://mimir-nginx.mon-mimir.svc:80/prometheus
+     access: proxy
+     isDefault: false
+
+## Grafana's primary configuration
+## NOTE: values in map will be converted to ini format
+## ref: http://docs.grafana.org/installation/configuration/
+##
+grafana.ini:
+  paths:
+    data: /var/lib/grafana/
+    logs: /var/log/grafana
+    plugins: /var/lib/grafana/plugins
+    provisioning: /etc/grafana/provisioning
+  analytics:
+    check_for_updates: true
+  log:
+    mode: console
+  grafana_net:
+    url: https://grafana.net
+  server:
+    domain: "{{ if (and .Values.ingress.enabled .Values.ingress.hosts) }}{{ tpl (.Values.ingress.hosts | first) . }}{{ else }}''{{ end }}"
+
+## Number of old ReplicaSets to retain
+##
+revisionHistoryLimit: 5
+
+# assertNoLeakedSecrets is a helper function defined in _helpers.tpl that checks if secret
+# values are not exposed in the rendered grafana.ini configmap. It is enabled by default.
+#
+# To pass values into grafana.ini without exposing them in a configmap, use variable expansion:
+# https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#variable-expansion
+#
+# Alternatively, if you wish to allow secret values to be exposed in the rendered grafana.ini configmap,
+# you can disable this check by setting assertNoLeakedSecrets to false.
+assertNoLeakedSecrets: true
+
diff --git a/manifests/monitoring/prometheus_values.yaml b/manifests/monitoring/prometheus_values.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fabc97c4a371ea47aff82a4bb310e56500aab991
--- /dev/null
+++ b/manifests/monitoring/prometheus_values.yaml
@@ -0,0 +1,52 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Configuration for Prometheus components and server settings
+# Global Prometheus configuration
+alertmanager:
+  enabled: false        # Default is true
+kube-state-metrics:
+  enabled: false        # Default is true
+prometheus-node-exporter:
+  enabled: false        # Default is true
+prometheus-pushgateway:
+  enabled: true         # Default is true
+
+# Prometheus server-specific configuration
+server:
+  retention: "30d"
+  logLevel: "debug"
+  resources:
+    requests:
+      cpu: "250m"
+      memory: "256Mi"
+    limits:
+      cpu: "1"
+      memory: "1Gi"
+
+  # Expose the Prometheus server via a Kubernetes service
+  service:
+    type: NodePort
+    nodePort: 30090
+
+  extraScrapeConfigs:
+    - job_name: 'pushgateway'
+      static_configs:
+        - targets:
+            - 'prometheus-pushgateway.monitoring.svc.cluster.local:9091'  # Push Gateway endpoint
+
+  # Global Prometheus settings:
+  global:
+    scrape_interval: 10s
+    evaluation_interval: 10s
diff --git a/manifests/servicemonitors.yaml b/manifests/servicemonitors.yaml
index d486ca971e63cf9ccc20a435d49c39e530fb438f..fa6aed0f927efa21d55ff65b18b401070e411bf4 100644
--- a/manifests/servicemonitors.yaml
+++ b/manifests/servicemonitors.yaml
@@ -575,9 +575,9 @@ apiVersion: monitoring.coreos.com/v1
 kind: ServiceMonitor
 metadata:
   namespace: monitoring # namespace where prometheus is running
-  name: tfs-kpi_value_apiservice-metric
+  name: tfs-kpi-value-apiservice-metric
   labels:
-    app: kpi_value_apiservice
+    app: kpi-value-apiservice
     #release: prometheus
     #release: prom  # name of the release
     # ( VERY IMPORTANT: You need to know the correct release name by viewing
@@ -588,7 +588,7 @@ spec:
     matchLabels:
       # Target app service
       #namespace: tfs
-      app: kpi_value_apiservice # same as above
+      app: kpi-value-apiservice # same as above
       #release: prometheus # same as above
   endpoints:
     - port: metrics # named port in target app
@@ -604,9 +604,9 @@ apiVersion: monitoring.coreos.com/v1
 kind: ServiceMonitor
 metadata:
   namespace: monitoring # namespace where prometheus is running
-  name: tfs-kpi_value_writerservice-metric
+  name: tfs-kpi-value-writerservice-metric
   labels:
-    app: kpi_value_writerservice
+    app: kpi-value-writerservice
     #release: prometheus
     #release: prom  # name of the release
     # ( VERY IMPORTANT: You need to know the correct release name by viewing
@@ -617,7 +617,7 @@ spec:
     matchLabels:
       # Target app service
       #namespace: tfs
-      app: kpi_value_writerservice # same as above
+      app: kpi-value-writerservice # same as above
       #release: prometheus # same as above
   endpoints:
     - port: metrics # named port in target app
diff --git a/manifests/webuiservice.yaml b/manifests/webuiservice.yaml
index 20d7c28ab498224f9bf8879fce625c98c61cbc34..0a8194af2d1e34dd740588bde971301bcabfb025 100644
--- a/manifests/webuiservice.yaml
+++ b/manifests/webuiservice.yaml
@@ -12,6 +12,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: grafana-pvc
+spec:
+  accessModes:
+    - ReadWriteOnce
+  resources:
+    requests:
+      storage: 1Gi
+---
 apiVersion: apps/v1
 kind: Deployment
 metadata:
@@ -61,44 +72,51 @@ spec:
             limits:
               cpu: 1000m
               memory: 1024Mi
-        # - name: grafana
-        #   image: grafana/grafana:8.5.22
-        #   imagePullPolicy: IfNotPresent
-        #   ports:
-        #     - containerPort: 3001
-        #       name: http-grafana
-        #       protocol: TCP
-        #   env:
-        #     - name: GF_SERVER_ROOT_URL
-        #       value: "http://0.0.0.0:3001/grafana/"
-        #     - name: GF_SERVER_SERVE_FROM_SUB_PATH
-        #       value: "true"
-        #   readinessProbe:
-        #     failureThreshold: 60
-        #     httpGet:
-        #       #path: /robots.txt
-        #       path: /login
-        #       port: 3001
-        #       scheme: HTTP
-        #     initialDelaySeconds: 10
-        #     periodSeconds: 1
-        #     successThreshold: 1
-        #     timeoutSeconds: 5
-        #   livenessProbe:
-        #     failureThreshold: 60
-        #     initialDelaySeconds: 10
-        #     periodSeconds: 1
-        #     successThreshold: 1
-        #     tcpSocket:
-        #       port: 3001
-        #     timeoutSeconds: 1
-        #   resources:
-        #     requests:
-        #       cpu: 350m
-        #       memory: 512Mi
-        #     limits:
-        #       cpu: 600m
-        #       memory: 1024Mi
+        - name: grafana
+          image: grafana/grafana:8.5.22
+          imagePullPolicy: IfNotPresent
+          ports:
+            - containerPort: 3000
+              name: http-grafana
+              protocol: TCP
+          env:
+            - name: GF_SERVER_ROOT_URL
+              value: "http://0.0.0.0:3000/grafana/"
+            - name: GF_SERVER_SERVE_FROM_SUB_PATH
+              value: "true"
+          readinessProbe:
+            failureThreshold: 60
+            httpGet:
+              #path: /robots.txt
+              path: /login
+              port: 3000
+              scheme: HTTP
+            initialDelaySeconds: 1
+            periodSeconds: 1
+            successThreshold: 1
+            timeoutSeconds: 2
+          livenessProbe:
+            failureThreshold: 60
+            initialDelaySeconds: 1
+            periodSeconds: 1
+            successThreshold: 1
+            tcpSocket:
+              port: 3000
+            timeoutSeconds: 1
+          resources:
+            requests:
+              cpu: 250m
+              memory: 512Mi
+            limits:
+              cpu: 500m
+              memory: 1024Mi
+          volumeMounts:
+            - mountPath: /var/lib/grafana
+              name: grafana-pv
+      volumes:
+        - name: grafana-pv
+          persistentVolumeClaim:
+            claimName: grafana-pvc
 ---
 apiVersion: v1
 kind: Service
diff --git a/proto/context.proto b/proto/context.proto
index ea8888c56c8ebabac6e4e2a2ed64a5c338f54684..afbf22d7b6b9b29af624eada46e2823a6297944e 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -228,6 +228,9 @@ enum DeviceDriverEnum {
   DEVICEDRIVER_IETF_ACTN = 10;
   DEVICEDRIVER_OC = 11;
   DEVICEDRIVER_QKD = 12;
+  DEVICEDRIVER_IETF_L3VPN = 13;
+  DEVICEDRIVER_IETF_SLICE = 14;
+  DEVICEDRIVER_NCE = 15;
 }
 
 enum DeviceOperationalStatusEnum {
@@ -263,6 +266,14 @@ message LinkId {
   Uuid link_uuid = 1;
 }
 
+enum LinkTypeEnum {
+  LINKTYPE_UNKNOWN = 0;
+  LINKTYPE_COPPER  = 1;
+  LINKTYPE_FIBER   = 2;
+  LINKTYPE_RADIO   = 3;
+  LINKTYPE_VIRTUAL = 4;
+}
+
 message LinkAttributes {
   float total_capacity_gbps = 1;
   float used_capacity_gbps  = 2;
@@ -271,9 +282,9 @@ message LinkAttributes {
 message Link {
   LinkId link_id = 1;
   string name = 2;
-  repeated EndPointId link_endpoint_ids = 3;
-  LinkAttributes attributes = 4;
-  LinkTypeEnum link_type = 5;
+  LinkTypeEnum link_type = 3;
+  repeated EndPointId link_endpoint_ids = 4;
+  LinkAttributes attributes = 5;
 }
 
 message LinkIdList {
@@ -289,14 +300,6 @@ message LinkEvent {
   LinkId link_id = 2;
 }
 
-enum LinkTypeEnum {
-  LINKTYPE_UNKNOWN = 0;
-  LINKTYPE_COPPER = 1;
-  LINKTYPE_VIRTUAL_COPPER = 2;
-  LINKTYPE_OPTICAL = 3;
-  LINKTYPE_VIRTUAL_OPTICAL = 4;
-}
-
 // ----- Service -------------------------------------------------------------------------------------------------------
 message ServiceId {
   ContextId context_id = 1;
diff --git a/proto/kpi_sample_types.proto b/proto/kpi_sample_types.proto
index 0a9800d9e5839205e1e45f84e4c8bdafbe93f32f..d4efc084e5f1ea2376e71ef6a15bc9b972c5ac1d 100644
--- a/proto/kpi_sample_types.proto
+++ b/proto/kpi_sample_types.proto
@@ -39,4 +39,14 @@ enum KpiSampleType {
     KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO     = 605;
 
     KPISAMPLETYPE_SERVICE_LATENCY_MS            = 701;
+
+// output KPIs
+    KPISAMPLETYPE_PACKETS_TRANSMITTED_AGG_OUTPUT           = 1101;
+    KPISAMPLETYPE_PACKETS_RECEIVED_AGG_OUTPUT              = 1102;
+    KPISAMPLETYPE_PACKETS_DROPPED_AGG_OUTPUT               = 1103;
+    KPISAMPLETYPE_BYTES_TRANSMITTED_AGG_OUTPUT             = 1201;
+    KPISAMPLETYPE_BYTES_RECEIVED_AGG_OUTPUT                = 1202;
+    KPISAMPLETYPE_BYTES_DROPPED_AGG_OUTPUT                 = 1203;
+
+    KPISAMPLETYPE_SERVICE_LATENCY_MS_AGG_OUTPUT            = 1701;
 }
diff --git a/scripts/grpcurl_inspect_context.sh b/scripts/grpcurl_inspect_context.sh
new file mode 100755
index 0000000000000000000000000000000000000000..dda920a7a1899a9d8cdc3e1d1c7c576463c66fed
--- /dev/null
+++ b/scripts/grpcurl_inspect_context.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+########################################################################################################################
+# Define your deployment settings here
+########################################################################################################################
+
+# If not already set, set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Ref: https://github.com/fullstorydev/grpcurl
+
+source tfs_runtime_env_vars.sh
+
+GRPC_ENDPOINT="$CONTEXTSERVICE_SERVICE_HOST:$CONTEXTSERVICE_SERVICE_PORT_GRPC"
+GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT"
+
+GRPC_SERVICES=`$GRP_CURL_CMD list`
+echo "gRPC Services found in $GRPC_ENDPOINT:"
+printf "\n"
+
+for GRPC_SERVICE in $GRPC_SERVICES; do
+    echo "gRPC Service: $GRPC_SERVICE"
+    $GRP_CURL_CMD describe $GRPC_SERVICE
+    printf "\n"
+done
+
+echo "Done!"
diff --git a/scripts/grpcurl_inspect_device.sh b/scripts/grpcurl_inspect_device.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0e1202fb6ed3b0306f3dfe03cd60eeb55c7abe83
--- /dev/null
+++ b/scripts/grpcurl_inspect_device.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+########################################################################################################################
+# Define your deployment settings here
+########################################################################################################################
+
+# If not already set, set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Ref: https://github.com/fullstorydev/grpcurl
+
+source tfs_runtime_env_vars.sh
+
+GRPC_ENDPOINT="$DEVICESERVICE_SERVICE_HOST:$DEVICESERVICE_SERVICE_PORT_GRPC"
+GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT"
+
+GRPC_SERVICES=`$GRP_CURL_CMD list`
+echo "gRPC Services found in $GRPC_ENDPOINT:"
+printf "\n"
+
+for GRPC_SERVICE in $GRPC_SERVICES; do
+    echo "gRPC Service: $GRPC_SERVICE"
+    $GRP_CURL_CMD describe $GRPC_SERVICE
+    printf "\n"
+done
+
+echo "Done!"
diff --git a/scripts/grpcurl_inspect_pathcomp_frontend.sh b/scripts/grpcurl_inspect_pathcomp_frontend.sh
new file mode 100755
index 0000000000000000000000000000000000000000..686f7ae1e46aed2c60a33cd7fc7265ff1b5a3762
--- /dev/null
+++ b/scripts/grpcurl_inspect_pathcomp_frontend.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+########################################################################################################################
+# Define your deployment settings here
+########################################################################################################################
+
+# If not already set, set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Ref: https://github.com/fullstorydev/grpcurl
+
+source tfs_runtime_env_vars.sh
+
+GRPC_ENDPOINT="$PATHCOMPSERVICE_SERVICE_HOST:$PATHCOMPSERVICE_SERVICE_PORT_GRPC"
+GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT"
+
+GRPC_SERVICES=`$GRP_CURL_CMD list`
+echo "gRPC Services found in $GRPC_ENDPOINT:"
+printf "\n"
+
+for GRPC_SERVICE in $GRPC_SERVICES; do
+    echo "gRPC Service: $GRPC_SERVICE"
+    $GRP_CURL_CMD describe $GRPC_SERVICE
+    printf "\n"
+done
+
+echo "Done!"
diff --git a/scripts/grpcurl_inspect_service.sh b/scripts/grpcurl_inspect_service.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f1b674ee5aa8d7f0a1878840cc1f674d61b51ea5
--- /dev/null
+++ b/scripts/grpcurl_inspect_service.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+########################################################################################################################
+# Define your deployment settings here
+########################################################################################################################
+
+# If not already set, set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Ref: https://github.com/fullstorydev/grpcurl
+
+source tfs_runtime_env_vars.sh
+
+GRPC_ENDPOINT="$SERVICESERVICE_SERVICE_HOST:$SERVICESERVICE_SERVICE_PORT_GRPC"
+GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT"
+
+GRPC_SERVICES=`$GRP_CURL_CMD list`
+echo "gRPC Services found in $GRPC_ENDPOINT:"
+printf "\n"
+
+for GRPC_SERVICE in $GRPC_SERVICES; do
+    echo "gRPC Service: $GRPC_SERVICE"
+    $GRP_CURL_CMD describe $GRPC_SERVICE
+    printf "\n"
+done
+
+echo "Done!"
diff --git a/scripts/grpcurl_inspect_slice.sh b/scripts/grpcurl_inspect_slice.sh
new file mode 100755
index 0000000000000000000000000000000000000000..170be7bf567c5f7adb0d84db62416ecc0d512f21
--- /dev/null
+++ b/scripts/grpcurl_inspect_slice.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+########################################################################################################################
+# Define your deployment settings here
+########################################################################################################################
+
+# If not already set, set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE=${TFS_K8S_NAMESPACE:-"tfs"}
+
+########################################################################################################################
+# Automated steps start here
+########################################################################################################################
+
+# Ref: https://github.com/fullstorydev/grpcurl
+
+source tfs_runtime_env_vars.sh
+
+GRPC_ENDPOINT="$SLICESERVICE_SERVICE_HOST:$SLICESERVICE_SERVICE_PORT_GRPC"
+GRP_CURL_CMD="docker run fullstorydev/grpcurl --plaintext $GRPC_ENDPOINT"
+
+GRPC_SERVICES=`$GRP_CURL_CMD list`
+echo "gRPC Services found in $GRPC_ENDPOINT:"
+printf "\n"
+
+for GRPC_SERVICE in $GRPC_SERVICES; do
+    echo "gRPC Service: $GRPC_SERVICE"
+    $GRP_CURL_CMD describe $GRPC_SERVICE
+    printf "\n"
+done
+
+echo "Done!"
diff --git a/scripts/run_tests_locally-analytics-backend.sh b/scripts/run_tests_locally-analytics-backend.sh
index 1c3386c62084bb42d6ffa2e1349b6f4286820a52..700155a42714bd05069c7c62db9ada09b4125355 100755
--- a/scripts/run_tests_locally-analytics-backend.sh
+++ b/scripts/run_tests_locally-analytics-backend.sh
@@ -18,8 +18,11 @@ PROJECTDIR=`pwd`
 
 cd $PROJECTDIR/src
 RCFILE=$PROJECTDIR/coverage/.coveragerc
+
 export KFK_SERVER_ADDRESS='127.0.0.1:9092'
+
 CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}')
 export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytics?sslmode=require"
-python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \
+
+python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \
     analytics/backend/tests/test_backend.py
diff --git a/scripts/run_tests_locally-analytics-frontend.sh b/scripts/run_tests_locally-analytics-frontend.sh
index 6e945406f0ff7b2670a35d5315d0ef428f701988..2c18296cf86ae4a00904fb684e2de5c56da9a2ea 100755
--- a/scripts/run_tests_locally-analytics-frontend.sh
+++ b/scripts/run_tests_locally-analytics-frontend.sh
@@ -18,8 +18,10 @@ PROJECTDIR=`pwd`
 
 cd $PROJECTDIR/src
 RCFILE=$PROJECTDIR/coverage/.coveragerc
+
 export KFK_SERVER_ADDRESS='127.0.0.1:9092'
 CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}')
 export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_analytics?sslmode=require"
-python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \
+
+python3 -m pytest --log-level=DEBUG --log-cli-level=INFO --verbose \
     analytics/frontend/tests/test_frontend.py
diff --git a/scripts/run_tests_locally-kpi-value-writer.sh b/scripts/run_tests_locally-kpi-value-writer.sh
index cbeed3b784a2316a3261ee7950bb5e6cffbb7fbf..e3d9c7c6a419483cf0ce9e066ba67e5d4ccefed4 100755
--- a/scripts/run_tests_locally-kpi-value-writer.sh
+++ b/scripts/run_tests_locally-kpi-value-writer.sh
@@ -19,6 +19,7 @@ PROJECTDIR=`pwd`
 cd $PROJECTDIR/src
 
 export KFK_SERVER_ADDRESS='127.0.0.1:9092'
+
 RCFILE=$PROJECTDIR/coverage/.coveragerc
 python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \
     kpi_value_writer/tests/test_kpi_value_writer.py
diff --git a/scripts/run_tests_locally-nbi-ietf-slice.sh b/scripts/run_tests_locally-nbi-ietf-slice.sh
new file mode 100755
index 0000000000000000000000000000000000000000..bf53f18b9a37f9248b072ae2c699b5874fa2c869
--- /dev/null
+++ b/scripts/run_tests_locally-nbi-ietf-slice.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
+
+
+PROJECTDIR=`pwd`
+
+cd $PROJECTDIR/src
+RCFILE=$PROJECTDIR/coverage/.coveragerc
+
+# Run unitary tests and analyze coverage of code at same time
+# helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0
+coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
+    nbi/tests/test_slice_2.py
diff --git a/scripts/run_tests_locally-telemetry-backend.sh b/scripts/run_tests_locally-telemetry-backend.sh
index 3ad4a2d0e05dbb11573eb146b4f0a4959894ace0..1b4915d7476311d1ceb1693a0934278b44516f22 100755
--- a/scripts/run_tests_locally-telemetry-backend.sh
+++ b/scripts/run_tests_locally-telemetry-backend.sh
@@ -18,15 +18,12 @@ PROJECTDIR=`pwd`
 
 cd $PROJECTDIR/src
 # RCFILE=$PROJECTDIR/coverage/.coveragerc
-# coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose \
-#     kpi_manager/tests/test_unitary.py
 
-# python3 kpi_manager/tests/test_unitary.py
 export KFK_SERVER_ADDRESS='127.0.0.1:9092'
 CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}')
 export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_telemetry?sslmode=require"
 RCFILE=$PROJECTDIR/coverage/.coveragerc
 
 
-python3 -m pytest --log-level=INFO --log-cli-level=debug --verbose \
-    telemetry/backend/tests/test_TelemetryBackend.py
+python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
+    telemetry/backend/tests/test_backend.py
diff --git a/scripts/run_tests_locally-telemetry-emulated.sh b/scripts/run_tests_locally-telemetry-emulated.sh
new file mode 100755
index 0000000000000000000000000000000000000000..879b878c7281a17dcc89a36ff146939151540ec4
--- /dev/null
+++ b/scripts/run_tests_locally-telemetry-emulated.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+
+PROJECTDIR=`pwd`
+
+cd $PROJECTDIR/src
+# RCFILE=$PROJECTDIR/coverage/.coveragerc
+
+# export KFK_SERVER_ADDRESS='127.0.0.1:9092'
+# CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}')
+# export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_telemetry?sslmode=require"
+RCFILE=$PROJECTDIR/coverage/.coveragerc
+
+
+python3 -m pytest --log-level=debug --log-cli-level=info --verbose \
+    telemetry/backend/tests/test_emulated.py
diff --git a/scripts/run_tests_locally-telemetry-frontend.sh b/scripts/run_tests_locally-telemetry-frontend.sh
index 38822330ec3837ac1a101e2a7d46f4928c4b31e6..e70818377ed4c7021da0222a831c6f7d319398c7 100755
--- a/scripts/run_tests_locally-telemetry-frontend.sh
+++ b/scripts/run_tests_locally-telemetry-frontend.sh
@@ -18,10 +18,11 @@ PROJECTDIR=`pwd`
 
 cd $PROJECTDIR/src
 
-# python3 kpi_manager/tests/test_unitary.py
 export KFK_SERVER_ADDRESS='127.0.0.1:9092'
 CRDB_SQL_ADDRESS=$(kubectl get service cockroachdb-public --namespace crdb -o jsonpath='{.spec.clusterIP}')
+
 export CRDB_URI="cockroachdb://tfs:tfs123@${CRDB_SQL_ADDRESS}:26257/tfs_telemetry?sslmode=require"
 RCFILE=$PROJECTDIR/coverage/.coveragerc
-python3 -m pytest --log-level=DEBUG --log-cli-level=DEBUG --verbose \
+
+python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \
     telemetry/frontend/tests/test_frontend.py
diff --git a/src/analytics/backend/service/AnalyticsBackendService.py b/src/analytics/backend/service/AnalyticsBackendService.py
index f3a58feaab8667b266052803dddd1641b8a690f3..1abdd62c0f7162fe7a50f1c08e698f71c5fc93ad 100755
--- a/src/analytics/backend/service/AnalyticsBackendService.py
+++ b/src/analytics/backend/service/AnalyticsBackendService.py
@@ -16,109 +16,164 @@ import time
 import json
 import logging
 import threading
+
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
-from confluent_kafka import Consumer as KafkaConsumer
-from confluent_kafka import KafkaError
+from confluent_kafka import Consumer
+from confluent_kafka import KafkaError, KafkaException
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
-from threading import Thread, Event
-from .DaskStreaming import DaskStreamer
+from analytics.backend.service.Streamer import DaskStreamer
+from analytics.backend.service.AnalyzerHelper import AnalyzerHelper
+
 
 LOGGER = logging.getLogger(__name__)
 
 class AnalyticsBackendService(GenericGrpcService):
     """
-    Class listens for ...
+    AnalyticsBackendService class is responsible for handling the requests from the AnalyticsFrontendService.
+    It listens to the Kafka topic for the requests to start and stop the Streamer accordingly.
+    It also initializes the Kafka producer and Dask cluster for the streamer.
     """
-    def __init__(self, cls_name : str = __name__) -> None:
+    def __init__(self, cls_name : str = __name__, n_workers=1, threads_per_worker=1
+                 ) -> None:
         LOGGER.info('Init AnalyticsBackendService')
         port = get_service_port_grpc(ServiceNameEnum.ANALYTICSBACKEND)
         super().__init__(port, cls_name=cls_name)
-        self.running_threads = {}       # To keep track of all running analyzers 
-        self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(),
-                                            'group.id'           : 'analytics-frontend',
-                                            'auto.offset.reset'  : 'latest'})
+        self.active_streamers = {}
+        self.central_producer = AnalyzerHelper.initialize_kafka_producer()  # Multi-threaded producer
+        self.cluster          = AnalyzerHelper.initialize_dask_cluster(
+                                        n_workers, threads_per_worker) # Local cluster
+        self.request_consumer = Consumer({
+            'bootstrap.servers' : KafkaConfig.get_kafka_address(),
+            'group.id'          : 'analytics-backend',
+            'auto.offset.reset' : 'latest',
+            })
+
 
     def install_servicers(self):
-        threading.Thread(target=self.RequestListener, args=()).start()
+        threading.Thread(
+            target=self.RequestListener,
+            args=()
+        ).start()
 
     def RequestListener(self):
         """
         listener for requests on Kafka topic.
         """
         LOGGER.info("Request Listener is initiated ...")
-        # print      ("Request Listener is initiated ...")
-        consumer = self.kafka_consumer
+        consumer = self.request_consumer
         consumer.subscribe([KafkaTopic.ANALYTICS_REQUEST.value])
         while True:
-            receive_msg = consumer.poll(2.0)
-            if receive_msg is None:
+            message = consumer.poll(2.0)
+            if message is None:
                 continue
-            elif receive_msg.error():
-                if receive_msg.error().code() == KafkaError._PARTITION_EOF:
-                    continue
-                else:
-                    LOGGER.error("Consumer error: {:}".format(receive_msg.error()))
-                    # print       ("Consumer error: {:}".format(receive_msg.error()))
-                    break
+            elif message.error():
+                    if message.error().code() == KafkaError._PARTITION_EOF:
+                        LOGGER.warning(f"Consumer reached end of topic {message.topic()}/{message.partition()}")
+                        break
+                    elif message.error().code() == KafkaError.UNKNOWN_TOPIC_OR_PART:
+                        LOGGER.error(f"Subscribed topic {message.topic()} does not exist. May be topic does not have any messages.")
+                        continue
+                    elif message.error():
+                        raise KafkaException(message.error())
             try:
-                analyzer      = json.loads(receive_msg.value().decode('utf-8'))
-                analyzer_uuid = receive_msg.key().decode('utf-8')
-                LOGGER.debug('Recevied Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer))
-                # print       ('Recevied Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer))
+                analyzer      = json.loads(message.value().decode('utf-8'))
+                analyzer_uuid = message.key().decode('utf-8')
+                LOGGER.info('Recevied Analyzer: {:} - {:}'.format(analyzer_uuid, analyzer))
 
                 if analyzer["algo_name"] is None and analyzer["oper_mode"] is None:
-                    self.StopDaskListener(analyzer_uuid)
+                    if self.StopStreamer(analyzer_uuid):
+                        LOGGER.info("Dask Streamer stopped.")
+                    else:
+                        LOGGER.warning("Failed to stop Dask Streamer. May be already terminated...")
                 else:
-                    self.StartDaskListener(analyzer_uuid, analyzer)
+                    if self.StartStreamer(analyzer_uuid, analyzer):
+                        LOGGER.info("Dask Streamer started.")
+                    else:
+                        LOGGER.warning("Failed to start Dask Streamer.")
             except Exception as e:
                 LOGGER.warning("Unable to consume message from topic: {:}. ERROR: {:}".format(KafkaTopic.ANALYTICS_REQUEST.value, e))
-                # print         ("Unable to consume message from topic: {:}. ERROR: {:}".format(KafkaTopic.ANALYTICS_REQUEST.value, e))
-
-    def StartDaskListener(self, analyzer_uuid, analyzer):
-        kpi_list      = analyzer[ 'input_kpis'   ] 
-        thresholds    = analyzer[ 'thresholds'   ]
-        window_size   = analyzer[ 'window_size'  ]
-        window_slider = analyzer[ 'window_slider']
-
-        LOGGER.debug ("Received parameters: {:} - {:} - {:} - {:}".format(
-            kpi_list, thresholds, window_size, window_slider))
-        # print        ("Received parameters: {:} - {:} - {:} - {:}".format(
-        #     kpi_list, thresholds, window_size, window_slider))
+
+
+    def StartStreamer(self, analyzer_uuid : str, analyzer : dict):
+        """
+        Start the DaskStreamer with the given parameters.
+        """
+        if analyzer_uuid in self.active_streamers:
+            LOGGER.warning("Dask Streamer already running with the given analyzer_uuid: {:}".format(analyzer_uuid))
+            return False
         try:
-            stop_event = Event()
-            thread     = Thread(
-                target=DaskStreamer,
-                # args=(analyzer_uuid, kpi_list, oper_list, thresholds, stop_event),
-                args=(analyzer['output_kpis'][0] , kpi_list, thresholds, stop_event),
-                kwargs={
-                    "window_size"       : window_size,
-                }
+            streamer = DaskStreamer(
+                key               = analyzer_uuid,
+                input_kpis        = analyzer['input_kpis'        ],
+                output_kpis       = analyzer['output_kpis'       ],
+                thresholds        = analyzer['thresholds'        ],
+                batch_size        = analyzer['batch_size_min'    ],
+                batch_duration    = analyzer['batch_duration_min'],
+                window_size       = analyzer['window_size'       ],
+                cluster_instance  = self.cluster,
+                producer_instance = self.central_producer,
             )
-            thread.start()
-            self.running_threads[analyzer_uuid] = (thread, stop_event)
-            # print      ("Initiated Analyzer backend: {:}".format(analyzer_uuid))
-            LOGGER.info("Initiated Analyzer backend: {:}".format(analyzer_uuid))
+            streamer.start()
+            LOGGER.info(f"Streamer started with analyzer Id: {analyzer_uuid}")
+
+            # Stop the streamer after the given duration
+            duration = analyzer['duration']
+            if duration > 0:
+                def stop_after_duration():
+                    time.sleep(duration)
+                    LOGGER.warning(f"Execution duration ({duration}) completed of Analyzer: {analyzer_uuid}")
+                    if not self.StopStreamer(analyzer_uuid):
+                        LOGGER.warning("Failed to stop Dask Streamer. Streamer may be already terminated.")
+
+                duration_thread = threading.Thread(
+                    target=stop_after_duration, daemon=True, name=f"stop_after_duration_{analyzer_uuid}"
+                    )
+                duration_thread.start()
+
+            self.active_streamers[analyzer_uuid] = streamer
             return True
         except Exception as e:
-            # print       ("Failed to initiate Analyzer backend: {:}".format(e))
-            LOGGER.error("Failed to initiate Analyzer backend: {:}".format(e))
+            LOGGER.error("Failed to start Dask Streamer. ERROR: {:}".format(e))
             return False
 
-    def StopDaskListener(self, analyzer_uuid):
-        if analyzer_uuid in self.running_threads:
-            try:
-                thread, stop_event = self.running_threads[analyzer_uuid]
-                stop_event.set()
-                thread.join()
-                del self.running_threads[analyzer_uuid]
-                # print      ("Terminating backend (by TerminateBackend): Analyzer Id: {:}".format(analyzer_uuid))
-                LOGGER.info("Terminating backend (by TerminateBackend): Analyzer Id: {:}".format(analyzer_uuid))
+    def StopStreamer(self, analyzer_uuid : str):
+        """
+        Stop the DaskStreamer with the given analyzer_uuid.
+        """
+        try:
+            if analyzer_uuid not in self.active_streamers:
+                LOGGER.warning("Dask Streamer not found with the given analyzer_uuid: {:}".format(analyzer_uuid))
                 return True
-            except Exception as e:
-                LOGGER.error("Failed to terminate. Analyzer Id: {:} - ERROR: {:}".format(analyzer_uuid, e))
-                return False
-        else:
-            # print         ("Analyzer not found in active collectors. Analyzer Id: {:}".format(analyzer_uuid))
-            LOGGER.warning("Analyzer not found in active collectors: Analyzer Id: {:}".format(analyzer_uuid))
+            LOGGER.info(f"Terminating streamer with Analyzer Id: {analyzer_uuid}")
+            streamer = self.active_streamers[analyzer_uuid]
+            streamer.stop()
+            streamer.join()
+            del self.active_streamers[analyzer_uuid]
+            LOGGER.info(f"Streamer with analyzer_uuid '{analyzer_uuid}' has been trerminated sucessfully.")
+            return True
+        except:
+            LOGGER.exception("Failed to stop Dask Streamer.")
+            return False
+
+    def close(self):
+        """
+        Close the producer and cluster cleanly.
+        """
+        if self.central_producer:
+            try:
+                self.central_producer.flush()
+                LOGGER.info("Kafka producer flushed and closed.")
+            except:
+                LOGGER.exception("Error closing Kafka producer")
+        if self.cluster:
+            try:
+                self.cluster.close()
+                LOGGER.info("Dask cluster closed.")
+            except:
+                LOGGER.exception("Error closing Dask cluster")
+
+    def stop(self):
+        self.close()
+        return super().stop()
diff --git a/src/analytics/backend/service/AnalyzerHandlers.py b/src/analytics/backend/service/AnalyzerHandlers.py
new file mode 100644
index 0000000000000000000000000000000000000000..256530ba78329f09327b551f0238f4dd8a1258b5
--- /dev/null
+++ b/src/analytics/backend/service/AnalyzerHandlers.py
@@ -0,0 +1,136 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 enum import Enum
+import pandas as pd
+
+logger = logging.getLogger(__name__)
+
+
+class Handlers(Enum):
+    AGGREGATION_HANDLER = "AggregationHandler"
+    UNSUPPORTED_HANDLER = "UnsupportedHandler"
+
+    @classmethod
+    def is_valid_handler(cls, handler_name):
+        return handler_name in cls._value2member_map_
+
+# This method is top-level and should not be part of the class due to serialization issues.
+def threshold_handler(key, aggregated_df, thresholds):
+    """
+    Apply thresholds (TH-Fall and TH-Raise) based on the thresholds dictionary
+    on the aggregated DataFrame.
+
+    Args:
+        key (str): Key for the aggregated DataFrame.
+        aggregated_df (pd.DataFrame): DataFrame with aggregated metrics.
+        thresholds (dict): Thresholds dictionary with keys in the format '<metricName>' and values as (fail_th, raise_th).
+
+    Returns:
+        pd.DataFrame: DataFrame with additional threshold columns.
+    """
+    for metric_name, threshold_values in thresholds.items():
+        # Ensure the metric column exists in the DataFrame
+        if metric_name not in aggregated_df.columns:
+            logger.warning(f"Metric '{metric_name}' does not exist in the DataFrame for key: {key}. Skipping threshold application.")
+            continue
+        
+        # Ensure the threshold values are valid (check for tuple specifically)
+        if isinstance(threshold_values, list) and len(threshold_values) == 2:
+            fail_th, raise_th = threshold_values
+            
+            # Add threshold columns with updated naming
+            aggregated_df[f"{metric_name}_TH_RAISE"] = aggregated_df[metric_name] > raise_th
+            aggregated_df[f"{metric_name}_TH_FALL"]  = aggregated_df[metric_name] < fail_th
+        else:
+            logger.warning(f"Threshold values for '{metric_name}' ({threshold_values}) are not a list of length 2. Skipping threshold application.")
+    return aggregated_df
+
+def aggregation_handler(
+        batch_type_name, key, batch, input_kpi_list, output_kpi_list, thresholds
+    ):
+    """
+      Process a batch of data and calculate aggregated values for each input KPI
+      and maps them to the output KPIs. """
+
+    logger.info(f"({batch_type_name}) Processing batch for key: {key}")
+    if not batch:
+        logger.info("Empty batch received. Skipping processing.")
+        return []
+    else:
+        logger.info(f" >>>>> Processing {len(batch)} records for key: {key}")
+        
+        # Convert data into a DataFrame
+        df = pd.DataFrame(batch)
+
+        # Filter the DataFrame to retain rows where kpi_id is in the input list (subscribed endpoints only)
+        df = df[df['kpi_id'].isin(input_kpi_list)].copy()
+
+        if df.empty:
+            logger.warning(f"No data available for KPIs: {input_kpi_list}. Skipping processing.")
+            return []
+
+        # Define all possible aggregation methods
+        aggregation_methods = {
+            "min"     : ('kpi_value', 'min'),
+            "max"     : ('kpi_value', 'max'),
+            "avg"     : ('kpi_value', 'mean'),
+            "first"   : ('kpi_value', lambda x: x.iloc[0]),
+            "last"    : ('kpi_value', lambda x: x.iloc[-1]),
+            "variance": ('kpi_value', 'var'),
+            "count"   : ('kpi_value', 'count'),
+            "range"   : ('kpi_value', lambda x: x.max() - x.min()),
+            "sum"     : ('kpi_value', 'sum'),
+        }
+
+        results = []
+        
+        # Process each KPI-specific task parameter
+        for kpi_index, kpi_id in enumerate(input_kpi_list):
+
+            # logger.info(f"1.Processing KPI: {kpi_id}")
+            kpi_task_parameters = thresholds["task_parameter"][kpi_index]
+            
+            # Get valid task parameters for this KPI
+            valid_task_parameters = [
+                method for method in kpi_task_parameters.keys() 
+                if method in aggregation_methods
+            ]
+
+            # Select the aggregation methods based on valid task parameters
+            selected_methods = {method: aggregation_methods[method] for method in valid_task_parameters}
+
+            # logger.info(f"2. Processing KPI: {kpi_id} with task parameters: {kpi_task_parameters}")
+            kpi_df = df[df['kpi_id'] == kpi_id]
+
+            # Check if kpi_df is not empty before applying the aggregation methods
+            if not kpi_df.empty:
+                agg_df = kpi_df.groupby('kpi_id').agg(**selected_methods).reset_index()
+
+                # logger.info(f"3. Aggregated DataFrame for KPI: {kpi_id}: {agg_df}")
+
+                agg_df['kpi_id'] = output_kpi_list[kpi_index]
+
+                # logger.info(f"4. Applying thresholds for df: {agg_df['kpi_id']}")
+                record = threshold_handler(key, agg_df, kpi_task_parameters)
+
+                results.extend(record.to_dict(orient='records'))
+            else:
+                logger.warning(f"No data available for KPIs: {kpi_id}. Skipping aggregation.")
+                continue
+        if results:
+            return results
+        else:
+            return []
diff --git a/src/analytics/backend/service/AnalyzerHelper.py b/src/analytics/backend/service/AnalyzerHelper.py
new file mode 100644
index 0000000000000000000000000000000000000000..15a45aee68341c599905983efd79737a9d4929ab
--- /dev/null
+++ b/src/analytics/backend/service/AnalyzerHelper.py
@@ -0,0 +1,67 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 dask.distributed import Client, LocalCluster
+from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
+from confluent_kafka import Consumer, Producer
+
+import logging
+logger = logging.getLogger(__name__)
+
+
+class AnalyzerHelper:
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def initialize_dask_client(cluster_instance):
+        """Initialize a local Dask client."""
+        if cluster_instance is None:
+            logger.error("Dask Cluster is not initialized. Exiting.")
+            return None
+        client = Client(cluster_instance)
+        logger.info(f"Dask Client Initialized: {client}")
+        return client
+
+    @staticmethod
+    def initialize_dask_cluster(n_workers=1, threads_per_worker=2):
+        """Initialize a local Dask cluster"""
+        cluster = LocalCluster(n_workers=n_workers, threads_per_worker=threads_per_worker)
+        logger.info(f"Dask Cluster Initialized: {cluster}")
+        return cluster
+
+    @staticmethod
+    def initialize_kafka_consumer():    # TODO: update to receive topic and group_id as parameters
+        """Initialize the Kafka consumer."""
+        consumer_conf = {
+            'bootstrap.servers': KafkaConfig.get_kafka_address(),
+            'group.id': 'analytics-backend',
+            'auto.offset.reset': 'latest'
+        }
+        consumer = Consumer(consumer_conf)
+        consumer.subscribe([KafkaTopic.VALUE.value])
+        return consumer
+
+    @staticmethod
+    def initialize_kafka_producer():
+        """Initialize the Kafka producer."""
+        return Producer({'bootstrap.servers': KafkaConfig.get_kafka_address()})
+
+    @staticmethod
+    def delivery_report(err, msg):
+        if err is not None:
+            logger.error(f"Message delivery failed: {err}")
+        else:
+            logger.debug(f"Message delivered to {msg.topic()} [{msg.partition()}] at offset {msg.offset()}")
diff --git a/src/analytics/backend/service/DaskStreaming.py b/src/analytics/backend/service/DaskStreaming.py
deleted file mode 100644
index 79dee7ef972a8b5546e3b38289c4fdb5b4bcc0d1..0000000000000000000000000000000000000000
--- a/src/analytics/backend/service/DaskStreaming.py
+++ /dev/null
@@ -1,268 +0,0 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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
-import time
-import json
-from confluent_kafka import Consumer, Producer, KafkaException, KafkaError
-import pandas as pd
-from dask.distributed import Client, LocalCluster
-from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
-
-logging.basicConfig(level=logging.INFO)
-LOGGER = logging.getLogger(__name__)
-
-def SettingKafkaConsumerParams():
-    return {'bootstrap.servers'  : KafkaConfig.get_kafka_address(),
-            'group.id'           : 'analytics-backend',
-            'auto.offset.reset'  : 'latest'}
-
-def GetAggregationMappings(thresholds):
-    agg_dict = {}
-    for threshold_key in thresholds.keys():
-        parts = threshold_key.split('_', 1)
-        if len(parts) != 2:
-            LOGGER.warning(f"Threshold key '{threshold_key}' does not follow the '<aggregation>_<metricName>' format. Skipping.")
-            continue
-        aggregation, metric_name = parts
-        # Ensure that the aggregation function is valid in pandas
-        if aggregation not in ['mean', 'min', 'max', 'first', 'last', 'std']:
-            LOGGER.warning(f"Unsupported aggregation '{aggregation}' in threshold key '{threshold_key}'. Skipping.")
-            continue
-        agg_dict[threshold_key] = ('kpi_value', aggregation)
-    return agg_dict
-
-
-def ApplyThresholds(aggregated_df, thresholds):
-    """
-    Apply thresholds (TH-Fall and TH-Raise) based on the thresholds dictionary
-    on the aggregated DataFrame.
-    Args:       aggregated_df (pd.DataFrame): DataFrame with aggregated metrics.
-                thresholds (dict): Thresholds dictionary with keys in the format '<aggregation>_<metricName>'.
-    Returns:    pd.DataFrame: DataFrame with additional threshold columns.
-    """
-    for threshold_key, threshold_values in thresholds.items():
-        if threshold_key not in aggregated_df.columns:
-
-            LOGGER.warning(f"Threshold key '{threshold_key}' does not correspond to any aggregation result. Skipping threshold application.")
-            continue
-        if isinstance(threshold_values, (list, tuple)) and len(threshold_values) == 2:
-            fail_th, raise_th = threshold_values
-            aggregated_df["THRESHOLD_FALL"] = aggregated_df[threshold_key] < fail_th
-            aggregated_df["THRESHOLD_RAISE"] = aggregated_df[threshold_key] > raise_th
-            aggregated_df["value"] = aggregated_df[threshold_key]
-        else:
-            LOGGER.warning(f"Threshold values for '{threshold_key}' are not a list or tuple of length 2. Skipping threshold application.")
-    return aggregated_df
-
-def initialize_dask_client():
-    """
-    Initialize a local Dask cluster and client.
-    """
-    cluster = LocalCluster(n_workers=2, threads_per_worker=2)
-    client = Client(cluster)
-    LOGGER.info(f"Dask Client Initialized: {client}")
-    return client, cluster
-
-def initialize_kafka_producer():
-    return Producer({'bootstrap.servers': KafkaConfig.get_kafka_address()})
-
-def delivery_report(err, msg):
-    if err is not None:
-        LOGGER.error(f"Message delivery failed: {err}")
-    else:
-        LOGGER.info(f"Message delivered to {msg.topic()} [{msg.partition()}] at offset {msg.offset()}")
-
-def process_batch(batch, agg_mappings, thresholds, key):
-    """
-    Process a batch of data and apply thresholds.
-    Args:       batch (list of dict): List of messages from Kafka.
-                agg_mappings (dict): Mapping from threshold key to aggregation function.
-                thresholds (dict): Thresholds dictionary.
-    Returns:    list of dict: Processed records ready to be sent to Kafka.
-    """
-    if not batch:
-        LOGGER.info("Empty batch received. Skipping processing.")
-        return []
-
-
-    df = pd.DataFrame(batch)
-    LOGGER.info(f"df {df} ")
-    df['time_stamp'] = pd.to_datetime(df['time_stamp'], errors='coerce')
-    df.dropna(subset=['time_stamp'], inplace=True)
-    LOGGER.info(f"df {df} ")
-    required_columns = {'time_stamp', 'kpi_id', 'kpi_value'}
-    if not required_columns.issubset(df.columns):
-        LOGGER.warning(f"Batch contains missing required columns. Required columns: {required_columns}. Skipping batch.")
-        return []
-    if df.empty:
-        LOGGER.info("No data after filtering by KPI IDs. Skipping processing.")
-        return []
-
-    # Perform aggregations using named aggregation
-    try:
-        agg_dict = {key: value for key, value in agg_mappings.items()}
-
-        df_agg_ = df.groupby(['window_start']).agg(**agg_dict).reset_index()
-
-        #example: agg_dict = {'min_latency_E2E': ('kpi_value', 'min')
-
-        #given that threshold has 1 value
-        second_value_tuple = next(iter(agg_dict.values()))[1]
-        #in case we have multiple thresholds!
-        #second_values_tuples = [value[1] for value in agg_dict.values()]
-        if second_value_tuple=="min":
-            df_agg = df_agg_.min(numeric_only=True).to_frame().T
-        elif second_value_tuple == "max":
-            df_agg = df_agg_.max(numeric_only=True).to_frame().T
-        elif second_value_tuple == "std":
-            df_agg = df_agg_.sted(numeric_only=True).to_frame().T
-        else:
-            df_agg = df_agg_.mean(numeric_only=True).to_frame().T
-
-        # Assign the first value of window_start from the original aggregated data
-        df_agg['window_start'] = df_agg_['window_start'].iloc[0]
-
-        # Reorder columns to place 'window_start' first if needed
-        cols = ['window_start'] + [col for col in df_agg.columns if col != 'window_start']
-        df_agg = df_agg[cols]
-
-    except Exception as e:
-        LOGGER.error(f"Aggregation error: {e}")
-        return []
-
-    # Apply thresholds
-
-
-    df_thresholded = ApplyThresholds(df_agg, thresholds)
-    df_thresholded['kpi_id'] = key
-    df_thresholded['window_start'] = df_thresholded['window_start'].dt.strftime('%Y-%m-%dT%H:%M:%SZ')
-    # Convert aggregated DataFrame to list of dicts
-    result = df_thresholded.to_dict(orient='records')
-    LOGGER.info(f"Processed batch with {len(result)} records after aggregation and thresholding.")
-    return result
-
-def produce_result(result, producer, destination_topic):
-    for record in result:
-        try:
-            producer.produce(
-                destination_topic,
-                key=str(record.get('kpi_id', '')),
-                value=json.dumps(record),
-                callback=delivery_report
-            )
-        except KafkaException as e:
-            LOGGER.error(f"Failed to produce message: {e}")
-    producer.flush()
-    LOGGER.info(f"Produced {len(result)} aggregated records to '{destination_topic}'.")
-
-def DaskStreamer(key, kpi_list, thresholds, stop_event,
-                window_size="30s", time_stamp_col="time_stamp"):
-    client, cluster = initialize_dask_client()
-    consumer_conf   = SettingKafkaConsumerParams()
-    consumer        = Consumer(consumer_conf)
-    consumer.subscribe([KafkaTopic.VALUE.value])
-    producer        = initialize_kafka_producer()
-
-    # Parse window_size to seconds
-    try:
-        window_size_td = pd.to_timedelta(window_size)
-        window_size_seconds = window_size_td.total_seconds()
-    except Exception as e:
-        LOGGER.error(f"Invalid window_size format: {window_size}. Error: {e}")
-        window_size_seconds = 30 
-    LOGGER.info(f"Batch processing interval set to {window_size_seconds} seconds.")
-
-    # Extract aggregation mappings from thresholds
-    agg_mappings = GetAggregationMappings(thresholds)
-    if not agg_mappings:
-        LOGGER.error("No valid aggregation mappings extracted from thresholds. Exiting streamer.")
-        consumer.close()
-        producer.flush()
-        client.close()
-        cluster.close()
-        return
-    try:
-        batch = []
-        last_batch_time = time.time()
-        LOGGER.info("Starting to consume messages...")
-
-        while not stop_event.is_set():
-            msg = consumer.poll(1.0)
-
-            if msg is None:
-                current_time = time.time()
-                if (current_time - last_batch_time) >= window_size_seconds and batch:
-                    LOGGER.info("Time-based batch threshold reached. Processing batch.")
-                    future = client.submit(process_batch, batch, agg_mappings, thresholds)
-                    future.add_done_callback(lambda fut: produce_result(fut.result(), producer, KafkaTopic.ALARMS.value))
-                    batch = []
-                    last_batch_time = current_time
-                continue
-
-            if msg.error():
-                if msg.error().code() == KafkaError._PARTITION_EOF:
-                    LOGGER.warning(f"End of partition reached {msg.topic()} [{msg.partition()}] at offset {msg.offset()}")
-                else:
-                    LOGGER.error(f"Kafka error: {msg.error()}")
-                continue
-
-            try:
-                message_value = json.loads(msg.value().decode('utf-8'))
-            except json.JSONDecodeError as e:
-                LOGGER.error(f"JSON decode error: {e}")
-                continue
-
-            try:
-                message_timestamp = pd.to_datetime(message_value[time_stamp_col], errors='coerce')
-                LOGGER.warning(f"message_timestamp: {message_timestamp}. Skipping message.")
-
-                if pd.isna(message_timestamp):
-                    LOGGER.warning(f"Invalid timestamp in message: {message_value}. Skipping message.")
-                    continue
-                window_start = message_timestamp.floor(window_size)
-                LOGGER.warning(f"window_start: {window_start}. Skipping message.")
-                message_value['window_start'] = window_start
-            except Exception as e:
-                LOGGER.error(f"Error processing timestamp: {e}. Skipping message.")
-                continue
-
-            if message_value['kpi_id'] not in kpi_list:
-                LOGGER.debug(f"KPI ID '{message_value['kpi_id']}' not in kpi_list. Skipping message.")
-                continue
-
-            batch.append(message_value)
-
-            current_time = time.time()
-            if (current_time - last_batch_time) >= window_size_seconds and batch:
-                LOGGER.info("Time-based batch threshold reached. Processing batch.")
-                future = client.submit(process_batch, batch, agg_mappings, thresholds, key)
-                future.add_done_callback(lambda fut: produce_result(fut.result(), producer, KafkaTopic.ALARMS.value))
-                batch = []
-                last_batch_time = current_time
-
-    except Exception as e:
-        LOGGER.exception(f"Error in Dask streaming process: {e}")
-    finally:
-        # Process any remaining messages in the batch
-        if batch:
-            LOGGER.info("Processing remaining messages in the batch.")
-            future = client.submit(process_batch, batch, agg_mappings, thresholds)
-            future.add_done_callback(lambda fut: produce_result(fut.result(), producer, KafkaTopic.ALARMS.value))
-        consumer.close()
-        producer.flush()
-        LOGGER.info("Kafka consumer and producer closed.")
-        client.close()
-        cluster.close()
-        LOGGER.info("Dask client and cluster closed.")
diff --git a/src/analytics/backend/service/Streamer.py b/src/analytics/backend/service/Streamer.py
new file mode 100644
index 0000000000000000000000000000000000000000..10917f002ed306ea408a20b92e94aed597ef1ea3
--- /dev/null
+++ b/src/analytics/backend/service/Streamer.py
@@ -0,0 +1,167 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 time
+import json
+import threading
+import logging
+
+from confluent_kafka                            import KafkaException, KafkaError
+from common.tools.kafka.Variables               import KafkaTopic
+from analytics.backend.service.AnalyzerHandlers import Handlers, aggregation_handler
+from analytics.backend.service.AnalyzerHelper   import AnalyzerHelper
+
+
+logger = logging.getLogger(__name__)
+
+
+class DaskStreamer(threading.Thread):
+    def __init__(self, key, input_kpis, output_kpis, thresholds, 
+                 batch_size        = 5, 
+                 batch_duration    = None,
+                 window_size       = None,
+                 cluster_instance  = None,
+                 producer_instance = AnalyzerHelper.initialize_kafka_producer()
+                 ):
+        super().__init__()
+        self.key            = key
+        self.input_kpis     = input_kpis
+        self.output_kpis    = output_kpis
+        self.thresholds     = thresholds
+        self.window_size    = window_size      # TODO: Not implemented
+        self.batch_size     = batch_size
+        self.batch_duration = batch_duration
+        self.running        = True
+        self.batch          = []
+
+        # Initialize Kafka and Dask components
+        self.client   = AnalyzerHelper.initialize_dask_client(cluster_instance)
+        self.consumer = AnalyzerHelper.initialize_kafka_consumer()      # Single-threaded consumer
+        self.producer = producer_instance
+
+        logger.info("Dask Streamer initialized.")
+
+    def run(self):
+        """Main method to start the DaskStreamer."""
+        try:
+            logger.info("Starting Dask Streamer")
+            last_batch_time = time.time()
+            while True:
+                if not self.consumer:
+                    logger.warning("Kafka consumer is not initialized or stopped. Exiting loop.")
+                    break
+                if not self.running:
+                    logger.warning("Dask Streamer instance has been terminated. Exiting loop.")
+                    break
+                if not self.client:
+                    logger.warning("Dask client is not running. Exiting loop.")
+                    break
+                message = self.consumer.poll(timeout=1.0)
+                if message is None:
+                    # logger.info("No new messages received.")
+                    continue
+                if message.error():
+                    if message.error().code() == KafkaError._PARTITION_EOF:
+                        logger.warning(f"Consumer reached end of topic {message.topic()}/{message.partition()}")
+                    elif message.error().code() == KafkaError.UNKNOWN_TOPIC_OR_PART:
+                        logger.error(f"Subscribed topic {message.topic()} does not exist. May be topic does not have any messages.")
+                        continue
+                    elif message.error():
+                        raise KafkaException(message.error())
+                else:
+                    try:
+                        value = json.loads(message.value())
+                    except json.JSONDecodeError:
+                        logger.error(f"Failed to decode message: {message.value()}")
+                        continue
+                    self.batch.append(value)
+
+                # Window size has a precedence over batch size
+                if self.batch_duration is None:
+                    if len(self.batch) >= self.batch_size:  # If batch size is not provided, process continue with the default batch size
+                        logger.info(f"Processing based on batch size {self.batch_size}.")
+                        self.task_handler_selector()
+                        self.batch = []
+                else:
+                    # Process based on window size
+                    current_time = time.time()
+                    if (current_time - last_batch_time) >= self.batch_duration and self.batch:
+                        logger.info(f"Processing based on window size {self.batch_duration}.")
+                        self.task_handler_selector()
+                        self.batch = []
+                        last_batch_time = current_time
+
+        except Exception as e:
+            logger.exception(f"Error in Dask streaming process: {e}")
+        finally:
+            self.stop()
+            logger.info(">>> Exiting Dask Streamer...")
+
+    def task_handler_selector(self):
+        """Select the task handler based on the task type."""
+        logger.info(f"Batch to be processed: {self.batch}")
+        if Handlers.is_valid_handler(self.thresholds["task_type"]):
+            if self.client is not None and self.client.status == 'running':
+                try:
+                    future = self.client.submit(aggregation_handler, "batch size", self.key,
+                                                    self.batch, self.input_kpis, self.output_kpis, self.thresholds)
+                    future.add_done_callback(lambda fut: self.produce_result(fut.result(), KafkaTopic.ALARMS.value))
+                except Exception as e:
+                    logger.error(f"Failed to submit task to Dask client or unable to process future. See error for detail: {e}")
+            else:
+                logger.warning("Dask client is not running. Skipping processing.")
+        else:
+            logger.warning(f"Unknown task type: {self.thresholds['task_type']}. Skipping processing.")
+
+    def produce_result(self, result, destination_topic):
+        """Produce results to the Kafka topic."""
+        if not result:
+            logger.warning("Nothing to produce. Skipping.")
+            return
+        for record in result:
+            try:
+                self.producer.produce(
+                    destination_topic,
+                    key=str(record.get('kpi_id', '')),
+                    value=json.dumps(record),
+                    callback=AnalyzerHelper.delivery_report
+                )
+            except KafkaException as e:
+                logger.error(f"Failed to produce message: {e}")
+        self.producer.flush()
+        logger.info(f"Produced {len(result)} aggregated records to '{destination_topic}'.")
+
+    def stop(self):
+        """Clean up Kafka and Dask thread resources."""
+        if not self.running:
+            logger.info("Dask Streamer is already stopped.")
+            return
+        self.running = False
+        logger.info("Streamer running status is set to False. Waiting 5 seconds before stopping...")
+        time.sleep(5)       # Waiting time for running tasks to complete
+        if self.consumer:
+            try:
+                self.consumer.close()
+                logger.info("Kafka consumer closed.")
+            except Exception as e:
+                logger.error(f"Error closing Kafka consumer: {e}")
+
+        if self.client is not None and hasattr(self.client, 'status') and self.client.status == 'running':
+            try:
+                self.client.close()
+                logger.info("Dask client closed.")
+            except Exception as e:
+                logger.error(f"Error closing Dask client: {e}")
+
+# TODO: May be Single streamer for all analyzers ... ?
diff --git a/src/analytics/backend/service/__main__.py b/src/analytics/backend/service/__main__.py
index 533761bab2ed225e3f8d82f5df7d9290f7fa01b8..55bcb53e4c1c404bd7203f7c7ecc6d0c260d5a54 100644
--- a/src/analytics/backend/service/__main__.py
+++ b/src/analytics/backend/service/__main__.py
@@ -16,8 +16,11 @@ import logging, signal, sys, threading
 from prometheus_client import start_http_server
 from common.Settings import get_log_level, get_metrics_port
 from .AnalyticsBackendService import AnalyticsBackendService
+from common.tools.kafka.Variables import KafkaTopic
+
 
 terminate = threading.Event()
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
 LOGGER = None
 
 def signal_handler(signal, frame): # pylint: disable=redefined-outer-name
@@ -36,6 +39,8 @@ def main():
 
     LOGGER.info('Starting...')
 
+    KafkaTopic.create_all_topics()
+
     # Start metrics server
     metrics_port = get_metrics_port()
     start_http_server(metrics_port)
diff --git a/src/analytics/backend/tests/messages.py b/src/analytics/backend/tests/messages.py
index 55d966dfbbae2318a5f774049b02f5b340070113..2ff1e93536e94863ba9eaaf76d35f7453ba95727 100644
--- a/src/analytics/backend/tests/messages.py
+++ b/src/analytics/backend/tests/messages.py
@@ -53,8 +53,8 @@ def create_analyzer():
     _create_analyzer.algorithm_name               = "Test_Aggergate_and_Threshold"
     _create_analyzer.operation_mode               = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING
     
-    _kpi_id = KpiId()
     # input IDs to analyze
+    _kpi_id = KpiId()
     _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _kpi_id.kpi_id.uuid              = "5716c369-932b-4a02-b4c7-6a2e808b92d7"
     _create_analyzer.input_kpi_ids.append(_kpi_id)
@@ -63,11 +63,14 @@ def create_analyzer():
     _create_analyzer.input_kpi_ids.append(_kpi_id)
     _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _create_analyzer.input_kpi_ids.append(_kpi_id)
+
     # output IDs after analysis
+    _kpi_id = KpiId()
     _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _create_analyzer.output_kpi_ids.append(_kpi_id)
     _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _create_analyzer.output_kpi_ids.append(_kpi_id)
+    
     # parameter
     _threshold_dict = {
         # 'avg_value'   :(20, 30), 'min_value'   :(00, 10), 'max_value'   :(45, 50),
diff --git a/src/analytics/backend/tests/messages_analyzer.py b/src/analytics/backend/tests/messages_analyzer.py
new file mode 100644
index 0000000000000000000000000000000000000000..813b4f06cdbaf1dd1c00c4d0f0dfa4b78339e09c
--- /dev/null
+++ b/src/analytics/backend/tests/messages_analyzer.py
@@ -0,0 +1,67 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 pandas as pd
+from analytics.backend.service.AnalyzerHandlers import Handlers
+
+def get_input_kpi_list():
+    return ["1e22f180-ba28-4641-b190-2287bf446666", "6e22f180-ba28-4641-b190-2287bf448888", 'kpi_3']
+
+def get_output_kpi_list():
+    return ["1e22f180-ba28-4641-b190-2287bf441616", "6e22f180-ba28-4641-b190-2287bf181818", 'kpi_4']
+
+def get_thresholds():
+    return {
+        "task_type": Handlers.AGGREGATION_HANDLER.value,
+        "task_parameter": [
+            {"last":  [40, 80], "variance": [300, 500]},
+            {"count": [2,  4],  "max":      [70,  100]},
+            {"min":   [10, 20], "avg":      [50,  70]},
+        ],
+    }
+
+def get_duration():
+    return 90
+
+def get_batch_duration():
+    return 30
+
+def get_windows_size():
+    return None
+
+def get_batch_size():
+    return 5
+
+def get_interval():
+    return 5
+
+def get_batch():
+    return [
+        {"time_stamp": "2025-01-13T08:44:10Z", "kpi_id": "6e22f180-ba28-4641-b190-2287bf448888", "kpi_value": 46.72},
+        {"time_stamp": "2025-01-13T08:44:12Z", "kpi_id": "6e22f180-ba28-4641-b190-2287bf448888", "kpi_value": 65.22},
+        {"time_stamp": "2025-01-13T08:44:14Z", "kpi_id": "1e22f180-ba28-4641-b190-2287bf446666", "kpi_value": 54.24},
+        {"time_stamp": "2025-01-13T08:44:16Z", "kpi_id": "1e22f180-ba28-4641-b190-2287bf446666", "kpi_value": 57.67},
+        {"time_stamp": "2025-01-13T08:44:18Z", "kpi_id": "1e22f180-ba28-4641-b190-2287bf446666", "kpi_value": 38.6},
+        {"time_stamp": "2025-01-13T08:44:20Z", "kpi_id": "6e22f180-ba28-4641-b190-2287bf448888", "kpi_value": 38.9},
+        {"time_stamp": "2025-01-13T08:44:22Z", "kpi_id": "6e22f180-ba28-4641-b190-2287bf448888", "kpi_value": 52.44},
+        {"time_stamp": "2025-01-13T08:44:24Z", "kpi_id": "6e22f180-ba28-4641-b190-2287bf448888", "kpi_value": 47.76},
+        {"time_stamp": "2025-01-13T08:44:26Z", "kpi_id": "efef4d95-1cf1-43c4-9742-95c283ddd7a6", "kpi_value": 33.71},
+        {"time_stamp": "2025-01-13T08:44:28Z", "kpi_id": "efef4d95-1cf1-43c4-9742-95c283ddd7a6", "kpi_value": 64.44},
+    ]
+
+def get_agg_df():
+    data = [ 
+        {"kpi_id": "1e22f180-ba28-4641-b190-2287bf441616", "last": 47.76, "variance": 970.41},
+    ]
+    return pd.DataFrame(data)
diff --git a/src/analytics/backend/tests/test_backend.py b/src/analytics/backend/tests/test_backend.py
index 4aa9df5fae9849ee429361603a35b2fb8eaa4d23..1bbfaee136942bb7f14e77438683e8460f0a4f0b 100644
--- a/src/analytics/backend/tests/test_backend.py
+++ b/src/analytics/backend/tests/test_backend.py
@@ -12,148 +12,307 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import time, json
-from typing import Dict
+import time
+import json
+import pytest
 import logging
-from threading import Event, Thread
-from common.tools.kafka.Variables import KafkaTopic
+import pandas as pd
+
+from unittest.mock      import MagicMock, patch
+from .messages_analyzer import get_batch, get_input_kpi_list, get_output_kpi_list, get_thresholds, \
+                               get_windows_size, get_batch_size, get_agg_df, get_duration
+
+from common.tools.kafka.Variables                      import KafkaTopic
+from analytics.backend.service.Streamer                import DaskStreamer
+from analytics.backend.service.AnalyzerHandlers        import aggregation_handler, threshold_handler
 from analytics.backend.service.AnalyticsBackendService import AnalyticsBackendService
-from analytics.backend.tests.messages import get_kpi_id_list, get_operation_list, get_threshold_dict
-from .messages import create_analyzer, create_analyzer_dask
-from threading import Thread, Event
-from ..service.DaskStreaming import DaskStreamer
 
-LOGGER = logging.getLogger(__name__)
 
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(funcName)s -  %(levelname)s - %(message)s')
+
+
+# ----
+# Test fixtures and helper functions
+# ----
+
+@pytest.fixture(autouse=True)
+def log_all_methods(request):
+    '''
+    This fixture logs messages before and after each test function runs, indicating the start and end of the test.
+    The autouse=True parameter ensures that this logging happens automatically for all tests in the module.
+    '''
+    logger.info(f" >>>>> Starting test: {request.node.name} ")
+    yield
+    logger.info(f" <<<<< Finished test: {request.node.name} ")
+
+@pytest.fixture
+def mock_kafka_producer():
+    mock_producer         = MagicMock()
+    mock_producer.produce = MagicMock()
+    mock_producer.flush   = MagicMock()
+    return mock_producer
+
+@pytest.fixture
+def mock_dask_cluster():
+    mock_cluster       = MagicMock()
+    mock_cluster.close = MagicMock()
+    return mock_cluster
+
+@pytest.fixture
+def mock_dask_client():
+    mock_client        = MagicMock()
+    mock_client.status = 'running'
+    mock_client.submit = MagicMock()
+    return mock_client
+
+@pytest.fixture()
+def mock_kafka_consumer():
+    mock_consumer           = MagicMock()
+    mock_consumer.subscribe = MagicMock()
+    return mock_consumer
+
+@pytest.fixture()
+def mock_streamer_start():
+    mock_streamer = MagicMock()
+    mock_streamer.start = MagicMock()
+    return mock_streamer
 
 ###########################
-# Tests Implementation of Telemetry Backend
+# funtionality pytest cases with specific fixtures for AnalyticsBackendService class sub-methods
 ###########################
 
-# --- "test_validate_kafka_topics" should be run before the functionality tests ---
-def test_validate_kafka_topics():
-    LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ")
-    response = KafkaTopic.create_all_topics()
-    assert isinstance(response, bool)
-
-
-# --- To test Dask Streamer functionality ---
-# def test_StartDaskStreamer():   # Directly from the Streamer class
-#     LOGGER.debug(" >>> test_StartSparkStreamer: START <<< ")
-#     stop_event = Event()
-#     kpi_list = ["1e22f180-ba28-4641-b190-2287bf446666", "6e22f180-ba28-4641-b190-2287bf448888", 'kpi_3']
-#     oper_list = ['avg', 'min', 'max',]
-#     thresholds = {
-#         'avg_value': (10.0, 90.0),
-#         'min_value': (5.0, 95.0),
-#         'max_value': (15.0, 85.0),
-#         'latency'  : (2.0, 10.0)
-#     }
-
-#     # Start the DaskStreamer in a separate thread
-#     streamer_thread = Thread(
-#         target=DaskStreamer,
-#         args=("analytics_stream", kpi_list, oper_list, thresholds, stop_event),
-#         kwargs={
-#             "window_size": "60s",
-#             "win_slide_duration": "30s",
-#             "time_stamp_col": "time_stamp"
-#         }
-#     )
-#     streamer_thread.start()
-#     try:
-#         while True:
-#             time.sleep(10)
-#     except KeyboardInterrupt:
-#         LOGGER.info("KeyboardInterrupt received. Stopping streamer...")
-#         stop_event.set()
-#         streamer_thread.join()
-#         LOGGER.info("Streamer stopped gracefully.")
-
-# --- To test Start Streamer functionality ---
-# def test_StartDaskStreamer():
-#     LOGGER.debug(" >>> test_StartBaskStreamer: START <<< ")
-#     analyzer_obj = create_analyzer_dask()
-#     # LOGGER.info("Created Analyzer Object: {:}".format(analyzer_obj))
-#     analyzer_uuid = analyzer_obj.analyzer_id.analyzer_id.uuid
-#     analyzer_to_generate : Dict = {
-#         "algo_name"       : analyzer_obj.algorithm_name,
-#         "input_kpis"      : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids],
-#         "output_kpis"     : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids],
-#         "oper_mode"       : analyzer_obj.operation_mode,
-#         "thresholds"      : json.loads(analyzer_obj.parameters["thresholds"]),
-#         "oper_list"       : json.loads(analyzer_obj.parameters["oper_list"]),
-#         # "oper_list"       : analyzer_obj.parameters["oper_list"],
-#         "window_size"     : analyzer_obj.parameters["window_size"],
-#         "window_slider"   : analyzer_obj.parameters["window_slider"],
-#         # "store_aggregate" : analyzer_obj.parameters["store_aggregate"] 
-#     }
-#     AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     LOGGER.info("Analyzer to be generated: {:}".format((analyzer_to_generate)))
-#     response = AnalyticsBackendServiceObj.StartDaskListener(analyzer_uuid, analyzer_to_generate)
-#     assert isinstance(response, bool)
-#     time.sleep(100)
-#     LOGGER.info('Initiating StopRequestListener...')
-#     # AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     response = AnalyticsBackendServiceObj.StopDaskListener(analyzer_uuid)
-#     LOGGER.debug(str(response)) 
-#     assert isinstance(response, bool)
+@pytest.fixture
+def analytics_service(mock_kafka_producer, mock_dask_cluster, mock_dask_client, mock_kafka_consumer, mock_streamer_start):
+    with patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_kafka_producer', return_value = mock_kafka_producer), \
+         patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_dask_cluster',   return_value = mock_dask_cluster  ), \
+         patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_dask_client',    return_value = mock_dask_client   ), \
+         patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_kafka_consumer', return_value = mock_kafka_consumer), \
+         patch('analytics.backend.service.Streamer.DaskStreamer.run',                               return_value = mock_streamer_start):
+         
+        service = AnalyticsBackendService()
+        yield service
+        service.close()
 
-# --- To test Start Streamer functionality ---
-# def test_StartSparkStreamer():
-#     LOGGER.debug(" >>> test_StartSparkStreamer: START <<< ")
-#     analyzer_obj = create_analyzer()
-#     analyzer_uuid = analyzer_obj.analyzer_id.analyzer_id.uuid
-#     analyzer_to_generate : Dict = {
-#         "algo_name"       : analyzer_obj.algorithm_name,
-#         "input_kpis"      : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids],
-#         "output_kpis"     : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids],
-#         "oper_mode"       : analyzer_obj.operation_mode,
-#         "thresholds"      : json.loads(analyzer_obj.parameters["thresholds"]),
-#         "window_size"     : analyzer_obj.parameters["window_size"],
-#         "window_slider"   : analyzer_obj.parameters["window_slider"],
-#         # "store_aggregate" : analyzer_obj.parameters["store_aggregate"] 
-#     }
-#     AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     response = AnalyticsBackendServiceObj.StartSparkStreamer(analyzer_uuid, analyzer_to_generate)
-#     assert isinstance(response, bool)
+@pytest.fixture
+def analyzer_data():
+    return {
+        'algo_name'          : 'test_algorithm',
+        'oper_mode'          : 'test_mode',
+        'input_kpis'         : get_input_kpi_list(),
+        'output_kpis'        : get_output_kpi_list(),
+        'thresholds'         : get_thresholds(),
+        'duration'           : get_duration(),
+        'batch_size_min'     : get_batch_size(),
+        'window_size'        : get_windows_size(),
+        'batch_duration_min' : get_duration(),
+    }
 
-# --- To TEST StartRequestListenerFunctionality
-# def test_StartRequestListener():
-#     LOGGER.info('test_RunRequestListener')
-#     AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     AnalyticsBackendServiceObj.stop_event = Event()
-#     listener_thread = Thread(target=AnalyticsBackendServiceObj.RequestListener, args=())
-#     listener_thread.start()
-
-#     time.sleep(100)
-
-    # AnalyticsBackendServiceObj.stop_event.set()
-    # LOGGER.info('Backend termination initiated. waiting for termination... 10 seconds')
-    # listener_thread.join(timeout=10)
-    # assert not listener_thread.is_alive(), "RequestListener thread did not terminate as expected."
-    # LOGGER.info('Completed test_RunRequestListener')
-
-# To test START and STOP communication together
-# def test_StopRequestListener():
-#     LOGGER.info('test_RunRequestListener')
-#     LOGGER.info('Initiating StartRequestListener...')
-#     AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     response_thread = AnalyticsBackendServiceObj.StartRequestListener() # response is Tuple (thread, stop_event)
-#     # LOGGER.debug(str(response_thread))
-#     time.sleep(10)
-#     LOGGER.info('Initiating StopRequestListener...')
-#     AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     response = AnalyticsBackendServiceObj.StopRequestListener(response_thread)
-#     LOGGER.debug(str(response)) 
-#     assert isinstance(response, bool)
+def test_start_streamer(analytics_service, analyzer_data):
+    analyzer_uuid = "test-analyzer-uuid"
+    # Start streamer
+    result = analytics_service.StartStreamer(analyzer_uuid, analyzer_data)
+    assert result is True
+    assert analyzer_uuid in analytics_service.active_streamers
+
+def test_stop_streamer(analytics_service, analyzer_data):
+    analyzer_uuid = "test-analyzer-uuid"
+
+    # Start streamer for stopping it later
+    analytics_service.StartStreamer(analyzer_uuid, analyzer_data)
+    assert analyzer_uuid in analytics_service.active_streamers
+
+    # Stop streamer
+    with patch('time.sleep', return_value=None):
+        result = analytics_service.StopStreamer(analyzer_uuid)
+    assert result is True
+    assert analyzer_uuid not in analytics_service.active_streamers
+
+    # Verify that the streamer was stopped
+    assert analyzer_uuid not in analytics_service.active_streamers
+
+def test_close(analytics_service, mock_kafka_producer, mock_dask_cluster):
+    analytics_service.close()
+
+    mock_kafka_producer.flush.assert_called_once()
+    mock_dask_cluster.close.assert_called_once()
+
+###########################
+# funtionality pytest with specific fixtures for streamer class sub methods
+###########################
+
+@pytest.fixture
+def dask_streamer(mock_kafka_producer, mock_dask_cluster, mock_dask_client, mock_kafka_consumer):
+    with patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_kafka_producer', return_value = mock_kafka_producer), \
+         patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_dask_cluster',   return_value = mock_dask_cluster  ), \
+         patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_dask_client',    return_value = mock_dask_client   ), \
+         patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_kafka_consumer', return_value = mock_kafka_consumer):
+        
+        return DaskStreamer(
+            key               = "test_key",
+            input_kpis        = get_input_kpi_list(),
+            output_kpis       = get_output_kpi_list(),
+            thresholds        = get_thresholds(),
+            batch_size        = get_batch_size(),
+            window_size       = get_windows_size(),
+            cluster_instance  = mock_dask_cluster(),
+            producer_instance = mock_kafka_producer(),
+        )
+
+def test_dask_streamer_initialization(dask_streamer):
+    """Test if the DaskStreamer initializes correctly."""
+    assert dask_streamer.key         == "test_key"
+    assert dask_streamer.batch_size  == get_batch_size()
+    assert dask_streamer.window_size is None
+    assert dask_streamer.consumer    is not None
+    assert dask_streamer.producer    is not None
+    assert dask_streamer.client      is not None
+
+def test_run_stops_on_no_consumer(dask_streamer):
+    """Test if the run method exits when the consumer is not initialized."""
+    dask_streamer.consumer = None
+    with patch('time.sleep', return_value=None):
+        dask_streamer.run()
 
-# To independently tests the SparkListener functionality
-# def test_SparkListener():
-#     LOGGER.info('test_RunRequestListener')
-#     AnalyticsBackendServiceObj = AnalyticsBackendService()
-#     response = AnalyticsBackendServiceObj.RunSparkStreamer(
-#         get_kpi_id_list(), get_operation_list(), get_threshold_dict()
-#         )
-#     LOGGER.debug(str(response))
+    assert not dask_streamer.running
+
+def test_task_handler_selector_valid_handler(dask_streamer, mock_dask_client):
+    """Test task handler selection with a valid handler."""
+    with patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.initialize_dask_client', return_value = mock_dask_client):
+
+        dask_streamer.task_handler_selector()
+        assert dask_streamer.client.status == 'running'
+
+def test_task_handler_selector_invalid_handler(dask_streamer):
+    """Test task handler selection with an invalid handler."""
+    with patch('analytics.backend.service.AnalyzerHandlers.Handlers.is_valid_handler', return_value=False):
+        dask_streamer.task_handler_selector()
+        assert dask_streamer.batch == []
+
+def test_produce_result(dask_streamer):
+    """Test if produce_result sends records to Kafka."""
+    result = [{"kpi_id": "kpi1", "value": 100}]
+    with patch('analytics.backend.service.AnalyzerHelper.AnalyzerHelper.delivery_report', return_value=None) as mock_delivery_report, \
+         patch.object(dask_streamer.producer, 'produce') as mock_produce:
+        dask_streamer.produce_result(result, "test_topic")
+        mock_produce.assert_called_once_with(
+            "test_topic",
+            key="kpi1",
+            value=json.dumps({"kpi_id": "kpi1", "value": 100}),
+            callback=mock_delivery_report
+        )
+
+def test_stop(dask_streamer):
+    """Test the cleanup method."""
+    with patch.object(dask_streamer.consumer, 'close') as mock_consumer_close, \
+         patch.object(dask_streamer.client,   'close') as mock_client_close, \
+         patch('time.sleep', return_value=0):
+        
+        # Mock the conditions required for the close calls
+        dask_streamer.client.status = 'running'
+        
+        dask_streamer.stop()
+
+        mock_consumer_close.assert_called_once()
+        mock_client_close.assert_called_once()
+
+def test_run_with_valid_consumer(dask_streamer):
+    """Test the run method with a valid Kafka consumer."""
+    with patch.object(dask_streamer.consumer, 'poll')         as mock_poll, \
+         patch.object(dask_streamer, 'task_handler_selector') as mock_task_handler_selector:
+        
+        # Simulate valid messages without errors
+        mock_message_1 = MagicMock()
+        mock_message_1.value.return_value = b'{"kpi_id": "kpi1", "value": 100}'
+        mock_message_1.error.return_value = None  # No error
+
+        mock_message_2 = MagicMock()
+        mock_message_2.value.return_value = b'{"kpi_id": "kpi2", "value": 200}'
+        mock_message_2.error.return_value = None  # No error
+
+        # Mock `poll` to return valid messages
+        mock_poll.side_effect = [mock_message_1, mock_message_2]
+        
+        # Run the `run` method in a limited loop
+        with patch('time.sleep', return_value=None):  # Mock `sleep` to avoid delays
+            dask_streamer.running = True            
+            dask_streamer.batch_size = 2            
+            
+            # Limit the loop by breaking it after one full processing cycle
+            def stop_running_after_task_handler():
+                logger.info("Stopping the streamer after processing the first batch.")
+                dask_streamer.running = False
+            
+            mock_task_handler_selector.side_effect = stop_running_after_task_handler
+            dask_streamer.run()
+        
+        assert len(dask_streamer.batch) == 0  # Batch should be cleared after processing
+        mock_task_handler_selector.assert_called_once()  # Task handler should be called once
+        mock_poll.assert_any_call(timeout=1.0)  # Poll should have been called at least once
+
+# # add a test to check the working of aggregation_handler function and threshold_handler from AnalyzerHandlers.py
+def test_aggregation_handler():
+
+    # Create a sample batch
+    batch           = get_batch()
+    input_kpi_list  = get_input_kpi_list()
+    output_kpi_list = get_output_kpi_list()
+    thresholds      = get_thresholds() 
+
+    # Test aggregation_handler
+    aggregated_df = aggregation_handler(
+        "test_batch", "test_key", batch, input_kpi_list, output_kpi_list, thresholds
+    )
+    assert isinstance(aggregated_df, list)
+    assert all(isinstance(item, dict) for item in aggregated_df)
+
+# # Test threshold_handler
+def test_threshold_handler():
+    # Create a sample aggregated DataFrame
+    agg_df     = get_agg_df()
+    thresholds = get_thresholds()
+
+    # Test threshold_handler
+    result = threshold_handler("test_key", agg_df, thresholds["task_parameter"][0])
+
+    assert isinstance(result, pd.DataFrame)
+    assert result.shape == (1, 7)
+
+
+###########################
+# integration test of Streamer with backend service (Shouldn't be run in the CI/CD pipeline)
+###########################
+# This is a local machine test to check the integration of the backend service with the Streamer
+
+# @pytest.fixture(scope='session')
+# def analyticBackend_service():
+#     logger.info('Initializing AnalyticsBackendService...')
+
+#     _service = AnalyticsBackendService()
+#     _service.start()
+
+#     logger.info('Yielding AnalyticsBackendService...')
+#     yield _service
+
+#     logger.info('Terminating AnalyticsBackendService...')
+#     _service.stop()
+#     logger.info('Terminated AnalyticsBackendService...')
+
+
+# # --- "test_validate_kafka_topics" should be run before the functionality tests ---
+# def test_validate_kafka_topics():
+#     logger.debug(" >>> test_validate_kafka_topics: START <<< ")
+#     response = KafkaTopic.create_all_topics()
 #     assert isinstance(response, bool)
+
+# def test_backend_integration_with_frontend(analyticBackend_service: AnalyticsBackendService):
+#     # backendServiceObject = AnalyticsBackendService()
+#     # backendServiceObject.install_servicers()
+#     logger.info(" waiting for 2 minutes for the backend service before termination  ... ")
+#     time.sleep(300)
+#     logger.info(" Initiating stop collector ... ")
+#     status = analyticBackend_service.StopStreamer("efef4d95-1cf1-43c4-9742-95c283ddd666")
+#     analyticBackend_service.close()
+#     assert isinstance(status, bool)
+#     assert status == True
+#     logger.info(" Backend service terminated successfully ... ")
diff --git a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py
index fd5bcd185b1f9945eccf583c33af2a243fe729be..cd20503e7dbe1059b2209e4b0ccd29a229e7916e 100644
--- a/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py
+++ b/src/analytics/frontend/service/AnalyticsFrontendServiceServicerImpl.py
@@ -46,7 +46,7 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer):
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def StartAnalyzer(self, 
-                       request : Analyzer, grpc_context: grpc.ServicerContext # type: ignore
+                       request : Analyzer, context: grpc.ServicerContext # type: ignore
                       ) -> AnalyzerId: # type: ignore
         LOGGER.info ("At Service gRPC message: {:}".format(request))
         response = AnalyzerId()
@@ -65,14 +65,18 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer):
         """
         analyzer_uuid = analyzer_obj.analyzer_id.analyzer_id.uuid
         analyzer_to_generate : Dict = {
-            "algo_name"       : analyzer_obj.algorithm_name,
-            "input_kpis"      : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids],
-            "output_kpis"     : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids],
-            "oper_mode"       : analyzer_obj.operation_mode,
-            "thresholds"      : json.loads(analyzer_obj.parameters["thresholds"]),
-            "window_size"     : analyzer_obj.parameters["window_size"],
-            "window_slider"   : analyzer_obj.parameters["window_slider"],
-            # "store_aggregate" : analyzer_obj.parameters["store_aggregate"] 
+            "algo_name"           : analyzer_obj.algorithm_name,
+            "input_kpis"          : [k.kpi_id.uuid for k in analyzer_obj.input_kpi_ids],
+            "output_kpis"         : [k.kpi_id.uuid for k in analyzer_obj.output_kpi_ids],
+            "oper_mode"           : analyzer_obj.operation_mode,
+            "duration"            : analyzer_obj.duration_s,
+            "thresholds"          : json.loads(analyzer_obj.parameters["thresholds"]),
+            "window_size"         : analyzer_obj.parameters["window_size"],     # slider window size in seconds (single batch execution time)
+            "window_slider"       : analyzer_obj.parameters["window_slider"],   # slider shift in seconds
+            "batch_size_min"      : analyzer_obj.batch_min_size,                # currently implemented
+            "batch_size_max"      : analyzer_obj.batch_max_size,
+            "batch_duration_min"  : analyzer_obj.batch_min_duration_s,          # currently implemented
+            "batch_interval_max"  : analyzer_obj.batch_max_duration_s
         }
         self.kafka_producer.produce(
             KafkaTopic.ANALYTICS_REQUEST.value,
@@ -137,7 +141,7 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer):
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def StopAnalyzer(self, 
-                      request : AnalyzerId, grpc_context: grpc.ServicerContext # type: ignore
+                      request : AnalyzerId, context: grpc.ServicerContext # type: ignore
                      ) -> Empty:  # type: ignore
         LOGGER.info ("At Service gRPC message: {:}".format(request))
         try:
@@ -181,7 +185,7 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer):
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SelectAnalyzers(self, 
-                         filter : AnalyzerFilter, contextgrpc_context: grpc.ServicerContext # type: ignore
+                         filter : AnalyzerFilter, context: grpc.ServicerContext # type: ignore
                         ) -> AnalyzerList:  # type: ignore
         LOGGER.info("At Service gRPC message: {:}".format(filter))
         response = AnalyzerList()
@@ -202,7 +206,5 @@ class AnalyticsFrontendServiceServicerImpl(AnalyticsFrontendServiceServicer):
     def delivery_callback(self, err, msg):
         if err:
             LOGGER.debug('Message delivery failed: {:}'.format(err))
-            # print       ('Message delivery failed: {:}'.format(err))
         else:
             LOGGER.debug('Message delivered to topic {:}'.format(msg.topic()))
-            # print('Message delivered to topic {:}'.format(msg.topic()))
diff --git a/src/analytics/frontend/service/__main__.py b/src/analytics/frontend/service/__main__.py
index edf94c4fdd828c9a195d8695b0ba52b544b6a863..a79b2bbc63b5543e11ee8bda92e1b8d9fdda967d 100644
--- a/src/analytics/frontend/service/__main__.py
+++ b/src/analytics/frontend/service/__main__.py
@@ -18,8 +18,11 @@ from common.Settings import get_log_level, get_metrics_port
 from .AnalyticsFrontendService import AnalyticsFrontendService
 from analytics.database.AnalyzerModel import Analyzer as Model
 from common.tools.database.GenericDatabase import Database
+from common.tools.kafka.Variables import KafkaTopic
+
 
 terminate = threading.Event()
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
 LOGGER    = None
 
 def signal_handler(signal, frame): # pylint: disable=redefined-outer-name
@@ -43,6 +46,8 @@ def main():
     kpiDBobj.create_database()
     kpiDBobj.create_tables()
 
+    KafkaTopic.create_all_topics()
+
     # Start metrics server
     metrics_port = get_metrics_port()
     start_http_server(metrics_port)
diff --git a/src/analytics/frontend/tests/messages.py b/src/analytics/frontend/tests/messages.py
index 4df6070bedffd91402953bbbbbec16ce0118008c..326bc0be22c0d0e01ccdd79b439b82a88d06e0ad 100644
--- a/src/analytics/frontend/tests/messages.py
+++ b/src/analytics/frontend/tests/messages.py
@@ -20,43 +20,77 @@ from common.proto.analytics_frontend_pb2 import ( AnalyzerOperationMode, Analyze
 
 def create_analyzer_id():
     _create_analyzer_id                  = AnalyzerId()
-    # _create_analyzer_id.analyzer_id.uuid = str(uuid.uuid4())
+    _create_analyzer_id.analyzer_id.uuid = str(uuid.uuid4())
     # _create_analyzer_id.analyzer_id.uuid = "efef4d95-1cf1-43c4-9742-95c283ddd7a6"
-    _create_analyzer_id.analyzer_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666"
+    # _create_analyzer_id.analyzer_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666"
     return _create_analyzer_id
 
 def create_analyzer():
     _create_analyzer                              = Analyzer()
-    # _create_analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4())
-    _create_analyzer.analyzer_id.analyzer_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666"
-    _create_analyzer.algorithm_name               = "Test_Aggergate_and_Threshold"
+
+    _create_analyzer.analyzer_id.analyzer_id.uuid = str(uuid.uuid4())
+    # _create_analyzer.analyzer_id.analyzer_id.uuid = "1e22f180-ba28-4641-b190-2287bf446666"
+    _create_analyzer.algorithm_name               = "Test_new_Threshold"
     _create_analyzer.operation_mode               = AnalyzerOperationMode.ANALYZEROPERATIONMODE_STREAMING
     
-    _kpi_id = KpiId()
     # input IDs to analyze
-    _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
+    _kpi_id = KpiId()
+
+    # _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _kpi_id.kpi_id.uuid              = "6e22f180-ba28-4641-b190-2287bf448888"
     _create_analyzer.input_kpi_ids.append(_kpi_id)
-    _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
+
+    # _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _kpi_id.kpi_id.uuid              = "1e22f180-ba28-4641-b190-2287bf446666"
     _create_analyzer.input_kpi_ids.append(_kpi_id)
+
     _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _create_analyzer.input_kpi_ids.append(_kpi_id)
+    
     # output IDs after analysis
-    _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
+    _kpi_id = KpiId()
+
+    # _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
+    _kpi_id.kpi_id.uuid              = "6e22f180-ba28-4641-b190-2287bf181818"
+    _create_analyzer.output_kpi_ids.append(_kpi_id)
+
+    # _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
+    _kpi_id.kpi_id.uuid              = "1e22f180-ba28-4641-b190-2287bf441616"
     _create_analyzer.output_kpi_ids.append(_kpi_id)
+
     _kpi_id.kpi_id.uuid              = str(uuid.uuid4())
     _create_analyzer.output_kpi_ids.append(_kpi_id)
+
     # parameter
+    # _threshold_dict = {
+    #     'mean_value'  :[20, 30], 'min_value'   :[00, 10], 'max_value' :[45, 50],
+    #     'first_value' :[00, 10], 'last_value'  :[40, 50], 'std_value' :[00, 10]
+    #     }
     _threshold_dict = {
-        'mean_value'   :(20, 30), 'min_value'   :(00, 10), 'max_value'   :(45, 50),
-        'first_value' :(00, 10), 'last_value'  :(40, 50), 'std_value':(00, 10)
-        }
+        "task_type": Handlers.AGGREGATION_HANDLER.value,
+        "task_parameter": [
+            {"last":  [40, 80], "variance": [300, 500]},
+            {"count": [2,  4],  "max":      [70,  100]},
+            {"min":   [10, 20], "avg":      [50,  70]},
+        ],
+    }
+
     _create_analyzer.parameters['thresholds']      = json.dumps(_threshold_dict)
-    _create_analyzer.parameters['window_size']     = "10s"            # Such as "10 seconds", "2 minutes", "3 hours", "4 days" or "5 weeks" 
-    _create_analyzer.parameters['window_slider']   = "5s"             # should be less than window size
-    _create_analyzer.parameters['store_aggregate'] = str(False)       # TRUE to store. No implemented yet
+    _create_analyzer.parameters['window_size']     = "0"   #   slider window size in seconds (Total time for aggeration processing) 
+    _create_analyzer.parameters['window_slider']   = "0"    #   should be less than window size
+    _create_analyzer.parameters['store_aggregate'] = str(False)  #   TRUE to store. No implemented yet
 
+    # duration of the analyzer
+    _create_analyzer.duration_s = 90
+
+    # batch window size
+    _create_analyzer.batch_min_duration_s = 20
+    _create_analyzer.batch_max_duration_s = 50
+
+    # batch size
+    _create_analyzer.batch_min_size       = 5
+    _create_analyzer.batch_max_size       = 10
+    
     return _create_analyzer
 
 def create_analyzer_filter():
@@ -84,3 +118,10 @@ def create_analyzer_filter():
     # _create_analyzer_filter.input_kpi_ids.append(_output_kpi_id_obj)
 
     return _create_analyzer_filter
+
+
+# Added for testing to remove the dependency on the backend service
+from enum import Enum
+class Handlers(Enum):
+    AGGREGATION_HANDLER = "AggregationHandler"
+    UNSUPPORTED_HANDLER = "UnsupportedHandler"
diff --git a/src/analytics/frontend/tests/test_frontend.py b/src/analytics/frontend/tests/test_frontend.py
index 134871fb77719e4747b6fc3ae6cfd21dd317a31f..7d8a08d3ad2d82758b088a8f83342c2b3929eadd 100644
--- a/src/analytics/frontend/tests/test_frontend.py
+++ b/src/analytics/frontend/tests/test_frontend.py
@@ -78,6 +78,15 @@ def analyticsFrontend_client(analyticsFrontend_service : AnalyticsFrontendServic
 
     LOGGER.info('Closed AnalyticsFrontendClient...')
 
+@pytest.fixture(autouse=True)
+def log_all_methods(request):
+    '''
+    This fixture logs messages before and after each test function runs, indicating the start and end of the test.
+    The autouse=True parameter ensures that this logging happens automatically for all tests in the module.
+    '''
+    LOGGER.info(f" >>>>> Starting test: {request.node.name} ")
+    yield
+    LOGGER.info(f" <<<<< Finished test: {request.node.name} ")
 
 ###########################
 # Tests Implementation of Analytics Frontend
@@ -89,24 +98,17 @@ def test_validate_kafka_topics():
     response = KafkaTopic.create_all_topics()
     assert isinstance(response, bool)
 
-# ----- core funtionality test -----
-# def test_StartAnalytics(analyticsFrontend_client):
-#     LOGGER.info(' >>> test_StartAnalytic START: <<< ')
-#     response = analyticsFrontend_client.StartAnalyzer(create_analyzer())
-#     LOGGER.debug(str(response))
-#     assert isinstance(response, AnalyzerId)
-
 # To test start and stop listener together
 def test_StartAnalyzers(analyticsFrontend_client):
     LOGGER.info(' >>> test_StartAnalyzers START: <<< ')
     added_analyzer_id = analyticsFrontend_client.StartAnalyzer(create_analyzer())
     LOGGER.debug(str(added_analyzer_id))
-    LOGGER.info(' --> Calling StartResponseListener... ')
-    class_obj = AnalyticsFrontendServiceServicerImpl()
-    response =  class_obj.StartResponseListener(added_analyzer_id.analyzer_id.uuid)
-    LOGGER.debug(response)
-    LOGGER.info("waiting for timer to comlete ...")
-    time.sleep(3)
+    # LOGGER.info(' --> Calling StartResponseListener... ')
+    # class_obj = AnalyticsFrontendServiceServicerImpl()
+    # response  =  class_obj.StartResponseListener(added_analyzer_id.analyzer_id.uuid)
+    # LOGGER.debug(response)
+    LOGGER.info("waiting for timer to complete ...")
+    time.sleep(15)
     LOGGER.info('--> StopAnalyzer')
     response = analyticsFrontend_client.StopAnalyzer(added_analyzer_id)
     LOGGER.debug(str(response))
diff --git a/src/common/DeviceTypes.py b/src/common/DeviceTypes.py
index eb315352b47bbe501f66868c0181a0d34cd6cfed..9a982d1eb71e8b139d2a86fe1a774154239c7147 100644
--- a/src/common/DeviceTypes.py
+++ b/src/common/DeviceTypes.py
@@ -38,6 +38,7 @@ class DeviceTypeEnum(Enum):
     CLIENT                          = 'client'
     DATACENTER                      = 'datacenter'
     IP_SDN_CONTROLLER               = 'ip-sdn-controller'
+    NCE                             = 'nce'
     MICROWAVE_RADIO_SYSTEM          = 'microwave-radio-system'
     OPEN_LINE_SYSTEM                = 'open-line-system'
     OPTICAL_ROADM                   = 'optical-roadm'
@@ -52,3 +53,4 @@ class DeviceTypeEnum(Enum):
 
     # ETSI TeraFlowSDN controller
     TERAFLOWSDN_CONTROLLER          = 'teraflowsdn'
+    IETF_SLICE                      = 'ietf-slice'
diff --git a/src/common/tools/client/RetryDecorator.py b/src/common/tools/client/RetryDecorator.py
index fc45d95c8dccbbca32ace5fbba5fb4aefc7a4d79..efc8b52348e6becdec13d4929e1ae9b4f3ad428f 100644
--- a/src/common/tools/client/RetryDecorator.py
+++ b/src/common/tools/client/RetryDecorator.py
@@ -51,24 +51,32 @@ LOGGER = logging.getLogger(__name__)
 def delay_linear(initial=0, increment=0, maximum=None):
     def compute(num_try):
         delay = initial + (num_try - 1) * increment
-        if maximum is not None: delay = max(delay, maximum)
+        if maximum is not None:
+            delay = max(delay, maximum)
         return delay
     return compute
 
-def delay_exponential(initial=1, increment=1, maximum=None):
+def delay_exponential(initial=1.0, increment=1.0, maximum=None):
     def compute(num_try):
         delay = initial * pow(increment, (num_try - 1))
-        if maximum is not None: delay = max(delay, maximum)
+        if maximum is not None:
+            delay = max(delay, maximum)
         return delay
     return compute
 
-def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0),
-          prepare_method_name=None, prepare_method_args=[], prepare_method_kwargs={}):
+# pylint: disable=dangerous-default-value
+def retry(
+    max_retries=0, delay_function=delay_linear(initial=0, increment=0),
+    prepare_method_name=None, prepare_method_args=list(), prepare_method_kwargs=dict()
+):
     def _reconnect(func):
         def wrapper(self, *args, **kwargs):
             if prepare_method_name is not None:
                 prepare_method = getattr(self, prepare_method_name, None)
-                if prepare_method is None: raise Exception('Prepare Method ({}) not found'.format(prepare_method_name))
+                if prepare_method is None:
+                    MSG = 'Prepare Method ({:s}) not found'
+                    # pylint: disable=broad-exception-raised
+                    raise Exception(MSG.format(prepare_method_name))
             num_try, given_up = 0, False
             while not given_up:
                 try:
@@ -78,14 +86,29 @@ def retry(max_retries=0, delay_function=delay_linear(initial=0, increment=0),
 
                     num_try += 1
                     given_up = num_try > max_retries
-                    if given_up: raise Exception('Giving up... {:d} tries failed'.format(max_retries)) from e
+                    if given_up:
+                        MSG = '[{:s}:{:s}] Giving up... {:d} tries failed'
+                        msg = MSG.format(func.__module__, func.__name__, max_retries)
+                        # pylint: disable=broad-exception-raised
+                        raise Exception(msg) from e
                     if delay_function is not None:
                         delay = delay_function(num_try)
                         time.sleep(delay)
-                        LOGGER.info('Retry {:d}/{:d} after {:f} seconds...'.format(num_try, max_retries, delay))
+                        MSG = '[{:s}:{:s}] Retry {:d}/{:d} after {:f} seconds...'
+                        LOGGER.info(MSG.format(
+                            func.__module__, func.__name__, num_try, max_retries, delay
+                        ))
                     else:
-                        LOGGER.info('Retry {:d}/{:d} immediate...'.format(num_try, max_retries))
+                        MSG = '[{:s}:{:s}] Retry {:d}/{:d} immediate...'
+                        LOGGER.info(MSG.format(
+                            func.__module__, func.__name__, num_try, max_retries
+                        ))
 
-                    if prepare_method_name is not None: prepare_method(*prepare_method_args, **prepare_method_kwargs)
+                    if prepare_method_name is not None:
+                        MSG = '[{:s}:{:s}] Running prepare method...'
+                        LOGGER.debug(MSG.format(
+                            prepare_method.__module__, prepare_method.__name__
+                        ))
+                        prepare_method(*prepare_method_args, **prepare_method_kwargs)
         return wrapper
     return _reconnect
diff --git a/src/common/tools/context_queries/Slice.py b/src/common/tools/context_queries/Slice.py
index c826c59ce79adbe1e399d674ffd46a421ddd9b5e..12bd8c03c68ab0baea5b4db91b7468e2eae7f1a9 100644
--- a/src/common/tools/context_queries/Slice.py
+++ b/src/common/tools/context_queries/Slice.py
@@ -12,12 +12,20 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import grpc, logging
-from typing import Optional
+import logging
+import grpc
+from typing import Optional, Tuple, Union
+from uuid import UUID, uuid5
 from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import Slice, SliceFilter, SliceId
+from common.method_wrappers.ServiceExceptions import InvalidArgumentsException
+from common.proto.context_pb2 import ContextId, Slice, SliceFilter, SliceId
+from common.method_wrappers.ServiceExceptions import InvalidArgumentsException
+from common.proto.context_pb2 import ContextId, Slice, SliceFilter, SliceId
 from context.client.ContextClient import ContextClient
 
+
+NAMESPACE_TFS = UUID("200e3a1f-2223-534f-a100-758e29c37f40")
+
 LOGGER = logging.getLogger(__name__)
 
 def get_slice_by_id(
@@ -59,3 +67,96 @@ def get_slice_by_uuid(
         context_client, slice_id, rw_copy=rw_copy, include_endpoint_ids=include_endpoint_ids,
         include_constraints=include_constraints, include_service_ids=include_service_ids,
         include_subslice_ids=include_subslice_ids, include_config_rules=include_config_rules)
+
+
+def get_uuid_from_string(
+    str_uuid_or_name: Union[str, UUID], prefix_for_name: Optional[str] = None
+) -> str:
+    # if UUID given, assume it is already a valid UUID
+    if isinstance(str_uuid_or_name, UUID):
+        return str_uuid_or_name
+    if not isinstance(str_uuid_or_name, str):
+        MSG = "Parameter({:s}) cannot be used to produce a UUID"
+        raise Exception(MSG.format(str(repr(str_uuid_or_name))))
+    try:
+        # try to parse as UUID
+        return str(UUID(str_uuid_or_name))
+    except:  # pylint: disable=bare-except
+        # produce a UUID within TFS namespace from parameter
+        if prefix_for_name is not None:
+            str_uuid_or_name = "{:s}/{:s}".format(prefix_for_name, str_uuid_or_name)
+        return str(uuid5(NAMESPACE_TFS, str_uuid_or_name))
+
+
+def context_get_uuid(
+    context_id: ContextId,
+    context_name: str = "",
+    allow_random: bool = False,
+    allow_default: bool = False,
+) -> str:
+    context_uuid = context_id.context_uuid.uuid
+
+    if len(context_uuid) > 0:
+        return get_uuid_from_string(context_uuid)
+    if len(context_name) > 0:
+        return get_uuid_from_string(context_name)
+    if allow_default:
+        return get_uuid_from_string(DEFAULT_CONTEXT_NAME)
+
+    raise InvalidArgumentsException(
+        [
+            ("context_id.context_uuid.uuid", context_uuid),
+            ("name", context_name),
+        ],
+        extra_details=["At least one is required to produce a Context UUID"],
+    )
+
+
+def slice_get_uuid(slice_id: SliceId) -> Tuple[str, str]:
+    context_uuid = context_get_uuid(slice_id.context_id, allow_random=False)
+    raw_slice_uuid = slice_id.slice_uuid.uuid
+
+    if len(raw_slice_uuid) > 0:
+        return context_uuid, get_uuid_from_string(
+            raw_slice_uuid, prefix_for_name=context_uuid
+        )
+
+    raise InvalidArgumentsException(
+        [
+            ("slice_id.slice_uuid.uuid", raw_slice_uuid),
+        ],
+        extra_details=["At least one is required to produce a Slice UUID"],
+    )
+
+def get_slice_by_defualt_id(
+    context_client : ContextClient, default_slice_id : SliceId, context_uuid : str = DEFAULT_CONTEXT_NAME,
+    rw_copy : bool = False, include_endpoint_ids : bool = True, include_constraints : bool = True,
+    include_service_ids : bool = True, include_subslice_ids : bool = True, include_config_rules : bool = True
+) -> Optional[Slice]:
+    context_uuid, slice_uuid = slice_get_uuid(default_slice_id)
+    LOGGER.debug(f'P60: {context_uuid} {slice_uuid}')
+    slice_id = SliceId()
+    slice_id.context_id.context_uuid.uuid = context_uuid    # pylint: disable=no-member
+    slice_id.slice_uuid.uuid = slice_uuid                   # pylint: disable=no-member
+    return get_slice_by_id(
+        context_client, slice_id, rw_copy=rw_copy, include_endpoint_ids=include_endpoint_ids,
+        include_constraints=include_constraints, include_service_ids=include_service_ids,
+        include_subslice_ids=include_subslice_ids, include_config_rules=include_config_rules)
+
+
+def get_slice_by_defualt_name(
+    context_client : ContextClient, slice_name : str, context_uuid : str = DEFAULT_CONTEXT_NAME,
+    rw_copy : bool = False, include_endpoint_ids : bool = True, include_constraints : bool = True,
+    include_service_ids : bool = True, include_subslice_ids : bool = True, include_config_rules : bool = True
+) -> Optional[Slice]:
+    default_slice_id = SliceId()
+    default_slice_id.context_id.context_uuid.uuid = context_uuid    # pylint: disable=no-member
+    default_slice_id.slice_uuid.uuid = slice_name                   # pylint: disable=no-member
+    context_uuid, slice_uuid = slice_get_uuid(default_slice_id)
+    slice_id = SliceId()
+    slice_id.context_id.context_uuid.uuid = context_uuid    # pylint: disable=no-member
+    slice_id.slice_uuid.uuid = slice_uuid                   # pylint: disable=no-member
+    return get_slice_by_id(
+        context_client, slice_id, rw_copy=rw_copy, include_endpoint_ids=include_endpoint_ids,
+        include_constraints=include_constraints, include_service_ids=include_service_ids,
+        include_subslice_ids=include_subslice_ids, include_config_rules=include_config_rules)
diff --git a/src/common/tools/database/GenericEngine.py b/src/common/tools/database/GenericEngine.py
index 1d38a1f440af643c253d5d17bda8ca9e6c3fdc44..89b6c2b6dd1d4c94dc2d1082ce0051a82078ddd8 100644
--- a/src/common/tools/database/GenericEngine.py
+++ b/src/common/tools/database/GenericEngine.py
@@ -33,8 +33,8 @@ class Engine:
                 CRDB_USERNAME, CRDB_PASSWORD, CRDB_NAMESPACE, CRDB_SQL_PORT, CRDB_DATABASE, CRDB_SSLMODE)
         try:
             engine = sqlalchemy.create_engine(crdb_uri, echo=False)
-            LOGGER.info(' AnalyzerDB initalized with DB URL: {:}'.format(crdb_uri))
+            LOGGER.info(' Database initalized with DB URL: {:}'.format(crdb_uri))
+            return engine
         except: # pylint: disable=bare-except # pragma: no cover
             LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri)))
             return None # type: ignore
-        return engine
diff --git a/src/common/tools/descriptor/Tools.py b/src/common/tools/descriptor/Tools.py
index c8807cef0d1357c732d34b11580d1f73e157501a..2ecd38ae146f5c5e3a04a84ad3bb05385554f659 100644
--- a/src/common/tools/descriptor/Tools.py
+++ b/src/common/tools/descriptor/Tools.py
@@ -115,6 +115,8 @@ CONTROLLER_DEVICE_TYPES = {
     DeviceTypeEnum.MICROWAVE_RADIO_SYSTEM.value,
     DeviceTypeEnum.OPEN_LINE_SYSTEM.value,
     DeviceTypeEnum.TERAFLOWSDN_CONTROLLER.value,
+    DeviceTypeEnum.IETF_SLICE.value,
+    DeviceTypeEnum.NCE.value,
 }
 
 def split_controllers_and_network_devices(devices : List[Dict]) -> Tuple[List[Dict], List[Dict]]:
diff --git a/src/common/tools/grpc/ConfigRules.py b/src/common/tools/grpc/ConfigRules.py
index c8919273e65c6f6edb0f3e0ca6f060a5471e8f0e..0cf5165e9a15e1bcbaa4067db1e866ab01fbe33c 100644
--- a/src/common/tools/grpc/ConfigRules.py
+++ b/src/common/tools/grpc/ConfigRules.py
@@ -54,14 +54,13 @@ def update_config_rule_custom(
 
     config_rule.custom.resource_value = json.dumps(json_resource_value, sort_keys=True)
 
-def copy_config_rules(source_config_rules, target_config_rules):
+def copy_config_rules(source_config_rules, target_config_rules, raise_if_differs = True):
     for source_config_rule in source_config_rules:
         config_rule_kind = source_config_rule.WhichOneof('config_rule')
         if config_rule_kind == 'custom':
             custom = source_config_rule.custom
             resource_key = custom.resource_key
             resource_value = json.loads(custom.resource_value)
-            raise_if_differs = True
             fields = {name:(value, raise_if_differs) for name,value in resource_value.items()}
             update_config_rule_custom(target_config_rules, resource_key, fields)
 
diff --git a/src/common/tools/kafka/Variables.py b/src/common/tools/kafka/Variables.py
index 21e66af137302553663d6e0a6701368bda638017..5c7501b6c07e6aaa26569e2817fca374e6b0c12e 100644
--- a/src/common/tools/kafka/Variables.py
+++ b/src/common/tools/kafka/Variables.py
@@ -41,14 +41,14 @@ class KafkaConfig(Enum):
 
 class KafkaTopic(Enum):
     # TODO: Later to be populated from ENV variable.
-    REQUEST            = 'topic_request' 
-    RESPONSE           = 'topic_response'
+    TELEMETRY_REQUEST  = 'topic_telemetry_request' 
+    TELEMETRY_RESPONSE = 'topic_telemetry_response'
     RAW                = 'topic_raw' 
     LABELED            = 'topic_labeled'
     VALUE              = 'topic_value'
     ALARMS             = 'topic_alarms'
-    ANALYTICS_REQUEST  = 'topic_request_analytics'
-    ANALYTICS_RESPONSE = 'topic_response_analytics'
+    ANALYTICS_REQUEST  = 'topic_analytics_request'
+    ANALYTICS_RESPONSE = 'topic_analytics_response'
 
     @staticmethod
     def create_all_topics() -> bool:
diff --git a/src/common/tools/service/GenericGrpcService.py b/src/common/tools/service/GenericGrpcService.py
index f29582fff87f4ca89ee44c78adbec33f321a9a39..453309127ccf49272d004740c1e3be52cba26779 100644
--- a/src/common/tools/service/GenericGrpcService.py
+++ b/src/common/tools/service/GenericGrpcService.py
@@ -12,18 +12,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Optional, Union
 import grpc, logging
 from concurrent import futures
+from typing import Any, List, Optional, Union
 from grpc_health.v1.health import HealthServicer, OVERALL_HEALTH
 from grpc_health.v1.health_pb2 import HealthCheckResponse
 from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server
+from grpc_reflection.v1alpha import reflection
 from common.Settings import get_grpc_bind_address, get_grpc_grace_period, get_grpc_max_workers
 
 class GenericGrpcService:
     def __init__(
-        self, bind_port : Union[str, int], bind_address : Optional[str] = None, max_workers : Optional[int] = None,
-        grace_period : Optional[int] = None, enable_health_servicer : bool = True, cls_name : str = __name__
+        self, bind_port : Union[str, int], bind_address : Optional[str] = None,
+        max_workers : Optional[int] = None, grace_period : Optional[int] = None,
+        enable_health_servicer : bool = True, enable_reflection : bool = True,
+        cls_name : str = __name__
     ) -> None:
         self.logger = logging.getLogger(cls_name)
         self.bind_port = bind_port
@@ -31,6 +34,8 @@ class GenericGrpcService:
         self.max_workers = get_grpc_max_workers() if max_workers is None else max_workers
         self.grace_period = get_grpc_grace_period() if grace_period is None else grace_period
         self.enable_health_servicer = enable_health_servicer
+        self.enable_reflection = enable_reflection
+        self.reflection_service_names : List[str] = [reflection.SERVICE_NAME]
         self.endpoint = None
         self.health_servicer = None
         self.pool = None
@@ -39,6 +44,11 @@ class GenericGrpcService:
     def install_servicers(self):
         pass
 
+    def add_reflection_service_name(self, service_descriptor : Any, service_name : str):
+        self.reflection_service_names.append(
+            service_descriptor.services_by_name[service_name].full_name
+        )
+
     def start(self):
         self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port))
         self.logger.info('Starting Service (tentative endpoint: {:s}, max_workers: {:s})...'.format(
@@ -54,6 +64,9 @@ class GenericGrpcService:
                 experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1))
             add_HealthServicer_to_server(self.health_servicer, self.server)
 
+        if self.enable_reflection:
+            reflection.enable_server_reflection(self.reflection_service_names, self.server)
+
         self.bind_port = self.server.add_insecure_port(self.endpoint)
         self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port))
         self.logger.info('Listening on {:s}...'.format(str(self.endpoint)))
diff --git a/src/common/tools/service/GenericGrpcServiceAsync.py b/src/common/tools/service/GenericGrpcServiceAsync.py
index 1d652deb79e1389e2403d1d13debcba7dbc43ecc..551a3d568612f59c2bc26f692ab8d1d27dc4f4b3 100644
--- a/src/common/tools/service/GenericGrpcServiceAsync.py
+++ b/src/common/tools/service/GenericGrpcServiceAsync.py
@@ -12,19 +12,21 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Optional, Union
-import grpc
-import logging
+import grpc, logging
 from concurrent import futures
+from typing import Any, List, Optional, Union
 from grpc_health.v1.health import HealthServicer, OVERALL_HEALTH
 from grpc_health.v1.health_pb2 import HealthCheckResponse
 from grpc_health.v1.health_pb2_grpc import add_HealthServicer_to_server
+from grpc_reflection.v1alpha import reflection
 from common.Settings import get_grpc_bind_address, get_grpc_grace_period, get_grpc_max_workers
 
 class GenericGrpcServiceAsync:
     def __init__(
-        self, bind_port: Union[str, int], bind_address: Optional[str] = None, max_workers: Optional[int] = None,
-        grace_period: Optional[int] = None, enable_health_servicer: bool = True, cls_name: str = __name__
+        self, bind_port : Union[str, int], bind_address : Optional[str] = None,
+        max_workers : Optional[int] = None, grace_period : Optional[int] = None,
+        enable_health_servicer : bool = True, enable_reflection : bool = True,
+        cls_name : str = __name__
     ) -> None:
         self.logger = logging.getLogger(cls_name)
         self.bind_port = bind_port
@@ -32,6 +34,8 @@ class GenericGrpcServiceAsync:
         self.max_workers = get_grpc_max_workers() if max_workers is None else max_workers
         self.grace_period = get_grpc_grace_period() if grace_period is None else grace_period
         self.enable_health_servicer = enable_health_servicer
+        self.enable_reflection = enable_reflection
+        self.reflection_service_names : List[str] = [reflection.SERVICE_NAME]
         self.endpoint = None
         self.health_servicer = None
         self.pool = None
@@ -40,7 +44,12 @@ class GenericGrpcServiceAsync:
     async def install_servicers(self):
         pass
 
-    async def start(self):
+    def add_reflection_service_name(self, service_descriptor : Any, service_name : str):
+        self.reflection_service_names.append(
+            service_descriptor.services_by_name[service_name].full_name
+        )
+
+    def start(self):
         self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port))
         self.logger.info('Starting Service (tentative endpoint: {:s}, max_workers: {:s})...'.format(
             str(self.endpoint), str(self.max_workers)))
@@ -55,6 +64,9 @@ class GenericGrpcServiceAsync:
                 experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1))
             add_HealthServicer_to_server(self.health_servicer, self.server)
 
+        if self.enable_reflection:
+            reflection.enable_server_reflection(self.reflection_service_names, self.server)
+
         self.bind_port = self.server.add_insecure_port(self.endpoint)
         self.endpoint = '{:s}:{:s}'.format(str(self.bind_address), str(self.bind_port))
         self.logger.info('Listening on {:s}...'.format(str(self.endpoint)))
diff --git a/src/context/service/ContextService.py b/src/context/service/ContextService.py
index a385f4481ec022b475649b749f5206512fe216b2..d633dea15a1e00316c9e8eac9d31ca69829f180f 100644
--- a/src/context/service/ContextService.py
+++ b/src/context/service/ContextService.py
@@ -16,7 +16,9 @@ import logging, sqlalchemy
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
 from common.message_broker.MessageBroker import MessageBroker
+from common.proto.context_pb2 import DESCRIPTOR as CONTEXT_DESCRIPTOR
 from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server
+from common.proto.context_policy_pb2 import DESCRIPTOR as CONTEXT_POLICY_DESCRIPTOR
 from common.proto.context_policy_pb2_grpc import add_ContextPolicyServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from .ContextServiceServicerImpl import ContextServiceServicerImpl
@@ -36,3 +38,6 @@ class ContextService(GenericGrpcService):
     def install_servicers(self):
         add_ContextServiceServicer_to_server(self.context_servicer, self.server)
         add_ContextPolicyServiceServicer_to_server(self.context_servicer, self.server)
+
+        self.add_reflection_service_name(CONTEXT_DESCRIPTOR, 'ContextService')
+        self.add_reflection_service_name(CONTEXT_POLICY_DESCRIPTOR, 'ContextPolicyService')
diff --git a/src/context/service/database/Connection.py b/src/context/service/database/Connection.py
index de45151a5ca95e974e940503aaade83a47faf46c..529c02d6e29b6434b3da0ec03593634b3ab87f08 100644
--- a/src/context/service/database/Connection.py
+++ b/src/context/service/database/Connection.py
@@ -74,7 +74,7 @@ def connection_set(db_engine : Engine, messagebroker : MessageBroker, request :
     _,service_uuid = service_get_uuid(request.service_id, allow_random=False)
     settings = grpc_message_to_json_string(request.settings),
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     connection_data = [{
         'connection_uuid': connection_uuid,
diff --git a/src/context/service/database/Context.py b/src/context/service/database/Context.py
index f0cd36f83fb3588976a3fcf515e2e97bd9613f4c..f3ef214c3715ac8c6110e3d5a18c2fb744d2d6db 100644
--- a/src/context/service/database/Context.py
+++ b/src/context/service/database/Context.py
@@ -82,7 +82,8 @@ def context_set(db_engine : Engine, messagebroker : MessageBroker, request : Con
     if len(request.slice_ids) > 0:      # pragma: no cover
         LOGGER.warning('Items in field "slice_ids" ignored. This field is used for retrieval purposes only.')
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
+
     context_data = [{
         'context_uuid': context_uuid,
         'context_name': context_name,
diff --git a/src/context/service/database/Device.py b/src/context/service/database/Device.py
index 930b5299f9c77243e5d26c453d051e3ecb455e27..7515f8d68227bd26f5d5384756186394492e5e53 100644
--- a/src/context/service/database/Device.py
+++ b/src/context/service/database/Device.py
@@ -92,7 +92,7 @@ def device_set(db_engine : Engine, messagebroker : MessageBroker, request : Devi
     oper_status = grpc_to_enum__device_operational_status(request.device_operational_status)
     device_drivers = [grpc_to_enum__device_driver(d) for d in request.device_drivers]
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     topology_uuids : Set[str] = set()
     related_topologies : List[Dict] = list()
diff --git a/src/context/service/database/Link.py b/src/context/service/database/Link.py
index c71f1fc8fcf0589e69d204f2f5de282e0c213a28..f249681347bdeba7d259e154cf9ff1bef0994e7c 100644
--- a/src/context/service/database/Link.py
+++ b/src/context/service/database/Link.py
@@ -24,11 +24,12 @@ from common.proto.context_pb2 import (
 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.enums.LinkType import grpc_to_enum__link_type_enum
 from .models.LinkModel import LinkModel, LinkEndPointModel
 from .models.TopologyModel import TopologyLinkModel, TopologyModel
 from .uuids.EndPoint import endpoint_get_uuid
 from .uuids.Link import link_get_uuid
+from .uuids.Topology import topology_get_uuid
 from .Events import notify_event_context, notify_event_link, notify_event_topology
 
 LOGGER = logging.getLogger(__name__)
@@ -70,7 +71,9 @@ def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link)
     link_name = raw_link_uuid if len(raw_link_name) == 0 else raw_link_name
     link_uuid = link_get_uuid(request.link_id, link_name=link_name, allow_random=True)
 
-    now = datetime.datetime.utcnow()
+    link_type = grpc_to_enum__link_type_enum(request.link_type)
+
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     topology_uuids : Set[str] = set()
     related_topologies : List[Dict] = list()
@@ -119,6 +122,7 @@ def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link)
     link_data = [{
         'link_uuid'           : link_uuid,
         'link_name'           : link_name,
+        'link_type'           : link_type,
         'total_capacity_gbps' : total_capacity_gbps,
         'used_capacity_gbps'  : used_capacity_gbps,
         'created_at'          : now,
@@ -131,6 +135,7 @@ def link_set(db_engine : Engine, messagebroker : MessageBroker, request : Link)
             index_elements=[LinkModel.link_uuid],
             set_=dict(
                 link_name           = stmt.excluded.link_name,
+                link_type           = stmt.excluded.link_type,
                 total_capacity_gbps = stmt.excluded.total_capacity_gbps,
                 used_capacity_gbps  = stmt.excluded.used_capacity_gbps,
                 updated_at          = stmt.excluded.updated_at,
diff --git a/src/context/service/database/OpticalLink.py b/src/context/service/database/OpticalLink.py
index e371d374a64582ccc26dbc5f666f29ee65ce56b5..7b3add6dbfaca98e94fff2d673c10c665d9e6db4 100644
--- a/src/context/service/database/OpticalLink.py
+++ b/src/context/service/database/OpticalLink.py
@@ -64,7 +64,7 @@ def optical_link_set(db_engine : Engine, messagebroker : MessageBroker, request
     link_name = raw_link_uuid if len(raw_link_name) == 0 else raw_link_name
     link_uuid = link_get_uuid(request.link_id, link_name=link_name, allow_random=True)
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     topology_uuids : Set[str] = set()
     related_topologies : List[Dict] = list()
diff --git a/src/context/service/database/PolicyRule.py b/src/context/service/database/PolicyRule.py
index 3d59c59b3ade828450924404d081e237b7a37c1f..ad38838fc127aaee1927f9e44ac0791cef105300 100644
--- a/src/context/service/database/PolicyRule.py
+++ b/src/context/service/database/PolicyRule.py
@@ -84,7 +84,7 @@ def policyrule_set(db_engine : Engine, messagebroker : MessageBroker, request :
         'actionList': json_policyrule_basic.get('actionList', []),
     }, sort_keys=True)
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     policyrule_data = [{
         'policyrule_uuid'     : policyrule_uuid,
diff --git a/src/context/service/database/Service.py b/src/context/service/database/Service.py
index 63b51692d9efa26e68a4c409da7e317bf7cbe566..5a912ea07fefd3395ba153ba8843a1ffcd5b42ae 100644
--- a/src/context/service/database/Service.py
+++ b/src/context/service/database/Service.py
@@ -93,7 +93,7 @@ def service_set(db_engine : Engine, messagebroker : MessageBroker, request : Ser
 
     service_status = grpc_to_enum__service_status(request.service_status.service_status)
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     service_endpoints_data : List[Dict] = list()
     for i,endpoint_id in enumerate(request.service_endpoint_ids):
@@ -182,7 +182,8 @@ def service_unset(db_engine : Engine, messagebroker : MessageBroker, request : S
                 ['should be == request.service_id.context_id.context_uuid.uuid({:s})'.format(raw_context_uuid)])
         service_endpoint_uuids.add(endpoint_get_uuid(endpoint_id, allow_random=False)[2])
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
+
     constraints = compose_constraints_data(request.service_constraints, now, service_uuid=service_uuid)
     config_rules = compose_config_rules_data(request.service_config.config_rules, now, service_uuid=service_uuid)
 
diff --git a/src/context/service/database/Slice.py b/src/context/service/database/Slice.py
index 18620e6fc76bbbbf6f445767d92a108f84c20a06..84e210e025e750613387a18c4c7eef4618cdfcdb 100644
--- a/src/context/service/database/Slice.py
+++ b/src/context/service/database/Slice.py
@@ -89,7 +89,7 @@ def slice_set(db_engine : Engine, messagebroker : MessageBroker, request : Slice
 
     slice_status = grpc_to_enum__slice_status(request.slice_status.slice_status)
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
 
     slice_endpoints_data : List[Dict] = list()
     for i,endpoint_id in enumerate(request.slice_endpoint_ids):
@@ -222,7 +222,8 @@ def slice_unset(db_engine : Engine, messagebroker : MessageBroker, request : Sli
         for subslice_id in request.slice_subslice_ids
     }
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
+
     constraints = compose_constraints_data(request.slice_constraints, now, slice_uuid=slice_uuid)
     config_rules = compose_config_rules_data(request.slice_config.config_rules, now, slice_uuid=slice_uuid)
 
diff --git a/src/context/service/database/Topology.py b/src/context/service/database/Topology.py
index ba2649c69abb025988e576f4978479bc05a5d657..1ee5d16422e94d2b9a2ed4dede461a14e97434ec 100644
--- a/src/context/service/database/Topology.py
+++ b/src/context/service/database/Topology.py
@@ -134,7 +134,8 @@ def topology_set(db_engine : Engine, messagebroker : MessageBroker, request : To
             MSG += 'Items in field "link_ids" ignored. This field is used for retrieval purposes only.'
             LOGGER.warning(MSG)
 
-    now = datetime.datetime.utcnow()
+    now = datetime.datetime.now(datetime.timezone.utc)
+
     topology_data = [{
         'context_uuid' : context_uuid,
         'topology_uuid': topology_uuid,
diff --git a/src/context/service/database/models/LinkModel.py b/src/context/service/database/models/LinkModel.py
index 423e39832201cc19d98a106b136fb545f4e24b7d..1bfa532d843bce4e078ef087fa4659b6fec75ceb 100644
--- a/src/context/service/database/models/LinkModel.py
+++ b/src/context/service/database/models/LinkModel.py
@@ -13,17 +13,22 @@
 # limitations under the License.
 
 import operator
-from sqlalchemy import CheckConstraint, Column, DateTime, Float, ForeignKey, Integer, String
+from sqlalchemy import (
+    CheckConstraint, Column, DateTime, Enum, Float, ForeignKey, Integer, String
+)
 from sqlalchemy.dialects.postgresql import UUID
 from sqlalchemy.orm import relationship
 from typing import Dict
+from common.proto.context_pb2 import LinkTypeEnum
 from ._Base import _Base
+from .enums.LinkType import ORM_LinkTypeEnum
 
 class LinkModel(_Base):
     __tablename__ = 'link'
 
     link_uuid           = Column(UUID(as_uuid=False), primary_key=True)
     link_name           = Column(String, nullable=False)
+    link_type           = Column(Enum(ORM_LinkTypeEnum), nullable=False)
     total_capacity_gbps = Column(Float, nullable=True)
     used_capacity_gbps  = Column(Float, nullable=True)
     created_at          = Column(DateTime, nullable=False)
@@ -44,11 +49,14 @@ class LinkModel(_Base):
         result = {
             'link_id'          : self.dump_id(),
             'name'             : self.link_name,
+            'link_type'        : self.link_type.value,
             'link_endpoint_ids': [
                 link_endpoint.endpoint.dump_id()
                 for link_endpoint in sorted(self.link_endpoints, key=operator.attrgetter('position'))
             ],
         }
+        if self.link_type is None:
+            self.link_type = LinkTypeEnum.LINKTYPE_UNKNOWN
         if self.total_capacity_gbps is not None:
             attributes : Dict = result.setdefault('attributes', dict())
             attributes.setdefault('total_capacity_gbps', self.total_capacity_gbps)
diff --git a/src/context/service/database/models/enums/DeviceDriver.py b/src/context/service/database/models/enums/DeviceDriver.py
index 5342f788a7b273aa7f6ae3c5779774165cd852bc..fe0d83fb1886a42526b1c71304b7e3ecc2b0b7d7 100644
--- a/src/context/service/database/models/enums/DeviceDriver.py
+++ b/src/context/service/database/models/enums/DeviceDriver.py
@@ -33,6 +33,9 @@ class ORM_DeviceDriverEnum(enum.Enum):
     GNMI_OPENCONFIG       = DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG
     OPTICAL_TFS           = DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS
     IETF_ACTN             = DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN
+    IETF_L3VPN            = DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN
+    NCE                   = DeviceDriverEnum.DEVICEDRIVER_NCE
+    IETF_SLICE            = DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE
     OC                    = DeviceDriverEnum.DEVICEDRIVER_OC
     QKD                   = DeviceDriverEnum.DEVICEDRIVER_QKD
 
diff --git a/src/context/service/database/models/enums/KpiSampleType.py b/src/context/service/database/models/enums/KpiSampleType.py
index 77b568dcfc809447851bd39fc5093ab60ca67892..66afdb710720f7bd272a8764a4c624fb7a563ab7 100644
--- a/src/context/service/database/models/enums/KpiSampleType.py
+++ b/src/context/service/database/models/enums/KpiSampleType.py
@@ -22,13 +22,16 @@ from ._GrpcToEnum import grpc_to_enum
 #            BYTES_RECEIVED. If item name does not match, automatic mapping of
 #            proto enums to database enums will fail.
 class ORM_KpiSampleTypeEnum(enum.Enum):
-    UNKNOWN                  = KpiSampleType.KPISAMPLETYPE_UNKNOWN
-    PACKETS_TRANSMITTED      = KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED
-    PACKETS_RECEIVED         = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    BYTES_TRANSMITTED        = KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED
-    BYTES_RECEIVED           = KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED
-    LINK_TOTAL_CAPACITY_GBPS = KpiSampleType.KPISAMPLETYPE_LINK_TOTAL_CAPACITY_GBPS
-    LINK_USED_CAPACITY_GBPS  = KpiSampleType.KPISAMPLETYPE_LINK_USED_CAPACITY_GBPS
+    UNKNOWN                  = KpiSampleType.KPISAMPLETYPE_UNKNOWN                  # 0
+    PACKETS_TRANSMITTED      = KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED      # 101
+    PACKETS_RECEIVED         = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED         # 102
+    PACKETS_DROPPED          = KpiSampleType.KPISAMPLETYPE_PACKETS_DROPPED          # 103
+    BYTES_TRANSMITTED        = KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED        # 201
+    BYTES_RECEIVED           = KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED           # 202
+    BYTES_DROPPED            = KpiSampleType.KPISAMPLETYPE_BYTES_DROPPED            # 203
+    LINK_TOTAL_CAPACITY_GBPS = KpiSampleType.KPISAMPLETYPE_LINK_TOTAL_CAPACITY_GBPS # 301
+    LINK_USED_CAPACITY_GBPS  = KpiSampleType.KPISAMPLETYPE_LINK_USED_CAPACITY_GBPS  # 302
+
 
 grpc_to_enum__kpi_sample_type = functools.partial(
     grpc_to_enum, KpiSampleType, ORM_KpiSampleTypeEnum)
diff --git a/src/context/service/database/models/enums/LinkType.py b/src/context/service/database/models/enums/LinkType.py
new file mode 100644
index 0000000000000000000000000000000000000000..68624af845ea813aa5ca886de97861852a294516
--- /dev/null
+++ b/src/context/service/database/models/enums/LinkType.py
@@ -0,0 +1,33 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, functools
+from common.proto.context_pb2 import LinkTypeEnum
+from ._GrpcToEnum import grpc_to_enum
+
+# IMPORTANT: Entries of enum class ORM_LinkTypeEnum should be named as in
+#            the proto files removing the prefixes. For example, proto item
+#            LinkTypeEnum.DEVICEDRIVER_COPPER should be included as COPPER.
+#            If item name does not match, automatic mapping of proto enums
+#            to database enums will fail.
+class ORM_LinkTypeEnum(enum.Enum):
+    UNKNOWN = LinkTypeEnum.LINKTYPE_UNKNOWN
+    COPPER  = LinkTypeEnum.LINKTYPE_COPPER
+    FIBER   = LinkTypeEnum.LINKTYPE_FIBER
+    RADIO   = LinkTypeEnum.LINKTYPE_RADIO
+    VIRTUAL = LinkTypeEnum.LINKTYPE_VIRTUAL
+
+grpc_to_enum__link_type_enum = functools.partial(
+    grpc_to_enum, LinkTypeEnum, ORM_LinkTypeEnum
+)
diff --git a/src/device/requirements.in b/src/device/requirements.in
index c89303df34d5562fdc2a7e83be76973578660ba5..ca2cdea47bb1ec1045a8bb8c35d64999b8f77f85 100644
--- a/src/device/requirements.in
+++ b/src/device/requirements.in
@@ -24,13 +24,13 @@ Flask-HTTPAuth==4.5.0
 Flask-RESTful==0.3.9
 ipaddress
 Jinja2==3.0.3
-libyang==2.8.0
+libyang==2.8.4
 macaddress
 ncclient==0.6.15
 numpy<2.0.0
 p4runtime==1.3.0
 pandas==1.5.*
-paramiko==2.9.2
+paramiko==2.11.*
 pyang==2.6.*
 git+https://github.com/robshakir/pyangbind.git
 python-json-logger==2.0.2
diff --git a/src/device/service/DeviceService.py b/src/device/service/DeviceService.py
index a94259471e76e40ddc5c6a1f2c109e8ada5075ae..a5a48e1bf80bce67fccd32316fa92935428d5b65 100644
--- a/src/device/service/DeviceService.py
+++ b/src/device/service/DeviceService.py
@@ -12,10 +12,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import os
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
+from common.proto.device_pb2 import DESCRIPTOR as DEVICE_DESCRIPTOR
 from common.proto.device_pb2_grpc import add_DeviceServiceServicer_to_server
+from common.proto.optical_device_pb2 import DESCRIPTOR as OPTICAL_DEVICE_DESCRIPTOR
 from common.proto.optical_device_pb2_grpc import add_OpenConfigServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from device.Config import LOAD_ALL_DEVICE_DRIVERS
@@ -41,8 +42,11 @@ class DeviceService(GenericGrpcService):
     def install_servicers(self):
         self.monitoring_loops.start()
         add_DeviceServiceServicer_to_server(self.device_servicer, self.server)
+        self.add_reflection_service_name(DEVICE_DESCRIPTOR, 'DeviceService')
+
         if LOAD_ALL_DEVICE_DRIVERS:
             add_OpenConfigServiceServicer_to_server(self.openconfig_device_servicer,self.server)
+            self.add_reflection_service_name(OPTICAL_DEVICE_DESCRIPTOR, 'OpenConfigService')
 
     def stop(self):
         super().stop()
diff --git a/src/device/service/driver_api/_Driver.py b/src/device/service/driver_api/_Driver.py
index 2580c3e785450f7be1972679872c3d16db39c714..e838e5b3d3cfca353fd4994fd60ad387b5f6766d 100644
--- a/src/device/service/driver_api/_Driver.py
+++ b/src/device/service/driver_api/_Driver.py
@@ -25,12 +25,15 @@ RESOURCE_ROUTING_POLICIES = '__routing_policies__'
 RESOURCE_SERVICES = '__services__'
 RESOURCE_ACL = '__acl__'
 RESOURCE_INVENTORY = '__inventory__'
+RESOURCE_RULES = "__rules__"
 
 
 class _Driver:
     def __init__(self, name : str, address: str, port: int, **settings) -> None:
         """ Initialize Driver.
             Parameters:
+                name : str
+                    Device driver name
                 address : str
                     The address of the device
                 port : int
diff --git a/src/device/service/drivers/__init__.py b/src/device/service/drivers/__init__.py
index b99ee50ca8319ab96f9062a3c58c356fa2ae7ec7..e3102cdf523a4e0b551873bb8f0c423db00aebf0 100644
--- a/src/device/service/drivers/__init__.py
+++ b/src/device/service/drivers/__init__.py
@@ -81,6 +81,16 @@ DRIVERS.append(
         }
     ]))
 
+
+from .ietf_l3vpn.driver import IetfL3VpnDriver # pylint: disable=wrong-import-position
+DRIVERS.append(
+    (IetfL3VpnDriver, [
+        {
+            FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.TERAFLOWSDN_CONTROLLER,
+            FilterFieldEnum.DRIVER: DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN,
+        }
+    ]))
+
 from .ietf_actn.IetfActnDriver import IetfActnDriver # pylint: disable=wrong-import-position
 DRIVERS.append(
     (IetfActnDriver, [
@@ -90,6 +100,24 @@ DRIVERS.append(
         }
     ]))
 
+from .ietf_slice.driver import IetfSliceDriver # pylint: disable=wrong-import-position
+DRIVERS.append(
+    (IetfSliceDriver, [
+        {
+            FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.IETF_SLICE,
+            FilterFieldEnum.DRIVER: DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE,
+        }
+    ]))
+
+from .nce.driver import NCEDriver # pylint: disable=wrong-import-position
+DRIVERS.append(
+    (NCEDriver, [
+        {
+            FilterFieldEnum.DEVICE_TYPE: DeviceTypeEnum.NCE,
+            FilterFieldEnum.DRIVER: DeviceDriverEnum.DEVICEDRIVER_NCE,
+        }
+    ]))
+
 if LOAD_ALL_DEVICE_DRIVERS:
     from .openconfig.OpenConfigDriver import OpenConfigDriver # 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 9f2a105c0d9735f486f41fab5bc3069ec9327f65..2a6f9c95d351f447f7368584d0ad07889eaecd7c 100644
--- a/src/device/service/drivers/emulated/Tools.py
+++ b/src/device/service/drivers/emulated/Tools.py
@@ -82,6 +82,26 @@ def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[
     
         if 'location' in endpoint_data:
             endpoint_resource_value['location'] = endpoint_data['location']
+
+        if "site_location" in endpoint_data:
+            endpoint_resource_value["site_location"] = endpoint_data["site_location"]
+
+        if "ce-ip" in endpoint_data:
+            endpoint_resource_value["ce-ip"] = endpoint_data["ce-ip"]
+
+        if "address_ip" in endpoint_data:
+            endpoint_resource_value["address_ip"] = endpoint_data["address_ip"]
+
+        if "address_prefix" in endpoint_data:
+            endpoint_resource_value["address_prefix"] = endpoint_data["address_prefix"]
+
+        if "mtu" in endpoint_data:
+            endpoint_resource_value["mtu"] = endpoint_data["mtu"]
+
+        if "ipv4_lan_prefixes" in endpoint_data:
+            endpoint_resource_value["ipv4_lan_prefixes"] = endpoint_data[
+                "ipv4_lan_prefixes"
+            ]
             
         return endpoint_resource_key, endpoint_resource_value
     except: # pylint: disable=bare-except
diff --git a/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py b/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py
index 00409dfbdf0f1932da4cedef9c02dccbb5be5ad0..03a55f472d2d4d4cd6726795fe6000c4fb68f95b 100644
--- a/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py
+++ b/src/device/service/drivers/gnmi_openconfig/GnmiSessionHandler.py
@@ -40,7 +40,6 @@ class GnmiSessionHandler:
         self._use_tls   = settings.get('use_tls', False)
         self._channel : Optional[grpc.Channel] = None
         self._stub : Optional[gNMIStub] = None
-        self._yang_handler = None
         self._monit_thread = None
         self._yang_handler = YangHandler()
         self._subscriptions = Subscriptions()
diff --git a/src/device/service/drivers/gnmi_openconfig/examples/libyang_examples.py b/src/device/service/drivers/gnmi_openconfig/examples/libyang_examples.py
new file mode 100644
index 0000000000000000000000000000000000000000..f16be652b753ca24fb7c16b361d43781328d97d4
--- /dev/null
+++ b/src/device/service/drivers/gnmi_openconfig/examples/libyang_examples.py
@@ -0,0 +1,162 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, libyang, logging, os
+from typing import Dict
+
+logging.basicConfig(level=logging.DEBUG)
+LOGGER = logging.getLogger(__name__)
+
+YANG_BASE_PATH = '/home/tfs/tfs-ctrl/src/device/service/drivers/gnmi_openconfig/git/openconfig/public'
+YANG_SEARCH_PATHS = ':'.join([
+    os.path.join(YANG_BASE_PATH, 'release'),
+    os.path.join(YANG_BASE_PATH, 'third_party'),
+])
+
+YANG_MODULES = [
+    'iana-if-type',
+    'openconfig-bgp-types',
+    'openconfig-vlan-types',
+
+    'openconfig-interfaces',
+    'openconfig-if-8021x',
+    'openconfig-if-aggregate',
+    'openconfig-if-ethernet-ext',
+    'openconfig-if-ethernet',
+    'openconfig-if-ip-ext',
+    'openconfig-if-ip',
+    'openconfig-if-poe',
+    'openconfig-if-sdn-ext',
+    'openconfig-if-tunnel',
+
+    'openconfig-vlan',
+
+    'openconfig-types',
+    'openconfig-policy-types',
+    'openconfig-mpls-types',
+    'openconfig-network-instance-types',
+    'openconfig-network-instance',
+
+    'openconfig-platform',
+    'openconfig-platform-controller-card',
+    'openconfig-platform-cpu',
+    'openconfig-platform-ext',
+    'openconfig-platform-fabric',
+    'openconfig-platform-fan',
+    'openconfig-platform-integrated-circuit',
+    'openconfig-platform-linecard',
+    'openconfig-platform-pipeline-counters',
+    'openconfig-platform-port',
+    'openconfig-platform-psu',
+    'openconfig-platform-software',
+    'openconfig-platform-transceiver',
+    'openconfig-platform-types',
+]
+
+class YangHandler:
+    def __init__(self) -> None:
+        self._yang_context = libyang.Context(YANG_SEARCH_PATHS)
+        self._loaded_modules = set()
+        for yang_module_name in YANG_MODULES:
+            LOGGER.info('Loading module: {:s}'.format(str(yang_module_name)))
+            self._yang_context.load_module(yang_module_name).feature_enable_all()
+            self._loaded_modules.add(yang_module_name)
+        self._data_path_instances = dict()
+
+    def get_data_paths(self) -> Dict[str, libyang.DNode]:
+        return self._data_path_instances
+
+    def get_data_path(self, path : str) -> libyang.DNode:
+        data_path_instance = self._data_path_instances.get(path)
+        if data_path_instance is None:
+            data_path_instance = self._yang_context.create_data_path(path)
+            self._data_path_instances[path] = data_path_instance
+        return data_path_instance
+
+    def destroy(self) -> None:
+        self._yang_context.destroy()
+
+def main():
+    yang_handler = YangHandler()
+
+    LOGGER.info('YangHandler Data (before):')
+    for path, dnode in yang_handler.get_data_paths().items():
+        LOGGER.info('|-> {:s}: {:s}'.format(str(path), json.dumps(dnode.print_dict())))
+
+    if_name        = 'eth1'
+    sif_index      = 0
+    enabled        = True
+    address_ip     = '172.16.0.1'
+    address_ip2    = '192.168.0.1'
+    address_prefix = 24
+    mtu            = 1500
+
+    yang_ifs : libyang.DContainer = yang_handler.get_data_path('/openconfig-interfaces:interfaces')
+    yang_if_path = 'interface[name="{:s}"]'.format(if_name)
+    yang_if : libyang.DContainer = yang_ifs.create_path(yang_if_path)
+    yang_if.create_path('config/name',    if_name)
+    yang_if.create_path('config/enabled', enabled)
+    yang_if.create_path('config/mtu',     mtu    )
+
+    yang_sifs : libyang.DContainer = yang_if.create_path('subinterfaces')
+    yang_sif_path = 'subinterface[index="{:d}"]'.format(sif_index)
+    yang_sif : libyang.DContainer = yang_sifs.create_path(yang_sif_path)
+    yang_sif.create_path('config/index',   sif_index)
+    yang_sif.create_path('config/enabled', enabled  )
+
+    yang_ipv4 : libyang.DContainer = yang_sif.create_path('openconfig-if-ip:ipv4')
+    yang_ipv4.create_path('config/enabled', enabled)
+
+    yang_ipv4_addrs : libyang.DContainer = yang_ipv4.create_path('addresses')
+    yang_ipv4_addr_path = 'address[ip="{:s}"]'.format(address_ip)
+    yang_ipv4_addr : libyang.DContainer = yang_ipv4_addrs.create_path(yang_ipv4_addr_path)
+    yang_ipv4_addr.create_path('config/ip',            address_ip    )
+    yang_ipv4_addr.create_path('config/prefix-length', address_prefix)
+
+    yang_ipv4_addr_path2 = 'address[ip="{:s}"]'.format(address_ip2)
+    yang_ipv4_addr2 : libyang.DContainer = yang_ipv4_addrs.create_path(yang_ipv4_addr_path2)
+    yang_ipv4_addr2.create_path('config/ip',            address_ip2   )
+    yang_ipv4_addr2.create_path('config/prefix-length', address_prefix)
+
+    str_data = yang_if.print_mem('json')
+    json_data = json.loads(str_data)
+    json_data = json_data['openconfig-interfaces:interface'][0]
+    str_data = json.dumps(json_data, indent=4)
+    LOGGER.info('Resulting Request (before unlink): {:s}'.format(str_data))
+
+    yang_ipv4_addr2.unlink()
+
+    root_node : libyang.DContainer = yang_handler.get_data_path('/openconfig-interfaces:interfaces')
+    LOGGER.info('root_node={:s}'.format(str(root_node.print_mem('json'))))
+
+    for s in root_node.siblings():
+        LOGGER.info('sibling: {:s}'.format(str(s)))
+
+    PATH_TMPL = '/openconfig-interfaces:interfaces/interface[name="{:s}"]/subinterfaces/subinterface[index="{:d}"]'
+    yang_sif = root_node.find_path(PATH_TMPL.format(if_name, sif_index))
+    if yang_sif is not None:
+        LOGGER.info('yang_sif={:s}'.format(str(yang_sif.print_mem('json'))))
+        yang_sif.unlink()
+        yang_sif.free()
+
+    str_data = yang_if.print_mem('json')
+    json_data = json.loads(str_data)
+    json_data = json_data['openconfig-interfaces:interface'][0]
+    str_data = json.dumps(json_data, indent=4)
+    LOGGER.info('Resulting Request (after unlink): {:s}'.format(str_data))
+
+    yang_handler.destroy()
+
+if __name__ == '__main__':
+    main()
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py b/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py
index a52c84691c00b0c09336e2400dbeb94a9ca310ed..ed833b647d9c856cd7e54c5258b14924d187eb9f 100644
--- a/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/Interface.py
@@ -34,6 +34,21 @@ class InterfaceHandler(_Handler):
             PATH_TMPL = '/interfaces/interface[name={:s}]/subinterfaces/subinterface[index={:d}]'
             str_path = PATH_TMPL.format(if_name, sif_index)
             str_data = json.dumps({})
+
+            root_node : libyang.DContainer = yang_handler.get_data_path(
+                '/openconfig-interfaces:interfaces'
+            )
+            yang_sif = root_node.find_path('/'.join([
+                '', # add slash at the beginning
+                'openconfig-interfaces:interfaces',
+                'interface[name="{:s}"]'.format(if_name),
+                'subinterfaces',
+                'subinterface[index="{:d}"]'.format(sif_index),
+            ]))
+            if yang_sif is not None:
+                yang_sif.unlink()
+                yang_sif.free()
+
             return str_path, str_data
 
         enabled        = get_bool(resource_value, 'enabled',  True) # True/False
diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py
index 2a4c19baa7ccdcc177e2724609a87636d1398a8a..f6f61a32403f154578da0247d0e1db24a727b017 100644
--- a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py
+++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py
@@ -36,15 +36,13 @@ class NetworkInstanceInterfaceHandler(_Handler):
 
         if IS_CEOS: ni_if_id = if_name
 
+        PATH_TMPL = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]'
+        str_path = PATH_TMPL.format(ni_name, ni_if_id)
+
         if delete:
-            PATH_TMPL = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]'
-            str_path = PATH_TMPL.format(ni_name, ni_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, ni_if_id
-        )
         #str_data = json.dumps({
         #    'id': if_id,
         #    'config': {'id': if_id, 'interface': if_name, 'subinterface': sif_index},
diff --git a/src/device/service/drivers/ietf_l3vpn/Constants.py b/src/device/service/drivers/ietf_l3vpn/Constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..df66eb16b3d78c1b388a086011ed6f6b75b8099f
--- /dev/null
+++ b/src/device/service/drivers/ietf_l3vpn/Constants.py
@@ -0,0 +1,25 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 device.service.driver_api._Driver import (
+    RESOURCE_ENDPOINTS,
+    RESOURCE_INTERFACES,
+    RESOURCE_NETWORK_INSTANCES,
+)
+
+SPECIAL_RESOURCE_MAPPINGS = {
+    RESOURCE_ENDPOINTS: "/endpoints",
+    RESOURCE_INTERFACES: "/interfaces",
+    RESOURCE_NETWORK_INSTANCES: "/net-instances",
+}
diff --git a/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py b/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ca965f8777aa23287ad379c8ac2cd0d92d9c28f
--- /dev/null
+++ b/src/device/service/drivers/ietf_l3vpn/TfsApiClient.py
@@ -0,0 +1,187 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+
+import requests
+from requests.auth import HTTPBasicAuth
+
+from device.service.driver_api.ImportTopologyEnum import ImportTopologyEnum
+
+GET_DEVICES_URL = "{:s}://{:s}:{:d}/tfs-api/devices"
+GET_LINKS_URL = "{:s}://{:s}:{:d}/tfs-api/links"
+L3VPN_URL = "{:s}://{:s}:{:d}/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services"
+TIMEOUT = 30
+
+HTTP_OK_CODES = {
+    200,  # OK
+    201,  # Created
+    202,  # Accepted
+    204,  # No Content
+}
+
+MAPPING_STATUS = {
+    "DEVICEOPERATIONALSTATUS_UNDEFINED": 0,
+    "DEVICEOPERATIONALSTATUS_DISABLED": 1,
+    "DEVICEOPERATIONALSTATUS_ENABLED": 2,
+}
+
+MAPPING_DRIVER = {
+    "DEVICEDRIVER_UNDEFINED": 0,
+    "DEVICEDRIVER_OPENCONFIG": 1,
+    "DEVICEDRIVER_TRANSPORT_API": 2,
+    "DEVICEDRIVER_P4": 3,
+    "DEVICEDRIVER_IETF_NETWORK_TOPOLOGY": 4,
+    "DEVICEDRIVER_ONF_TR_532": 5,
+    "DEVICEDRIVER_XR": 6,
+    "DEVICEDRIVER_IETF_L2VPN": 7,
+    "DEVICEDRIVER_GNMI_OPENCONFIG": 8,
+    "DEVICEDRIVER_OPTICAL_TFS": 9,
+    "DEVICEDRIVER_IETF_ACTN": 10,
+    "DEVICEDRIVER_OC": 11,
+}
+
+MSG_ERROR = "Could not retrieve devices in remote TeraFlowSDN instance({:s}). status_code={:s} reply={:s}"
+
+LOGGER = logging.getLogger(__name__)
+
+
+class TfsApiClient:
+    def __init__(
+        self,
+        address: str,
+        port: int,
+        scheme: str = "http",
+        username: Optional[str] = None,
+        password: Optional[str] = None,
+    ) -> None:
+        self._devices_url = GET_DEVICES_URL.format(scheme, address, port)
+        self._links_url = GET_LINKS_URL.format(scheme, address, port)
+        self._l3vpn_url = L3VPN_URL.format(scheme, address, port)
+        self._auth = None
+        # (
+        #     HTTPBasicAuth(username, password)
+        #     if username is not None and password is not None
+        #     else None
+        # )
+
+    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, auth=self._auth)
+        if reply.status_code not in HTTP_OK_CODES:
+            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"]
+            device_type: str = json_device["device_type"]
+            device_status = json_device["device_operational_status"]
+            device_url = "/devices/device[{:s}]".format(device_uuid)
+            device_data = {
+                "uuid": json_device["device_id"]["device_uuid"]["uuid"],
+                "name": json_device["name"],
+                "type": device_type,
+                "status": MAPPING_STATUS[device_status],
+                "drivers": [
+                    MAPPING_DRIVER[driver] for driver in json_device["device_drivers"]
+                ],
+            }
+            result.append((device_url, device_data))
+
+            for json_endpoint in json_device["device_endpoints"]:
+                endpoint_uuid = json_endpoint["endpoint_id"]["endpoint_uuid"]["uuid"]
+                endpoint_url = "/endpoints/endpoint[{:s}]".format(endpoint_uuid)
+                endpoint_data = {
+                    "device_uuid": device_uuid,
+                    "uuid": endpoint_uuid,
+                    "name": json_endpoint["name"],
+                    "type": json_endpoint["endpoint_type"],
+                }
+                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, 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
+
+    def create_connectivity_service(self, l3vpn_data: dict) -> None:
+        try:
+            requests.post(self._l3vpn_url, json=l3vpn_data)
+            LOGGER.debug(
+                "[create_connectivity_service] l3vpn_data={:s}".format(str(l3vpn_data))
+            )
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send post request to TFS L3VPN NBI")
+
+    def update_connectivity_service(self, l3vpn_data: dict) -> None:
+        vpn_id = l3vpn_data['ietf-l3vpn-svc:l3vpn-svc']["vpn-services"]["vpn-service"][0]["vpn-id"]
+        url = self._l3vpn_url + f"/vpn-service={vpn_id}"
+        try:
+            requests.put(url, json=l3vpn_data)
+            LOGGER.debug(
+                "[update_connectivity_service] l3vpn_data={:s}".format(str(l3vpn_data))
+            )
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send post request to TFS L3VPN NBI")
+
+    def delete_connectivity_service(self, service_uuid: str) -> None:
+        url = self._l3vpn_url + f"/vpn-service={service_uuid}"
+        try:
+            requests.delete(url, auth=self._auth)
+            LOGGER.debug("[delete_connectivity_service] url={:s}".format(str(url)))
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send delete request to TFS L3VPN NBI")
diff --git a/src/device/service/drivers/ietf_l3vpn/Tools.py b/src/device/service/drivers/ietf_l3vpn/Tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..7caaa27a52cacf03d9822e933f0a6b74fd0e4db8
--- /dev/null
+++ b/src/device/service/drivers/ietf_l3vpn/Tools.py
@@ -0,0 +1,198 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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, Optional, Tuple, TypedDict
+
+import requests
+
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.type_checkers.Checkers import chk_attribute, chk_string, chk_type
+from device.service.driver_api._Driver import RESOURCE_ENDPOINTS
+
+from .Constants import SPECIAL_RESOURCE_MAPPINGS
+
+
+class LANPrefixesDict(TypedDict):
+    lan: str
+    lan_tag: str
+
+
+LOGGER = logging.getLogger(__name__)
+
+SITE_NETWORK_ACCESS_TYPE = "ietf-l3vpn-svc:multipoint"
+
+
+def service_exists(wim_url: str, auth, service_uuid: str) -> bool:
+    try:
+        get_connectivity_service(wim_url, auth, service_uuid)
+        return True
+    except:  # pylint: disable=bare-except
+        return False
+
+
+def get_all_active_connectivity_services(wim_url: str, auth):
+    try:
+        LOGGER.info("Sending get all connectivity services")
+        servicepoint = f"{wim_url}/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services"
+        response = requests.get(servicepoint, auth=auth)
+
+        if response.status_code != requests.codes.ok:
+            raise Exception(
+                "Unable to get all connectivity services",
+                http_code=response.status_code,
+            )
+
+        return response
+    except requests.exceptions.ConnectionError:
+        raise Exception("Request Timeout", http_code=408)
+
+
+def get_connectivity_service(wim_url, auth, service_uuid):
+    try:
+        LOGGER.info("Sending get connectivity service")
+        servicepoint = f"{wim_url}/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service={service_uuid}"
+
+        response = requests.get(servicepoint)
+
+        if response.status_code != requests.codes.ok:
+            raise Exception(
+                "Unable to get connectivity service{:s}".format(str(service_uuid)),
+                http_code=response.status_code,
+            )
+
+        return response
+    except requests.exceptions.ConnectionError:
+        raise Exception("Request Timeout", http_code=408)
+
+
+def process_optional_string_field(
+    endpoint_data: Dict[str, Any],
+    field_name: str,
+    endpoint_resource_value: Dict[str, Any],
+) -> None:
+    field_value = chk_attribute(
+        field_name, endpoint_data, "endpoint_data", default=None
+    )
+    if field_value is None:
+        return
+    chk_string("endpoint_data.{:s}".format(field_name), field_value)
+    if len(field_value) > 0:
+        endpoint_resource_value[field_name] = field_value
+
+
+def compose_resource_endpoint(
+    endpoint_data: Dict[str, Any],
+) -> Optional[Tuple[str, Dict]]:
+    try:
+        # Check type of endpoint_data
+        chk_type("endpoint_data", endpoint_data, dict)
+
+        # Check endpoint UUID (mandatory)
+        endpoint_uuid = chk_attribute("uuid", endpoint_data, "endpoint_data")
+        chk_string("endpoint_data.uuid", endpoint_uuid, min_length=1)
+        endpoint_resource_path = SPECIAL_RESOURCE_MAPPINGS.get(RESOURCE_ENDPOINTS)
+        endpoint_resource_key = "{:s}/endpoint[{:s}]".format(
+            endpoint_resource_path, endpoint_uuid
+        )
+        endpoint_resource_value = {"uuid": endpoint_uuid}
+
+        # Check endpoint optional string fields
+        process_optional_string_field(endpoint_data, "name", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "site_location", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "ce-ip", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "address_ip", endpoint_resource_value
+        )
+        process_optional_string_field(
+            endpoint_data, "address_prefix", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "mtu", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "ipv4_lan_prefixes", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "type", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "context_uuid", endpoint_resource_value
+        )
+        process_optional_string_field(
+            endpoint_data, "topology_uuid", endpoint_resource_value
+        )
+
+        # Check endpoint sample types (optional)
+        endpoint_sample_types = chk_attribute(
+            "sample_types", endpoint_data, "endpoint_data", default=[]
+        )
+        chk_type("endpoint_data.sample_types", endpoint_sample_types, list)
+        sample_types = {}
+        sample_type_errors = []
+        for i, endpoint_sample_type in enumerate(endpoint_sample_types):
+            field_name = "endpoint_data.sample_types[{:d}]".format(i)
+            try:
+                chk_type(field_name, endpoint_sample_type, (int, str))
+                if isinstance(endpoint_sample_type, int):
+                    metric_name = KpiSampleType.Name(endpoint_sample_type)
+                    metric_id = endpoint_sample_type
+                elif isinstance(endpoint_sample_type, str):
+                    metric_id = KpiSampleType.Value(endpoint_sample_type)
+                    metric_name = endpoint_sample_type
+                else:
+                    str_type = str(type(endpoint_sample_type))
+                    raise Exception("Bad format: {:s}".format(str_type))  # pylint: disable=broad-exception-raised
+            except Exception as e:  # pylint: disable=broad-exception-caught
+                MSG = "Unsupported {:s}({:s}) : {:s}"
+                sample_type_errors.append(
+                    MSG.format(field_name, str(endpoint_sample_type), str(e))
+                )
+
+            metric_name = metric_name.lower().replace("kpisampletype_", "")
+            monitoring_resource_key = "{:s}/state/{:s}".format(
+                endpoint_resource_key, metric_name
+            )
+            sample_types[metric_id] = monitoring_resource_key
+
+        if len(sample_type_errors) > 0:
+            # pylint: disable=broad-exception-raised
+            raise Exception(
+                "Malformed Sample Types:\n{:s}".format("\n".join(sample_type_errors))
+            )
+
+        if len(sample_types) > 0:
+            endpoint_resource_value["sample_types"] = sample_types
+
+        if "site_location" in endpoint_data:
+            endpoint_resource_value["site_location"] = endpoint_data["site_location"]
+
+        if "ce-ip" in endpoint_data:
+            endpoint_resource_value["ce-ip"] = endpoint_data["ce-ip"]
+
+        if "address_ip" in endpoint_data:
+            endpoint_resource_value["address_ip"] = endpoint_data["address_ip"]
+
+        if "address_prefix" in endpoint_data:
+            endpoint_resource_value["address_prefix"] = endpoint_data["address_prefix"]
+
+        if "mtu" in endpoint_data:
+            endpoint_resource_value["mtu"] = endpoint_data["mtu"]
+
+        if "ipv4_lan_prefixes" in endpoint_data:
+            endpoint_resource_value["ipv4_lan_prefixes"] = endpoint_data[
+                "ipv4_lan_prefixes"
+            ]
+
+        return endpoint_resource_key, endpoint_resource_value
+    except:  # pylint: disable=bare-except
+        LOGGER.exception("Problem composing endpoint({:s})".format(str(endpoint_data)))
+        return None
diff --git a/src/device/service/drivers/ietf_l3vpn/__init__.py b/src/device/service/drivers/ietf_l3vpn/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..bbfc943b68af13a11e562abbc8680ade71db8f02
--- /dev/null
+++ b/src/device/service/drivers/ietf_l3vpn/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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_l3vpn/driver.py b/src/device/service/drivers/ietf_l3vpn/driver.py
new file mode 100644
index 0000000000000000000000000000000000000000..2aca83b6a645bf2e793b08841949813f0413a531
--- /dev/null
+++ b/src/device/service/drivers/ietf_l3vpn/driver.py
@@ -0,0 +1,309 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+import logging
+import re
+import threading
+from typing import Any, Iterator, List, Optional, Tuple, Union
+
+import anytree
+import requests
+from requests.auth import HTTPBasicAuth
+
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.type_checkers.Checkers import chk_length, chk_string, chk_type
+from device.service.driver_api._Driver import (
+    RESOURCE_ENDPOINTS,
+    RESOURCE_SERVICES,
+    _Driver,
+)
+from device.service.driver_api.AnyTreeTools import (
+    TreeNode,
+    dump_subtree,
+    get_subnode,
+    set_subnode_value,
+)
+from device.service.driver_api.ImportTopologyEnum import (
+    ImportTopologyEnum,
+    get_import_topology,
+)
+
+from .Constants import SPECIAL_RESOURCE_MAPPINGS
+from .TfsApiClient import TfsApiClient
+from .Tools import compose_resource_endpoint
+
+LOGGER = logging.getLogger(__name__)
+
+
+ALL_RESOURCE_KEYS = [
+    RESOURCE_ENDPOINTS,
+    RESOURCE_SERVICES,
+]
+
+RE_GET_ENDPOINT_FROM_INTERFACE = re.compile(r"^\/interface\[([^\]]+)\].*")
+
+RE_IETF_L3VPN_DATA = re.compile(r"^\/service\[[^\]]+\]\/IETFL3VPN$")
+RE_IETF_L3VPN_OPERATION = re.compile(r"^\/service\[[^\]]+\]\/IETFL3VPN\/operation$")
+
+DRIVER_NAME = "ietf_l3vpn"
+METRICS_POOL = MetricsPool("Device", "Driver", labels={"driver": DRIVER_NAME})
+
+
+class IetfL3VpnDriver(_Driver):
+    def __init__(self, address: str, port: str, **settings) -> None:
+        super().__init__(DRIVER_NAME, address, int(port), **settings)
+        self.__lock = threading.Lock()
+        self.__started = threading.Event()
+        self.__terminate = threading.Event()
+        self.__running = TreeNode(".")
+        scheme = self.settings.get("scheme", "http")
+        username = self.settings.get("username")
+        password = self.settings.get("password")
+        self.tac = TfsApiClient(
+            self.address,
+            self.port,
+            scheme=scheme,
+            username=username,
+            password=password,
+        )
+        self.__auth = None
+        # (
+        #     HTTPBasicAuth(username, password)
+        #     if username is not None and password is not None
+        #     else None
+        # )
+        self.__tfs_nbi_root = "{:s}://{:s}:{:d}".format(
+            scheme, self.address, int(self.port)
+        )
+        self.__timeout = int(self.settings.get("timeout", 120))
+        self.__import_topology = get_import_topology(
+            self.settings, default=ImportTopologyEnum.DEVICES
+        )
+        endpoints = self.settings.get("endpoints", [])
+        endpoint_resources = []
+        for endpoint in endpoints:
+            endpoint_resource = compose_resource_endpoint(endpoint)
+            if endpoint_resource is None:
+                continue
+            endpoint_resources.append(endpoint_resource)
+        self._set_initial_config(endpoint_resources)
+
+    def _set_initial_config(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        chk_type("resources", resources, list)
+        if len(resources) == 0:
+            return []
+        results = []
+        resolver = anytree.Resolver(pathattr="name")
+        with self.__lock:
+            for i, resource in enumerate(resources):
+                str_resource_name = "resources[#{:d}]".format(i)
+                try:
+                    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, resource_key, allow_empty=False)
+                    resource_path = resource_key.split("/")
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Exception validating {:s}: {:s}".format(
+                            str_resource_name, str(resource_key)
+                        )
+                    )
+                    results.append(e)  # if validation fails, store the exception
+                    continue
+
+                try:
+                    resource_value = json.loads(resource_value)
+                except:  # pylint: disable=bare-except
+                    pass
+
+                set_subnode_value(
+                    resolver, self.__running, resource_path, resource_value
+                )
+
+                results.append(True)
+        return results
+
+    def Connect(self) -> bool:
+        url = (
+            self.__tfs_nbi_root + "/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services"
+        )
+        with self.__lock:
+            if self.__started.is_set():
+                return True
+            try:
+                # requests.get(url, timeout=self.__timeout, auth=self.__auth)
+                ...
+            except requests.exceptions.Timeout:
+                LOGGER.exception("Timeout connecting {:s}".format(url))
+                return False
+            except Exception:  # pylint: disable=broad-except
+                LOGGER.exception("Exception connecting {:s}".format(url))
+                return False
+            else:
+                self.__started.set()
+                return True
+
+    def Disconnect(self) -> bool:
+        with self.__lock:
+            self.__terminate.set()
+            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:
+            if len(resource_keys) == 0:
+                return dump_subtree(self.__running)
+            results = []
+            resolver = anytree.Resolver(pathattr="name")
+            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)
+                    resource_key = SPECIAL_RESOURCE_MAPPINGS.get(
+                        resource_key, resource_key
+                    )
+                    resource_path = resource_key.split("/")
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Exception validating {:s}: {:s}".format(
+                            str_resource_name, str(resource_key)
+                        )
+                    )
+                    results.append(
+                        (resource_key, e)
+                    )  # if validation fails, store the exception
+                    continue
+
+                resource_node = get_subnode(
+                    resolver, self.__running, resource_path, default=None
+                )
+                # if not found, resource_node is None
+                if resource_node is None:
+                    continue
+                results.extend(dump_subtree(resource_node))
+            return results
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConfig(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        results = []
+        if len(resources) == 0:
+            return results
+        with self.__lock:
+            for resource in resources:
+                resource_key, resource_value = resource
+                if RE_IETF_L3VPN_OPERATION.match(resource_key):
+                    operation_type = json.loads(resource_value)["type"]
+                    results.append((resource_key, True))
+                    break
+            else:
+                raise Exception("operation type not found in resources")
+            for resource in resources:
+                LOGGER.info("resource = {:s}".format(str(resource)))
+                resource_key, resource_value = resource
+                if not RE_IETF_L3VPN_DATA.match(resource_key):
+                    continue
+                try:
+                    resource_value = json.loads(resource_value)
+
+                    # if service_exists(self.__tfs_nbi_root, self.__auth, service_uuid):
+                    #     exc = NotImplementedError(
+                    #         "IETF L3VPN Service Update is still not supported"
+                    #     )
+                    #     results.append((resource[0], exc))
+                    #     continue
+                    if operation_type == "create":
+                        service_id = resource_value["ietf-l3vpn-svc:l3vpn-svc"][
+                            "vpn-services"
+                        ]["vpn-service"][0]["vpn-id"]
+                        self.tac.create_connectivity_service(resource_value)
+                    elif operation_type == "update":
+                        service_id = resource_value["ietf-l3vpn-svc:l3vpn-svc"][
+                            "vpn-services"
+                        ]["vpn-service"][0]["vpn-id"]
+                        self.tac.update_connectivity_service(resource_value)
+                    else:
+                        raise Exception("operation type not supported")
+                    results.append((resource_key, True))
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Unhandled error processing resource_key({:s})".format(
+                            str(resource_key)
+                        )
+                    )
+                    results.append((resource_key, e))
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConfig(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        results = []
+        if len(resources) == 0:
+            return results
+        with self.__lock:
+            for resource in resources:
+                LOGGER.info("resource = {:s}".format(str(resource)))
+                resource_key, resource_value = resource
+                if not RE_IETF_L3VPN_DATA.match(resource_key):
+                    continue
+                try:
+                    resource_value = json.loads(resource_value)
+                    service_id = resource_value["id"]
+
+                    # if service_exists(self.__tfs_nbi_root, self.__auth, service_uuid):
+                    self.tac.delete_connectivity_service(service_id)
+                    results.append((resource_key, True))
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Unhandled error processing resource_key({:s})".format(
+                            str(resource_key)
+                        )
+                    )
+                    results.append((resource_key, e))
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SubscribeState(
+        self, subscriptions: List[Tuple[str, float, float]]
+    ) -> List[Union[bool, Exception]]:
+        # TODO: IETF L3VPN does not support monitoring by now
+        return [False for _ in subscriptions]
+
+    @metered_subclass_method(METRICS_POOL)
+    def UnsubscribeState(
+        self, subscriptions: List[Tuple[str, float, float]]
+    ) -> List[Union[bool, Exception]]:
+        # TODO: IETF L3VPN does not support monitoring by now
+        return [False for _ in subscriptions]
+
+    def GetState(
+        self, blocking=False, terminate: Optional[threading.Event] = None
+    ) -> Iterator[Tuple[float, str, Any]]:
+        # TODO: IETF L3VPN does not support monitoring by now
+        return []
diff --git a/src/device/service/drivers/ietf_slice/Constants.py b/src/device/service/drivers/ietf_slice/Constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..172c328aeaa5a2beafe4ced1b273cb3e7577e241
--- /dev/null
+++ b/src/device/service/drivers/ietf_slice/Constants.py
@@ -0,0 +1,25 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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 device.service.driver_api._Driver import (
+    RESOURCE_ENDPOINTS,
+    RESOURCE_INTERFACES,
+    RESOURCE_NETWORK_INSTANCES,
+)
+
+SPECIAL_RESOURCE_MAPPINGS = {
+    RESOURCE_ENDPOINTS: "/endpoints",
+    RESOURCE_INTERFACES: "/interfaces",
+    RESOURCE_NETWORK_INSTANCES: "/net-instances",
+}
diff --git a/src/device/service/drivers/ietf_slice/Tools.py b/src/device/service/drivers/ietf_slice/Tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd976927e4b17c74264b3372ed1caeeb1bc96c61
--- /dev/null
+++ b/src/device/service/drivers/ietf_slice/Tools.py
@@ -0,0 +1,147 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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, Optional, Tuple
+
+import requests
+
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.type_checkers.Checkers import chk_attribute, chk_string, chk_type
+from device.service.driver_api._Driver import RESOURCE_ENDPOINTS
+
+from .Constants import SPECIAL_RESOURCE_MAPPINGS
+
+LOGGER = logging.getLogger(__name__)
+
+
+def process_optional_string_field(
+    endpoint_data: Dict[str, Any],
+    field_name: str,
+    endpoint_resource_value: Dict[str, Any],
+) -> None:
+    field_value = chk_attribute(
+        field_name, endpoint_data, "endpoint_data", default=None
+    )
+    if field_value is None:
+        return
+    chk_string("endpoint_data.{:s}".format(field_name), field_value)
+    if len(field_value) > 0:
+        endpoint_resource_value[field_name] = field_value
+
+
+def compose_resource_endpoint(
+    endpoint_data: Dict[str, Any],
+) -> Optional[Tuple[str, Dict]]:
+    try:
+        # Check type of endpoint_data
+        chk_type("endpoint_data", endpoint_data, dict)
+
+        # Check endpoint UUID (mandatory)
+        endpoint_uuid = chk_attribute("uuid", endpoint_data, "endpoint_data")
+        chk_string("endpoint_data.uuid", endpoint_uuid, min_length=1)
+        endpoint_resource_path = SPECIAL_RESOURCE_MAPPINGS.get(RESOURCE_ENDPOINTS)
+        endpoint_resource_key = "{:s}/endpoint[{:s}]".format(
+            endpoint_resource_path, endpoint_uuid
+        )
+        endpoint_resource_value = {"uuid": endpoint_uuid}
+
+        # Check endpoint optional string fields
+        process_optional_string_field(endpoint_data, "name", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "site_location", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "ce-ip", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "address_ip", endpoint_resource_value
+        )
+        process_optional_string_field(
+            endpoint_data, "address_prefix", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "mtu", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "ipv4_lan_prefixes", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "type", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "context_uuid", endpoint_resource_value
+        )
+        process_optional_string_field(
+            endpoint_data, "topology_uuid", endpoint_resource_value
+        )
+
+        # Check endpoint sample types (optional)
+        endpoint_sample_types = chk_attribute(
+            "sample_types", endpoint_data, "endpoint_data", default=[]
+        )
+        chk_type("endpoint_data.sample_types", endpoint_sample_types, list)
+        sample_types = {}
+        sample_type_errors = []
+        for i, endpoint_sample_type in enumerate(endpoint_sample_types):
+            field_name = "endpoint_data.sample_types[{:d}]".format(i)
+            try:
+                chk_type(field_name, endpoint_sample_type, (int, str))
+                if isinstance(endpoint_sample_type, int):
+                    metric_name = KpiSampleType.Name(endpoint_sample_type)
+                    metric_id = endpoint_sample_type
+                elif isinstance(endpoint_sample_type, str):
+                    metric_id = KpiSampleType.Value(endpoint_sample_type)
+                    metric_name = endpoint_sample_type
+                else:
+                    str_type = str(type(endpoint_sample_type))
+                    raise Exception("Bad format: {:s}".format(str_type))  # pylint: disable=broad-exception-raised
+            except Exception as e:  # pylint: disable=broad-exception-caught
+                MSG = "Unsupported {:s}({:s}) : {:s}"
+                sample_type_errors.append(
+                    MSG.format(field_name, str(endpoint_sample_type), str(e))
+                )
+
+            metric_name = metric_name.lower().replace("kpisampletype_", "")
+            monitoring_resource_key = "{:s}/state/{:s}".format(
+                endpoint_resource_key, metric_name
+            )
+            sample_types[metric_id] = monitoring_resource_key
+
+        if len(sample_type_errors) > 0:
+            # pylint: disable=broad-exception-raised
+            raise Exception(
+                "Malformed Sample Types:\n{:s}".format("\n".join(sample_type_errors))
+            )
+
+        if len(sample_types) > 0:
+            endpoint_resource_value["sample_types"] = sample_types
+
+        if "site_location" in endpoint_data:
+            endpoint_resource_value["site_location"] = endpoint_data["site_location"]
+
+        if "ce-ip" in endpoint_data:
+            endpoint_resource_value["ce-ip"] = endpoint_data["ce-ip"]
+
+        if "address_ip" in endpoint_data:
+            endpoint_resource_value["address_ip"] = endpoint_data["address_ip"]
+
+        if "address_prefix" in endpoint_data:
+            endpoint_resource_value["address_prefix"] = endpoint_data["address_prefix"]
+
+        if "mtu" in endpoint_data:
+            endpoint_resource_value["mtu"] = endpoint_data["mtu"]
+
+        if "ipv4_lan_prefixes" in endpoint_data:
+            endpoint_resource_value["ipv4_lan_prefixes"] = endpoint_data[
+                "ipv4_lan_prefixes"
+            ]
+
+        return endpoint_resource_key, endpoint_resource_value
+    except:  # pylint: disable=bare-except
+        LOGGER.exception("Problem composing endpoint({:s})".format(str(endpoint_data)))
+        return None
diff --git a/src/device/service/drivers/ietf_slice/__init__.py b/src/device/service/drivers/ietf_slice/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..6242c89c7fa17bc5b6cc44328d8ce58438721d45
--- /dev/null
+++ b/src/device/service/drivers/ietf_slice/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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_slice/driver.py b/src/device/service/drivers/ietf_slice/driver.py
new file mode 100644
index 0000000000000000000000000000000000000000..e8b6e7d0effac1f7a3eb05c7aabd2d0a39125b65
--- /dev/null
+++ b/src/device/service/drivers/ietf_slice/driver.py
@@ -0,0 +1,306 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+import logging
+import re
+import threading
+from typing import Any, Iterator, List, Optional, Tuple, Union
+
+import anytree
+import requests
+from requests.auth import HTTPBasicAuth
+
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.type_checkers.Checkers import chk_length, chk_string, chk_type
+from device.service.driver_api._Driver import (
+    RESOURCE_ENDPOINTS,
+    RESOURCE_SERVICES,
+    _Driver,
+)
+from device.service.driver_api.AnyTreeTools import (
+    TreeNode,
+    dump_subtree,
+    get_subnode,
+    set_subnode_value,
+)
+from device.service.driver_api.ImportTopologyEnum import (
+    ImportTopologyEnum,
+    get_import_topology,
+)
+
+from .Constants import SPECIAL_RESOURCE_MAPPINGS
+from .tfs_slice_nbi_client import TfsApiClient
+from .Tools import compose_resource_endpoint
+
+LOGGER = logging.getLogger(__name__)
+
+
+ALL_RESOURCE_KEYS = [
+    RESOURCE_ENDPOINTS,
+    RESOURCE_SERVICES,
+]
+
+RE_IETF_SLICE_DATA = re.compile(r"^\/service\[[^\]]+\]\/IETFSlice$")
+RE_IETF_SLICE_OPERATION = re.compile(r"^\/service\[[^\]]+\]\/IETFSlice\/operation$")
+
+DRIVER_NAME = "ietf_slice"
+METRICS_POOL = MetricsPool("Device", "Driver", labels={"driver": DRIVER_NAME})
+
+
+class IetfSliceDriver(_Driver):
+    def __init__(self, address: str, port: str, **settings) -> None:
+        super().__init__(DRIVER_NAME, address, int(port), **settings)
+        self.__lock = threading.Lock()
+        self.__started = threading.Event()
+        self.__terminate = threading.Event()
+        self.__running = TreeNode(".")
+        scheme = self.settings.get("scheme", "http")
+        username = self.settings.get("username")
+        password = self.settings.get("password")
+        self.tac = TfsApiClient(
+            self.address,
+            self.port,
+            scheme=scheme,
+            username=username,
+            password=password,
+        )
+        self.__auth = None
+        # (
+        #     HTTPBasicAuth(username, password)
+        #     if username is not None and password is not None
+        #     else None
+        # )
+        self.__tfs_nbi_root = "{:s}://{:s}:{:d}".format(
+            scheme, self.address, int(self.port)
+        )
+        self.__timeout = int(self.settings.get("timeout", 120))
+        self.__import_topology = get_import_topology(
+            self.settings, default=ImportTopologyEnum.DEVICES
+        )
+        endpoints = self.settings.get("endpoints", [])
+        endpoint_resources = []
+        for endpoint in endpoints:
+            endpoint_resource = compose_resource_endpoint(endpoint)
+            if endpoint_resource is None:
+                continue
+            endpoint_resources.append(endpoint_resource)
+        self._set_initial_config(endpoint_resources)
+
+    def _set_initial_config(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        chk_type("resources", resources, list)
+        if len(resources) == 0:
+            return []
+        results = []
+        resolver = anytree.Resolver(pathattr="name")
+        with self.__lock:
+            for i, resource in enumerate(resources):
+                str_resource_name = "resources[#{:d}]".format(i)
+                try:
+                    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, resource_key, allow_empty=False)
+                    resource_path = resource_key.split("/")
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Exception validating {:s}: {:s}".format(
+                            str_resource_name, str(resource_key)
+                        )
+                    )
+                    results.append(e)  # if validation fails, store the exception
+                    continue
+
+                try:
+                    resource_value = json.loads(resource_value)
+                except:  # pylint: disable=bare-except
+                    pass
+
+                set_subnode_value(
+                    resolver, self.__running, resource_path, resource_value
+                )
+
+                results.append(True)
+        return results
+
+    def Connect(self) -> bool:
+        url = self.__tfs_nbi_root + "/restconf/data/ietf-network-slice-service:ietf-nss"
+        with self.__lock:
+            if self.__started.is_set():
+                return True
+            try:
+                # requests.get(url, timeout=self.__timeout)
+                ...
+            except requests.exceptions.Timeout:
+                LOGGER.exception("Timeout connecting {:s}".format(url))
+                return False
+            except Exception:  # pylint: disable=broad-except
+                LOGGER.exception("Exception connecting {:s}".format(url))
+                return False
+            else:
+                self.__started.set()
+                return True
+
+    def Disconnect(self) -> bool:
+        with self.__lock:
+            self.__terminate.set()
+            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:
+            if len(resource_keys) == 0:
+                return dump_subtree(self.__running)
+            results = []
+            resolver = anytree.Resolver(pathattr="name")
+            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)
+                    resource_key = SPECIAL_RESOURCE_MAPPINGS.get(
+                        resource_key, resource_key
+                    )
+                    resource_path = resource_key.split("/")
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Exception validating {:s}: {:s}".format(
+                            str_resource_name, str(resource_key)
+                        )
+                    )
+                    results.append(
+                        (resource_key, e)
+                    )  # if validation fails, store the exception
+                    continue
+                resource_node = get_subnode(
+                    resolver, self.__running, resource_path, default=None
+                )
+                # if not found, resource_node is None
+                if resource_node is None:
+                    continue
+                results.extend(dump_subtree(resource_node))
+            return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConfig(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        results = []
+
+        if len(resources) == 0:
+            return results
+
+        with self.__lock:
+            for resource in resources:
+                resource_key, resource_value = resource
+                if RE_IETF_SLICE_OPERATION.match(resource_key):
+                    operation_type = json.loads(resource_value)["type"]
+                    results.append((resource_key, True))
+                    break
+            else:
+                raise Exception("operation type not found in resources")
+            for resource in resources:
+                LOGGER.info("resource = {:s}".format(str(resource)))
+                resource_key, resource_value = resource
+                if not RE_IETF_SLICE_DATA.match(resource_key):
+                    continue
+                try:
+                    resource_value = json.loads(resource_value)
+
+                    slice_name = resource_value["network-slice-services"][
+                        "slice-service"
+                    ][0]["id"]
+
+                    if operation_type == "create":
+                        self.tac.create_slice(resource_value)
+
+                    elif operation_type == "update":
+                        connection_groups = resource_value["network-slice-services"][
+                            "slice-service"
+                        ][0]["connection-groups"]["connection-group"]
+
+                        if len(connection_groups) != 1:
+                            raise Exception("only one connection group is supported")
+
+                        connection_group = connection_groups[0]
+
+                        self.tac.update_slice(
+                            slice_name, connection_group["id"], connection_group
+                        )
+
+                    elif operation_type == "delete":
+                        self.tac.delete_slice(slice_name)
+
+                    results.append((resource_key, True))
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Unhandled error processing resource_key({:s})".format(
+                            str(resource_key)
+                        )
+                    )
+                    results.append((resource_key, e))
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConfig(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        results = []
+
+        if len(resources) == 0:
+            return results
+
+        with self.__lock:
+            for resource in resources:
+                LOGGER.info("resource = {:s}".format(str(resource)))
+                resource_key, resource_value = resource
+                try:
+                    results.append((resource_key, True))
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Unhandled error processing resource_key({:s})".format(
+                            str(resource_key)
+                        )
+                    )
+                    results.append((resource_key, e))
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SubscribeState(
+        self, subscriptions: List[Tuple[str, float, float]]
+    ) -> List[Union[bool, Exception]]:
+        # TODO: IETF Slice does not support monitoring by now
+        return [False for _ in subscriptions]
+
+    @metered_subclass_method(METRICS_POOL)
+    def UnsubscribeState(
+        self, subscriptions: List[Tuple[str, float, float]]
+    ) -> List[Union[bool, Exception]]:
+        # TODO: IETF Slice does not support monitoring by now
+        return [False for _ in subscriptions]
+
+    def GetState(
+        self, blocking=False, terminate: Optional[threading.Event] = None
+    ) -> Iterator[Tuple[float, str, Any]]:
+        # TODO: IETF Slice does not support monitoring by now
+        return []
diff --git a/src/device/service/drivers/ietf_slice/tfs_slice_nbi_client.py b/src/device/service/drivers/ietf_slice/tfs_slice_nbi_client.py
new file mode 100644
index 0000000000000000000000000000000000000000..596e3d903d6e17dda96be42d776aae2f9068f7bd
--- /dev/null
+++ b/src/device/service/drivers/ietf_slice/tfs_slice_nbi_client.py
@@ -0,0 +1,76 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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 Optional
+
+import requests
+from requests.auth import HTTPBasicAuth
+
+IETF_SLICE_URL = "{:s}://{:s}:{:d}/restconf/data/ietf-network-slice-service"
+TIMEOUT = 30
+
+LOGGER = logging.getLogger(__name__)
+
+HEADERS = {"Content-Type": "application/json"}
+
+
+class TfsApiClient:
+    def __init__(
+        self,
+        address: str,
+        port: int,
+        scheme: str = "http",
+        username: Optional[str] = None,
+        password: Optional[str] = None,
+    ) -> None:
+        self._slice_url = IETF_SLICE_URL.format(scheme, address, port)
+        self._auth = None
+        # (
+        #     HTTPBasicAuth(username, password)
+        #     if username is not None and password is not None
+        #     else None
+        # )
+
+    def create_slice(self, slice_data: dict) -> None:
+        url = self._slice_url + ":network-slice-services"
+        try:
+            requests.post(url, json=slice_data, headers=HEADERS)
+            LOGGER.info(f"IETF Slice Post to {url}: {slice_data}")
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send post request to TFS IETF Slice NBI")
+
+    def update_slice(
+        self,
+        slice_name: str,
+        connection_group_id: str,
+        updated_connection_group_data: dict,
+    ) -> None:
+        url = (
+            self._slice_url
+            + f":network-slice-services/slice-service={slice_name}/connection-groups/connection-group={connection_group_id}"
+        )
+        try:
+            requests.put(url, json=updated_connection_group_data, headers=HEADERS)
+            LOGGER.info(f"IETF Slice Put to {url}: {updated_connection_group_data}")
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send update request to TFS IETF Slice NBI")
+
+    def delete_slice(self, slice_name: str) -> None:
+        url = self._slice_url + f":network-slice-services/slice-service={slice_name}"
+        try:
+            requests.delete(url)
+            LOGGER.info(f"IETF Slice Delete to {url}")
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send delete request to TFS IETF Slice NBI")
diff --git a/src/device/service/drivers/nce/Constants.py b/src/device/service/drivers/nce/Constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..172c328aeaa5a2beafe4ced1b273cb3e7577e241
--- /dev/null
+++ b/src/device/service/drivers/nce/Constants.py
@@ -0,0 +1,25 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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 device.service.driver_api._Driver import (
+    RESOURCE_ENDPOINTS,
+    RESOURCE_INTERFACES,
+    RESOURCE_NETWORK_INSTANCES,
+)
+
+SPECIAL_RESOURCE_MAPPINGS = {
+    RESOURCE_ENDPOINTS: "/endpoints",
+    RESOURCE_INTERFACES: "/interfaces",
+    RESOURCE_NETWORK_INSTANCES: "/net-instances",
+}
diff --git a/src/device/service/drivers/nce/Tools.py b/src/device/service/drivers/nce/Tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..f9b2f24a8df494d04d749624ea6b2e5b986944fc
--- /dev/null
+++ b/src/device/service/drivers/nce/Tools.py
@@ -0,0 +1,145 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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, Optional, Tuple
+
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.type_checkers.Checkers import chk_attribute, chk_string, chk_type
+from device.service.driver_api._Driver import RESOURCE_ENDPOINTS
+
+from .Constants import SPECIAL_RESOURCE_MAPPINGS
+
+LOGGER = logging.getLogger(__name__)
+
+
+def process_optional_string_field(
+    endpoint_data: Dict[str, Any],
+    field_name: str,
+    endpoint_resource_value: Dict[str, Any],
+) -> None:
+    field_value = chk_attribute(
+        field_name, endpoint_data, "endpoint_data", default=None
+    )
+    if field_value is None:
+        return
+    chk_string("endpoint_data.{:s}".format(field_name), field_value)
+    if len(field_value) > 0:
+        endpoint_resource_value[field_name] = field_value
+
+
+def compose_resource_endpoint(
+    endpoint_data: Dict[str, Any],
+) -> Optional[Tuple[str, Dict]]:
+    try:
+        # Check type of endpoint_data
+        chk_type("endpoint_data", endpoint_data, dict)
+
+        # Check endpoint UUID (mandatory)
+        endpoint_uuid = chk_attribute("uuid", endpoint_data, "endpoint_data")
+        chk_string("endpoint_data.uuid", endpoint_uuid, min_length=1)
+        endpoint_resource_path = SPECIAL_RESOURCE_MAPPINGS.get(RESOURCE_ENDPOINTS)
+        endpoint_resource_key = "{:s}/endpoint[{:s}]".format(
+            endpoint_resource_path, endpoint_uuid
+        )
+        endpoint_resource_value = {"uuid": endpoint_uuid}
+
+        # Check endpoint optional string fields
+        process_optional_string_field(endpoint_data, "name", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "site_location", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "ce-ip", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "address_ip", endpoint_resource_value
+        )
+        process_optional_string_field(
+            endpoint_data, "address_prefix", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "mtu", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "ipv4_lan_prefixes", endpoint_resource_value
+        )
+        process_optional_string_field(endpoint_data, "type", endpoint_resource_value)
+        process_optional_string_field(
+            endpoint_data, "context_uuid", endpoint_resource_value
+        )
+        process_optional_string_field(
+            endpoint_data, "topology_uuid", endpoint_resource_value
+        )
+
+        # Check endpoint sample types (optional)
+        endpoint_sample_types = chk_attribute(
+            "sample_types", endpoint_data, "endpoint_data", default=[]
+        )
+        chk_type("endpoint_data.sample_types", endpoint_sample_types, list)
+        sample_types = {}
+        sample_type_errors = []
+        for i, endpoint_sample_type in enumerate(endpoint_sample_types):
+            field_name = "endpoint_data.sample_types[{:d}]".format(i)
+            try:
+                chk_type(field_name, endpoint_sample_type, (int, str))
+                if isinstance(endpoint_sample_type, int):
+                    metric_name = KpiSampleType.Name(endpoint_sample_type)
+                    metric_id = endpoint_sample_type
+                elif isinstance(endpoint_sample_type, str):
+                    metric_id = KpiSampleType.Value(endpoint_sample_type)
+                    metric_name = endpoint_sample_type
+                else:
+                    str_type = str(type(endpoint_sample_type))
+                    raise Exception("Bad format: {:s}".format(str_type))  # pylint: disable=broad-exception-raised
+            except Exception as e:  # pylint: disable=broad-exception-caught
+                MSG = "Unsupported {:s}({:s}) : {:s}"
+                sample_type_errors.append(
+                    MSG.format(field_name, str(endpoint_sample_type), str(e))
+                )
+
+            metric_name = metric_name.lower().replace("kpisampletype_", "")
+            monitoring_resource_key = "{:s}/state/{:s}".format(
+                endpoint_resource_key, metric_name
+            )
+            sample_types[metric_id] = monitoring_resource_key
+
+        if len(sample_type_errors) > 0:
+            # pylint: disable=broad-exception-raised
+            raise Exception(
+                "Malformed Sample Types:\n{:s}".format("\n".join(sample_type_errors))
+            )
+
+        if len(sample_types) > 0:
+            endpoint_resource_value["sample_types"] = sample_types
+
+        if "site_location" in endpoint_data:
+            endpoint_resource_value["site_location"] = endpoint_data["site_location"]
+
+        if "ce-ip" in endpoint_data:
+            endpoint_resource_value["ce-ip"] = endpoint_data["ce-ip"]
+
+        if "address_ip" in endpoint_data:
+            endpoint_resource_value["address_ip"] = endpoint_data["address_ip"]
+
+        if "address_prefix" in endpoint_data:
+            endpoint_resource_value["address_prefix"] = endpoint_data["address_prefix"]
+
+        if "mtu" in endpoint_data:
+            endpoint_resource_value["mtu"] = endpoint_data["mtu"]
+
+        if "ipv4_lan_prefixes" in endpoint_data:
+            endpoint_resource_value["ipv4_lan_prefixes"] = endpoint_data[
+                "ipv4_lan_prefixes"
+            ]
+
+        return endpoint_resource_key, endpoint_resource_value
+    except:  # pylint: disable=bare-except
+        LOGGER.exception("Problem composing endpoint({:s})".format(str(endpoint_data)))
+        return None
diff --git a/src/device/service/drivers/nce/__init__.py b/src/device/service/drivers/nce/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..6242c89c7fa17bc5b6cc44328d8ce58438721d45
--- /dev/null
+++ b/src/device/service/drivers/nce/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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/nce/driver.py b/src/device/service/drivers/nce/driver.py
new file mode 100644
index 0000000000000000000000000000000000000000..4ac1a2b1c604a6ebe5028688dc39f545e0e1cee6
--- /dev/null
+++ b/src/device/service/drivers/nce/driver.py
@@ -0,0 +1,278 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+import logging
+import re
+import threading
+from typing import Any, Iterator, List, Optional, Tuple, Union
+
+import anytree
+import requests
+from requests.auth import HTTPBasicAuth
+
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.type_checkers.Checkers import chk_length, chk_string, chk_type
+from device.service.driver_api._Driver import _Driver
+from device.service.driver_api.AnyTreeTools import (
+    TreeNode,
+    dump_subtree,
+    get_subnode,
+    set_subnode_value,
+)
+from device.service.driver_api.ImportTopologyEnum import (
+    ImportTopologyEnum,
+    get_import_topology,
+)
+
+from .Constants import SPECIAL_RESOURCE_MAPPINGS
+from .nce_fan_client import NCEClient
+from .Tools import compose_resource_endpoint
+
+LOGGER = logging.getLogger(__name__)
+
+
+RE_NCE_APP_FLOW_DATA = re.compile(r"^\/service\[[^\]]+\]\/AppFlow$")
+RE_NCE_APP_FLOW_OPERATION = re.compile(r"^\/service\[[^\]]+\]\/AppFlow\/operation$")
+
+DRIVER_NAME = "nce"
+METRICS_POOL = MetricsPool("Device", "Driver", labels={"driver": DRIVER_NAME})
+
+
+class NCEDriver(_Driver):
+    def __init__(self, address: str, port: str, **settings) -> None:
+        super().__init__(DRIVER_NAME, address, int(port), **settings)
+        self.__lock = threading.Lock()
+        self.__started = threading.Event()
+        self.__terminate = threading.Event()
+        self.__running = TreeNode(".")
+        scheme = self.settings.get("scheme", "http")
+        username = self.settings.get("username")
+        password = self.settings.get("password")
+        self.nce = NCEClient(
+            self.address,
+            self.port,
+            scheme=scheme,
+            username=username,
+            password=password,
+        )
+        self.__auth = None
+        # (
+        #     HTTPBasicAuth(username, password)
+        #     if username is not None and password is not None
+        #     else None
+        # )
+        self.__tfs_nbi_root = "{:s}://{:s}:{:d}".format(
+            scheme, self.address, int(self.port)
+        )
+        self.__timeout = int(self.settings.get("timeout", 120))
+        self.__import_topology = get_import_topology(
+            self.settings, default=ImportTopologyEnum.DEVICES
+        )
+        endpoints = self.settings.get("endpoints", [])
+        endpoint_resources = []
+        for endpoint in endpoints:
+            endpoint_resource = compose_resource_endpoint(endpoint)
+            if endpoint_resource is None:
+                continue
+            endpoint_resources.append(endpoint_resource)
+        self._set_initial_config(endpoint_resources)
+
+    def _set_initial_config(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        chk_type("resources", resources, list)
+        if len(resources) == 0:
+            return []
+        results = []
+        resolver = anytree.Resolver(pathattr="name")
+        with self.__lock:
+            for i, resource in enumerate(resources):
+                str_resource_name = "resources[#{:d}]".format(i)
+                try:
+                    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, resource_key, allow_empty=False)
+                    resource_path = resource_key.split("/")
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Exception validating {:s}: {:s}".format(
+                            str_resource_name, str(resource_key)
+                        )
+                    )
+                    results.append(e)  # if validation fails, store the exception
+                    continue
+
+                try:
+                    resource_value = json.loads(resource_value)
+                except:  # pylint: disable=bare-except
+                    pass
+
+                set_subnode_value(
+                    resolver, self.__running, resource_path, resource_value
+                )
+
+                results.append(True)
+        return results
+
+    def Connect(self) -> bool:
+        with self.__lock:
+            if self.__started.is_set():
+                return True
+            try:
+                ...
+            except requests.exceptions.Timeout:
+                return False
+            except Exception:  # pylint: disable=broad-except
+                return False
+            else:
+                self.__started.set()
+                return True
+
+    def Disconnect(self) -> bool:
+        with self.__lock:
+            self.__terminate.set()
+            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:
+            if len(resource_keys) == 0:
+                return dump_subtree(self.__running)
+            results = []
+            resolver = anytree.Resolver(pathattr="name")
+            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)
+                    resource_key = SPECIAL_RESOURCE_MAPPINGS.get(
+                        resource_key, resource_key
+                    )
+                    resource_path = resource_key.split("/")
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Exception validating {:s}: {:s}".format(
+                            str_resource_name, str(resource_key)
+                        )
+                    )
+                    results.append(
+                        (resource_key, e)
+                    )  # if validation fails, store the exception
+                    continue
+
+                resource_node = get_subnode(
+                    resolver, self.__running, resource_path, default=None
+                )
+                # if not found, resource_node is None
+                if resource_node is None:
+                    continue
+                results.extend(dump_subtree(resource_node))
+            return results
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetConfig(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        results = []
+
+        if len(resources) == 0:
+            return results
+
+        with self.__lock:
+            for resource in resources:
+                resource_key, resource_value = resource
+                LOGGER.debug("resource = {:s}".format(str(resource)))
+                if RE_NCE_APP_FLOW_OPERATION.match(resource_key):
+                    operation_type = json.loads(resource_value)["type"]
+                    results.append((resource_key, True))
+                    break
+            else:
+                raise Exception("operation type not found in resources")
+            for resource in resources:
+                LOGGER.info("resource = {:s}".format(str(resource)))
+                resource_key, resource_value = resource
+                if not RE_NCE_APP_FLOW_DATA.match(resource_key):
+                    continue
+                try:
+                    resource_value = json.loads(resource_value)
+                    if operation_type == "create":
+
+                        self.nce.create_app_flow(resource_value)
+                    elif operation_type == "delete":
+
+                        app_flow_name = resource_value["huawei-nce-app-flow:app-flows"][
+                            "app-flow"
+                        ][0]["app-name"]
+                        self.nce.delete_app_flow(app_flow_name)
+                    results.append((resource_key, True))
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Unhandled error processing resource_key({:s})".format(
+                            str(resource_key)
+                        )
+                    )
+                    results.append((resource_key, e))
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def DeleteConfig(
+        self, resources: List[Tuple[str, Any]]
+    ) -> List[Union[bool, Exception]]:
+        results = []
+        if len(resources) == 0:
+            return results
+        with self.__lock:
+            for resource in resources:
+                LOGGER.info("resource = {:s}".format(str(resource)))
+                resource_key, resource_value = resource
+                try:
+                    results.append((resource_key, True))
+                except Exception as e:  # pylint: disable=broad-except
+                    LOGGER.exception(
+                        "Unhandled error processing resource_key({:s})".format(
+                            str(resource_key)
+                        )
+                    )
+                    results.append((resource_key, e))
+        return results
+
+    @metered_subclass_method(METRICS_POOL)
+    def SubscribeState(
+        self, subscriptions: List[Tuple[str, float, float]]
+    ) -> List[Union[bool, Exception]]:
+        # TODO: IETF L3VPN does not support monitoring by now
+        return [False for _ in subscriptions]
+
+    @metered_subclass_method(METRICS_POOL)
+    def UnsubscribeState(
+        self, subscriptions: List[Tuple[str, float, float]]
+    ) -> List[Union[bool, Exception]]:
+        # TODO: IETF L3VPN does not support monitoring by now
+        return [False for _ in subscriptions]
+
+    def GetState(
+        self, blocking=False, terminate: Optional[threading.Event] = None
+    ) -> Iterator[Tuple[float, str, Any]]:
+        # TODO: IETF L3VPN does not support monitoring by now
+        return []
diff --git a/src/device/service/drivers/nce/nce_fan_client.py b/src/device/service/drivers/nce/nce_fan_client.py
new file mode 100644
index 0000000000000000000000000000000000000000..1c3523427ab5818b650a5eeecafc098b1c55662e
--- /dev/null
+++ b/src/device/service/drivers/nce/nce_fan_client.py
@@ -0,0 +1,94 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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 Optional
+
+import requests
+from requests.auth import HTTPBasicAuth
+
+LOGGER = logging.getLogger(__name__)
+
+NCE_FAN_URL = "{:s}://{:s}:{:d}/restconf/v1/data"
+TIMEOUT = 30
+
+HTTP_OK_CODES = {
+    200,  # OK
+    201,  # Created
+    202,  # Accepted
+    204,  # No Content
+}
+
+MAPPING_STATUS = {
+    "DEVICEOPERATIONALSTATUS_UNDEFINED": 0,
+    "DEVICEOPERATIONALSTATUS_DISABLED": 1,
+    "DEVICEOPERATIONALSTATUS_ENABLED": 2,
+}
+
+MAPPING_DRIVER = {
+    "DEVICEDRIVER_UNDEFINED": 0,
+    "DEVICEDRIVER_OPENCONFIG": 1,
+    "DEVICEDRIVER_TRANSPORT_API": 2,
+    "DEVICEDRIVER_P4": 3,
+    "DEVICEDRIVER_IETF_NETWORK_TOPOLOGY": 4,
+    "DEVICEDRIVER_ONF_TR_532": 5,
+    "DEVICEDRIVER_XR": 6,
+    "DEVICEDRIVER_IETF_L2VPN": 7,
+    "DEVICEDRIVER_GNMI_OPENCONFIG": 8,
+    "DEVICEDRIVER_OPTICAL_TFS": 9,
+    "DEVICEDRIVER_IETF_ACTN": 10,
+    "DEVICEDRIVER_OC": 11,
+}
+
+HEADERS = {'Content-Type': 'application/json'}
+
+class NCEClient:
+    def __init__(
+        self,
+        address: str,
+        port: int,
+        scheme: str = "http",
+        username: Optional[str] = None,
+        password: Optional[str] = None,
+    ) -> None:
+        self._nce_fan_url = NCE_FAN_URL.format(scheme, address, port)
+        self._auth = None
+
+    def create_app_flow(self, app_flow_data: dict) -> None:
+        try:
+            app_data = app_flow_data["huawei-nce-app-flow:app-flows"]["applications"]
+            app_url = self._nce_fan_url + "/app-flows/apps"
+            LOGGER.info(f'Creating app: {app_data} URL: {app_url}')
+            requests.post(app_url, json=app_data, headers=HEADERS)
+
+            app_flow_data = {
+                "app-flow": app_flow_data["huawei-nce-app-flow:app-flows"]["app-flow"]
+            }
+            app_flow_url = self._nce_fan_url + "/app-flows"
+            LOGGER.info(f'Creating app flow: {app_flow_data} URL: {app_flow_url}')
+            requests.post(app_flow_url, json=app_flow_data, headers=HEADERS)
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send post requests to NCE FAN")
+
+    def delete_app_flow(self, app_flow_name: str) -> None:
+        try:
+            app_url = self._nce_fan_url + f"/app-flows/apps/application={app_flow_name}"
+            LOGGER.info(f'Deleting app: {app_flow_name} URL: {app_url}')
+            requests.delete(app_url)
+
+            app_flow_url = self._nce_fan_url + f"/app-flows/app-flow={app_flow_name}"
+            LOGGER.info(f'Deleting app flow: {app_flow_name} URL: {app_flow_url}')
+            requests.delete(app_flow_url)
+        except requests.exceptions.ConnectionError:
+            raise Exception("faild to send delete request to NCE FAN")
diff --git a/src/device/service/drivers/p4/p4_common.py b/src/device/service/drivers/p4/p4_common.py
index ec851493777243829737136722198173580fbadd..b55296a65922de93370a66301254cacf9ca7220a 100644
--- a/src/device/service/drivers/p4/p4_common.py
+++ b/src/device/service/drivers/p4/p4_common.py
@@ -27,10 +27,12 @@ import math
 import re
 import socket
 import ipaddress
+from typing import Any, Dict, List, Optional, Tuple
 from ctypes import c_uint16, sizeof
 import macaddress
 
-from common.type_checkers.Checkers import chk_type
+from common.type_checkers.Checkers import \
+    chk_attribute, chk_string, chk_type, chk_issubclass
 try:
     from .p4_exception import UserBadValueError
 except ImportError:
@@ -38,6 +40,7 @@ except ImportError:
 
 P4_ATTR_DEV_ID = "id"
 P4_ATTR_DEV_NAME = "name"
+P4_ATTR_DEV_ENDPOINTS = "endpoints"
 P4_ATTR_DEV_VENDOR = "vendor"
 P4_ATTR_DEV_HW_VER = "hw_ver"
 P4_ATTR_DEV_SW_VER = "sw_ver"
@@ -50,6 +53,7 @@ P4_VAL_DEF_HW_VER = "BMv2 simple_switch"
 P4_VAL_DEF_SW_VER = "Stratum"
 P4_VAL_DEF_TIMEOUT = 60
 
+RESOURCE_ENDPOINTS_ROOT_PATH = "/endpoints"
 
 # Logger instance
 LOGGER = logging.getLogger(__name__)
@@ -422,6 +426,28 @@ def parse_action_parameters_from_json(resource):
     return action_params
 
 
+def parse_replicas_from_json(resource):
+    """
+    Parse the session replicas within a JSON-based object.
+
+    :param resource: JSON-based object
+    :return: map of replicas
+    """
+    if not resource or ("replicas" not in resource):
+        LOGGER.warning(
+            "JSON entry misses 'replicas' list of attributes")
+        return None
+    chk_type("replicas", resource["replicas"], list)
+
+    replicas = {}
+    for rep in resource["replicas"]:
+        chk_type("egress-port", rep["egress-port"], int)
+        chk_type("instance", rep["instance"], int)
+        replicas[rep["egress-port"]] = rep["instance"]
+
+    return replicas
+
+
 def parse_integer_list_from_json(resource, resource_list, resource_item):
     """
     Parse the list of integers within a JSON-based object.
@@ -443,3 +469,77 @@ def parse_integer_list_from_json(resource, resource_list, resource_item):
         integers_list.append(item[resource_item])
 
     return integers_list
+
+def process_optional_string_field(
+    #TODO: Consider adding this in common methdos as it is taken by the Emulated driver
+    endpoint_data : Dict[str, Any], field_name : str, endpoint_resource_value : Dict[str, Any]
+) -> None:
+    field_value = chk_attribute(field_name, endpoint_data, 'endpoint_data', default=None)
+    if field_value is None: return
+    chk_string('endpoint_data.{:s}'.format(field_name), field_value)
+    if len(field_value) > 0: endpoint_resource_value[field_name] = field_value
+
+def compose_resource_endpoints(endpoints_list : List[Tuple[str, Any]]):
+    #TODO: Consider adding this in common methods; currently taken by the Emulated driver
+    endpoint_resources = []
+    for i, endpoint in enumerate(endpoints_list):
+        LOGGER.debug("P4 endpoint {}: {}".format(i, endpoint))
+        endpoint_resource = compose_resource_endpoint(endpoint)
+        if endpoint_resource is None: continue
+        endpoint_resources.append(endpoint_resource)
+    return endpoint_resources
+
+def compose_resource_endpoint(endpoint_data : Dict[str, Any]) -> Optional[Tuple[str, Dict]]:
+    #TODO: Consider adding this in common methods; currently taken by the Emulated driver
+    try:
+        endpoint_uuid = chk_attribute('uuid', endpoint_data, 'endpoint_data')
+        chk_string('endpoint_data.uuid', endpoint_uuid, min_length=1)
+        endpoint_resource_path = RESOURCE_ENDPOINTS_ROOT_PATH
+        endpoint_resource_key = '{:s}/endpoint[{:s}]'.format(endpoint_resource_path, endpoint_uuid)
+        endpoint_resource_value = {'uuid': endpoint_uuid}
+
+        # Check endpoint's optional string fields
+        process_optional_string_field(endpoint_data, 'name', endpoint_resource_value)
+        process_optional_string_field(endpoint_data, 'type', endpoint_resource_value)
+        process_optional_string_field(endpoint_data, 'context_uuid', endpoint_resource_value)
+        process_optional_string_field(endpoint_data, 'topology_uuid', endpoint_resource_value)
+
+        return endpoint_resource_key, endpoint_resource_value
+    except: # pylint: disable=bare-except
+        LOGGER.error('Problem composing endpoint({:s})'.format(str(endpoint_data)))
+        return None
+
+def compose_resource_rules(rules_list : List[Tuple[str, Any]]):
+    rule_resources = []
+    for i, rule in enumerate(rules_list):
+        rule_resource = compose_resource_rule(rule_data=rule, rule_cnt=i)
+        if rule_resource is None: continue
+        rule_resources.append(rule_resource)
+    return rule_resources
+
+def compose_resource_rule(rule_data : Dict[str, Any], rule_cnt : int) -> Optional[Tuple[str, Dict]]:
+    try:
+        LOGGER.info("Rule: {}".format(rule_data))
+
+        rule_resource_key = chk_attribute('resource_key', rule_data, 'rule_data')
+        chk_string('rule_data.resource_key', rule_resource_key, min_length=1)
+
+        rule_resource_value = chk_attribute('resource_value', rule_data, 'rule_data')
+        chk_issubclass('rule_data.resource_value', rule_resource_value, dict)
+
+        rule_key_unique = ""
+
+        if "table" == rule_resource_key:
+            table_name = parse_resource_string_from_json(rule_resource_value, "table-name")
+            assert table_name, "Invalid table name in rule"
+            rule_key_unique = '/{0}s/{0}/{1}[{2}]'.format(rule_resource_key, table_name, rule_cnt)
+        else:
+            msg = f"Parsed an invalid key {rule_resource_key}"
+            LOGGER.error(msg)
+            raise Exception(msg)
+
+        assert rule_key_unique, "Invalid unique resource key"
+        return rule_key_unique, rule_resource_value
+    except: # pylint: disable=bare-except
+        LOGGER.error('Problem composing rule({:s})'.format(str(rule_data)))
+        return None
diff --git a/src/device/service/drivers/p4/p4_context.py b/src/device/service/drivers/p4/p4_context.py
index ca8f0c19ef6cecdc361664323bbe2cd8beed64e3..ce8e308e8b2f55aa37c7cf06b6a56fdf7dc3bd7f 100644
--- a/src/device/service/drivers/p4/p4_context.py
+++ b/src/device/service/drivers/p4/p4_context.py
@@ -34,6 +34,7 @@ class P4Type(enum.Enum):
     meter = 6
     direct_meter = 7
     controller_packet_metadata = 8
+    digest = 9
 
 
 P4Type.table.p4info_name = "tables"
@@ -44,6 +45,7 @@ P4Type.direct_counter.p4info_name = "direct_counters"
 P4Type.meter.p4info_name = "meters"
 P4Type.direct_meter.p4info_name = "direct_meters"
 P4Type.controller_packet_metadata.p4info_name = "controller_packet_metadata"
+P4Type.digest.p4info_name = "digests"
 
 for object_type in P4Type:
     object_type.pretty_name = object_type.name.replace('_', ' ')
@@ -58,11 +60,12 @@ class P4RuntimeEntity(enum.Enum):
     table_entry = 1
     action_profile_member = 2
     action_profile_group = 3
-    meter_entry = 4
-    direct_meter_entry = 5
-    counter_entry = 6
-    direct_counter_entry = 7
+    counter_entry = 4
+    direct_counter_entry = 5
+    meter_entry = 6
+    direct_meter_entry = 7
     packet_replication_engine_entry = 8
+    digest_entry = 9
 
 
 class Context:
diff --git a/src/device/service/drivers/p4/p4_driver.py b/src/device/service/drivers/p4/p4_driver.py
index d31fa46738fad9f9404c8ba21dfbc49b08fde074..c89a42baddaf45737ebfcf26a665f0a6beb8544f 100644
--- a/src/device/service/drivers/p4/p4_driver.py
+++ b/src/device/service/drivers/p4/p4_driver.py
@@ -23,15 +23,19 @@ import 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, chk_length, chk_string
+from device.service.driver_api._Driver import RESOURCE_ENDPOINTS, RESOURCE_RULES
 from .p4_common import matches_ipv4, matches_ipv6, valid_port,\
-    P4_ATTR_DEV_ID, P4_ATTR_DEV_NAME, P4_ATTR_DEV_VENDOR,\
-    P4_ATTR_DEV_HW_VER, P4_ATTR_DEV_SW_VER,\
+    compose_resource_endpoints, parse_resource_string_from_json,\
+    P4_ATTR_DEV_ID, P4_ATTR_DEV_NAME, P4_ATTR_DEV_ENDPOINTS,\
+    P4_ATTR_DEV_VENDOR, P4_ATTR_DEV_HW_VER, P4_ATTR_DEV_SW_VER,\
     P4_ATTR_DEV_P4BIN, P4_ATTR_DEV_P4INFO, P4_ATTR_DEV_TIMEOUT,\
     P4_VAL_DEF_VENDOR, P4_VAL_DEF_HW_VER, P4_VAL_DEF_SW_VER,\
     P4_VAL_DEF_TIMEOUT
-from .p4_manager import P4Manager, KEY_TABLE, KEY_ACTION, \
-    KEY_ACTION_PROFILE, KEY_COUNTER, KEY_DIR_COUNTER, KEY_METER, KEY_DIR_METER,\
-    KEY_CTL_PKT_METADATA
+from .p4_manager import P4Manager, \
+    KEY_TABLE, KEY_ACTION, KEY_ACTION_PROFILE, \
+    KEY_COUNTER, KEY_DIR_COUNTER, KEY_METER, KEY_DIR_METER,\
+    KEY_CTL_PKT_METADATA, KEY_DIGEST, KEY_CLONE_SESSION,\
+    KEY_ENDPOINT
 from .p4_client import WriteOperation
 
 try:
@@ -59,6 +63,8 @@ class P4Driver(_Driver):
             P4 device datapath ID (Mandatory)
         name : str
             P4 device name (Optional)
+        endpoints : list
+            List of P4 device endpoints, i.e., ports (Optional)
         vendor : str
             P4 device vendor (Optional)
         hw_ver : str
@@ -70,17 +76,22 @@ class P4Driver(_Driver):
         p4info : str
             Path to P4 info file (Optional, but must be combined with p4bin)
         timeout : int
-            Device timeout in seconds (Optional)
+            P4 device timeout in seconds (Optional)
+        rules : list
+            List of rules to configure the P4 device's pipeline
     """
 
     def __init__(self, address: str, port: int, **settings) -> None:
-        super().__init__(settings.pop('name', DRIVER_NAME), address, port, **settings)
+        super().__init__(name=DRIVER_NAME, address=address, port=port, setting=settings)
         self.__manager = None
         self.__address = address
         self.__port = int(port)
-        self.__endpoint = None
+        self.__grpc_endpoint = None
         self.__settings = settings
         self.__id = None
+        self.__name = None
+        self.__endpoints = []
+        self.__rules = {}
         self.__vendor = P4_VAL_DEF_VENDOR
         self.__hw_version = P4_VAL_DEF_HW_VER
         self.__sw_version = P4_VAL_DEF_SW_VER
@@ -97,7 +108,7 @@ class P4Driver(_Driver):
                     self.__address, self.__port)
 
         for key, value in settings.items():
-            LOGGER.info("\t%8s = %s", key, value)
+            LOGGER.info("\t%9s = %s", key, value)
 
     def Connect(self) -> bool:
         """
@@ -105,14 +116,14 @@ class P4Driver(_Driver):
 
         :return: boolean connection status.
         """
-        LOGGER.info("Connecting to P4 device %s ...", self.__endpoint)
+        LOGGER.info("Connecting to P4 device %s ...", self.__grpc_endpoint)
 
         with self.__lock:
             # Skip if already connected
             if self.__started.is_set():
                 return True
 
-            # Dynamically devise an election ID
+            # TODO: Dynamically devise an election ID
             election_id = (1, 0)
 
             # Spawn a P4 manager for this device
@@ -140,7 +151,7 @@ class P4Driver(_Driver):
 
         :return: boolean disconnection status.
         """
-        LOGGER.info("Disconnecting from P4 device %s ...", self.__endpoint)
+        LOGGER.info("Disconnecting from P4 device %s ...", self.__grpc_endpoint)
 
         # If not started, assume it is already disconnected
         if not self.__started.is_set():
@@ -167,13 +178,15 @@ class P4Driver(_Driver):
 
         :return: list of initial configuration items.
         """
-        initial_conf = []
+
+        resource_keys = [RESOURCE_ENDPOINTS] if self.__endpoints else []
 
         with self.__lock:
-            if not initial_conf:
-                LOGGER.warning("No initial configuration for P4 device %s ...",
-                               self.__endpoint)
-            return []
+            if not resource_keys:
+                LOGGER.warning("No initial configuration for P4 device {} ...".format(self.__grpc_endpoint))
+                return []
+            LOGGER.info("Initial configuration for P4 device {}:".format(self.__grpc_endpoint))
+            return self.GetConfig(resource_keys)
 
     @metered_subclass_method(METRICS_POOL)
     def GetConfig(self, resource_keys: List[str] = [])\
@@ -186,7 +199,7 @@ class P4Driver(_Driver):
         None/Exception.
         """
         LOGGER.info(
-            "Getting configuration from P4 device %s ...", self.__endpoint)
+            "Getting configuration from P4 device %s ...", self.__grpc_endpoint)
 
         # No resource keys means fetch all configuration
         if len(resource_keys) == 0:
@@ -195,7 +208,7 @@ class P4Driver(_Driver):
                 "implies getting all resource keys!")
             resource_keys = [
                 obj_name for obj_name, _ in self.__manager.p4_objects.items()
-            ]
+            ] + [RESOURCE_ENDPOINTS] + [RESOURCE_RULES]
 
         # Verify the input type
         chk_type("resources", resource_keys, list)
@@ -214,7 +227,7 @@ class P4Driver(_Driver):
         changes requested.
         """
         LOGGER.info(
-            "Setting configuration to P4 device %s ...", self.__endpoint)
+            "Setting configuration to P4 device %s ...", self.__grpc_endpoint)
 
         if not resources or len(resources) == 0:
             LOGGER.warning(
@@ -238,7 +251,7 @@ class P4Driver(_Driver):
         deletions requested.
         """
         LOGGER.info(
-            "Deleting configuration from P4 device %s ...", self.__endpoint)
+            "Deleting configuration from P4 device %s ...", self.__grpc_endpoint)
 
         if not resources or len(resources) == 0:
             LOGGER.warning(
@@ -308,6 +321,14 @@ class P4Driver(_Driver):
         """
         return self.__manager
 
+    def is_started(self):
+        """
+        Check if an instance of the P4 manager is started.
+
+        :return: boolean P4 manager instance status
+        """
+        return self.__started.is_set()
+
     def __parse_and_validate_settings(self):
         """
         Verify that the driver inputs comply to what is expected.
@@ -319,7 +340,7 @@ class P4Driver(_Driver):
             f"{self.__address} not a valid IPv4 or IPv6 address"
         assert valid_port(self.__port), \
             f"{self.__port} not a valid transport port"
-        self.__endpoint = f"{self.__address}:{self.__port}"
+        self.__grpc_endpoint = f"{self.__address}:{self.__port}"
 
         # Device ID
         try:
@@ -337,6 +358,16 @@ class P4Driver(_Driver):
                 "No device name is provided. Setting default name: %s",
                 self.__name)
 
+        # Device endpoints
+        if P4_ATTR_DEV_ENDPOINTS in self.__settings:
+            endpoints = self.__settings.get(P4_ATTR_DEV_ENDPOINTS, [])
+            endpoint_resources = compose_resource_endpoints(endpoints)
+            if endpoint_resources:
+                LOGGER.info("Setting endpoints: {}".format(endpoint_resources))
+                self.SetConfig(endpoint_resources)
+        else:
+            LOGGER.warning("No device endpoints are provided.")
+
         # Device vendor
         if P4_ATTR_DEV_VENDOR in self.__settings:
             self.__vendor = self.__settings.get(P4_ATTR_DEV_VENDOR)
@@ -365,7 +396,7 @@ class P4Driver(_Driver):
         if P4_ATTR_DEV_P4BIN in self.__settings:
             self.__p4bin_path = self.__settings.get(P4_ATTR_DEV_P4BIN)
             assert os.path.exists(self.__p4bin_path),\
-                "Invalid path to p4bin file"
+                "Invalid path to p4bin file: {}".format(self.__p4bin_path)
             assert P4_ATTR_DEV_P4INFO in self.__settings,\
                 "p4info and p4bin settings must be provided together"
 
@@ -373,7 +404,7 @@ class P4Driver(_Driver):
         if P4_ATTR_DEV_P4INFO in self.__settings:
             self.__p4info_path = self.__settings.get(P4_ATTR_DEV_P4INFO)
             assert os.path.exists(self.__p4info_path),\
-                "Invalid path to p4info file"
+                "Invalid path to p4info file: {}".format(self.__p4info_path)
             assert P4_ATTR_DEV_P4BIN in self.__settings,\
                 "p4info and p4bin settings must be provided together"
 
@@ -404,7 +435,7 @@ class P4Driver(_Driver):
         """
         resources = []
 
-        LOGGER.debug("GetConfig() -> Keys: %s", resource_keys)
+        LOGGER.info("GetConfig() -> Keys: {}".format(resource_keys))
 
         for resource_key in resource_keys:
             entries = []
@@ -423,8 +454,7 @@ class P4Driver(_Driver):
                             entries.append(c_entries)
                 elif KEY_DIR_COUNTER == resource_key:
                     for d_cnt_name in self.__manager.get_direct_counter_names():
-                        dc_entries = \
-                            self.__manager.direct_counter_entries_to_json(
+                        dc_entries = self.__manager.direct_counter_entries_to_json(
                                 d_cnt_name)
                         if dc_entries:
                             entries.append(dc_entries)
@@ -436,28 +466,35 @@ class P4Driver(_Driver):
                             entries.append(m_entries)
                 elif KEY_DIR_METER == resource_key:
                     for d_meter_name in self.__manager.get_direct_meter_names():
-                        dm_entries = \
-                            self.__manager.direct_meter_entries_to_json(
+                        dm_entries = self.__manager.direct_meter_entries_to_json(
                                 d_meter_name)
                         if dm_entries:
                             entries.append(dm_entries)
                 elif KEY_ACTION_PROFILE == resource_key:
                     for ap_name in self.__manager.get_action_profile_names():
-                        ap_entries = \
-                            self.__manager.action_prof_member_entries_to_json(
+                        ap_entries = self.__manager.action_prof_member_entries_to_json(
                                 ap_name)
                         if ap_entries:
                             entries.append(ap_entries)
                 elif KEY_ACTION == resource_key:
-                    #To be implemented or deprecated
-                    pass
-                elif '__endpoints__' == resource_key:
-                    #Not Supported for P4 devices
+                    # To be implemented or deprecated
                     pass
                 elif KEY_CTL_PKT_METADATA == resource_key:
+                    #TODO: Handle controller packet metadata
                     msg = f"{resource_key.capitalize()} is not a " \
                           f"retrievable resource"
-                    raise Exception(msg)
+                    LOGGER.warning("%s", msg)
+                elif KEY_DIGEST == resource_key:
+                    #TODO: Handle digests
+                    msg = f"{resource_key.capitalize()} is not a " \
+                          f"retrievable resource"
+                    LOGGER.warning("%s", msg)
+                elif RESOURCE_ENDPOINTS == resource_key:
+                    resources += self.__endpoints
+                    continue
+                elif RESOURCE_RULES == resource_key:
+                     resources = self.__rules_into_resources()
+                     continue
                 else:
                     msg = f"GetConfig failed due to invalid " \
                           f"resource key: {resource_key}"
@@ -465,8 +502,10 @@ class P4Driver(_Driver):
                 resources.append(
                     (resource_key, entries if entries else None)
                 )
-            except Exception as ex:  # pylint: disable=broad-except
-                resources.append((resource_key, ex))
+            except Exception as e:  # pylint: disable=broad-except
+                resources.append((resource_key, e))
+
+        LOGGER.info("GetConfig() -> Results: %s", resources)
 
         return resources
 
@@ -480,6 +519,8 @@ class P4Driver(_Driver):
         """
         results = []
 
+        LOGGER.info("SetConfig -> Resources {}".format(resources))
+
         for i, resource in enumerate(resources):
             str_resource_name = f"resources[#{i}]"
             resource_key = ""
@@ -499,11 +540,15 @@ class P4Driver(_Driver):
                 continue
 
             try:
-                resource_value = json.loads(resource_value)
-            except Exception:  # pylint: disable=broad-except
-                pass
+                # Rules are JSON-based, endpoints are not
+                if "endpoint" not in resource_key:
+                    resource_value = json.loads(resource_value)
+            except Exception as e:  # pylint: disable=broad-except
+                LOGGER.exception("Exception validating resource value {}".format(resource_value))
+                results.append(e)
+                continue
 
-            LOGGER.debug(
+            LOGGER.info(
                 "SetConfig() -> Key: %s - Value: %s",
                 resource_key, resource_value)
 
@@ -512,13 +557,22 @@ class P4Driver(_Driver):
             # to be inserted already exists, thus simply needs an update.
             operation = WriteOperation.insert
 
+            # Dataplane and cache rule insertion process
             try:
-                self.__apply_operation(resource_key, resource_value, operation)
-                results.append(True)
-            except Exception as ex:  # pylint: disable=broad-except
-                results.append(ex)
+                r2, r3 = False, True
+                r1 = self.__cache_rule_insert(resource_key, resource_value, operation)
+                # Cache insertion succeeded, proceed to dataplane
+                if r1:
+                    r2 = self.__apply_operation(resource_key, resource_value, operation)
+                # Dataplane insertion did not succeed --> Revert caching
+                if not r2 and r1:
+                    r3 = self.__cache_rule_remove(resource_key)
+                results.append(r1 & r2 & r3)
+            except Exception as e:  # pylint: disable=broad-except
+                results.append(e)
+                continue
 
-        print(results)
+        LOGGER.info("SetConfig() -> Results: {}".format(results))
 
         return results
 
@@ -552,21 +606,31 @@ class P4Driver(_Driver):
 
             try:
                 resource_value = json.loads(resource_value)
-            except Exception:  # pylint: disable=broad-except
-                pass
+            except Exception as e:  # pylint: disable=broad-except
+                results.append(e)
+                continue
 
-            LOGGER.debug("DeleteConfig() -> Key: %s - Value: %s",
+            LOGGER.info("DeleteConfig() -> Key: %s - Value: %s",
                          resource_key, resource_value)
 
             operation = WriteOperation.delete
 
+            # Dataplane and cache rule removal process
             try:
-                self.__apply_operation(resource_key, resource_value, operation)
-                results.append(True)
-            except Exception as ex:  # pylint: disable=broad-except
-                results.append(ex)
+                r2, r3 = False, True
+                r1 = self.__cache_rule_remove(resource_key)
+                # Cache removal succeeded, proceed to dataplane
+                if r1:
+                    r2 = self.__apply_operation(resource_key, resource_value, operation)
+                # Dataplane removal did not succeed --> Revert caching
+                if not r2 and r1:
+                    r3 = self.__cache_rule_insert(resource_key, resource_value, WriteOperation.insert)
+                results.append(r1 & r2 & r3)
+            except Exception as e:  # pylint: disable=broad-except
+                results.append(e)
+                continue
 
-        print(results)
+        LOGGER.info("DeleteConfig() -> Results: {}".format(results))
 
         return results
 
@@ -583,35 +647,85 @@ class P4Driver(_Driver):
         """
 
         # Apply settings to the various tables
-        if KEY_TABLE == resource_key:
+        if KEY_TABLE in resource_key:
             self.__manager.table_entry_operation_from_json(
                 resource_value, operation)
-        elif KEY_COUNTER == resource_key:
+        elif KEY_COUNTER in resource_key:
             self.__manager.counter_entry_operation_from_json(
                 resource_value, operation)
-        elif KEY_DIR_COUNTER == resource_key:
+        elif KEY_DIR_COUNTER in resource_key:
             self.__manager.direct_counter_entry_operation_from_json(
                 resource_value, operation)
-        elif KEY_METER == resource_key:
+        elif KEY_METER in resource_key:
             self.__manager.meter_entry_operation_from_json(
                 resource_value, operation)
-        elif KEY_DIR_METER == resource_key:
+        elif KEY_DIR_METER in resource_key:
             self.__manager.direct_meter_entry_operation_from_json(
                 resource_value, operation)
-        elif KEY_ACTION_PROFILE == resource_key:
+        elif KEY_ACTION_PROFILE in resource_key:
             self.__manager.action_prof_member_entry_operation_from_json(
                 resource_value, operation)
             self.__manager.action_prof_group_entry_operation_from_json(
                 resource_value, operation)
-        elif KEY_CTL_PKT_METADATA == resource_key:
+        elif KEY_CLONE_SESSION in resource_key:
+            self.__manager.clone_session_entry_operation_from_json(
+                resource_value, operation)
+        elif KEY_CTL_PKT_METADATA in resource_key:
             msg = f"{resource_key.capitalize()} is not a " \
                   f"configurable resource"
             raise Exception(msg)
+        elif KEY_DIGEST in resource_key:
+            msg = f"{resource_key.capitalize()} is not a " \
+                  f"configurable resource"
+            raise Exception(msg)
+        elif KEY_ENDPOINT in resource_key:
+            self.__endpoints.append((resource_key, resource_value))
         else:
             msg = f"{operation} on invalid key {resource_key}"
             LOGGER.error(msg)
             raise Exception(msg)
 
-        LOGGER.debug("%s operation: %s", resource_key.capitalize(), operation)
+        return True
+
+    def __cache_rule_insert(self, resource_key, resource_value, operation):
+        """
+        Insert a new rule into the rule cache or update an existing one.
+
+        :param resource_key: P4 resource key
+        :param resource_value: P4 resource value in JSON format
+        :param operation: write operation (i.e., insert, update) to apply
+        :return: True if new rule is inserted or existing is updated, otherwise False
+        """
+        if (resource_key in self.__rules.keys()) and (operation == WriteOperation.insert):
+            LOGGER.error("Attempting to insert an existing rule key: {}".format(resource_key))
+            return False
+        elif (resource_key not in self.__rules.keys()) and (operation == WriteOperation.update):
+            LOGGER.error("Attempting to update a non-existing rule key: {}".format(resource_key))
+            return False
+        elif (resource_key in self.__rules.keys()) and (operation == WriteOperation.update):
+            LOGGER.warning("Updating an existing rule key: {}".format(resource_key))
+        self.__rules[resource_key] = resource_value
+        return True
+
+    def __cache_rule_remove(self, resource_key):
+        """
+        Remove an existing rule from the rule cache.
 
+        :param resource_key: P4 resource key
+        :return: True if existing rule is removed, otherwise False
+        """
+        if resource_key not in self.__rules.keys():
+            LOGGER.error("Attempting to remove a non-existing rule key: {}".format(resource_key))
+            return False
+        self.__rules.pop(resource_key)
         return True
+
+    def __rules_into_resources(self):
+        """
+        Transform rules from the driver's rule map into
+        resources exposed through the SBI API.
+        """
+        resource_list = []
+        for rule_key, rule_val in self.__rules.items():
+            resource_list.append((rule_key, rule_val))
+        return resource_list
diff --git a/src/device/service/drivers/p4/p4_manager.py b/src/device/service/drivers/p4/p4_manager.py
index f6684412a4d650ecb909632b9ddcbc3d17a55a5c..210422ed8de2559b56fa22da4e36f154b7d03b99 100644
--- a/src/device/service/drivers/p4/p4_manager.py
+++ b/src/device/service/drivers/p4/p4_manager.py
@@ -35,7 +35,8 @@ try:
     from .p4_common import encode,\
         parse_resource_string_from_json, parse_resource_integer_from_json,\
         parse_resource_bytes_from_json, parse_match_operations_from_json,\
-        parse_action_parameters_from_json, parse_integer_list_from_json
+        parse_action_parameters_from_json, parse_integer_list_from_json,\
+        parse_replicas_from_json
     from .p4_exception import UserError, InvalidP4InfoError
 except ImportError:
     from p4_client import P4RuntimeClient, P4RuntimeException,\
@@ -58,6 +59,7 @@ CONTEXT = Context()
 CLIENTS = {}
 
 # Constant P4 entities
+KEYS_P4 = []
 KEY_TABLE = "table"
 KEY_ACTION = "action"
 KEY_ACTION_PROFILE = "action_profile"
@@ -66,6 +68,11 @@ KEY_DIR_COUNTER = "direct_counter"
 KEY_METER = "meter"
 KEY_DIR_METER = "direct_meter"
 KEY_CTL_PKT_METADATA = "controller_packet_metadata"
+KEY_DIGEST = "digest"
+
+# Extra resource keys
+KEY_CLONE_SESSION = "clone_session"
+KEY_ENDPOINT = "endpoint"
 
 
 def get_context():
@@ -83,19 +90,20 @@ def get_table_type(table):
     :param table: P4 table
     :return: P4 table type
     """
-    for m_f in table.match_fields:
-        if m_f.match_type == p4info_pb2.MatchField.EXACT:
-            return p4info_pb2.MatchField.EXACT
-        if m_f.match_type == p4info_pb2.MatchField.LPM:
-            return p4info_pb2.MatchField.LPM
-        if m_f.match_type == p4info_pb2.MatchField.TERNARY:
-            return p4info_pb2.MatchField.TERNARY
-        if m_f.match_type == p4info_pb2.MatchField.RANGE:
-            return p4info_pb2.MatchField.RANGE
-        if m_f.match_type == p4info_pb2.MatchField.OPTIONAL:
-            return p4info_pb2.MatchField.OPTIONAL
-    return None
+    is_ternary = False
 
+    for m_f in table.match_fields:
+        # LPM and range are special forms of ternary
+        if m_f.match_type in [
+            p4info_pb2.MatchField.TERNARY,
+            p4info_pb2.MatchField.LPM,
+            p4info_pb2.MatchField.RANGE
+        ]:
+            is_ternary = True
+
+    if is_ternary:
+        return p4info_pb2.MatchField.TERNARY
+    return p4info_pb2.MatchField.EXACT
 
 def match_type_to_str(match_type):
     """
@@ -132,12 +140,12 @@ class P4Manager:
         self.__id = device_id
         self.__ip_address = ip_address
         self.__port = int(port)
-        self.__endpoint = f"{self.__ip_address}:{self.__port}"
+        self.__grpc_endpoint = f"{self.__ip_address}:{self.__port}"
         self.key_id = ip_address+str(port)
         CLIENTS[self.key_id] = P4RuntimeClient(
-            self.__id, self.__endpoint, election_id, role_name, ssl_options)
+            self.__id, self.__grpc_endpoint, election_id, role_name, ssl_options)
         self.__p4info = None
-        
+
         self.local_client = CLIENTS[self.key_id]
 
         # Internal memory for whitebox management
@@ -146,14 +154,14 @@ class P4Manager:
 
         # | -> P4 entities
         self.table_entries = {}
+        self.action_profile_members = {}
+        self.action_profile_groups = {}
         self.counter_entries = {}
         self.direct_counter_entries = {}
         self.meter_entries = {}
         self.direct_meter_entries = {}
-        self.multicast_groups = {}
         self.clone_session_entries = {}
-        self.action_profile_members = {}
-        self.action_profile_groups = {}
+        self.multicast_groups = {}
 
     def start(self, p4bin_path, p4info_path):
         """
@@ -234,7 +242,7 @@ class P4Manager:
         self.__id = None
         self.__ip_address = None
         self.__port = None
-        self.__endpoint = None
+        self.__grpc_endpoint = None
         self.__clear_state()
 
     def __clear_state(self):
@@ -244,14 +252,14 @@ class P4Manager:
         :return: void
         """
         self.table_entries.clear()
+        self.action_profile_members.clear()
+        self.action_profile_groups.clear()
         self.counter_entries.clear()
         self.direct_counter_entries.clear()
         self.meter_entries.clear()
         self.direct_meter_entries.clear()
-        self.multicast_groups.clear()
         self.clone_session_entries.clear()
-        self.action_profile_members.clear()
-        self.action_profile_groups.clear()
+        self.multicast_groups.clear()
         self.p4_objects.clear()
 
     def __init_objects(self):
@@ -264,7 +272,7 @@ class P4Manager:
         global KEY_TABLE, KEY_ACTION, KEY_ACTION_PROFILE, \
             KEY_COUNTER, KEY_DIR_COUNTER, \
             KEY_METER, KEY_DIR_METER, \
-            KEY_CTL_PKT_METADATA
+            KEY_CTL_PKT_METADATA, KEY_DIGEST, KEYS_P4
 
         KEY_TABLE = P4Type.table.name
         KEY_ACTION = P4Type.action.name
@@ -274,12 +282,15 @@ class P4Manager:
         KEY_METER = P4Type.meter.name
         KEY_DIR_METER = P4Type.direct_meter.name
         KEY_CTL_PKT_METADATA = P4Type.controller_packet_metadata.name
-        assert (k for k in [
+        KEY_DIGEST = P4Type.digest.name
+
+        KEYS_P4 = [
             KEY_TABLE, KEY_ACTION, KEY_ACTION_PROFILE,
             KEY_COUNTER, KEY_DIR_COUNTER,
             KEY_METER, KEY_DIR_METER,
-            KEY_CTL_PKT_METADATA
-        ])
+            KEY_CTL_PKT_METADATA, KEY_DIGEST
+        ]
+        assert (k for k in KEYS_P4)
 
         if not self.p4_objects:
             LOGGER.warning(
@@ -292,6 +303,11 @@ class P4Manager:
             for table in self.p4_objects[KEY_TABLE]:
                 self.table_entries[table.name] = []
 
+        if KEY_ACTION_PROFILE in self.p4_objects:
+            for act_prof in self.p4_objects[KEY_ACTION_PROFILE]:
+                self.action_profile_members[act_prof.name] = []
+                self.action_profile_groups[act_prof.name] = []
+
         if KEY_COUNTER in self.p4_objects:
             for cnt in self.p4_objects[KEY_COUNTER]:
                 self.counter_entries[cnt.name] = []
@@ -308,11 +324,6 @@ class P4Manager:
             for d_meter in self.p4_objects[KEY_DIR_METER]:
                 self.direct_meter_entries[d_meter.name] = []
 
-        if KEY_ACTION_PROFILE in self.p4_objects:
-            for act_prof in self.p4_objects[KEY_ACTION_PROFILE]:
-                self.action_profile_members[act_prof.name] = []
-                self.action_profile_groups[act_prof.name] = []
-
     def __discover_objects(self):
         """
         Discover and store all P4 objects.
@@ -509,6 +520,20 @@ class P4Manager:
                 return pkt_meta
         return None
 
+    def get_digest(self, digest_name):
+        """
+        Get a digest object by name.
+
+        :param digest_name: name of a digest object
+        :return: digest object or None
+        """
+        if KEY_DIGEST not in self.p4_objects:
+            return None
+        for dg in self.p4_objects[KEY_DIGEST]:
+            if dg == digest_name.name:
+                return digest_name
+        return None
+
     def get_resource_keys(self):
         """
         Retrieve the available P4 resource keys.
@@ -561,15 +586,15 @@ class P4Manager:
         self.table_entries[table_name] = []
 
         try:
-            for count, table_entry in enumerate(
-                    TableEntry(self.local_client, table_name)(action=action_name).read()):
-                LOGGER.debug(
-                    "Table %s - Entry %d\n%s", table_name, count, table_entry)
+            entries = TableEntry(self.local_client, table_name).read()
+            assert self.local_client
+            for table_entry in entries:
                 self.table_entries[table_name].append(table_entry)
             return self.table_entries[table_name]
         except P4RuntimeException as ex:
-            LOGGER.error(ex)
-            return []
+            LOGGER.error("Failed to get table %s entries: %s",
+                         table_name, str(ex))
+        return []
 
     def table_entries_to_json(self, table_name):
         """
@@ -634,10 +659,14 @@ class P4Manager:
         :return: number of P4 table entries or negative integer
         upon missing table
         """
-        entries = self.get_table_entries(table_name, action_name)
-        if entries is None:
-            return -1
-        return len(entries)
+        count = 0
+        try:
+            entries = TableEntry(self.local_client, table_name).read()
+            count = sum(1 for _ in entries)
+        except Exception as e:  # pylint: disable=broad-except
+            LOGGER.error("Failed to read entries of table: %s", table_name)
+
+        return count
 
     def count_table_entries_all(self):
         """
@@ -675,7 +704,7 @@ class P4Manager:
         metadata = parse_resource_bytes_from_json(json_resource, "metadata")
 
         if operation in [WriteOperation.insert, WriteOperation.update]:
-            LOGGER.debug("Table entry to insert/update: %s", json_resource)
+            LOGGER.info("Table entry to insert/update: %s", json_resource)
             return self.insert_table_entry(
                 table_name=table_name,
                 match_map=match_map,
@@ -685,7 +714,7 @@ class P4Manager:
                 metadata=metadata if metadata else None
             )
         if operation == WriteOperation.delete:
-            LOGGER.debug("Table entry to delete: %s", json_resource)
+            LOGGER.info("Table entry to delete: %s", json_resource)
             return self.delete_table_entry(
                 table_name=table_name,
                 match_map=match_map,
@@ -700,7 +729,7 @@ class P4Manager:
             cnt_pkt=-1, cnt_byte=-1):
         """
         Insert an entry into an exact match table.
-    
+
         :param table_name: P4 table name
         :param match_map: Map of match operations
         :param action_name: Action name
@@ -712,45 +741,45 @@ class P4Manager:
         """
         assert match_map, "Table entry without match operations is not accepted"
         assert action_name, "Table entry without action is not accepted"
-    
+
         table_entry = TableEntry(self.local_client, table_name)(action=action_name)
-    
+
         for match_k, match_v in match_map.items():
             table_entry.match[match_k] = match_v
-    
+
         for action_k, action_v in action_params.items():
             table_entry.action[action_k] = action_v
-    
+
         if metadata:
             table_entry.metadata = metadata
-    
+
         if cnt_pkt > 0:
             table_entry.counter_data.packet_count = cnt_pkt
-    
+
         if cnt_byte > 0:
             table_entry.counter_data.byte_count = cnt_byte
-    
+
         ex_msg = ""
         try:
             table_entry.insert()
             LOGGER.info("Inserted exact table entry: %s", table_entry)
         except (P4RuntimeException, P4RuntimeWriteException) as ex:
-            raise P4RuntimeException from ex
-    
+            ex_msg = str(ex)
+            LOGGER.warning(ex)
+
         # Table entry exists, needs to be modified
         if "ALREADY_EXISTS" in ex_msg:
             table_entry.modify()
             LOGGER.info("Updated exact table entry: %s", table_entry)
-    
+
         return table_entry
-    
-    
+
     def insert_table_entry_ternary(self,
             table_name, match_map, action_name, action_params, metadata,
             priority, cnt_pkt=-1, cnt_byte=-1):
         """
         Insert an entry into a ternary match table.
-    
+
         :param table_name: P4 table name
         :param match_map: Map of match operations
         :param action_name: Action name
@@ -763,47 +792,47 @@ class P4Manager:
         """
         assert match_map, "Table entry without match operations is not accepted"
         assert action_name, "Table entry without action is not accepted"
-    
+
         table_entry = TableEntry(self.local_client, table_name)(action=action_name)
-    
+
         for match_k, match_v in match_map.items():
             table_entry.match[match_k] = match_v
-    
+
         for action_k, action_v in action_params.items():
             table_entry.action[action_k] = action_v
-    
+
         table_entry.priority = priority
-    
+
         if metadata:
             table_entry.metadata = metadata
-    
+
         if cnt_pkt > 0:
             table_entry.counter_data.packet_count = cnt_pkt
-    
+
         if cnt_byte > 0:
             table_entry.counter_data.byte_count = cnt_byte
-    
+
         ex_msg = ""
         try:
             table_entry.insert()
             LOGGER.info("Inserted ternary table entry: %s", table_entry)
         except (P4RuntimeException, P4RuntimeWriteException) as ex:
-            raise P4RuntimeException from ex
-    
+            ex_msg = str(ex)
+            LOGGER.error(ex)
+
         # Table entry exists, needs to be modified
         if "ALREADY_EXISTS" in ex_msg:
             table_entry.modify()
             LOGGER.info("Updated ternary table entry: %s", table_entry)
-    
+
         return table_entry
-    
-    
+
     def insert_table_entry_range(self,
             table_name, match_map, action_name, action_params, metadata,
             priority, cnt_pkt=-1, cnt_byte=-1):  # pylint: disable=unused-argument
         """
         Insert an entry into a range match table.
-    
+
         :param table_name: P4 table name
         :param match_map: Map of match operations
         :param action_name: Action name
@@ -816,17 +845,16 @@ class P4Manager:
         """
         assert match_map, "Table entry without match operations is not accepted"
         assert action_name, "Table entry without action is not accepted"
-    
+
         raise NotImplementedError(
             "Range-based table insertion not implemented yet")
-    
-    
+
     def insert_table_entry_optional(self,
             table_name, match_map, action_name, action_params, metadata,
             priority, cnt_pkt=-1, cnt_byte=-1):  # pylint: disable=unused-argument
         """
         Insert an entry into an optional match table.
-    
+
         :param table_name: P4 table name
         :param match_map: Map of match operations
         :param action_name: Action name
@@ -839,7 +867,7 @@ class P4Manager:
         """
         assert match_map, "Table entry without match operations is not accepted"
         assert action_name, "Table entry without action is not accepted"
-    
+
         raise NotImplementedError(
             "Optional-based table insertion not implemented yet")
 
@@ -869,32 +897,36 @@ class P4Manager:
         assert table, \
             "P4 pipeline does not implement table " + table_name
 
-        if not get_table_type(table):
+        table_type = get_table_type(table)
+
+        if not table_type:
             msg = f"Table {table_name} is undefined, cannot insert entry"
             LOGGER.error(msg)
             raise UserError(msg)
 
+        LOGGER.debug("Table {}: {}".format(table_name, match_type_to_str(table_type)))
+
         # Exact match is supported
-        if get_table_type(table) == p4info_pb2.MatchField.EXACT:
+        if table_type == p4info_pb2.MatchField.EXACT:
             return self.insert_table_entry_exact(
                 table_name, match_map, action_name, action_params, metadata,
                 cnt_pkt, cnt_byte)
 
         # Ternary and LPM matches are supported
-        if get_table_type(table) in \
+        if table_type in \
                 [p4info_pb2.MatchField.TERNARY, p4info_pb2.MatchField.LPM]:
             return self.insert_table_entry_ternary(
                 table_name, match_map, action_name, action_params, metadata,
                 priority, cnt_pkt, cnt_byte)
 
         # TODO: Cover RANGE match  # pylint: disable=W0511
-        if get_table_type(table) == p4info_pb2.MatchField.RANGE:
+        if table_type == p4info_pb2.MatchField.RANGE:
             return self.insert_table_entry_range(
                 table_name, match_map, action_name, action_params, metadata,
                 priority, cnt_pkt, cnt_byte)
 
         # TODO: Cover OPTIONAL match  # pylint: disable=W0511
-        if get_table_type(table) == p4info_pb2.MatchField.OPTIONAL:
+        if table_type == p4info_pb2.MatchField.OPTIONAL:
             return self.insert_table_entry_optional(
                 table_name, match_map, action_name, action_params, metadata,
                 priority, cnt_pkt, cnt_byte)
@@ -917,7 +949,9 @@ class P4Manager:
         assert table, \
             "P4 pipeline does not implement table " + table_name
 
-        if not get_table_type(table):
+        table_type = get_table_type(table)
+
+        if not table_type:
             msg = f"Table {table_name} is undefined, cannot delete entry"
             LOGGER.error(msg)
             raise UserError(msg)
@@ -930,7 +964,7 @@ class P4Manager:
         for action_k, action_v in action_params.items():
             table_entry.action[action_k] = action_v
 
-        if get_table_type(table) in \
+        if table_type in \
                 [p4info_pb2.MatchField.TERNARY, p4info_pb2.MatchField.LPM]:
             if priority == 0:
                 msg = f"Table {table_name} is ternary, priority must be != 0"
@@ -938,15 +972,25 @@ class P4Manager:
                 raise UserError(msg)
 
         # TODO: Ensure correctness of RANGE & OPTIONAL  # pylint: disable=W0511
-        if get_table_type(table) in \
+        if table_type in \
                 [p4info_pb2.MatchField.RANGE, p4info_pb2.MatchField.OPTIONAL]:
             raise NotImplementedError(
                 "Range and optional-based table deletion not implemented yet")
 
         table_entry.priority = priority
 
-        table_entry.delete()
-        LOGGER.info("Deleted entry %s from table: %s", table_entry, table_name)
+        ex_msg = ""
+        try:
+            table_entry.delete()
+            LOGGER.info("Deleted entry %s from table: %s", table_entry, table_name)
+        except (P4RuntimeException, P4RuntimeWriteException) as ex:
+            ex_msg = str(ex)
+            LOGGER.warning(ex)
+
+        # Table entry exists, needs to be modified
+        if "NOT_FOUND" in ex_msg:
+            # TODO: No way to discriminate between a modified entry and an actual table miss
+            LOGGER.warning("Table entry was initially modified, thus cannot be removed: %s", table_entry)
 
         return table_entry
 
@@ -1172,7 +1216,8 @@ class P4Manager:
                 self.counter_entries[cnt_name].append(cnt_entry)
             return self.counter_entries[cnt_name]
         except P4RuntimeException as ex:
-            LOGGER.error(ex)
+            LOGGER.error("Failed to get counter %s entries: %s",
+                         cnt_name, str(ex))
             return []
 
     def counter_entries_to_json(self, cnt_name):
@@ -1620,7 +1665,8 @@ class P4Manager:
                 self.meter_entries[meter_name].append(meter_entry)
             return self.meter_entries[meter_name]
         except P4RuntimeException as ex:
-            LOGGER.error(ex)
+            LOGGER.error("Failed to get meter %s entries: %s",
+                         meter_name, str(ex))
             return []
 
     def meter_entries_to_json(self, meter_name):
@@ -1852,7 +1898,8 @@ class P4Manager:
                 self.direct_meter_entries[d_meter_name].append(d_meter_entry)
             return self.direct_meter_entries[d_meter_name]
         except P4RuntimeException as ex:
-            LOGGER.error(ex)
+            LOGGER.error("Failed to get direct meter %s entries: %s",
+                         d_meter_name, str(ex))
             return []
 
     def direct_meter_entries_to_json(self, d_meter_name):
@@ -2094,7 +2141,8 @@ class P4Manager:
                 self.action_profile_members[ap_name].append(ap_entry)
             return self.action_profile_members[ap_name]
         except P4RuntimeException as ex:
-            LOGGER.error(ex)
+            LOGGER.error("Failed to get action profile member %s entries: %s",
+                         ap_name, str(ex))
             return []
 
     def action_prof_member_entries_to_json(self, ap_name):
@@ -2357,7 +2405,8 @@ class P4Manager:
                 self.action_profile_groups[ap_name].append(ap_entry)
             return self.action_profile_groups[ap_name]
         except P4RuntimeException as ex:
-            LOGGER.error(ex)
+            LOGGER.error("Failed to get action profile group %s entries: %s",
+                         ap_name, str(ex))
             return []
 
     def count_action_prof_group_entries(self, ap_name):
@@ -2880,14 +2929,13 @@ class P4Manager:
             json_resource, "session-id")
 
         if operation in [WriteOperation.insert, WriteOperation.update]:
-            ports = parse_integer_list_from_json(
-                json_resource, "ports", "port")
+            replicas = parse_replicas_from_json(json_resource)
 
             LOGGER.debug(
                 "Clone session entry to insert/update: %s", json_resource)
             return self.insert_clone_session_entry(
                 session_id=session_id,
-                ports=ports
+                replicas=replicas
             )
         if operation == WriteOperation.delete:
             LOGGER.debug(
@@ -2897,22 +2945,24 @@ class P4Manager:
             )
         return None
 
-    def insert_clone_session_entry(self, session_id, ports):
+    def insert_clone_session_entry(self, session_id, replicas):
         """
         Insert a new clone session.
 
         :param session_id: id of a clone session
-        :param ports: list of egress ports to clone session
+        :param replicas: list of egress ports to clone session
         :return: inserted clone session
         """
         assert session_id > 0, \
             "Clone session " + session_id + " must be > 0"
-        assert ports, \
-            "No clone session ports are provided"
+        assert replicas, \
+            "No clone session replicas are provided"
+        assert isinstance(replicas, dict), \
+            "Clone session replicas must be a dictionary"
 
         session = CloneSessionEntry(self.local_client, session_id)
-        for p in ports:
-            session.add(p, 1)
+        for eg_port,instance in replicas.items():
+            session.add(eg_port, instance)
 
         ex_msg = ""
         try:
@@ -2943,12 +2993,15 @@ class P4Manager:
             "Clone session " + session_id + " must be > 0"
 
         session = CloneSessionEntry(self.local_client, session_id)
-        session.delete()
+
+        try:
+            session.delete()
+            LOGGER.info("Deleted clone session %d", session_id)
+        except (P4RuntimeException, P4RuntimeWriteException) as ex:
+            LOGGER.error(ex)
 
         if session_id in self.clone_session_entries:
             del self.clone_session_entries[session_id]
-        LOGGER.info(
-            "Deleted clone session %d", session_id)
 
         return session
 
@@ -3786,6 +3839,7 @@ class _P4EntityBase(_EntityBase):
     def __init__(self, p4_client, p4_type, entity_type, p4runtime_cls, name=None,
                  modify_only=False):
         super().__init__(p4_client, entity_type, p4runtime_cls, modify_only)
+        assert self.local_client, "No local P4 client instance"
         self._p4_type = p4_type
         if name is None:
             raise UserError(
@@ -3815,7 +3869,7 @@ class ActionProfileMember(_P4EntityBase):
     """
 
     def __init__(self, p4_client, action_profile_name=None):
-        super().__init__( p4_client,
+        super().__init__(p4_client,
             P4Type.action_profile, P4RuntimeEntity.action_profile_member,
             p4runtime_pb2.ActionProfileMember, action_profile_name)
         self.member_id = 0
@@ -3981,7 +4035,7 @@ class ActionProfileGroup(_P4EntityBase):
     """
 
     def __init__(self, p4_client, action_profile_name=None):
-        super().__init__( p4_client,
+        super().__init__(p4_client,
             P4Type.action_profile, P4RuntimeEntity.action_profile_group,
             p4runtime_pb2.ActionProfileGroup, action_profile_name)
         self.group_id = 0
@@ -5055,7 +5109,7 @@ class CounterEntry(_CounterEntryBase):
     """
 
     def __init__(self, p4_client, counter_name=None):
-        super().__init__( p4_client,
+        super().__init__(p4_client,
             P4Type.counter, P4RuntimeEntity.counter_entry,
             p4runtime_pb2.CounterEntry, counter_name,
             modify_only=True)
@@ -5115,11 +5169,11 @@ To write to the counter, use <self>.modify
 class DirectCounterEntry(_CounterEntryBase):
     """
     Direct P4 counter entry.
-    """ 
+    """
     local_client = None
 
     def __init__(self, p4_client, direct_counter_name=None):
-        super().__init__( p4_client, 
+        super().__init__(p4_client,
             P4Type.direct_counter, P4RuntimeEntity.direct_counter_entry,
             p4runtime_pb2.DirectCounterEntry, direct_counter_name,
             modify_only=True)
@@ -5213,7 +5267,7 @@ class _MeterEntryBase(_P4EntityBase):
     """
 
     def __init__(self, p4_client, *args, **kwargs):
-        super().__init__(*args, **kwargs)
+        super().__init__(p4_client, *args, **kwargs)
         self._meter_type = self._info.spec.unit
         self.index = -1
         self.cir = -1
@@ -5910,7 +5964,7 @@ class IdleTimeoutNotification():
     """
     P4 idle timeout notification.
     """
-    
+
     local_client = None
 
     def __init__(self, p4_client):
diff --git a/src/device/tests/test_unitary_ietf_l3vpn.py b/src/device/tests/test_unitary_ietf_l3vpn.py
new file mode 100644
index 0000000000000000000000000000000000000000..728ca691332c8abee7b5d6f5ad6c151240e540ed
--- /dev/null
+++ b/src/device/tests/test_unitary_ietf_l3vpn.py
@@ -0,0 +1,345 @@
+import json
+from json import dumps
+
+import requests
+
+from device.service.drivers.ietf_l3vpn.driver import IetfL3VpnDriver
+from device.service.Tools import RESOURCE_ENDPOINTS
+
+settings = {
+    "endpoints": [
+        {
+            "uuid": "access-pe",
+            "name": "access-pe",
+            "type": "copper",
+            "ce-ip": "1.1.1.1",
+            "address_ip": "3.3.2.1",
+            "address_prefix": 24,
+            "location": "access",
+            "mtu": 1500,
+            "ipv4_lan_prefixes": [
+                {"lan": "128.32.10.0/24", "lan_tag": 10},
+                {"lan": "128.32.20.0/24", "lan_tag": 20},
+            ],
+        },
+        {
+            "uuid": "cloud-pe",
+            "name": "cloud-pe",
+            "type": "copper",
+            "ce-ip": "1.1.1.1",
+            "address_ip": "3.3.2.1",
+            "address_prefix": 24,
+            "location": "cloud",
+            "mtu": 1500,
+            "ipv4_lan_prefixes": [{"lan": "172.1.101.0/24", "lan_tag": 101}],
+        },
+    ],
+    "scheme": "http",
+    "username": "admin",
+    "password": "admin",
+    "base_url": "/restconf/v2/data",
+    "timeout": 120,
+    "verify": False,
+}
+
+post_request_data = []
+get_request_data = []
+
+
+def mock_post(*args, **kwargs):
+    post_request_data.append((args, kwargs))
+
+
+def mock_get(*args, **kwargs):
+    get_request_data.append((args, kwargs))
+
+
+driver = IetfL3VpnDriver(address="1.2.3.4", port=0, **settings)
+
+
+def test_connect(monkeypatch):
+    global post_request_data
+    global get_request_data
+    post_request_data = []
+    get_request_data = []
+    monkeypatch.setattr(requests, "post", mock_post)
+    monkeypatch.setattr(requests, "get", mock_get)
+
+    driver.Connect()
+    assert not post_request_data
+    assert len(get_request_data) == 1
+    assert get_request_data[0][0] == (
+        "http://1.2.3.4:0/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services",
+    )
+    assert list(get_request_data[0][1].keys()) == ["timeout", "verify", "auth"]
+
+
+def test_GetConfig(monkeypatch):
+    global post_request_data
+    global get_request_data
+    post_request_data = []
+    get_request_data = []
+    monkeypatch.setattr(requests, "post", mock_post)
+    monkeypatch.setattr(requests, "get", mock_get)
+
+    resources_to_get = [RESOURCE_ENDPOINTS]
+    result_GetConfig = driver.GetConfig(resources_to_get)
+    assert result_GetConfig == [
+        (
+            "/endpoints/endpoint[access-pe]",
+            {
+                "uuid": "access-pe",
+                "name": "access-pe",
+                "type": "copper",
+                "location": "access",
+                "ce-ip": "1.1.1.1",
+                "address_ip": "3.3.2.1",
+                "address_prefix": 24,
+                "mtu": 1500,
+                "ipv4_lan_prefixes": [
+                    {"lan": "128.32.10.0/24", "lan_tag": 10},
+                    {"lan": "128.32.20.0/24", "lan_tag": 20},
+                ],
+            },
+        ),
+        (
+            "/endpoints/endpoint[cloud-pe]",
+            {
+                "uuid": "cloud-pe",
+                "name": "cloud-pe",
+                "type": "copper",
+                "location": "cloud",
+                "ce-ip": "1.1.1.1",
+                "address_ip": "3.3.2.1",
+                "address_prefix": 24,
+                "mtu": 1500,
+                "ipv4_lan_prefixes": [{"lan": "172.1.101.0/24", "lan_tag": 101}],
+            },
+        ),
+    ]
+
+
+def test_SetConfig(monkeypatch):
+    global post_request_data
+    global get_request_data
+    post_request_data = []
+    get_request_data = []
+    monkeypatch.setattr(requests, "post", mock_post)
+    monkeypatch.setattr(requests, "get", mock_get)
+
+    resources = [
+        (
+            "/services/service[vpn_A]",
+            json.dumps(
+                {
+                    "uuid": "vpn_A",
+                    "src_device_name": "ip-net-controller",
+                    "src_endpoint_name": settings["endpoints"][0]["name"],
+                    "src_site_location": settings["endpoints"][0]["location"],
+                    "src_ipv4_lan_prefixes": settings["endpoints"][0][
+                        "ipv4_lan_prefixes"
+                    ],
+                    "src_ce_address": settings["endpoints"][0]["ce-ip"],
+                    "src_pe_address": settings["endpoints"][0]["address_ip"],
+                    "src_ce_pe_network_prefix": settings["endpoints"][0][
+                        "address_prefix"
+                    ],
+                    "src_mtu": settings["endpoints"][0]["mtu"],
+                    "dst_device_name": "ip-net-controller",
+                    "dst_endpoint_name": settings["endpoints"][1]["name"],
+                    "dst_site_location": settings["endpoints"][1]["location"],
+                    "dst_ipv4_lan_prefixes": settings["endpoints"][1][
+                        "ipv4_lan_prefixes"
+                    ],
+                    "dst_ce_address": settings["endpoints"][1]["ce-ip"],
+                    "dst_pe_address": settings["endpoints"][1]["address_ip"],
+                    "dst_ce_pe_network_prefix": settings["endpoints"][1][
+                        "address_prefix"
+                    ],
+                    "dst_mtu": settings["endpoints"][1]["mtu"],
+                }
+            ),
+        )
+    ]
+    result_SetConfig = driver.SetConfig(resources)
+    assert result_SetConfig == [("/services/service[vpn_A]", True)]
+    assert len(get_request_data) == 1
+    assert get_request_data[0][0] == (
+        "http://1.2.3.4:0/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-service=vpn_A",
+    )
+    assert len(post_request_data) == 1
+    assert post_request_data[0][0] == (
+        "http://1.2.3.4:0/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services/vpn-services",
+    )
+    assert post_request_data[0][1]["json"] == {
+        "ietf-l3vpn-svc:l3vpn-svc": {
+            "vpn-services": {"vpn-service": [{"vpn-id": "vpn_A"}]},
+            "sites": {
+                "site": [
+                    {
+                        "site-id": "site_access",
+                        "management": {"type": "ietf-l3vpn-svc:customer-managed"},
+                        "locations": {"location": [{"location-id": "access"}]},
+                        "devices": {
+                            "device": [
+                                {
+                                    "device-id": "ip-net-controller",
+                                    "location": "access",
+                                }
+                            ]
+                        },
+                        "routing-protocols": {
+                            "routing-protocol": [
+                                {
+                                    "type": "ietf-l3vpn-svc:static",
+                                    "static": {
+                                        "cascaded-lan-prefixes": {
+                                            "ipv4-lan-prefixes": [
+                                                {
+                                                    "lan": "128.32.10.0/24",
+                                                    "lan-tag": 10,
+                                                    "next-hop": "3.3.2.1",
+                                                },
+                                                {
+                                                    "lan": "128.32.20.0/24",
+                                                    "lan-tag": 20,
+                                                    "next-hop": "3.3.2.1",
+                                                },
+                                            ]
+                                        }
+                                    },
+                                }
+                            ]
+                        },
+                        "site-network-accesses": {
+                            "site-network-access": [
+                                {
+                                    "site-network-access-id": "access-pe",
+                                    "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                                    "device-reference": "ip-net-controller",
+                                    "vpn-attachment": {
+                                        "vpn-id": "vpn_A",
+                                        "site-role": "ietf-l3vpn-svc:hub-role",
+                                    },
+                                    "ip-connection": {
+                                        "ipv4": {
+                                            "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                                            "addresses": {
+                                                "provider-address": "3.3.2.1",
+                                                "customer-address": "1.1.1.1",
+                                                "prefix-length": 24,
+                                            },
+                                        }
+                                    },
+                                    "service": {
+                                        "svc-mtu": 1500,
+                                        "svc-input-bandwidth": 1000000000,
+                                        "svc-output-bandwidth": 1000000000,
+                                        "qos": {
+                                            "qos-profile": {
+                                                "classes": {
+                                                    "class": [
+                                                        {
+                                                            "class-id": "src_qos_profile",
+                                                            "direction": (
+                                                                "ietf-l3vpn-svc:both",
+                                                            ),
+                                                            "latency": {
+                                                                "latency-boundary": 10
+                                                            },
+                                                            "bandwidth": {
+                                                                "guaranteed-bw-percent": 100
+                                                            },
+                                                        }
+                                                    ]
+                                                }
+                                            }
+                                        },
+                                    },
+                                }
+                            ]
+                        },
+                    },
+                    {
+                        "site-id": "site_cloud",
+                        "management": {"type": "ietf-l3vpn-svc:customer-managed"},
+                        "locations": {"location": [{"location-id": "cloud"}]},
+                        "devices": {
+                            "device": [
+                                {
+                                    "device-id": "ip-net-controller",
+                                    "location": "cloud",
+                                }
+                            ]
+                        },
+                        "routing-protocols": {
+                            "routing-protocol": [
+                                {
+                                    "type": "ietf-l3vpn-svc:static",
+                                    "static": {
+                                        "cascaded-lan-prefixes": {
+                                            "ipv4-lan-prefixes": [
+                                                {
+                                                    "lan": "172.1.101.0/24",
+                                                    "lan-tag": 101,
+                                                    "next-hop": "3.3.2.1",
+                                                }
+                                            ]
+                                        }
+                                    },
+                                }
+                            ]
+                        },
+                        "site-network-accesses": {
+                            "site-network-access": [
+                                {
+                                    "site-network-access-id": "cloud-pe",
+                                    "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                                    "device-reference": "ip-net-controller",
+                                    "vpn-attachment": {
+                                        "vpn-id": "vpn_A",
+                                        "site-role": "ietf-l3vpn-svc:spoke-role",
+                                    },
+                                    "ip-connection": {
+                                        "ipv4": {
+                                            "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                                            "addresses": {
+                                                "provider-address": "3.3.2.1",
+                                                "customer-address": "1.1.1.1",
+                                                "prefix-length": 24,
+                                            },
+                                        }
+                                    },
+                                    "service": {
+                                        "svc-mtu": 1500,
+                                        "svc-input-bandwidth": 1000000000,
+                                        "svc-output-bandwidth": 1000000000,
+                                        "qos": {
+                                            "qos-profile": {
+                                                "classes": {
+                                                    "class": [
+                                                        {
+                                                            "class-id": "dst_qos_profile",
+                                                            "direction": (
+                                                                "ietf-l3vpn-svc:both",
+                                                            ),
+                                                            "latency": {
+                                                                "latency-boundary": 10
+                                                            },
+                                                            "bandwidth": {
+                                                                "guaranteed-bw-percent": 100
+                                                            },
+                                                        }
+                                                    ]
+                                                }
+                                            }
+                                        },
+                                    },
+                                }
+                            ]
+                        },
+                    },
+                ]
+            },
+        }
+    }
diff --git a/src/e2e_orchestrator/service/E2EOrchestratorService.py b/src/e2e_orchestrator/service/E2EOrchestratorService.py
index 9fa7bf4bd82564c4158b5af77c0d69b0b9014289..3abef2777ba22cc63df3db1eb86ee411a4ea74c7 100644
--- a/src/e2e_orchestrator/service/E2EOrchestratorService.py
+++ b/src/e2e_orchestrator/service/E2EOrchestratorService.py
@@ -12,19 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import logging
-
 from common.Constants import ServiceNameEnum
-from common.proto.e2eorchestrator_pb2_grpc import add_E2EOrchestratorServiceServicer_to_server
 from common.Settings import get_service_port_grpc
+from common.proto.e2eorchestrator_pb2 import DESCRIPTOR as E2EORCHESTRATOR_DESCRIPTOR
+from common.proto.e2eorchestrator_pb2_grpc import add_E2EOrchestratorServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from .E2EOrchestratorServiceServicerImpl import E2EOrchestratorServiceServicerImpl
 
-LOGGER = logging.getLogger(__name__)
-
-
 class E2EOrchestratorService(GenericGrpcService):
-    def __init__(self, cls_name: str = __name__):
+    def __init__(self, cls_name: str = __name__) -> None:
         port = get_service_port_grpc(ServiceNameEnum.E2EORCHESTRATOR)
         super().__init__(port, cls_name=cls_name)
         self.e2eorchestrator_servicer = E2EOrchestratorServiceServicerImpl()
@@ -33,3 +29,5 @@ class E2EOrchestratorService(GenericGrpcService):
         add_E2EOrchestratorServiceServicer_to_server(
             self.e2eorchestrator_servicer, self.server
         )
+
+        self.add_reflection_service_name(E2EORCHESTRATOR_DESCRIPTOR, 'E2EOrchestratorService')
diff --git a/src/forecaster/service/ForecasterService.py b/src/forecaster/service/ForecasterService.py
index 5f540cdc5bc628ae1a35e5f5ebf47ead276a413c..fedb5242d616eb8eef0a9b4e3fd5308925437acd 100644
--- a/src/forecaster/service/ForecasterService.py
+++ b/src/forecaster/service/ForecasterService.py
@@ -14,6 +14,7 @@
 
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
+from common.proto.forecaster_pb2 import DESCRIPTOR as FORECASTER_DESCRIPTOR
 from common.proto.forecaster_pb2_grpc import add_ForecasterServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from .ForecasterServiceServicerImpl import ForecasterServiceServicerImpl
@@ -26,3 +27,5 @@ class ForecasterService(GenericGrpcService):
 
     def install_servicers(self):
         add_ForecasterServiceServicer_to_server(self.forecaster_servicer, self.server)
+
+        self.add_reflection_service_name(FORECASTER_DESCRIPTOR, 'ForecasterService')
diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
index 1dd214506339ccb257830c28fc43d0d80cdee9e7..38e6a1fe16f9ed89ee24934bc14040f2d60b5cdc 100644
--- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
+++ b/src/kpi_manager/service/KpiManagerServiceServicerImpl.py
@@ -18,7 +18,7 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m
 from common.proto.context_pb2 import Empty
 from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer
 from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList
-# from kpi_manager.database.Kpi_DB import KpiDB
+from common.method_wrappers.ServiceExceptions import NotFoundException
 from kpi_manager.database.KpiDB import KpiDB
 from kpi_manager.database.KpiModel import Kpi as KpiModel
 
@@ -31,65 +31,48 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         self.kpi_db_obj = KpiDB(KpiModel)
     
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore
-                        ) -> KpiId: # type: ignore
+    def SetKpiDescriptor(
+        self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore
+    ) -> KpiId: # type: ignore
         response = KpiId()
         LOGGER.info("Received gRPC message object: {:}".format(request))
-        try:
-            kpi_to_insert = KpiModel.convert_KpiDescriptor_to_row(request)
-            if(self.kpi_db_obj.add_row_to_db(kpi_to_insert)):
-                response.kpi_id.uuid = request.kpi_id.kpi_id.uuid
-                # LOGGER.info("Added Row: {:}".format(response))
-            return response
-        except Exception as e:
-            LOGGER.info("Unable to create KpiModel class object. {:}".format(e))
-    
+        kpi_to_insert = KpiModel.convert_KpiDescriptor_to_row(request)
+        if self.kpi_db_obj.add_row_to_db(kpi_to_insert):
+            response.kpi_id.uuid = request.kpi_id.kpi_id.uuid
+            # LOGGER.info("Added Row: {:}".format(response))
+        return response
+
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)        
-    def GetKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore
-                         ) -> KpiDescriptor: # type: ignore
+    def GetKpiDescriptor(
+        self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore
+    ) -> KpiDescriptor: # type: ignore
         response = KpiDescriptor()
-        print("--> Received gRPC message object: {:}".format(request))
         LOGGER.info("Received gRPC message object: {:}".format(request))
-        try: 
-            kpi_id_to_search = request.kpi_id.uuid
-            row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search)
-            if row is None:
-                print ('No matching row found for kpi id: {:}'.format(kpi_id_to_search))
-                LOGGER.info('No matching row found kpi id: {:}'.format(kpi_id_to_search))
-                return Empty()
-            else:
-                response = KpiModel.convert_row_to_KpiDescriptor(row)
-                return response
-        except Exception as e:
-            print ('Unable to search kpi id. {:}'.format(e))
-            LOGGER.info('Unable to search kpi id. {:}'.format(e))
-            raise e
+        kpi_id_to_search = request.kpi_id.uuid
+        row = self.kpi_db_obj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search)
+        if row is None:
+            LOGGER.info('No matching row found kpi id: {:}'.format(kpi_id_to_search))
+            raise NotFoundException('KpiDescriptor', kpi_id_to_search)
+        response = KpiModel.convert_row_to_KpiDescriptor(row)
+        return response
     
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def DeleteKpiDescriptor(self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore
-                            ) -> Empty: # type: ignore
+    def DeleteKpiDescriptor(
+        self, request: KpiId, grpc_context: grpc.ServicerContext # type: ignore
+    ) -> Empty: # type: ignore
         LOGGER.info("Received gRPC message object: {:}".format(request))
-        try:
-            kpi_id_to_search = request.kpi_id.uuid
-            self.kpi_db_obj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search)
-        except Exception as e:
-            LOGGER.info('Unable to search kpi id. {:}'.format(e))
-        finally:
-            return Empty()
+        kpi_id_to_search = request.kpi_id.uuid
+        self.kpi_db_obj.delete_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search)
+        return Empty()
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
-    def SelectKpiDescriptor(self, filter: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore
-                            ) -> KpiDescriptorList: # type: ignore
+    def SelectKpiDescriptor(
+        self, filter: KpiDescriptorFilter, grpc_context: grpc.ServicerContext # type: ignore
+    ) -> KpiDescriptorList: # type: ignore
         LOGGER.info("Received gRPC message object: {:}".format(filter))
         response = KpiDescriptorList()
-        try:
-            rows = self.kpi_db_obj.select_with_filter(KpiModel, filter)
-        except Exception as e:
-            LOGGER.info('Unable to apply filter on kpi descriptor. {:}'.format(e))
-        try:
-            for row in rows:
-                kpiDescriptor_obj = KpiModel.convert_row_to_KpiDescriptor(row)
-                response.kpi_descriptor_list.append(kpiDescriptor_obj)
-            return response
-        except Exception as e:
-            LOGGER.info('Unable to process filter response {:}'.format(e))
+        rows = self.kpi_db_obj.select_with_filter(KpiModel, filter)
+        for row in rows:
+            kpiDescriptor_obj = KpiModel.convert_row_to_KpiDescriptor(row)
+            response.kpi_descriptor_list.append(kpiDescriptor_obj)
+        return response
diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_manager/tests/test_kpi_manager.py
index fedc3f94cee5be08301cd6241779966f3111f9c1..17a1c8d77d975c35fec82928f46c52b791816837 100755
--- a/src/kpi_manager/tests/test_kpi_manager.py
+++ b/src/kpi_manager/tests/test_kpi_manager.py
@@ -13,6 +13,7 @@
 # limitations under the License.
 
 
+import grpc
 import os, pytest
 import logging
 from typing import Union
@@ -109,13 +110,19 @@ def test_DeleteKpiDescriptor(kpi_manager_client):
     LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ")
     # adding KPI
     response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
+
     # deleting KPI
     del_response = kpi_manager_client.DeleteKpiDescriptor(response_id)
-    # select KPI
-    kpi_manager_client.GetKpiDescriptor(response_id)
     LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response))
     assert isinstance(del_response, Empty)
 
+    # select KPI and check it does not exist
+    with pytest.raises(grpc.RpcError) as e:
+        kpi_manager_client.GetKpiDescriptor(response_id)
+    assert e.value.code() == grpc.StatusCode.NOT_FOUND
+    MSG = 'KpiDescriptor({:s}) not found'
+    assert e.value.details() == MSG.format(response_id.kpi_id.uuid)
+
 def test_GetKpiDescriptor(kpi_manager_client):
     LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ")
     # adding KPI
@@ -123,11 +130,6 @@ def test_GetKpiDescriptor(kpi_manager_client):
     # get KPI
     response = kpi_manager_client.GetKpiDescriptor(response_id)
     LOGGER.info("Response gRPC message object: {:}".format(response))
-
-    LOGGER.info(" >>> calling GetKpiDescriptor with random ID")
-    rand_response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request())
-    LOGGER.info("Response gRPC message object: {:}".format(rand_response))
-
     assert isinstance(response, KpiDescriptor)
 
 def test_SelectKpiDescriptor(kpi_manager_client):
diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_manager/tests/test_messages.py
index 5f55c2cfcfd3c5c65aa317d02376dd6971fba384..094c56df8d1056175526498081fdc790645f4233 100644
--- a/src/kpi_manager/tests/test_messages.py
+++ b/src/kpi_manager/tests/test_messages.py
@@ -28,13 +28,13 @@ def create_kpi_descriptor_request(descriptor_name: str = "Test_name"):
     _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
     _create_kpi_request.kpi_id.kpi_id.uuid                 = str(uuid.uuid4())
     # _create_kpi_request.kpi_id.kpi_id.uuid                 = "6e22f180-ba28-4641-b190-2287bf448888"
-    # _create_kpi_request.kpi_id.kpi_id.uuid                 = "1e22f180-ba28-4641-b190-2287bf446666"
+    # _create_kpi_request.kpi_id.kpi_id.uuid                 = "f974b6cc-095f-4767-b8c1-3457b383fb99"
     _create_kpi_request.kpi_description                    = descriptor_name
     _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV2' 
+    _create_kpi_request.device_id.device_uuid.uuid         = str(uuid.uuid4())
     _create_kpi_request.service_id.service_uuid.uuid       = 'SERV2'
-    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC1' 
-    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END1' 
+    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC1'
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = str(uuid.uuid4())
     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' 
     _create_kpi_request.link_id.link_uuid.uuid             = 'LNK1' 
     return _create_kpi_request
@@ -77,4 +77,4 @@ def create_kpi_filter_request():
     _create_kpi_filter_request.connection_id.append(connection_id_obj)
     _create_kpi_filter_request.link_id.append(link_id_obj)
 
-    return _create_kpi_filter_request
\ No newline at end of file
+    return _create_kpi_filter_request
diff --git a/src/kpi_value_writer/service/KpiValueWriter.py b/src/kpi_value_writer/service/KpiValueWriter.py
index 0bc95355e35e6deab8ba79eeeb87e278b1b2ecd2..74291bba34ff85556ffe55e2c57ad7877846dc34 100644
--- a/src/kpi_value_writer/service/KpiValueWriter.py
+++ b/src/kpi_value_writer/service/KpiValueWriter.py
@@ -15,25 +15,21 @@
 import json
 import logging
 import threading
+
+from confluent_kafka import KafkaError
+from confluent_kafka import Consumer as KafkaConsumer
+
 from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
-from common.proto.kpi_value_api_pb2 import KpiValue
 from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId
 from common.Settings import get_service_port_grpc
 from common.Constants import ServiceNameEnum
 from common.tools.service.GenericGrpcService import GenericGrpcService
 
-
-from confluent_kafka import KafkaError
-from confluent_kafka import Consumer as KafkaConsumer
-
 from kpi_manager.client.KpiManagerClient import KpiManagerClient
-# -- test import --
-# from kpi_value_writer.tests.test_messages import create_kpi_descriptor_request
 from .MetricWriterToPrometheus import MetricWriterToPrometheus
 
 
-LOGGER           = logging.getLogger(__name__)
-ACTIVE_CONSUMERS = []
+LOGGER = logging.getLogger(__name__)
 
 class KpiValueWriter(GenericGrpcService):
     def __init__(self, cls_name : str = __name__) -> None:
@@ -43,9 +39,8 @@ class KpiValueWriter(GenericGrpcService):
                                             'group.id'           : 'KpiValueWriter',
                                             'auto.offset.reset'  : 'latest'})
 
-    def RunKafkaConsumer(self):
+    def install_servicers(self):
         thread = threading.Thread(target=self.KafkaKpiConsumer, args=())
-        ACTIVE_CONSUMERS.append(thread)
         thread.start()
 
     def KafkaKpiConsumer(self):
@@ -55,44 +50,32 @@ class KpiValueWriter(GenericGrpcService):
         consumer = self.kafka_consumer
         consumer.subscribe([KafkaTopic.VALUE.value])
         LOGGER.debug("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value))
-        print("Kafka Consumer start listenng on topic: {:}".format(KafkaTopic.VALUE.value))
         while True:
             raw_kpi = consumer.poll(1.0)
             if raw_kpi is None:
                 continue
             elif raw_kpi.error():
-                if raw_kpi.error().code() == KafkaError._PARTITION_EOF:
-                    continue
-                else:
+                if raw_kpi.error().code() != KafkaError._PARTITION_EOF:
                     print("Consumer error: {}".format(raw_kpi.error()))
-                    continue
+                continue
             try:
                 kpi_value = json.loads(raw_kpi.value().decode('utf-8'))
                 LOGGER.info("Received KPI : {:}".format(kpi_value))
-                print("Received KPI : {:}".format(kpi_value))
                 self.get_kpi_descriptor(kpi_value, kpi_manager_client, metric_writer)
-            except Exception as e:
-                print("Error detail: {:}".format(e))
+            except:
+                LOGGER.exception("Error detail: ")
                 continue
 
     def get_kpi_descriptor(self, kpi_value: str, kpi_manager_client, metric_writer):
-        print("--- START -----")
-
         kpi_id = KpiId()
-        kpi_id.kpi_id.uuid = kpi_value['kpi_uuid']
-        print("KpiId generated: {:}".format(kpi_id))
-        # print("Kpi manger client created: {:}".format(kpi_manager_client))
+        kpi_id.kpi_id.uuid = kpi_value['kpi_id']  # type: ignore
         try:
             kpi_descriptor_object = KpiDescriptor()
             kpi_descriptor_object = kpi_manager_client.GetKpiDescriptor(kpi_id)
-            # TODO: why kpi_descriptor_object recevies a KpiDescriptor type object not Empty type object???
             if kpi_descriptor_object.kpi_id.kpi_id.uuid == kpi_id.kpi_id.uuid:
                 LOGGER.info("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object))
-                print("Extracted KpiDescriptor: {:}".format(kpi_descriptor_object))
                 metric_writer.create_and_expose_cooked_kpi(kpi_descriptor_object, kpi_value)
             else:
-                LOGGER.info("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id))
-                print("No KPI Descriptor found in DB for Kpi ID: {:}".format(kpi_id))
-        except Exception as e:
-            LOGGER.info("Unable to get KpiDescriptor. Error: {:}".format(e))
-            print ("Unable to get KpiDescriptor. Error: {:}".format(e))
+                LOGGER.info("No KPI Descriptor found in Database for Kpi ID: {:}".format(kpi_id))
+        except:
+            LOGGER.exception("Unable to get KpiDescriptor")
diff --git a/src/kpi_value_writer/service/MetricWriterToPrometheus.py b/src/kpi_value_writer/service/MetricWriterToPrometheus.py
index bfbb6e3bab9770719f2fc23b3fab00e2805b074a..595d025b3de512453b9591b0e9d52d21a80de67a 100644
--- a/src/kpi_value_writer/service/MetricWriterToPrometheus.py
+++ b/src/kpi_value_writer/service/MetricWriterToPrometheus.py
@@ -14,15 +14,20 @@
 
 # read Kafka stream from Kafka topic
 
+import os
 import logging
-from prometheus_client import Gauge
-from common.proto.kpi_sample_types_pb2 import KpiSampleType
 
-from common.proto.kpi_value_api_pb2 import KpiValue
-from common.proto.kpi_manager_pb2 import KpiDescriptor
+from prometheus_client            import Gauge
+from prometheus_client.exposition import push_to_gateway
+from prometheus_client.registry   import CollectorRegistry
+
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.proto.kpi_value_api_pb2    import KpiValue
+from common.proto.kpi_manager_pb2      import KpiDescriptor
 
-LOGGER         = logging.getLogger(__name__)
-PROM_METRICS   = {}
+LOGGER       = logging.getLogger(__name__)
+PROM_METRICS = {}
+GATEWAY_URL  = os.getenv('PUSHGATEWAY_URL', 'prometheus-pushgateway.monitoring.svc.cluster.local:9091')
 
 class MetricWriterToPrometheus:
     '''
@@ -30,7 +35,9 @@ class MetricWriterToPrometheus:
     cooked KPI value = KpiDescriptor (gRPC message) + KpiValue (gRPC message)
     '''
     def __init__(self):
-        pass
+        self.job_name    = 'kpivaluewriter'
+        self.registry    = CollectorRegistry()
+        self.gateway_url = GATEWAY_URL
 
     def merge_kpi_descriptor_and_kpi_value(self, kpi_descriptor, kpi_value):
             # Creating a dictionary from the kpi_descriptor's attributes
@@ -45,25 +52,28 @@ class MetricWriterToPrometheus:
                 'connection_id'  : kpi_descriptor.connection_id.connection_uuid.uuid,
                 'link_id'        : kpi_descriptor.link_id.link_uuid.uuid,
                 'time_stamp'     : kpi_value.timestamp.timestamp,
+                #'time_stamp'     : kpi_value["time_stamp"],
                 'kpi_value'      : kpi_value.kpi_value_type.floatVal
+                #'kpi_value'      : kpi_value["kpi_value"]
             }
             LOGGER.debug("Cooked Kpi: {:}".format(cooked_kpi))
             return cooked_kpi
 
     def create_and_expose_cooked_kpi(self, kpi_descriptor: KpiDescriptor, kpi_value: KpiValue):
         # merge both gRPC messages into single varible.
-        cooked_kpi = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value)
+        cooked_kpi      = self.merge_kpi_descriptor_and_kpi_value(kpi_descriptor, kpi_value)
         tags_to_exclude = {'kpi_description', 'kpi_sample_type', 'kpi_value'}           
-        metric_tags = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude]  # These values will be used as metric tags
-        metric_name = cooked_kpi['kpi_sample_type']
+        metric_tags     = [tag for tag in cooked_kpi.keys() if tag not in tags_to_exclude]  # These values will be used as metric tags
+        metric_name     = cooked_kpi['kpi_sample_type']
         try:
             if metric_name not in PROM_METRICS:     # Only register the metric, when it doesn't exists
                 PROM_METRICS[metric_name] = Gauge ( 
                     metric_name,
                     cooked_kpi['kpi_description'],
-                    metric_tags
+                    metric_tags,
+                    registry=self.registry
                 )
-            LOGGER.debug("Metric is created with labels: {:}".format(metric_tags))
+                LOGGER.debug("Metric is created with labels: {:}".format(metric_tags))
             PROM_METRICS[metric_name].labels(
                     kpi_id          = cooked_kpi['kpi_id'],
                     device_id       = cooked_kpi['device_id'],
@@ -74,7 +84,11 @@ class MetricWriterToPrometheus:
                     link_id         = cooked_kpi['link_id'],
                     time_stamp      = cooked_kpi['time_stamp'],
                 ).set(float(cooked_kpi['kpi_value']))
-            LOGGER.debug("Metric pushed to the endpoints: {:}".format(PROM_METRICS[metric_name]))
+            LOGGER.debug("Metric is being pushed to the Gateway ... : {:}".format(PROM_METRICS[metric_name]))
+
+            # Push to the Prometheus Gateway, Prometheus is preconfigured to scrap the metrics from the gateway
+            push_to_gateway(self.gateway_url, job=self.job_name, registry=self.registry)
+            LOGGER.debug("Metric pushed to Prometheus Gateway.")
 
         except ValueError as e:
             if 'Duplicated timeseries' in str(e):
diff --git a/src/kpi_value_writer/service/__main__.py b/src/kpi_value_writer/service/__main__.py
index 28ba2ac90f1e9ed28dfeeeda6b6da17568a124e7..56fc6100d391eec5953b24d882397c3ef7a2f130 100644
--- a/src/kpi_value_writer/service/__main__.py
+++ b/src/kpi_value_writer/service/__main__.py
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 import logging, signal, sys, threading
-from prometheus_client import start_http_server
 from kpi_value_writer.service.KpiValueWriter import KpiValueWriter
 from common.Settings import get_log_level
 
@@ -39,8 +38,6 @@ def main():
     grpc_service = KpiValueWriter()
     grpc_service.start()
 
-    start_http_server(10808)
-    LOGGER.debug("Prometheus client is started on port 10808")
     # Wait for Ctrl+C or termination signal
     while not terminate.wait(timeout=1.0): pass
 
diff --git a/src/kpi_value_writer/tests/test_kpi_value_writer.py b/src/kpi_value_writer/tests/test_kpi_value_writer.py
index 0d3f9e683db5430fe9214cbf4131dcc38912da85..29e81d28ae8da9f9a2602be8b36cee368ee3d87b 100755
--- a/src/kpi_value_writer/tests/test_kpi_value_writer.py
+++ b/src/kpi_value_writer/tests/test_kpi_value_writer.py
@@ -12,14 +12,35 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import pytest
+import time
 import logging
 from kpi_value_writer.service.KpiValueWriter import KpiValueWriter
+from kpi_manager.client.KpiManagerClient import KpiManagerClient
 
 from common.tools.kafka.Variables import KafkaTopic
+from test_messages import create_kpi_descriptor_request
 
+LOGGER = logging.getLogger(__name__)
 
+# -------- Fixtures ----------------
+
+@pytest.fixture(autouse=True)
+def log_all_methods(request):
+    '''
+    This fixture logs messages before and after each test function runs, indicating the start and end of the test.
+    The autouse=True parameter ensures that this logging happens automatically for all tests in the module.
+    '''
+    LOGGER.info(f" >>>>> Starting test: {request.node.name} ")
+    yield
+    LOGGER.info(f" <<<<< Finished test: {request.node.name} ")
+
+# @pytest.fixture(scope='module')
+# def kpi_manager_client():
+#     LOGGER.debug("Yielding KpiManagerClient ...")
+#     yield KpiManagerClient(host="10.152.183.203")
+#     LOGGER.debug("KpiManagerClient is terminated.")
 
-LOGGER = logging.getLogger(__name__)
 
 # -------- Initial Test ----------------
 def test_validate_kafka_topics():
@@ -27,7 +48,15 @@ def test_validate_kafka_topics():
     response = KafkaTopic.create_all_topics()
     assert isinstance(response, bool)
 
-def test_KafkaConsumer():
-    LOGGER.debug(" --->>> test_kafka_consumer: START <<<--- ")
-    # kpi_value_writer = KpiValueWriter()
-    # kpi_value_writer.RunKafkaConsumer()
+# --------------
+# NOT FOR GITHUB PIPELINE (Local testing only)
+# --------------
+# def test_KafkaConsumer(kpi_manager_client):
+
+#     # kpidescriptor = create_kpi_descriptor_request()
+#     # kpi_manager_client.SetKpiDescriptor(kpidescriptor)
+
+#     kpi_value_writer = KpiValueWriter()
+#     kpi_value_writer.KafkaKpiConsumer()
+#     LOGGER.debug(" waiting for timer to finish ")
+#     time.sleep(300)
diff --git a/src/kpi_value_writer/tests/test_messages.py b/src/kpi_value_writer/tests/test_messages.py
index ffc6b398c4ff6405fe1ac8eec086553fa6fbe193..4cd901b2c8b28e13f6ff0f373d3c0de6201a4c96 100755
--- a/src/kpi_value_writer/tests/test_messages.py
+++ b/src/kpi_value_writer/tests/test_messages.py
@@ -25,7 +25,8 @@ def create_kpi_id_request():
 
 def create_kpi_descriptor_request(description: str = "Test Description"):
     _create_kpi_request                                    = kpi_manager_pb2.KpiDescriptor()
-    _create_kpi_request.kpi_id.kpi_id.uuid                 = str(uuid.uuid4())
+    # _create_kpi_request.kpi_id.kpi_id.uuid                 = str(uuid.uuid4())
+    _create_kpi_request.kpi_id.kpi_id.uuid                 = "efef4d95-1cf1-43c4-9742-95c283dddddd"
     _create_kpi_request.kpi_description                    = description
     _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
     _create_kpi_request.device_id.device_uuid.uuid         = 'DEV4'  
diff --git a/src/nbi/README.md b/src/nbi/README.md
index 32902a0b33dba2f9ce3df4a60833608bac6e129d..f997ce21c9b809a1749f046672e895d3ad466824 100644
--- a/src/nbi/README.md
+++ b/src/nbi/README.md
@@ -31,5 +31,5 @@ sudo ldconfig
 
 ### Install Python bindings
 ```bash
-pip install libyang==2.8.0
+pip install libyang==2.8.4
 ```
diff --git a/src/nbi/requirements.in b/src/nbi/requirements.in
index 0d780483626979cc993a984d3da709762c749d56..d56ee821b19894e435368cd6250b25d3bdc33c10 100644
--- a/src/nbi/requirements.in
+++ b/src/nbi/requirements.in
@@ -18,7 +18,7 @@ Flask==2.1.3
 Flask-HTTPAuth==4.5.0
 Flask-RESTful==0.3.9
 jsonschema==4.4.0
-libyang==2.8.0
+libyang==2.8.4
 netaddr==0.9.0
 pyang==2.6.0
 git+https://github.com/robshakir/pyangbind.git
diff --git a/src/nbi/service/__main__.py b/src/nbi/service/__main__.py
index 71df0517aa688c106d8d0fe544f5f6b1af5a58f3..1d470f4eac30795e2272c9145baf947f3c982ba5 100644
--- a/src/nbi/service/__main__.py
+++ b/src/nbi/service/__main__.py
@@ -31,6 +31,7 @@ from .rest_server.nbi_plugins.ietf_network_slice import register_ietf_nss
 from .rest_server.nbi_plugins.ietf_acl import register_ietf_acl
 from .rest_server.nbi_plugins.qkd_app import register_qkd_app
 from .rest_server.nbi_plugins.tfs_api import register_tfs_api
+from .rest_server.nbi_plugins import register_restconf
 from .context_subscription import register_context_subscription
 
 terminate = threading.Event()
@@ -79,6 +80,7 @@ def main():
     register_ietf_acl(rest_server)
     register_qkd_app(rest_server)
     register_tfs_api(rest_server)
+    register_restconf(rest_server)
     rest_server.start()
 
     register_context_subscription()
diff --git a/src/nbi/service/rest_server/nbi_plugins/__init__.py b/src/nbi/service/rest_server/nbi_plugins/__init__.py
index 53d5157f750bfb085125cbd33faff1cec5924e14..9b5d7920db49bab6d456aba186e6500142aad5b2 100644
--- a/src/nbi/service/rest_server/nbi_plugins/__init__.py
+++ b/src/nbi/service/rest_server/nbi_plugins/__init__.py
@@ -12,3 +12,27 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from flask.json import jsonify
+from flask_restful import Resource
+
+from nbi.service.rest_server.RestServer import RestServer
+
+from .tools.HttpStatusCodes import HTTP_CREATED
+
+URL_PREFIX = "/restconf/data"
+
+
+class BaseServer(Resource):
+    def post(self):
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
+
+
+def _add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs):
+    urls = [(URL_PREFIX + url) for url in urls]
+    rest_server.add_resource(resource, *urls, **kwargs)
+
+
+def register_restconf(rest_server: RestServer):
+    _add_resource(rest_server, BaseServer, "")
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Service.py b/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Service.py
index 97364dff8606f1af48bab362b94b968561792411..bf3f8aabca1c04260d32a4163ec2686931f520fc 100644
--- a/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Service.py
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Service.py
@@ -26,7 +26,7 @@ from ..tools.HttpStatusCodes import HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK
 LOGGER = logging.getLogger(__name__)
 
 class L3VPN_Service(Resource):
-    @HTTP_AUTH.login_required
+    # @HTTP_AUTH.login_required
     def get(self, vpn_id : str):
         LOGGER.debug('VPN_Id: {:s}'.format(str(vpn_id)))
         LOGGER.debug('Request: {:s}'.format(str(request)))
@@ -52,7 +52,7 @@ class L3VPN_Service(Resource):
             response.status_code = HTTP_SERVERERROR
         return response
 
-    @HTTP_AUTH.login_required
+    # @HTTP_AUTH.login_required
     def delete(self, vpn_id : str):
         LOGGER.debug('VPN_Id: {:s}'.format(str(vpn_id)))
         LOGGER.debug('Request: {:s}'.format(str(request)))
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Services.py b/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Services.py
index 98d950952702d5cf1df8aa29edc50683e56a296e..47f6d5726225350976a67eeaacda64ceb32f0d7f 100644
--- a/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Services.py
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_l3vpn/L3VPN_Services.py
@@ -26,11 +26,11 @@ from .YangValidator import YangValidator
 LOGGER = logging.getLogger(__name__)
 
 class L3VPN_Services(Resource):
-    @HTTP_AUTH.login_required
+    # @HTTP_AUTH.login_required
     def get(self):
         return {}
 
-    @HTTP_AUTH.login_required
+    # @HTTP_AUTH.login_required
     def post(self):
         if not request.is_json: raise UnsupportedMediaType('JSON payload is required')
         request_data : Dict = request.json
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service.py
index e25270d3601ffa1cfdffa68a98305e3646602001..8f6dc86609f8c0e4d51fa02c64ab7c59a377395a 100644
--- a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service.py
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
@@ -13,47 +13,61 @@
 # limitations under the License.
 
 import logging
+
 from flask.json import jsonify
 from flask_restful import Resource
+
 from common.proto.context_pb2 import SliceStatusEnum
 from common.tools.context_queries.Slice import get_slice_by_uuid
 from common.tools.grpc.Tools import grpc_message_to_json
 from context.client.ContextClient import ContextClient
 from slice.client.SliceClient import SliceClient
+
 from ..tools.Authentication import HTTP_AUTH
-from ..tools.HttpStatusCodes import HTTP_GATEWAYTIMEOUT, HTTP_NOCONTENT, HTTP_OK, HTTP_SERVERERROR
+from ..tools.HttpStatusCodes import (
+    HTTP_GATEWAYTIMEOUT,
+    HTTP_NOCONTENT,
+    HTTP_OK,
+    HTTP_SERVERERROR,
+)
 
 LOGGER = logging.getLogger(__name__)
 
+
 class NSS_Service(Resource):
-    @HTTP_AUTH.login_required
-    def get(self, slice_id : str):
-        LOGGER.debug('GET Slice ID: {:s}'.format(str(slice_id)))
+    # @HTTP_AUTH.login_required
+    def get(self, slice_id: str):
+        LOGGER.debug("GET Slice ID: {:s}".format(str(slice_id)))
         try:
             context_client = ContextClient()
 
             target = get_slice_by_uuid(context_client, slice_id, rw_copy=True)
             if target is None:
-                raise Exception('Slice({:s}) not found in database'.format(str(slice_id)))
+                raise Exception(
+                    "Slice({:s}) not found in database".format(str(slice_id))
+                )
 
-            if target.slice_id.slice_uuid.uuid != slice_id: # pylint: disable=no-member
-                raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
+            if target.slice_id.slice_uuid.uuid != slice_id:  # pylint: disable=no-member
+                raise Exception("Slice retrieval failed. Wrong Slice Id was returned")
 
             slice_ready_status = SliceStatusEnum.SLICESTATUS_ACTIVE
-            slice_status = target.slice_status.slice_status # pylint: disable=no-member
+            slice_status = target.slice_status.slice_status  # pylint: disable=no-member
             response = jsonify(grpc_message_to_json(target))
-            response.status_code = HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT
+            response.status_code = (
+                HTTP_OK if slice_status == slice_ready_status else HTTP_GATEWAYTIMEOUT
+            )
 
-        except Exception as e: # pylint: disable=broad-except
-            LOGGER.exception('Something went wrong Retrieving Slice({:s})'.format(str(slice_id)))
-            response = jsonify({'error': str(e)})
+        except Exception as e:  # pylint: disable=broad-except
+            LOGGER.exception(
+                "Something went wrong Retrieving Slice({:s})".format(str(slice_id))
+            )
+            response = jsonify({"error": str(e)})
             response.status_code = HTTP_SERVERERROR
         return response
 
-
-    @HTTP_AUTH.login_required
-    def delete(self, slice_id : str):
-        LOGGER.debug('DELETE Slice ID: {:s}'.format(str(slice_id)))
+    # @HTTP_AUTH.login_required
+    def delete(self, slice_id: str):
+        LOGGER.debug("DELETE Slice ID: {:s}".format(str(slice_id)))
         try:
             context_client = ContextClient()
             target = get_slice_by_uuid(context_client, slice_id)
@@ -62,17 +76,25 @@ class NSS_Service(Resource):
             response.status_code = HTTP_OK
 
             if target is None:
-                LOGGER.warning('Slice({:s}) not found in database. Nothing done.'.format(str(slice_id)))
+                LOGGER.warning(
+                    "Slice({:s}) not found in database. Nothing done.".format(
+                        str(slice_id)
+                    )
+                )
                 response.status_code = HTTP_NOCONTENT
             else:
-                if target.slice_id.slice_uuid.uuid != slice_id:  # pylint: disable=no-member
-                    raise Exception('Slice retrieval failed. Wrong Slice Id was returned')
+                if target.slice_id.slice_uuid.uuid != slice_id and target.name != slice_id:  # pylint: disable=no-member
+                    raise Exception(
+                        "Slice retrieval failed. Wrong Slice Id was returned"
+                    )
                 slice_client = SliceClient()
                 slice_client.DeleteSlice(target.slice_id)
                 LOGGER.debug(f"Slice({slice_id}) successfully deleted")
 
         except Exception as e:  # pylint: disable=broad-except
-            LOGGER.exception('Something went wrong Deleting Slice({:s})'.format(str(slice_id)))
-            response = jsonify({'error': str(e)})
+            LOGGER.exception(
+                "Something went wrong Deleting Slice({:s})".format(str(slice_id))
+            )
+            response = jsonify({"error": str(e)})
             response.status_code = HTTP_SERVERERROR
-        return response
\ No newline at end of file
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service_Match_Criteria.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service_Match_Criteria.py
new file mode 100644
index 0000000000000000000000000000000000000000..3e1c9f73f97f0df8a2b271cb34a4852e983e77a1
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service_Match_Criteria.py
@@ -0,0 +1,59 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+
+from flask import request
+from flask.json import jsonify
+from flask_restful import Resource
+from werkzeug.exceptions import UnsupportedMediaType
+
+from context.client.ContextClient import ContextClient
+from slice.client.SliceClient import SliceClient
+
+from ..tools.Authentication import HTTP_AUTH
+from ..tools.HttpStatusCodes import (
+    HTTP_CREATED,
+)
+from .ietf_slice_handler import IETFSliceHandler
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NSS_Service_Match_Criteria(Resource):
+    # @HTTP_AUTH.login_required
+    def get(self):
+        response = jsonify({"message": "All went well!"})
+        # TODO Return list of current network-slice-services
+        return response
+
+    # @HTTP_AUTH.login_required
+    def post(self, slice_id: str, sdp_id: str):
+        if not request.is_json:
+            raise UnsupportedMediaType("JSON payload is required")
+        request_data: Dict = request.json
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.create_match_criteria(
+            request_data, slice_id, sdp_id, context_client
+        )
+        slice_client = SliceClient()
+        slice_client.UpdateSlice(slice_request)
+        slice_request = IETFSliceHandler.copy_candidate_ietf_slice_data_to_running(
+            slice_id, context_client
+        )
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service_Match_Criterion.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service_Match_Criterion.py
new file mode 100644
index 0000000000000000000000000000000000000000..8fb8adfd98e461a43f2dc24121b84a59aaabbd6b
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Service_Match_Criterion.py
@@ -0,0 +1,48 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 flask.json import jsonify
+from flask_restful import Resource
+
+from context.client.ContextClient import ContextClient
+
+from ..tools.Authentication import HTTP_AUTH
+from ..tools.HttpStatusCodes import (
+    HTTP_CREATED,
+)
+from .ietf_slice_handler import IETFSliceHandler
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NSS_Service_Match_Criterion(Resource):
+    # @HTTP_AUTH.login_required
+    def get(self):
+        response = jsonify({"message": "All went well!"})
+        # TODO Return list of current network-slice-services
+        return response
+
+    # @HTTP_AUTH.login_required
+    def delete(self, slice_id: str, sdp_id: str, match_criterion_id: str):
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.delete_match_criteria(
+            slice_id, sdp_id, int(match_criterion_id), context_client
+        )
+        context_client = ContextClient()
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services.py
index 11a73141d6bd05db851d3019903e5a6db2f5c2d6..8398917a2c5d8c553efe59551962271d91759e9e 100644
--- a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services.py
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
@@ -11,112 +11,44 @@
 # 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
 import logging
-import ssl
-import uuid
 from typing import Dict
+
+from flask import request
 from flask.json import jsonify
 from flask_restful import Resource
-from flask import request
-
-from common.Constants import DEFAULT_CONTEXT_NAME
-from common.proto.context_pb2 import Slice, SliceStatusEnum, EndPointId, Constraint
-from common.tools.grpc.Tools import grpc_message_to_json
-from ..tools.Authentication import HTTP_AUTH
-from ..tools.HttpStatusCodes import HTTP_BADREQUEST, HTTP_OK, HTTP_CREATED, HTTP_SERVERERROR
 from werkzeug.exceptions import UnsupportedMediaType
 
+from context.client.ContextClient import ContextClient
 from slice.client.SliceClient import SliceClient
-from .bindings import load_json_data
-from .bindings.network_slice_services import NetworkSliceServices
+
+from ..tools.HttpStatusCodes import HTTP_CREATED, HTTP_OK
+from .ietf_slice_handler import IETFSliceHandler
 
 LOGGER = logging.getLogger(__name__)
 
+
 class NSS_Services(Resource):
-    @HTTP_AUTH.login_required
-    def get(self):    
-        response = jsonify({"message": "All went well!"})
-        # TODO Return list of current network-slice-services
+    # @HTTP_AUTH.login_required
+    def get(self):
+        context_client = ContextClient()
+        ietf_slices = IETFSliceHandler.get_all_ietf_slices(context_client)
+        response = jsonify(ietf_slices)
+        response.status_code = HTTP_OK
         return response
 
-    @HTTP_AUTH.login_required
+    # @HTTP_AUTH.login_required
     def post(self):
         if not request.is_json:
-            raise UnsupportedMediaType('JSON payload is required')
-        request_data = json.dumps(request.json)
+            raise UnsupportedMediaType("JSON payload is required")
+        request_data: Dict = request.json
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.create_slice_service(
+            request_data, context_client
+        )
+        slice_client = SliceClient()
+        slice_client.CreateSlice(slice_request)
+
         response = jsonify({})
         response.status_code = HTTP_CREATED
-
-        slices: NetworkSliceServices = load_json_data(request_data, NetworkSliceServices)[0]
-        for ietf_slice in slices.slice_service:
-            slice_request: Slice = Slice()
-            # Meta information
-            # TODO implement name and owner based on "tags"
-            slice_request.slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
-            slice_request.slice_id.slice_uuid.uuid = ietf_slice.service_id()
-            # TODO map with admin status of IETF Slice
-            slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
-
-            list_endpoints = []
-            for sdp in ietf_slice.sdps().sdp:
-                endpoint = EndPointId()
-                endpoint.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
-                endpoint.device_id.device_uuid.uuid = sdp.node_id()
-                endpoint.endpoint_uuid.uuid = sdp.sdp_id()
-                list_endpoints.append(endpoint)
-            slice_request.slice_endpoint_ids.extend(list_endpoints)
-
-            # TODO Map connectivity_groups and connectivity constructs to real connections
-            LOGGER.debug(f"Connection groups detected: {len(ietf_slice.connection_groups().connection_group())}")
-            list_constraints = []
-            for cg in ietf_slice.connection_groups().connection_group:
-                for cc in cg.connectivity_construct:
-                    if cc.slo_sle_policy.custom:
-                        with cc.slo_sle_policy.custom as slo:
-                            for metric_bound in slo.service_slo_sle_policy().metric_bounds().metric_bound:
-                                metric_type = str(metric_bound.metric_type()).casefold()
-                                if metric_type == "service-slo-two-way-bandwidth":  # TODO fix to two way!
-                                    constraint = Constraint()
-                                    metric_unit = metric_bound.metric_unit().casefold()
-                                    capacity = float(metric_bound.bound())  # Assuming capacity already in Gbps
-                                    if metric_unit == "mbps":
-                                        capacity /= 1E3
-                                    elif metric_unit != "gbps":
-                                        LOGGER.warning(f"Invalided metric unit ({metric_bound.metric_unit()}), must be Mbps or Gbps")
-                                        response.status_code = HTTP_SERVERERROR
-                                        return response
-                                    constraint.sla_capacity.capacity_gbps = capacity
-                                    list_constraints.append(constraint)
-
-                                elif metric_type == "service-slo-one-way-delay":
-                                    if metric_bound.metric_unit().casefold() == "ms":
-                                        latency = int(metric_bound.bound())
-                                    else:
-                                        LOGGER.warning(f"Invalided metric unit ({metric_bound.metric_unit()}), must be \"ms\" ")
-                                        response.status_code = HTTP_SERVERERROR
-                                        return response
-                                    constraint = Constraint()
-                                    constraint.sla_latency.e2e_latency_ms = latency
-                                    list_constraints.append(constraint)
-
-                                elif metric_type == "service-slo-availability":
-                                    availability = float(metric_bound.bound())
-                                    if availability > 100.0 or availability < 0.0:
-                                        raise Exception(f'Slice SLO availability ({availability}) must be constrained [0,100]')
-                                    constraint = Constraint()
-                                    constraint.sla_availability.availability = availability
-                                    # TODO not really necessary, remove after OFC2023
-                                    constraint.sla_availability.num_disjoint_paths = 0
-                                    constraint.sla_availability.all_active = False
-                                    list_constraints.append(constraint)
-
-            slice_request.slice_constraints.extend(list_constraints)
-            LOGGER.debug(grpc_message_to_json(slice_request))  # TODO remove
-            # TODO adding owner, needs to be recoded after updating the bindings
-            owner = request.json["data"]["ietf-network-slice-service:network-slice-services"]["slice-service"][0]["service-tags"][0]["value"]
-            slice_request.slice_owner.owner_string = owner
-            slice_request.slice_owner.owner_uuid.uuid = str(uuid.uuid5(uuid.NAMESPACE_DNS, owner))
-            slice_client = SliceClient()
-            slice_client.CreateSlice(slice_request)
         return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py
new file mode 100644
index 0000000000000000000000000000000000000000..0309c6ac475dec59d3219be79792fdef81e3d330
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Group.py
@@ -0,0 +1,75 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+
+from flask import request
+from flask.json import jsonify
+from flask_restful import Resource
+from werkzeug.exceptions import UnsupportedMediaType
+
+from context.client.ContextClient import ContextClient
+from slice.client.SliceClient import SliceClient
+
+from ..tools.Authentication import HTTP_AUTH
+from ..tools.HttpStatusCodes import HTTP_CREATED
+from .ietf_slice_handler import IETFSliceHandler
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NSS_Service_Connection_Group(Resource):
+    # @HTTP_AUTH.login_required
+    def get(self):
+        response = jsonify({"message": "All went well!"})
+        # TODO Return list of current network-slice-services
+        return response
+
+    # @HTTP_AUTH.login_required
+    def put(self, slice_id: str, connection_group_id: str):
+        if not request.is_json:
+            raise UnsupportedMediaType("JSON payload is required")
+        request_data: Dict = request.json
+
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.update_connection_group(
+            slice_id, request_data, context_client
+        )
+        slice_client = SliceClient()
+        slice_client.UpdateSlice(slice_request)
+        slice_request = IETFSliceHandler.copy_candidate_ietf_slice_data_to_running(
+            slice_id, context_client
+        )
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
+
+    # @HTTP_AUTH.login_required
+    def delete(self, slice_id: str, connection_group_id: str):
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.delete_connection_group(
+            slice_id, connection_group_id, context_client
+        )
+        slice_client = SliceClient()
+        slice_client.UpdateSlice(slice_request)
+        slice_request = IETFSliceHandler.copy_candidate_ietf_slice_data_to_running(
+            slice_id, context_client
+        )
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Groups.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Groups.py
new file mode 100644
index 0000000000000000000000000000000000000000..bee8349ef1949f0eb7f633ca4cbe6de6de1abbd6
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_Connection_Groups.py
@@ -0,0 +1,52 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+
+from flask import request
+from flask.json import jsonify
+from flask_restful import Resource
+from werkzeug.exceptions import UnsupportedMediaType
+
+from context.client.ContextClient import ContextClient
+
+from ..tools.Authentication import HTTP_AUTH
+from ..tools.HttpStatusCodes import HTTP_CREATED
+from .ietf_slice_handler import IETFSliceHandler
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NSS_Service_Connection_Groups(Resource):
+    # @HTTP_AUTH.login_required
+    def get(self):
+        response = jsonify({"message": "All went well!"})
+        # TODO Return list of current network-slice-services
+        return response
+
+    # @HTTP_AUTH.login_required
+    def post(self, slice_id: str):
+        if not request.is_json:
+            raise UnsupportedMediaType("JSON payload is required")
+        request_data: Dict = request.json
+
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.create_connection_group(
+            request_data, slice_id, context_client
+        )
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_SDP.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_SDP.py
new file mode 100644
index 0000000000000000000000000000000000000000..f1d04a858907d016dc39a5a15a0d2771e25310af
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_SDP.py
@@ -0,0 +1,45 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+
+from flask import request
+from flask.json import jsonify
+from flask_restful import Resource
+from werkzeug.exceptions import UnsupportedMediaType
+
+from context.client.ContextClient import ContextClient
+
+from ..tools.HttpStatusCodes import HTTP_OK
+from .ietf_slice_handler import IETFSliceHandler
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NSS_Service_SDP(Resource):
+    # @HTTP_AUTH.login_required
+    def get(self):
+        response = jsonify({"message": "All went well!"})
+        # TODO Return list of current network-slice-services
+        return response
+
+    # @HTTP_AUTH.login_required
+    def delete(self, slice_id: str, sdp_id: str):
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.delete_sdp(slice_id, sdp_id, context_client)
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_OK
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_SDPs.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_SDPs.py
new file mode 100644
index 0000000000000000000000000000000000000000..8a3fb8c4210b790dd25f9c0f8467b79ef5a86bc9
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/NSS_Services_SDPs.py
@@ -0,0 +1,51 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+
+from flask import request
+from flask.json import jsonify
+from flask_restful import Resource
+from werkzeug.exceptions import UnsupportedMediaType
+
+from context.client.ContextClient import ContextClient
+
+from ..tools.HttpStatusCodes import HTTP_CREATED
+from .ietf_slice_handler import IETFSliceHandler
+
+LOGGER = logging.getLogger(__name__)
+
+
+class NSS_Service_SDPs(Resource):
+    # @HTTP_AUTH.login_required
+    def get(self):
+        response = jsonify({"message": "All went well!"})
+        # TODO Return list of current network-slice-services
+        return response
+
+    # @HTTP_AUTH.login_required
+    def post(self, slice_id: str):
+        if not request.is_json:
+            raise UnsupportedMediaType("JSON payload is required")
+        request_data: Dict = request.json
+
+        context_client = ContextClient()
+        slice_request = IETFSliceHandler.create_sdp(
+            request_data, slice_id, context_client
+        )
+        _ = context_client.SetSlice(slice_request)
+
+        response = jsonify({})
+        response.status_code = HTTP_CREATED
+        return response
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/YangValidator.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/YangValidator.py
new file mode 100644
index 0000000000000000000000000000000000000000..77071f7f7a72ad7d46e34f118a87dc2280a2a24c
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/YangValidator.py
@@ -0,0 +1,36 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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 libyang, os
+from typing import Dict, Optional
+
+YANG_DIR = os.path.join(os.path.dirname(__file__), 'yang')
+
+class YangValidator:
+    def __init__(self, module_name : str) -> None:
+        self._yang_context = libyang.Context(YANG_DIR)
+        self._yang_module  = self._yang_context.load_module(module_name)
+        self._yang_module.feature_enable_all()
+
+    def parse_to_dict(self, message : Dict) -> Dict:
+        dnode : Optional[libyang.DNode] = self._yang_module.parse_data_dict(
+            message, validate_present=True, validate=True, strict=True
+        )
+        if dnode is None: raise Exception('Unable to parse Message({:s})'.format(str(message)))
+        message = dnode.print_dict()
+        dnode.free()
+        return message
+
+    def destroy(self) -> None:
+        self._yang_context.destroy()
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/__init__.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/__init__.py
index e900c27e96aafc248e5db1bec303cb25b5a0f2d7..db76b3b911c971df8ab81b1710f4ac80e4ccb3ad 100644
--- a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/__init__.py
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/__init__.py
@@ -1,4 +1,4 @@
-# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (https://tfs.etsi.org/)
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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.
@@ -16,16 +16,60 @@
 # Ref: https://datatracker.ietf.org/doc/draft-ietf-teas-ietf-network-slice-nbi-yang/
 
 from flask_restful import Resource
+
 from nbi.service.rest_server.RestServer import RestServer
-from .NSS_Services import NSS_Services
+
 from .NSS_Service import NSS_Service
+from .NSS_Service_Match_Criteria import NSS_Service_Match_Criteria
+from .NSS_Service_Match_Criterion import NSS_Service_Match_Criterion
+from .NSS_Services import NSS_Services
+from .NSS_Services_Connection_Group import NSS_Service_Connection_Group
+from .NSS_Services_Connection_Groups import NSS_Service_Connection_Groups
+from .NSS_Services_SDP import NSS_Service_SDP
+from .NSS_Services_SDPs import NSS_Service_SDPs
+
+URL_PREFIX = "/restconf/data/ietf-network-slice-service"
 
-URL_PREFIX = '/restconf/data/ietf-network-slice-service:ietf-nss'
 
-def _add_resource(rest_server : RestServer, resource : Resource, *urls, **kwargs):
+def _add_resource(rest_server: RestServer, resource: Resource, *urls, **kwargs):
     urls = [(URL_PREFIX + url) for url in urls]
     rest_server.add_resource(resource, *urls, **kwargs)
 
-def register_ietf_nss(rest_server : RestServer):
-    _add_resource(rest_server, NSS_Services, '/network-slice-services')
-    _add_resource(rest_server, NSS_Service, '/network-slice-services/slice-service=<string:slice_id>')
+
+def register_ietf_nss(rest_server: RestServer):
+    _add_resource(rest_server, NSS_Services, ":network-slice-services")
+    _add_resource(
+        rest_server,
+        NSS_Service,
+        ":network-slice-services/slice-service=<string:slice_id>",
+    )
+    _add_resource(
+        rest_server,
+        NSS_Service_SDPs,
+        ":network-slice-services/slice-service=<string:slice_id>/sdps",
+    )
+    _add_resource(
+        rest_server,
+        NSS_Service_SDP,
+        ":network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>",
+    )
+    _add_resource(
+        rest_server,
+        NSS_Service_Connection_Groups,
+        ":network-slice-services/slice-service=<string:slice_id>/connection-groups",
+    )
+    _add_resource(
+        rest_server,
+        NSS_Service_Connection_Group,
+        ":network-slice-services/slice-service=<string:slice_id>/connection-groups/connection-group=<string:connection_group_id>",
+    )
+    _add_resource(
+        rest_server,
+        NSS_Service_Match_Criteria,
+        ":network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>/service-match-criteria",
+    )
+    _add_resource(
+        rest_server,
+        NSS_Service_Match_Criterion,
+        ":network-slice-services/slice-service=<string:slice_id>/sdps/sdp=<string:sdp_id>/service-match-criteria/match-criterion=<string:match_criterion_id>",
+    )
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py
new file mode 100644
index 0000000000000000000000000000000000000000..80ce4c6b78d446ff1e08a750f236e0c143e1ba57
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf_slice_handler.py
@@ -0,0 +1,640 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+import logging
+import uuid
+from typing import Dict, List, Optional
+
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import (
+    ConfigRule,
+    Constraint,
+    DeviceId,
+    Device,
+    Empty,
+    EndPointId,
+    ServiceConfig,
+    Slice,
+    SliceStatusEnum,
+)
+from common.tools.context_queries.Slice import get_slice_by_defualt_name
+from common.tools.grpc.ConfigRules import update_config_rule_custom
+from common.tools.object_factory.Device import json_device_id
+from common.DeviceTypes import DeviceTypeEnum
+from context.client import ContextClient
+
+from .YangValidator import YangValidator
+
+LOGGER = logging.getLogger(__name__)
+
+
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
+ADDRESS_PREFIX = 24
+RAISE_IF_DIFFERS = False
+
+
+def validate_ietf_slice_data(request_data: Dict) -> None:
+    """
+    Validate the provided IETF slice data against the YANG model.
+    """
+    yang_validator = YangValidator("ietf-network-slice-service")
+    _ = yang_validator.parse_to_dict(request_data)
+    yang_validator.destroy()
+
+
+def get_custom_config_rule(
+    service_config: ServiceConfig, resource_key: str
+) -> Optional[ConfigRule]:
+    """
+    Retrieve the custom config rule with the given resource_key from a ServiceConfig.
+    """
+    for cr in service_config.config_rules:
+        if (
+            cr.WhichOneof("config_rule") == "custom"
+            and cr.custom.resource_key == resource_key
+        ):
+            return cr
+    return None
+
+
+def get_ietf_data_from_config(slice_request: Slice, resource_key: str) -> Dict:
+    """
+    Retrieve the IETF data (as a Python dict) from a slice's config rule for the specified resource_key.
+    Raises an exception if not found.
+    """
+    config_rule = get_custom_config_rule(slice_request.slice_config, resource_key)
+    if not config_rule:
+        raise Exception(f"IETF data not found for resource_key: {resource_key}")
+    return json.loads(config_rule.custom.resource_value)
+
+
+def update_ietf_data_in_config(
+    slice_request: Slice, resource_key: str, ietf_data: Dict
+) -> None:
+    """
+    Update the slice config rule (identified by resource_key) with the provided IETF data.
+    """
+    fields = {name: (value, RAISE_IF_DIFFERS) for name, value in ietf_data.items()}
+    update_config_rule_custom(
+        slice_request.slice_config.config_rules, resource_key, fields
+    )
+
+
+def build_constraints_from_connection_group(connection_group: dict) -> List[Constraint]:
+    """
+    Build a list of Constraints from the 'metric-bound' data in a connection group.
+    """
+    constraints = []
+    metric_bounds = connection_group["connectivity-construct"][0][
+        "service-slo-sle-policy"
+    ]["slo-policy"]["metric-bound"]
+
+    for metric in metric_bounds:
+        metric_type = metric["metric-type"]
+        if metric_type == "ietf-nss:one-way-delay-maximum":
+            bound_value = float(metric["bound"])
+            constraint = Constraint()
+            constraint.sla_latency.e2e_latency_ms = bound_value
+            constraints.append(constraint)
+        elif metric_type == "ietf-nss:one-way-bandwidth":
+            bound_value = float(metric["bound"])
+            constraint = Constraint()
+            # Convert from Mbps to Gbps if needed
+            constraint.sla_capacity.capacity_gbps = bound_value / 1.0e3
+            constraints.append(constraint)
+
+    return constraints
+
+
+def get_endpoint_controller_type(
+    endpoint: EndPointId, context_client: ContextClient
+) -> str:
+    """
+    Retrieve the device type of an endpoint's controller device, if any; otherwise returns an empty string.
+    """
+    endpoint_device: Device = context_client.GetDevice(endpoint.device_id)
+    if endpoint_device.controller_id == DeviceId():
+        return ""
+    controller = context_client.GetDevice(endpoint_device.controller_id)
+    if controller is None:
+        controller_uuid = endpoint_device.controller_id.device_uuid.uuid
+        raise Exception(f"Controller device {controller_uuid} not found")
+    return controller.device_type
+
+
+def sort_endpoints(
+    endpoints_list: List[EndPointId],
+    sdps: List,
+    connection_group: Dict,
+    context_client: ContextClient,
+) -> List[EndPointId]:
+    """
+    Sort the endpoints_list based on controller type:
+      - If the first endpoint is an NCE, keep order.
+      - If the last endpoint is an NCE, reverse order.
+      - Otherwise, use the 'p2p-sender-sdp' from the connection group to decide.
+    """
+    if not endpoints_list:
+        return endpoints_list
+
+    first_ep = endpoints_list[0]
+    last_ep = endpoints_list[-1]
+    first_controller_type = get_endpoint_controller_type(first_ep, context_client)
+    last_controller_type = get_endpoint_controller_type(last_ep, context_client)
+
+    if first_controller_type == DeviceTypeEnum.NCE.value:
+        return endpoints_list
+    elif last_controller_type == DeviceTypeEnum.NCE.value:
+        return endpoints_list[::-1]
+
+    src_sdp_id = connection_group["connectivity-construct"][0]["p2p-sender-sdp"]
+    sdp_id_name_mapping = {sdp["id"]: sdp["node-id"] for sdp in sdps}
+    if endpoints_list[0].device_id.device_uuid.uuid == sdp_id_name_mapping[src_sdp_id]:
+        return endpoints_list
+    return endpoints_list[::-1]
+
+
+def replace_ont_endpoint_with_emu_dc(
+    endpoint_list: List[EndPointId], context_client: ContextClient
+) -> List[EndPointId]:
+    """
+    Replace an ONT endpoint in endpoint_list with an 'emu-datacenter' endpoint if found.
+    One endpoint must be managed (controller_id != empty), the other must be unmanaged.
+    """
+    if len(endpoint_list) != 2:
+        raise Exception(
+            "Expecting exactly two endpoints to handle ONT -> emu-dc replacement"
+        )
+
+    link_list = context_client.ListLinks(Empty())
+    links = list(link_list.links)
+    devices_list = context_client.ListDevices(Empty())
+    devices = devices_list.devices
+
+    uuid_name_map = {d.device_id.device_uuid.uuid: d.name for d in devices}
+    uuid_device_map = {d.device_id.device_uuid.uuid: d for d in devices}
+    name_device_map = {d.name: d for d in devices}
+
+    endpoint_id_1, endpoint_id_2 = endpoint_list
+    device_uuid_1 = endpoint_id_1.device_id.device_uuid.uuid
+    device_uuid_2 = endpoint_id_2.device_id.device_uuid.uuid
+
+    device_1 = name_device_map.get(device_uuid_1)
+    device_2 = name_device_map.get(device_uuid_2)
+
+    if not device_1 or not device_2:
+        raise Exception("One or both devices not found in name_device_map")
+
+    # Check if the first endpoint is managed
+    if device_1.controller_id != DeviceId():
+        for link in links:
+            link_endpoints = list(link.link_endpoint_ids)
+            link_ep_1, link_ep_2 = link_endpoints
+            if (
+                device_uuid_1 == uuid_name_map.get(link_ep_1.device_id.device_uuid.uuid)
+                and uuid_device_map[link_ep_2.device_id.device_uuid.uuid].device_type
+                == "emu-datacenter"
+            ):
+                endpoint_list[0] = link_ep_2
+                break
+    # Otherwise, check if the second endpoint is managed
+    elif device_2.controller_id != DeviceId():
+        for link in links:
+            link_endpoints = list(link.link_endpoint_ids)
+            link_ep_1, link_ep_2 = link_endpoints
+            if (
+                device_uuid_2 == uuid_name_map.get(link_ep_1.device_id.device_uuid.uuid)
+                and uuid_device_map[link_ep_2.device_id.device_uuid.uuid].device_type
+                == "emu-datacenter"
+            ):
+                endpoint_list[1] = link_ep_2
+                break
+    else:
+        raise Exception(
+            "One endpoint should be managed by a controller and the other should not be"
+        )
+
+    return endpoint_list
+
+
+class IETFSliceHandler:
+    @staticmethod
+    def get_all_ietf_slices(context_client: ContextClient) -> Dict:
+        """
+        Retrieve all IETF slices from the (single) context. Expects exactly one context in the system.
+        """
+        existing_context_ids = context_client.ListContextIds(Empty())
+        context_ids = list(existing_context_ids.context_ids)
+        if len(context_ids) != 1:
+            raise Exception("Number of contexts should be exactly 1")
+
+        slices_list = context_client.ListSlices(context_ids[0])
+        slices = slices_list.slices
+
+        ietf_slices = {"network-slice-services": {"slice-service": []}}
+        for slc in slices:
+            candidate_cr = get_custom_config_rule(
+                slc.slice_config, CANDIDATE_RESOURCE_KEY
+            )
+            if not candidate_cr:
+                # Skip slices that don't have the candidate_ietf_slice data
+                continue
+            candidate_ietf_data = json.loads(candidate_cr.custom.resource_value)
+            ietf_slices["network-slice-services"]["slice-service"].append(
+                candidate_ietf_data["network-slice-services"]["slice-service"][0]
+            )
+        return ietf_slices
+
+    @staticmethod
+    def create_slice_service(
+        request_data: dict, context_client: ContextClient
+    ) -> Slice:
+        """
+        Create a new slice service from the provided IETF data, applying validations and constructing a Slice object.
+        """
+        # Ensure the top-level key is "network-slice-services"
+        if "network-slice-services" not in request_data:
+            request_data = {"network-slice-services": request_data}
+
+        validate_ietf_slice_data(request_data)
+        slice_service = request_data["network-slice-services"]["slice-service"][0]
+
+        slice_id = slice_service["id"]
+        sdps = slice_service["sdps"]["sdp"]
+        if len(sdps) != 2:
+            raise Exception("Number of SDPs should be exactly 2")
+
+        connection_groups = slice_service["connection-groups"]["connection-group"]
+        slice_request = Slice()
+        slice_request.slice_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
+        slice_request.slice_id.slice_uuid.uuid = slice_id
+        slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
+
+        list_endpoints = []
+        endpoint_config_rules = []
+        connection_group_ids = set()
+
+        # Build endpoints from SDPs
+        for sdp in sdps:
+            attachment_circuits = sdp["attachment-circuits"]["attachment-circuit"]
+            if len(attachment_circuits) != 1:
+                raise Exception("Each SDP must have exactly 1 attachment-circuit")
+
+            endpoint = EndPointId()
+            endpoint.topology_id.context_id.context_uuid.uuid = DEFAULT_CONTEXT_NAME
+            device_uuid = sdp["node-id"]
+            endpoint.device_id.device_uuid.uuid = device_uuid
+            endpoint_uuid = attachment_circuits[0]["ac-tp-id"]
+            endpoint.endpoint_uuid.uuid = endpoint_uuid
+            list_endpoints.append(endpoint)
+
+            # Keep track of connection-group-id from each SDP
+            connection_group_ids.add(
+                sdp["service-match-criteria"]["match-criterion"][0][
+                    "target-connection-group-id"
+                ]
+            )
+
+            # Endpoint-specific config rule fields
+            endpoint_config_rule_fields = {
+                "address_ip": (endpoint_uuid, RAISE_IF_DIFFERS),
+                "address_prefix": (ADDRESS_PREFIX, RAISE_IF_DIFFERS),
+            }
+            endpoint_config_rules.append(
+                (
+                    f"/device[{device_uuid}]/endpoint[{endpoint_uuid}]/settings",
+                    endpoint_config_rule_fields,
+                )
+            )
+
+        if len(connection_group_ids) != 1:
+            raise Exception("SDPs do not share a common connection-group-id")
+
+        # Build constraints from the matching connection group
+        unique_cg_id = connection_group_ids.pop()
+        found_cg = next(
+            (cg for cg in connection_groups if cg["id"] == unique_cg_id), None
+        )
+        if not found_cg:
+            raise Exception("The connection group referenced by the SDPs was not found")
+
+        list_constraints = build_constraints_from_connection_group(found_cg)
+
+        # Sort endpoints and optionally replace the ONT endpoint
+        list_endpoints = sort_endpoints(list_endpoints, sdps, found_cg, context_client)
+        list_endpoints = replace_ont_endpoint_with_emu_dc(
+            list_endpoints, context_client
+        )
+
+        slice_request.slice_endpoint_ids.extend(list_endpoints)
+        slice_request.slice_constraints.extend(list_constraints)
+
+        # Set slice owner
+        slice_request.slice_owner.owner_string = slice_id
+        slice_request.slice_owner.owner_uuid.uuid = str(
+            uuid.uuid5(uuid.NAMESPACE_DNS, slice_id)
+        )
+
+        # Update slice config with IETF data (both running and candidate)
+        ietf_slice_fields = {
+            name: (value, RAISE_IF_DIFFERS) for name, value in request_data.items()
+        }
+        update_config_rule_custom(
+            slice_request.slice_config.config_rules,
+            RUNNING_RESOURCE_KEY,
+            ietf_slice_fields,
+        )
+        update_config_rule_custom(
+            slice_request.slice_config.config_rules,
+            CANDIDATE_RESOURCE_KEY,
+            ietf_slice_fields,
+        )
+
+        # Update endpoint config rules
+        for ep_cr_key, ep_cr_fields in endpoint_config_rules:
+            update_config_rule_custom(
+                slice_request.slice_config.config_rules, ep_cr_key, ep_cr_fields
+            )
+
+        return slice_request
+
+    @staticmethod
+    def create_sdp(
+        request_data: dict, slice_uuid: str, context_client: ContextClient
+    ) -> Slice:
+        """
+        Add a new SDP to an existing slice, updating the candidate IETF data.
+        """
+        sdps = request_data["sdp"]
+        if len(sdps) != 1:
+            raise Exception("Number of SDPs to create must be exactly 1")
+
+        new_sdp = sdps[0]
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_uuid, rw_copy=False
+        )
+        ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY)
+
+        slice_service = ietf_data["network-slice-services"]["slice-service"][0]
+        slice_sdps = slice_service["sdps"]["sdp"]
+        slice_sdps.append(new_sdp)
+
+        # Save updated IETF data
+        update_ietf_data_in_config(slice_request, CANDIDATE_RESOURCE_KEY, ietf_data)
+        return slice_request
+
+    @staticmethod
+    def delete_sdp(
+        slice_uuid: str, sdp_id: str, context_client: ContextClient
+    ) -> Slice:
+        """
+        Delete the specified SDP from an existing slice's candidate IETF data.
+        """
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_uuid, rw_copy=False
+        )
+        ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY)
+
+        slice_service = ietf_data["network-slice-services"]["slice-service"][0]
+        slice_sdps = slice_service["sdps"]["sdp"]
+
+        # Find and remove the matching SDP
+        sdp_idx = next(
+            (i for i, sdp in enumerate(slice_sdps) if sdp["id"] == sdp_id), None
+        )
+        if sdp_idx is None:
+            raise Exception(f"SDP with id '{sdp_id}' not found in slice '{slice_uuid}'")
+        slice_sdps.pop(sdp_idx)
+
+        update_ietf_data_in_config(slice_request, CANDIDATE_RESOURCE_KEY, ietf_data)
+        return slice_request
+
+    @staticmethod
+    def create_connection_group(
+        request_data: dict, slice_id: str, context_client: ContextClient
+    ) -> Slice:
+        """
+        Add a new connection group to an existing slice's candidate IETF data.
+        """
+        connection_groups = request_data["connection-group"]
+        if len(connection_groups) != 1:
+            raise Exception("Number of connection groups to create must be exactly 1")
+
+        new_connection_group = connection_groups[0]
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_id, rw_copy=False
+        )
+        ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY)
+
+        slice_service = ietf_data["network-slice-services"]["slice-service"][0]
+        slice_connection_groups = slice_service["connection-groups"]["connection-group"]
+        slice_connection_groups.append(new_connection_group)
+
+        # Validate the updated data, then save
+        validate_ietf_slice_data(ietf_data)
+        update_ietf_data_in_config(slice_request, CANDIDATE_RESOURCE_KEY, ietf_data)
+        return slice_request
+
+    @staticmethod
+    def update_connection_group(
+        slice_name: str,
+        updated_connection_group: dict,
+        context_client: ContextClient,
+    ) -> Slice:
+        """
+        Update an existing connection group in the candidate IETF data.
+        """
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_name, rw_copy=False
+        )
+        candidate_ietf_data = get_ietf_data_from_config(
+            slice_request, CANDIDATE_RESOURCE_KEY
+        )
+
+        slice_service = candidate_ietf_data["network-slice-services"]["slice-service"][
+            0
+        ]
+        slice_connection_groups = slice_service["connection-groups"]["connection-group"]
+
+        cg_id = updated_connection_group["id"]
+        cg_idx = next(
+            (i for i, cg in enumerate(slice_connection_groups) if cg["id"] == cg_id),
+            None,
+        )
+        if cg_idx is None:
+            raise Exception(f"Connection group with id '{cg_id}' not found")
+
+        slice_connection_groups[cg_idx] = updated_connection_group
+        update_ietf_data_in_config(
+            slice_request, CANDIDATE_RESOURCE_KEY, candidate_ietf_data
+        )
+
+        slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
+        return slice_request
+
+    @staticmethod
+    def delete_connection_group(
+        slice_uuid: str, connection_group_id: str, context_client: ContextClient
+    ) -> Slice:
+        """
+        Remove an existing connection group from the candidate IETF data of a slice.
+        """
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_uuid, rw_copy=False
+        )
+        candidate_ietf_data = get_ietf_data_from_config(
+            slice_request, CANDIDATE_RESOURCE_KEY
+        )
+
+        slice_service = candidate_ietf_data["network-slice-services"]["slice-service"][
+            0
+        ]
+        slice_connection_groups = slice_service["connection-groups"]["connection-group"]
+
+        cg_idx = next(
+            (
+                i
+                for i, cg in enumerate(slice_connection_groups)
+                if cg["id"] == connection_group_id
+            ),
+            None,
+        )
+        if cg_idx is None:
+            raise Exception(
+                f"Connection group with id '{connection_group_id}' not found"
+            )
+
+        slice_connection_groups.pop(cg_idx)
+        update_ietf_data_in_config(
+            slice_request, CANDIDATE_RESOURCE_KEY, candidate_ietf_data
+        )
+
+        slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
+        return slice_request
+
+    @staticmethod
+    def create_match_criteria(
+        request_data: dict, slice_name: str, sdp_id: str, context_client: ContextClient
+    ) -> Slice:
+        """
+        Create a new match-criterion for the specified SDP in a slice's candidate IETF data.
+        """
+        match_criteria = request_data["match-criterion"]
+        if len(match_criteria) != 1:
+            raise Exception(
+                "Number of match-criterion entries to create must be exactly 1"
+            )
+
+        new_match_criterion = match_criteria[0]
+        target_connection_group_id = new_match_criterion["target-connection-group-id"]
+
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_name, rw_copy=False
+        )
+        ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY)
+
+        slice_service = ietf_data["network-slice-services"]["slice-service"][0]
+        connection_groups = slice_service["connection-groups"]["connection-group"]
+        sdps = slice_service["sdps"]["sdp"]
+
+        # Find the referenced connection group
+        found_cg = next(
+            (cg for cg in connection_groups if cg["id"] == target_connection_group_id),
+            None,
+        )
+        if not found_cg:
+            raise Exception(
+                f"Connection group '{target_connection_group_id}' not found"
+            )
+
+        # Build constraints from that connection group
+        list_constraints = build_constraints_from_connection_group(found_cg)
+
+        # Add match-criterion to the relevant SDP
+        sdp_to_update = next((s for s in sdps if s["id"] == sdp_id), None)
+        if not sdp_to_update:
+            raise Exception(f"SDP '{sdp_id}' not found")
+
+        sdp_to_update["service-match-criteria"]["match-criterion"].append(
+            new_match_criterion
+        )
+
+        # Update constraints at the slice level as needed
+        del slice_request.slice_constraints[:]
+        slice_request.slice_constraints.extend(list_constraints)
+        slice_request.slice_status.slice_status = SliceStatusEnum.SLICESTATUS_PLANNED
+
+        update_ietf_data_in_config(slice_request, CANDIDATE_RESOURCE_KEY, ietf_data)
+        return slice_request
+
+    @staticmethod
+    def delete_match_criteria(
+        slice_uuid: str,
+        sdp_id: str,
+        match_criterion_id: int,
+        context_client: ContextClient,
+    ) -> Slice:
+        """
+        Delete the specified match-criterion from an SDP in the slice's candidate IETF data.
+        """
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_uuid, rw_copy=False
+        )
+        ietf_data = get_ietf_data_from_config(slice_request, CANDIDATE_RESOURCE_KEY)
+
+        slice_service = ietf_data["network-slice-services"]["slice-service"][0]
+        sdps = slice_service["sdps"]["sdp"]
+
+        # Find and modify the specified SDP
+        sdp_to_update = next((s for s in sdps if s["id"] == sdp_id), None)
+        if not sdp_to_update:
+            raise Exception(f"SDP '{sdp_id}' not found in slice '{slice_uuid}'")
+
+        match_criteria = sdp_to_update["service-match-criteria"]["match-criterion"]
+        mc_index = next(
+            (
+                i
+                for i, m in enumerate(match_criteria)
+                if m["index"] == match_criterion_id
+            ),
+            None,
+        )
+        if mc_index is None:
+            raise Exception(
+                f"No match-criterion with index '{match_criterion_id}' found in SDP '{sdp_id}'"
+            )
+
+        match_criteria.pop(mc_index)
+        update_ietf_data_in_config(slice_request, CANDIDATE_RESOURCE_KEY, ietf_data)
+        return slice_request
+
+    @staticmethod
+    def copy_candidate_ietf_slice_data_to_running(
+        slice_uuid: str, context_client: ContextClient
+    ) -> Slice:
+        """
+        Copy candidate IETF slice data to the running IETF slice data for a given slice.
+        """
+        slice_request = get_slice_by_defualt_name(
+            context_client, slice_uuid, rw_copy=False
+        )
+        candidate_ietf_data = get_ietf_data_from_config(
+            slice_request, CANDIDATE_RESOURCE_KEY
+        )
+        update_ietf_data_in_config(
+            slice_request, RUNNING_RESOURCE_KEY, candidate_ietf_data
+        )
+        return slice_request
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ac-common@2023-11-13.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ac-common@2023-11-13.yang
new file mode 100644
index 0000000000000000000000000000000000000000..170e70fff67242b380fc984d815e3d83557eca06
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ac-common@2023-11-13.yang
@@ -0,0 +1,1651 @@
+module ietf-ac-common {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-ac-common";
+  prefix ac-common;
+
+  import ietf-vpn-common {
+    prefix vpn-common;
+    reference
+      "RFC 9181: A Common YANG Data Model for Layer 2 and Layer 3
+                 VPNs";
+  }
+  import ietf-netconf-acm {
+    prefix nacm;
+    reference
+      "RFC 8341: Network Configuration Access Control Model";
+  }
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types, Section 4";
+  }
+  import ietf-yang-types {
+    prefix yang;
+    reference
+      "RFC 6991: Common YANG Data Types, Section 3";
+  }
+  import ietf-key-chain {
+    prefix key-chain;
+    reference
+      "RFC 8177: YANG Data Model for Key Chains";
+  }
+
+  organization
+    "IETF OPSAWG (Operations and Management Area Working Group)";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
+     WG List:  <mailto:opsawg@ietf.org>
+
+     Editor:   Mohamed Boucadair
+               <mailto:mohamed.boucadair@orange.com>
+     Author:   Richard Roberts
+               <mailto:rroberts@juniper.net>
+     Author:   Oscar Gonzalez de Dios
+               <mailto:oscar.gonzalezdedios@telefonica.com>
+     Author:   Samier Barguil
+               <mailto:ssamier.barguil_giraldo@nokia.com>
+     Author:   Bo Wu
+               <mailto:lana.wubo@huawei.com>";
+  description
+    "This YANG module defines a common attachment circuit (AC)
+     YANG model.
+
+     Copyright (c) 2024 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 Revised BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX; see the
+     RFC itself for full legal notices.";
+
+  revision 2023-11-13 {
+    description
+      "Initial revision.";
+    reference
+      "RFC XXXX: A Common YANG Data Model for Attachment Circuits";
+  }
+
+  /****************************Features************************/
+
+  feature layer2-ac {
+    description
+      "Indicates support of Layer 2 ACs.";
+  }
+
+  feature layer3-ac {
+    description
+      "Indicates support of Layer 3 ACs.";
+  }
+
+  feature server-assigned-reference {
+    description
+      "This feature indicates support for server-generated references
+       and use of such references to access related resources.";
+  }
+
+  /****************************Identities************************/
+  // IP address allocation types
+
+  identity address-allocation-type {
+    description
+      "Base identity for address allocation type in the AC.";
+  }
+
+  identity provider-dhcp {
+    base address-allocation-type;
+    description
+      "The provider's network provides a DHCP service to the
+       customer.";
+  }
+
+  identity provider-dhcp-relay {
+    base address-allocation-type;
+    description
+      "The provider's network provides a DHCP relay service to the
+       customer.";
+  }
+
+  identity provider-dhcp-slaac {
+    if-feature "vpn-common:ipv6";
+    base address-allocation-type;
+    description
+      "The provider's network provides a DHCP service to the customer
+       as well as IPv6 Stateless Address Autoconfiguration (SLAAC).";
+    reference
+      "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+  }
+
+  identity static-address {
+    base address-allocation-type;
+    description
+      "The provider's network provides static IP addressing to the
+       customer.";
+  }
+
+  identity slaac {
+    if-feature "vpn-common:ipv6";
+    base address-allocation-type;
+    description
+      "The provider's network uses IPv6 SLAAC to provide addressing
+       to the customer.";
+    reference
+      "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+  }
+
+  identity dynamic-infra {
+    base address-allocation-type;
+    description
+      "The IP address is dynamically allocated by the hosting
+       infrastrcture.";
+  }
+
+  // next-hop actions
+
+  identity local-defined-next-hop {
+    description
+      "Base identity of local defined next hops.";
+  }
+
+  identity discard {
+    base local-defined-next-hop;
+    description
+      "Indicates an action to discard traffic for the corresponding
+       destination. For example, this can be used to black-hole
+       traffic.";
+  }
+
+  identity local-link {
+    base local-defined-next-hop;
+    description
+      "Treat traffic towards addresses within the specified next-hop
+       prefix as though they are connected to a local link.";
+  }
+
+  // Layer 2 tunnel types
+
+  identity l2-tunnel-type {
+    description
+      "Base identity for Layer 2 tunnel selection for an AC.";
+  }
+
+  identity pseudowire {
+    base l2-tunnel-type;
+    description
+      "Pseudowire tunnel termination for the AC.";
+  }
+
+  identity vpls {
+    base l2-tunnel-type;
+    description
+      "Virtual Private LAN Service (VPLS) tunnel termination for
+       the AC.";
+  }
+
+  identity vxlan {
+    base l2-tunnel-type;
+    description
+      "Virtual eXtensible Local Area Network (VXLAN) tunnel
+       termination for the AC.";
+  }
+
+  // Layer 3 tunnel types
+
+  identity l3-tunnel-type {
+    description
+      "Base identity for Layer 3 tunnel selection for an AC.";
+  }
+
+  identity ip-in-ip {
+    base l3-tunnel-type;
+    description
+      "IP in IP Tunneling.";
+  }
+
+  identity ipsec {
+    base l3-tunnel-type;
+    description
+      "IP Security (IPsec).";
+  }
+
+  identity gre {
+    base l3-tunnel-type;
+    description
+      "Generic Routing Encapsulation (GRE).";
+  }
+
+  // Tagging precedence
+
+  identity precedence-type {
+    description
+      "Redundancy type. The service can be created with primary and
+       secondary tagging.";
+  }
+
+  identity primary {
+    base precedence-type;
+    description
+      "Identifies the main attachment circuit.";
+  }
+
+  identity secondary {
+    base precedence-type;
+    description
+      "Identifies the secondary attachment circuit.";
+  }
+  // AC Type
+
+  identity role {
+    description
+      "Base identity for the network role of an AC.";
+  }
+
+  identity uni {
+    base role;
+      description
+        "User-to-Network Interface (UNI).";
+  }
+
+  identity nni {
+    base role;
+    description
+      "Network-to-Network Interface (NNI).";
+  }
+
+  identity public-nni {
+    base role;
+    description
+      "Public peering.";
+  }
+
+  // More Admin status types
+
+  identity awaiting-validation {
+    base vpn-common:administrative-status;
+    description
+      "This administrative status reflects that a request is
+       pending an adiministrator approval.";
+  }
+
+  identity awaiting-processing {
+    base vpn-common:administrative-status;
+    description
+      "This administrative status reflects that a request was
+       approved and validated, but is awaiting more processing
+       before activation.";
+  }
+
+  identity admin-prohibited {
+    base vpn-common:administrative-status;
+    description
+      "This administrative status reflects that a request cannot
+       be handled because of administrative policies.";
+  }
+  identity rejected {
+    base vpn-common:administrative-status;
+    description
+      "This administrative status reflects that a request was
+       rejected because, e.g., there are no sufficient resources
+       or other reasons not covered by the other status types.";
+  }
+
+  identity bgp-role {
+    description
+      "Used to indicate BGP role when establishing a BGP session.";
+    reference
+      "RFC 9234: Route Leak Prevention and Detection Using
+                 Roles in UPDATE and OPEN Messages, Section 4";
+  }
+
+  identity provider {
+    base bgp-role;
+    description
+      "The local AS is a transit provider of the remote AS.";
+  }
+
+  identity client {
+    base bgp-role;
+    description
+      "The local AS is a transit provider of the remote AS.";
+  }
+
+  identity rs {
+    base bgp-role;
+    description
+      "The local AS is a Route Server (RS).";
+  }
+
+  identity rs-client {
+    base bgp-role;
+    description
+      "The local AS is a client of an RS and the RS is the
+       remote AS.";
+  }
+
+  identity peer {
+    base bgp-role;
+    description
+      "The local and remote ASes have a peering relationship.";
+  }
+
+  /****************************Typedefs************************/
+  typedef predefined-next-hop {
+    type identityref {
+      base local-defined-next-hop;
+    }
+    description
+      "Predefined next-hop designation for locally generated
+       routes.";
+  }
+
+  typedef area-address {
+    type string {
+      pattern '[0-9A-Fa-f]{2}(\.[0-9A-Fa-f]{4}){0,6}';
+    }
+    description
+      "This type defines the area address format.";
+  }
+
+  /************************Reusable groupings********************/
+  /**** Service Status ****/
+
+  grouping service-status {
+    description
+      "Service status grouping.";
+    container status {
+      description
+        "Service status.";
+      container admin-status {
+        description
+          "Administrative service status.";
+        leaf status {
+          type identityref {
+            base vpn-common:administrative-status;
+          }
+          description
+            "Administrative service status.";
+        }
+        leaf last-change {
+          type yang:date-and-time;
+          config false;
+          description
+            "Indicates the actual date and time of the service
+             status change.";
+        }
+      }
+      container oper-status {
+        config false;
+        description
+          "Operational service status.";
+        uses vpn-common:oper-status-timestamp;
+      }
+    }
+  }
+
+  /**** A set of profiles ****/
+
+  grouping ac-profile-cfg {
+    description
+      "Grouping for AC profile configuration.";
+    container valid-provider-identifiers {
+      description
+        "Container for valid provider profile identifiers.
+         The profiles only have significance within the service
+         provider's administrative domain.";
+      list encryption-profile-identifier {
+        key "id";
+        description
+          "List of encryption profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the encryption profile to be used.";
+        }
+      }
+      list qos-profile-identifier {
+        key "id";
+        description
+          "List of QoS profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the QoS profile to be used.";
+        }
+      }
+      list failure-detection-profile-identifier {
+        key "id";
+        description
+          "List of BFD profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the a failure detection (e.g., BFD)
+             profile to be used.";
+        }
+      }
+      list forwarding-profile-identifier {
+        key "id";
+        description
+          "List of forwarding profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the forwarding profile to be used.";
+        }
+      }
+      list routing-profile-identifier {
+        key "id";
+        description
+          "List of routing profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the routing profile to be used by
+             the routing protocols over an AC.";
+        }
+      }
+      nacm:default-deny-write;
+    }
+  }
+
+  /**** Operational instructions ****/
+
+  grouping op-instructions {
+    description
+      "Scheduling instructions.";
+    leaf requested-start {
+      type yang:date-and-time;
+      description
+        "Indicates the requested date and time when the service is
+         expected to be active.";
+    }
+    leaf requested-stop {
+      type yang:date-and-time;
+      description
+        "Indicates the requested date and time when the service is
+         expected to be disabled.";
+    }
+    leaf actual-start {
+      type yang:date-and-time;
+      config false;
+      description
+        "Indicates the actual date and time when the service
+         actually was enabled.";
+    }
+    leaf actual-stop {
+      type yang:date-and-time;
+      config false;
+      description
+        "Indicates the actual date and time when the service
+         actually was disabled.";
+    }
+  }
+
+  /**** Layer 2 encapsulations ****/
+  // Dot1q
+
+  grouping dot1q {
+    description
+      "Defines a grouping for tagged interfaces.";
+    leaf tag-type {
+      type identityref {
+        base vpn-common:tag-type;
+      }
+      description
+        "Tag type.";
+    }
+    leaf cvlan-id {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "VLAN identifier.";
+    }
+  }
+
+  // priority-tagged
+
+  grouping priority-tagged {
+    description
+      "Priority tagged.";
+    leaf tag-type {
+      type identityref {
+        base vpn-common:tag-type;
+      }
+      description
+        "Tag type.";
+    }
+  }
+
+  // QinQ
+
+  grouping qinq {
+    description
+      "Includes QinQ parameters.";
+    leaf tag-type {
+      type identityref {
+        base vpn-common:tag-type;
+      }
+      description
+        "Tag type.";
+    }
+    leaf svlan-id {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "Service VLAN (S-VLAN) identifier.";
+    }
+    leaf cvlan-id {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "Customer VLAN (C-VLAN) identifier.";
+    }
+  }
+
+  /**** Layer 2 tunnel services ****/
+  // pseudowire (PW)
+
+  grouping pseudowire {
+    description
+      "Includes pseudowire termination parameters.";
+    leaf vcid {
+      type uint32;
+      description
+        "Indicates a PW or virtual circuit (VC) identifier.";
+    }
+    leaf far-end {
+      type union {
+        type uint32;
+        type inet:ip-address;
+      }
+      description
+        "Neighbor reference.";
+      reference
+        "RFC 8077: Pseudowire Setup and Maintenance Using the Label
+                   Distribution Protocol (LDP), Section 6.1";
+    }
+  }
+  // VPLS
+
+  grouping vpls {
+    description
+      "VPLS termination parameters.";
+    leaf vcid {
+      type uint32;
+      description
+        "VC identifier.";
+    }
+    leaf-list far-end {
+      type union {
+        type uint32;
+        type inet:ip-address;
+      }
+      description
+        "Neighbor reference.";
+    }
+  }
+
+  // VXLAN
+
+  grouping vxlan {
+    description
+      "VXLAN termination parameters.";
+    leaf vni-id {
+      type uint32;
+      description
+        "VXLAN Network Identifier (VNI).";
+    }
+    leaf peer-mode {
+      type identityref {
+        base vpn-common:vxlan-peer-mode;
+      }
+      description
+        "Specifies the VXLAN access mode. By default,
+         the peer mode is set to 'static-mode'.";
+    }
+    leaf-list peer-ip-address {
+      type inet:ip-address;
+      description
+        "List of a peer's IP addresses.";
+    }
+  }
+
+  // Layer 2 Tunnel service
+
+  grouping l2-tunnel-service {
+    description
+      "Defines a Layer 2 tunnel termination.";
+    leaf type {
+      type identityref {
+        base l2-tunnel-type;
+      }
+      description
+        "Selects the tunnel termination type for an AC.";
+    }
+    container pseudowire {
+      when "derived-from-or-self(../type, 'ac-common:pseudowire')" {
+        description
+          "Only applies when the Layer 2 service type is
+           'pseudowire'.";
+      }
+      description
+        "Includes pseudowire termination parameters.";
+      uses pseudowire;
+    }
+    container vpls {
+      when "derived-from-or-self(../type, 'ac-common:vpls')" {
+        description
+          "Only applies when the Layer 2 service type is 'vpls'.";
+      }
+      description
+        "VPLS termination parameters.";
+      uses vpls;
+    }
+    container vxlan {
+      when "derived-from-or-self(../type, 'ac-common:vxlan')" {
+        description
+          "Only applies when the Layer 2 service type is 'vxlan'.";
+      }
+      description
+        "VXLAN termination parameters.";
+      uses vxlan;
+    }
+  }
+
+  /**** Layer 3 connection *****/
+  // IPv4 allocation type
+
+  grouping ipv4-allocation-type {
+    description
+      "IPv4-specific parameters.";
+    leaf prefix-length {
+      type uint8 {
+        range "0..32";
+      }
+      description
+        "Subnet prefix length expressed in bits. It is applied to
+         both local and customer addresses.";
+    }
+    leaf address-allocation-type {
+      type identityref {
+        base address-allocation-type;
+      }
+      must "not(derived-from-or-self(current(), 'ac-common:slaac') "
+         + "or derived-from-or-self(current(), "
+         + "'ac-common:provider-dhcp-slaac'))" {
+        error-message "SLAAC is only applicable to IPv6.";
+      }
+      description
+        "Defines how IPv4 addresses are allocated to the peer site.";
+    }
+  }
+
+  // IPv6 allocation type
+
+  grouping ipv6-allocation-type {
+    description
+      "IPv6-specific parameters.";
+    leaf prefix-length {
+      type uint8 {
+        range "0..128";
+      }
+      description
+        "Subnet prefix length expressed in bits. It is applied to
+          both local and customer addresses.";
+    }
+    leaf address-allocation-type {
+      type identityref {
+        base address-allocation-type;
+      }
+      description
+        "Defines how IPv6 addresses are allocated to the peer site.";
+    }
+  }
+
+  // Basic parameters for IPv4 connection
+
+  grouping ipv4-connection-basic {
+    description
+      "Basic set fof IPv4-specific parameters for the connection.";
+    uses ipv4-allocation-type;
+    choice allocation-type {
+      description
+        "Choice of the IPv4 address allocation.";
+      case dynamic {
+        description
+          "When the addresses are allocated by DHCP or other dynamic
+           means local to the infrastructure.";
+        choice provider-dhcp {
+          description
+            "Parameters related to DHCP-allocated addresses. IP
+             addresses are allocated by DHCP, that is provided by
+             the operator.";
+          leaf dhcp-service-type {
+            type enumeration {
+              enum server {
+                description
+                  "Local DHCP server.";
+              }
+              enum relay {
+                description
+                  "Local DHCP relay.  DHCP requests are relayed to
+                   a provider's server.";
+              }
+            }
+            description
+              "Indicates the type of DHCP service to be enabled on
+               an AC.";
+          }
+        }
+        choice dhcp-relay {
+          description
+            "The DHCP relay is provided by the operator.";
+          container customer-dhcp-servers {
+            description
+              "Container for a list of the customer's DHCP servers.";
+            leaf-list server-ip-address {
+              type inet:ipv4-address;
+              description
+                "IPv4 addresses of the customer's DHCP server.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // Basic parameters for IPv6 connection
+
+  grouping ipv6-connection-basic {
+    description
+      "Basic set fof IPv6-specific parameters for the connection.";
+    uses ipv6-allocation-type;
+    choice allocation-type {
+      description
+        "Choice of the IPv6 address allocation.";
+      case dynamic {
+        description
+          "When the addresses are allocated by DHCP or other dynamic
+           means local to the infrastructure.";
+        choice provider-dhcp {
+          description
+            "Parameters related to DHCP-allocated addresses.
+             IP addresses are allocated by DHCP, that is provided
+             by the operator.";
+          leaf dhcp-service-type {
+            type enumeration {
+              enum server {
+                description
+                  "Local DHCP server.";
+              }
+              enum relay {
+                description
+                  "Local DHCP relay.  DHCP requests are relayed to a
+                   provider's server.";
+              }
+            }
+            description
+              "Indicates the type of DHCP service to be enabled on
+               the AC.";
+          }
+        }
+        choice dhcp-relay {
+          description
+            "The DHCP relay is provided by the operator.";
+          container customer-dhcp-servers {
+            description
+              "Container for a list of the customer's DHCP servers.";
+            leaf-list server-ip-address {
+              type inet:ipv6-address;
+              description
+                "IPv6 addresses of the customer's DHCP server.";
+            }
+          }
+        }
+      }
+    }
+  }
+  // Full parameters for the IPv4 connection
+
+  grouping ipv4-connection {
+    description
+      "IPv4-specific parameters.";
+    leaf local-address {
+      type inet:ipv4-address;
+      description
+        "The IP address used at the provider's interface.";
+    }
+    leaf virtual-address {
+      type inet:ipv4-address;
+      description
+        "This addresss may be used for redundancy purposes.";
+    }
+    uses ipv4-allocation-type;
+    choice allocation-type {
+      description
+        "Choice of the IPv4 address allocation.";
+      case dynamic {
+        description
+          "When the addresses are allocated by DHCP or other
+           dynamic means local to the infrastructure.";
+        choice address-assign {
+          description
+            "A choice for how IPv4 addresses are assigned.";
+          case number {
+            leaf number-of-dynamic-address {
+              type uint16;
+              description
+                "Specifies the number of IP addresses to be assigned
+                 to the customer on the AC.";
+            }
+          }
+          case explicit {
+            container customer-addresses {
+              description
+                "Container for customer addresses to be allocated
+                 using DHCP.";
+              list address-pool {
+                key "pool-id";
+                description
+                  "Describes IP addresses to be dyncamically
+                   allocated.
+
+                   When only 'start-address' is present, it
+                   represents a single address.
+
+                   When both 'start-address' and 'end-address' are
+                   specified, it implies a range inclusive of both
+                   addresses.";
+                leaf pool-id {
+                  type string;
+                  description
+                    "A pool identifier for the address range from
+                     'start-address' to 'end-address'.";
+                }
+                leaf start-address {
+                  type inet:ipv4-address;
+                  mandatory true;
+                  description
+                    "Indicates the first address in the pool.";
+                }
+                leaf end-address {
+                  type inet:ipv4-address;
+                  description
+                    "Indicates the last address in the pool.";
+                }
+              }
+            }
+          }
+        }
+        choice provider-dhcp {
+          description
+            "Parameters related to DHCP-allocated addresses. IP
+             addresses are allocated by DHCP, which is provided by
+             the operator.";
+          leaf dhcp-service-type {
+            type enumeration {
+              enum server {
+                description
+                  "Local DHCP server.";
+              }
+              enum relay {
+                description
+                  "Local DHCP relay.  DHCP requests are relayed to
+                   a provider's server.";
+              }
+            }
+            description
+              "Indicates the type of DHCP service to be enabled on
+               this AC.";
+          }
+        }
+        choice dhcp-relay {
+          description
+            "The DHCP relay is provided by the operator.";
+          container customer-dhcp-servers {
+            description
+              "Container for a list of the customer's DHCP servers.";
+            leaf-list server-ip-address {
+              type inet:ipv4-address;
+              description
+                "IPv4 addresses of the customer's DHCP server.";
+            }
+          }
+        }
+      }
+      case static-addresses {
+        description
+          "Lists the IPv4 addresses that are used.";
+        list address {
+          key "address-id";
+          ordered-by user;
+          description
+            "Lists the IPv4 addresses that are used. The first
+             address of the list is the primary address of the
+             connection.";
+          leaf address-id {
+            type string;
+            description
+              "An identifier of the static IPv4 address.";
+          }
+          leaf customer-address {
+            type inet:ipv4-address;
+            description
+              "An IPv4 address of the customer side.";
+          }
+        }
+      }
+    }
+  }
+
+  // Full parameters for the IPv6 connection
+
+  grouping ipv6-connection {
+    description
+      "IPv6-specific parameters.";
+    leaf local-address {
+      type inet:ipv6-address;
+      description
+        "IPv6 address of the provider side.";
+    }
+    leaf virtual-address {
+      type inet:ipv6-address;
+      description
+        "This addresss may be used for redundancy purposes.";
+    }
+    uses ipv6-allocation-type;
+    choice allocation-type {
+      description
+        "Choice of the IPv6 address allocation.";
+      case dynamic {
+        description
+          "When the addresses are allocated by DHCP or other
+           dynamic means local to the infrastructure.";
+        choice address-assign {
+          description
+            "A choice for how IPv6 addresses are assigned.";
+          case number {
+            leaf number-of-dynamic-address {
+              type uint16;
+              description
+                "Specifies the number of IP addresses to be
+                 assigned to the customer on this access.";
+            }
+          }
+          case explicit {
+            container customer-addresses {
+              description
+                "Container for customer addresses to be allocated
+                 using DHCP.";
+              list address-pool {
+                key "pool-id";
+                description
+                  "Describes IP addresses to be dyncamically
+                   allocated.
+
+                   When only 'start-address' is present, it
+                   represents a single address.
+
+                   When both 'start-address' and 'end-address' are
+                   specified, it implies a range inclusive of both
+                   addresses.";
+                leaf pool-id {
+                  type string;
+                  description
+                    "A pool identifier for the address range from
+                     'start-address' to 'end-address'.";
+                }
+                leaf start-address {
+                  type inet:ipv6-address;
+                  mandatory true;
+                  description
+                    "Indicates the first address in the pool.";
+                }
+                leaf end-address {
+                  type inet:ipv6-address;
+                  description
+                    "Indicates the last address in the pool.";
+                }
+              }
+            }
+          }
+        }
+        choice provider-dhcp {
+          description
+            "Parameters related to DHCP-allocated addresses.
+             IP addresses are allocated by DHCP, which is provided
+             by the operator.";
+          leaf dhcp-service-type {
+            type enumeration {
+              enum server {
+                description
+                  "Local DHCP server.";
+              }
+              enum relay {
+                description
+                  "Local DHCP relay.  DHCP requests are relayed
+                   to a provider's server.";
+              }
+            }
+            description
+              "Indicates the type of DHCP service to
+               be enabled on this access.";
+          }
+        }
+        choice dhcp-relay {
+          description
+            "The DHCP relay is provided by the operator.";
+          container customer-dhcp-servers {
+            description
+              "Container for a list of the customer's DHCP servers.";
+            leaf-list server-ip-address {
+              type inet:ipv6-address;
+              description
+                "IPv6 addresses of the customer's DHCP server.";
+            }
+          }
+        }
+      }
+      case static-addresses {
+        description
+          "Lists the IPv6 addresses that are used.";
+        list address {
+          key "address-id";
+          ordered-by user;
+          description
+            "Lists the IPv6 addresses that are used. The first
+             address of the list is the primary IP address of
+             the connection.";
+          leaf address-id {
+            type string;
+            description
+              "An identifier of the static IPv6 address.";
+          }
+          leaf customer-address {
+            type inet:ipv6-address;
+            description
+              "An IPv6 address of the customer side.";
+          }
+        }
+      }
+    }
+  }
+
+  /**** Routing ****/
+  // Routing authentication
+
+  grouping bgp-authentication {
+    description
+      "Grouping for BGP authentication parameters.";
+    container authentication {
+      description
+        "Container for BGP authentication  parameters.";
+      leaf enabled {
+        type boolean;
+        description
+          "Enables or disables authentication.";
+      }
+      container keying-material {
+        when "../enabled = 'true'";
+        description
+          "Container for describing how a BGP routing session is to
+           be secured on an AC.";
+        choice option {
+          description
+            "Choice of authentication options.";
+          case ao {
+            description
+              "Uses the TCP Authentication Option (TCP-AO).";
+            reference
+              "RFC 5925: The TCP Authentication Option";
+            leaf enable-ao {
+              type boolean;
+              description
+                "Enables the TCP-AO.";
+            }
+            leaf ao-keychain {
+              type key-chain:key-chain-ref;
+              description
+                "Reference to the TCP-AO key chain.";
+              reference
+                "RFC 8177: YANG Data Model for Key Chains";
+            }
+          }
+          case md5 {
+            description
+              "Uses MD5 to secure the session.";
+            reference
+              "RFC 4364: BGP/MPLS IP Virtual Private Networks
+                         (VPNs), Section 13.2";
+            leaf md5-keychain {
+              type key-chain:key-chain-ref;
+              description
+                "Reference to the MD5 key chain.";
+              reference
+                "RFC 8177: YANG Data Model for Key Chains";
+            }
+          }
+          case explicit {
+            leaf key-id {
+              type uint32;
+              description
+                "Key identifier.";
+            }
+            leaf key {
+              type string;
+              description
+                "BGP authentication key.
+
+                 This model only supports the subset of keys that
+                 are representable as ASCII strings.";
+            }
+            leaf crypto-algorithm {
+              type identityref {
+                base key-chain:crypto-algorithm;
+              }
+              description
+                "Indicates the cryptographic algorithm associated
+                 with the key.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping ospf-authentication {
+    description
+      "Authentication configuration.";
+    container authentication {
+      description
+        "Container for OSPF authentication  parameters.";
+      leaf enabled {
+        type boolean;
+        description
+          "Enables or disables authentication.";
+      }
+      container keying-material {
+        when "../enabled = 'true'";
+        description
+          "Container for describing how an OSPF session is to be
+           secured for this AC.";
+        choice option {
+          description
+            "Options for OSPF authentication.";
+          case auth-key-chain {
+            leaf key-chain {
+              type key-chain:key-chain-ref;
+              description
+                "Name of the key chain.";
+            }
+          }
+          case auth-key-explicit {
+            leaf key-id {
+              type uint32;
+              description
+                "Key identifier.";
+            }
+            leaf key {
+              type string;
+              description
+                "OSPF authentication key.
+                 This model only supports the subset of keys that
+                 are representable as ASCII strings.";
+            }
+            leaf crypto-algorithm {
+              type identityref {
+                base key-chain:crypto-algorithm;
+              }
+              description
+                "Indicates the cryptographic algorithm associated
+                 with the key.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping isis-authentication {
+    description
+      "IS-IS authentication configuration.";
+    container authentication {
+      description
+        "Container for IS-IS authentication  parameters.";
+      leaf enabled {
+        type boolean;
+        description
+          "Enables or disables authentication.";
+      }
+      container keying-material {
+        when "../enabled = 'true'";
+        description
+          "Container for describing how an IS-IS session is secured
+           over an AC.";
+        choice option {
+          description
+            "Options for IS-IS authentication.";
+          case auth-key-chain {
+            leaf key-chain {
+              type key-chain:key-chain-ref;
+              description
+                "Name of the key chain.";
+            }
+          }
+          case auth-key-explicit {
+            leaf key-id {
+              type uint32;
+              description
+                "Key identifier.";
+            }
+            leaf key {
+              type string;
+              description
+                "IS-IS authentication key.
+
+                 This model only supports the subset of keys that
+                 are representable as ASCII strings.";
+            }
+            leaf crypto-algorithm {
+              type identityref {
+                base key-chain:crypto-algorithm;
+              }
+              description
+                "Indicates the cryptographic algorithm associated
+                 with the key.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping rip-authentication {
+    description
+      "RIP authentication configuration.";
+    container authentication {
+      description
+        "Container for RIP authentication  parameters.";
+      leaf enabled {
+        type boolean;
+        description
+          "Enables or disables authentication.";
+      }
+      container keying-material {
+        when "../enabled = 'true'";
+        description
+          "Container for describing how a RIP session is to be
+           secured on this AC.";
+        choice option {
+          description
+            "Specifies the authentication
+             scheme.";
+          case auth-key-chain {
+            leaf key-chain {
+              type key-chain:key-chain-ref;
+              description
+                "Name of the key chain.";
+            }
+          }
+          case auth-key-explicit {
+            leaf key {
+              type string;
+              description
+                "RIP authentication key.
+
+                 This model only supports the subset of keys that
+                 are representable as ASCII strings.";
+            }
+            leaf crypto-algorithm {
+              type identityref {
+                base key-chain:crypto-algorithm;
+              }
+              description
+                "Indicates the cryptographic algorithm associated
+                 with the key.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // Basic routing parameters
+
+  grouping bgp-peer-group-without-name {
+    description
+      "Identifies a BGP peer-group configured on the local system.";
+    leaf local-as {
+      type inet:as-number;
+      description
+        "Indicates a local AS Number (ASN). This ASN is exposed
+         to a customer so that it knows which ASN to use
+         to set up a BGP session.";
+    }
+    leaf peer-as {
+      type inet:as-number;
+      description
+        "Indicates the customer's ASN when the customer
+         requests BGP routing.";
+    }
+    leaf address-family {
+      type identityref {
+        base vpn-common:address-family;
+      }
+      description
+        "This node contains the address families to be activated.
+         'dual-stack' means that both IPv4 and IPv6 will be
+         activated.";
+    }
+    leaf role {
+      type identityref {
+        base ac-common:bgp-role;
+      }
+      description
+        "Specifies the BGP role (provider, customer, peer, etc.).";
+      reference
+        "RFC 9234: Route Leak Prevention and Detection Using
+                   Roles in UPDATE and OPEN Messages, Section 4";
+    }
+  }
+
+  grouping bgp-peer-group-with-name {
+    description
+      "Identifies a BGP peer-group configured on the local system -
+       identified by a peer-group name.";
+    leaf name {
+      type string;
+      description
+        "Name of the BGP peer-group.";
+    }
+    uses bgp-peer-group-without-name;
+  }
+
+  grouping ospf-basic {
+    description
+      "Configuration specific to OSPF.";
+    leaf address-family {
+      type identityref {
+        base vpn-common:address-family;
+      }
+      description
+        "Indicates whether IPv4, IPv6, or both are to be activated.";
+    }
+    leaf area-id {
+      type yang:dotted-quad;
+      mandatory true;
+      description
+        "Area ID.";
+      reference
+        "RFC 4577: OSPF as the Provider/Customer Edge Protocol
+                   for BGP/MPLS IP Virtual Private Networks
+                   (VPNs), Section 4.2.3
+         RFC 6565: OSPFv3 as a Provider Edge to Customer Edge
+                   (PE-CE) Routing Protocol, Section 4.2";
+    }
+    leaf metric {
+      type uint16;
+      description
+        "Metric of the AC.  It is used in the routing state
+         calculation and path selection.";
+    }
+  }
+
+  grouping isis-basic {
+    description
+      "Basic configuration specific to IS-IS.";
+    leaf address-family {
+      type identityref {
+        base vpn-common:address-family;
+      }
+      description
+        "Indicates whether IPv4, IPv6, or both are to be activated.";
+    }
+    leaf area-address {
+      type area-address;
+      mandatory true;
+      description
+        "Area address.";
+    }
+  }
+
+  // Static routing
+
+  grouping ipv4-static-rtg-entry {
+    description
+      "Paramters to configure a specific IPv4 static routing entry.";
+    leaf lan {
+      type inet:ipv4-prefix;
+      description
+        "LAN prefix.";
+    }
+    leaf lan-tag {
+      type string;
+      description
+        "Internal tag to be used in service policies.";
+    }
+    leaf next-hop {
+      type union {
+        type inet:ip-address;
+        type predefined-next-hop;
+      }
+      description
+        "The next hop that is to be used for the static route.
+         This may be specified as an IP address or a
+         predefined next-hop type (e.g., 'discard' or
+         'local-link').";
+    }
+    leaf metric {
+      type uint32;
+      description
+        "Indicates the metric associated with the static route.";
+    }
+  }
+
+  grouping ipv4-static-rtg {
+    description
+      "Configuration specific to IPv4 static routing.";
+    list ipv4-lan-prefixes {
+      if-feature "vpn-common:ipv4";
+      key "lan next-hop";
+      description
+        "List of LAN prefixes for the site.";
+      uses ipv4-static-rtg-entry;
+      uses ac-common:service-status;
+    }
+  }
+
+  grouping ipv6-static-rtg-entry {
+    description
+      "Paramters to configure a specific IPv6 static routing entry.";
+    leaf lan {
+      type inet:ipv6-prefix;
+      description
+        "LAN prefixes.";
+    }
+    leaf lan-tag {
+      type string;
+      description
+        "Internal tag to be used in service (e.g., VPN) policies.";
+    }
+    leaf next-hop {
+      type union {
+        type inet:ip-address;
+        type predefined-next-hop;
+      }
+      description
+        "The next hop that is to be used for the static route.
+         This may be specified as an IP address or a predefined
+         next-hop type (e.g., 'discard' or 'local-link').";
+    }
+    leaf metric {
+      type uint32;
+      description
+        "Indicates the metric associated with the static route.";
+    }
+  }
+
+  grouping ipv6-static-rtg {
+    description
+      "Configuration specific to IPv6 static routing.";
+    list ipv6-lan-prefixes {
+      if-feature "vpn-common:ipv6";
+      key "lan next-hop";
+      description
+        "List of LAN prefixes for the site.";
+      uses ipv6-static-rtg-entry;
+      uses ac-common:service-status;
+    }
+  }
+
+  // OAM
+
+  grouping bfd {
+    description
+      "A grouping for basic BFD.";
+    leaf holdtime {
+      type uint32;
+      units "milliseconds";
+      description
+        "Expected BFD holdtime.
+         The customer may impose some fixed values
+         for the holdtime period if the provider allows
+         the customer to use this function.
+         If the provider doesn't allow the customer to
+         use this function, fixed values will not be set.";
+      reference
+        "RFC 5880: Bidirectional Forwarding Detection (BFD),
+                   Section 6.8.18";
+    }
+  }
+
+  // redundancy
+
+  grouping redundancy-group {
+    description
+      "A grouping for redundancy group.";
+    list group {
+       key "group-id";
+       description
+         "List of group-ids.";
+       leaf group-id {
+         type string;
+         description
+           "Indicates the group-id to which the AC belongs.";
+       }
+       leaf precedence {
+         type identityref {
+           base ac-common:precedence-type;
+         }
+         description
+           "Defines redundancy of an AC.";
+       }
+     }
+   }
+
+  // QoS
+
+  grouping bandwidth-parameters {
+    description
+      "A grouping for bandwidth parameters.";
+    leaf cir {
+      type uint64;
+      units "bps";
+      description
+        "Committed Information Rate (CIR). The maximum number of bits
+         that a port can receive or send during one second over
+         an interface.";
+    }
+    leaf cbs {
+      type uint64;
+      units "bytes";
+      description
+        "Committed Burst Size (CBS). CBS controls the bursty nature
+         of the traffic.  Traffic that does not use the configured
+         CIR accumulates credits until the credits reach the
+         configured CBS.";
+    }
+    leaf eir {
+      type uint64;
+      units "bps";
+      description
+        "Excess Information Rate (EIR), i.e., excess frame delivery
+         allowed not subject to a Service Level Agreement (SLA).
+         The traffic rate can be limited by EIR.";
+    }
+    leaf ebs {
+      type uint64;
+      units "bytes";
+      description
+        "Excess Burst Size (EBS).  The bandwidth available for burst
+         traffic from the EBS is subject to the amount of bandwidth
+         that is accumulated during periods when traffic allocated
+         by the EIR policy is not used.";
+    }
+    leaf pir {
+      type uint64;
+      units "bps";
+      description
+        "Peak Information Rate (PIR), i.e., maximum frame delivery
+         allowed. It is equal to or less than sum of CIR and EIR.";
+    }
+    leaf pbs {
+      type uint64;
+      units "bytes";
+      description
+        "Peak Burst Size (PBS).";
+    }
+  }
+
+  grouping bandwidth-per-type {
+    description
+      "Grouping for bandwidth per type.";
+    list bandwidth {
+      key "bw-type";
+      description
+        "List for bandwidth per type data nodes.";
+      leaf bw-type {
+        type identityref {
+          base vpn-common:bw-type;
+        }
+        description
+          "Indicates the bandwidth type.";
+      }
+      choice type {
+        description
+          "Choice based upon bandwidth type.";
+        case per-cos {
+          description
+            "Bandwidth per CoS.";
+          list cos {
+            key "cos-id";
+            description
+              "List of Class of Services.";
+            leaf cos-id {
+              type uint8;
+              description
+                "Identifier of the CoS, indicated by a Differentiated
+                 Services Code Point (DSCP) or a CE-CLAN CoS (802.1p)
+                 value in the service frame.";
+              reference
+                "IEEE Std 802.1Q: Bridges and Bridged Networks";
+            }
+            uses bandwidth-parameters;
+          }
+        }
+        case other {
+          description
+            "Other bandwidth types.";
+          uses bandwidth-parameters;
+        }
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ac-svc@2024-08-06.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ac-svc@2024-08-06.yang
new file mode 100644
index 0000000000000000000000000000000000000000..a5790644f1f7600cfad42663f2e7c7ed13134ac1
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ac-svc@2024-08-06.yang
@@ -0,0 +1,1252 @@
+module ietf-ac-svc {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-ac-svc";
+  prefix ac-svc;
+
+  import ietf-ac-common {
+    prefix ac-common;
+    reference
+      "RFC CCCC: A Common YANG Data Model for Attachment Circuits";
+  }
+  import ietf-vpn-common {
+    prefix vpn-common;
+    reference
+      "RFC 9181: A Common YANG Data Model for Layer 2 and Layer 3
+                 VPNs";
+  }
+  import ietf-netconf-acm {
+    prefix nacm;
+    reference
+      "RFC 8341: Network Configuration Access Control Model";
+  }
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types, Section 4";
+  }
+  import ietf-key-chain {
+    prefix key-chain;
+    reference
+      "RFC 8177: YANG Data Model for Key Chains";
+  }
+
+  organization
+    "IETF OPSAWG (Operations and Management Area Working Group)";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
+     WG List:  <mailto:opsawg@ietf.org>
+
+     Editor:   Mohamed Boucadair
+               <mailto:mohamed.boucadair@orange.com>
+     Author:   Richard Roberts
+               <mailto:rroberts@juniper.net>
+     Author:   Oscar Gonzalez de Dios
+               <mailto:oscar.gonzalezdedios@telefonica.com>
+     Author:   Samier Barguil
+               <mailto:ssamier.barguil_giraldo@nokia.com>
+     Author:   Bo Wu
+               <mailto:lana.wubo@huawei.com>";
+  description
+    "This YANG module defines a YANG model for exposing
+     attachment circuits as a service (ACaaS).
+
+     Copyright (c) 2024 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 Revised BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX; see the
+     RFC itself for full legal notices.";
+
+  revision 2024-08-06 {
+    description
+      "Initial revision.";
+    reference
+      "RFC XXXX: YANG Data Models for Bearers and 'Attachment
+                 Circuits'-as-a-Service (ACaaS)";
+  }
+
+  /* A set of typedefs to ease referencing cross-modules */
+
+  typedef attachment-circuit-reference {
+    type leafref {
+      path "/ac-svc:attachment-circuits/ac-svc:ac/ac-svc:name";
+    }
+    description
+      "Defines a reference to an attachment circuit that can be used
+       by other modules.";
+  }
+
+  typedef ac-group-reference {
+    type leafref {
+      path "/ac-svc:attachment-circuits/ac-svc:ac-group-profile"
+         + "/ac-svc:name";
+    }
+    description
+      "Defines a reference to an attachment circuit profile.";
+  }
+
+  typedef encryption-profile-reference {
+    type leafref {
+      path
+        "/ac-svc:specific-provisioning-profiles"
+      + "/ac-svc:valid-provider-identifiers"
+      + "/ac-svc:encryption-profile-identifier/ac-svc:id";
+    }
+    description
+      "Defines a reference to an encryption profile.";
+  }
+
+  typedef qos-profile-reference {
+    type leafref {
+      path
+        "/ac-svc:specific-provisioning-profiles"
+      + "/ac-svc:valid-provider-identifiers"
+      + "/ac-svc:qos-profile-identifier/ac-svc:id";
+    }
+    description
+      "Defines a reference to a QoS profile.";
+  }
+
+  typedef failure-detection-profile-reference {
+    type leafref {
+      path
+        "/ac-svc:specific-provisioning-profiles"
+      + "/ac-svc:valid-provider-identifiers"
+      + "/ac-svc:failure-detection-profile-identifier"
+      + "/ac-svc:id";
+    }
+    description
+      "Defines a reference to a BFD profile.";
+  }
+
+  typedef forwarding-profile-reference {
+    type leafref {
+      path
+        "/ac-svc:specific-provisioning-profiles"
+      + "/ac-svc:valid-provider-identifiers"
+      + "/ac-svc:forwarding-profile-identifier/ac-svc:id";
+    }
+    description
+      "Defines a reference to a forwarding profile.";
+  }
+
+  typedef routing-profile-reference {
+    type leafref {
+      path
+        "/ac-svc:specific-provisioning-profiles"
+      + "/ac-svc:valid-provider-identifiers"
+      + "/ac-svc:routing-profile-identifier/ac-svc:id";
+    }
+    description
+      "Defines a reference to a routing profile.";
+  }
+
+  typedef service-profile-reference {
+    type leafref {
+      path
+        "/ac-svc:service-provisioning-profiles"
+      + "/ac-svc:service-profile-identifier"
+      + "/ac-svc:id";
+    }
+    description
+      "Defines a reference to a service profile.";
+  }
+
+  /******************** Reusable groupings ********************/
+  // Basic Layer 2 connection
+
+  grouping l2-connection-basic {
+    description
+      "Defines Layer 2 protocols and parameters that can be
+       factorized when provisioning Layer 2 connectivity
+       among multiple ACs.";
+    container encapsulation {
+      description
+        "Container for Layer 2 encapsulation.";
+      leaf type {
+        type identityref {
+          base vpn-common:encapsulation-type;
+        }
+        description
+          "Encapsulation type.";
+      }
+      container dot1q {
+        when "derived-from-or-self(../type, 'vpn-common:dot1q')" {
+          description
+            "Only applies when the type of the tagged interface
+             is 'dot1q'.";
+        }
+        description
+          "Tagged interface.";
+        uses ac-common:dot1q;
+      }
+      container qinq {
+        when "derived-from-or-self(../type, 'vpn-common:qinq')" {
+          description
+            "Only applies when the type of the tagged interface
+             is 'qinq'.";
+        }
+        description
+          "Includes QinQ parameters.";
+        uses ac-common:qinq;
+      }
+    }
+  }
+
+  // Full Layer 2 connection
+
+  grouping l2-connection {
+    description
+      "Defines Layer 2 protocols and parameters that are used to
+       enable AC connectivity.";
+    container encapsulation {
+      description
+        "Container for Layer 2 encapsulation.";
+      leaf type {
+        type identityref {
+          base vpn-common:encapsulation-type;
+        }
+        description
+          "Indicates the encapsulation type.";
+      }
+      container dot1q {
+        when "derived-from-or-self(../type, 'vpn-common:dot1q')" {
+          description
+            "Only applies when the type of the tagged interface
+             is 'dot1q'.";
+        }
+        description
+          "Tagged interface.";
+        uses ac-common:dot1q;
+      }
+      container priority-tagged {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:priority-tagged')" {
+          description
+            "Only applies when the type of the tagged interface is
+             'priority-tagged'.";
+        }
+        description
+          "Priority-tagged interface.";
+        uses ac-common:priority-tagged;
+      }
+      container qinq {
+        when "derived-from-or-self(../type, 'vpn-common:qinq')" {
+          description
+            "Only applies when the type of the tagged interface
+             is 'qinq'.";
+        }
+        description
+          "Includes QinQ parameters.";
+        uses ac-common:qinq;
+      }
+    }
+    choice l2-service {
+      description
+        "The Layer 2 connectivity service can be provided by
+         indicating a pointer to an L2VPN or by specifying a
+         Layer 2 tunnel service.";
+      container l2-tunnel-service {
+        description
+          "Defines a Layer 2 tunnel termination.
+           It is only applicable when a tunnel is required.";
+        uses ac-common:l2-tunnel-service;
+      }
+      case l2vpn {
+        leaf l2vpn-id {
+          type vpn-common:vpn-id;
+          description
+            "Indicates the L2VPN service associated with an
+             Integrated Routing and Bridging (IRB) interface.";
+        }
+      }
+    }
+    leaf bearer-reference {
+      if-feature "ac-common:server-assigned-reference";
+      type string;
+      description
+        "This is an internal reference for the service provider
+         to identify the bearer associated with this AC.";
+    }
+  }
+
+  // Basic IP connection
+
+  grouping ip-connection-basic {
+    description
+      "Defines basic IP connection parameters.";
+    container ipv4 {
+      if-feature "vpn-common:ipv4";
+      description
+        "IPv4-specific parameters.";
+      uses ac-common:ipv4-connection-basic;
+    }
+    container ipv6 {
+      if-feature "vpn-common:ipv6";
+      description
+        "IPv6-specific parameters.";
+      uses ac-common:ipv6-connection-basic;
+    }
+  }
+
+  // Full IP connection
+
+  grouping ip-connection {
+    description
+      "Defines IP connection parameters.";
+    container ipv4 {
+      if-feature "vpn-common:ipv4";
+      description
+        "IPv4-specific parameters.";
+      uses ac-common:ipv4-connection {
+        augment ac-svc:allocation-type/static-addresses/address {
+          leaf failure-detection-profile {
+            if-feature "vpn-common:bfd";
+            type failure-detection-profile-reference;
+            description
+              "Points to a failure detection profile.";
+          }
+          description
+            "Adds a failure detection profile.";
+        }
+      }
+    }
+    container ipv6 {
+      if-feature "vpn-common:ipv6";
+      description
+        "IPv6-specific parameters.";
+      uses ac-common:ipv6-connection {
+        augment ac-svc:allocation-type/static-addresses/address {
+          leaf failure-detection-profile {
+            if-feature "vpn-common:bfd";
+            type failure-detection-profile-reference;
+            description
+              "Points to a failure detection profile.";
+          }
+          description
+            "Adds a failure detection profile.";
+        }
+      }
+    }
+    choice l3-service {
+      description
+        "The Layer 3 connectivity service can be provided by
+         specifying a Layer 3 tunnel service.";
+      container l3-tunnel-service {
+        description
+          "Defines a Layer 3 tunnel termination.
+           It is only applicable when a tunnel is required.";
+        leaf type {
+          type identityref {
+            base ac-common:l3-tunnel-type;
+          }
+          description
+            "Selects the tunnel termination type for an AC.";
+        }
+      }
+    }
+  }
+
+  // Routing protocol list
+
+  grouping routing-protocol-list {
+    description
+      "List of routing protocols used on the AC.";
+    leaf type {
+      type identityref {
+        base vpn-common:routing-protocol-type;
+      }
+      description
+        "Type of routing protocol.";
+    }
+    list routing-profiles {
+      key "id";
+      description
+        "Routing profiles.";
+      leaf id {
+        type routing-profile-reference;
+        description
+          "Reference to the routing profile to be used.";
+      }
+      leaf type {
+        type identityref {
+          base vpn-common:ie-type;
+        }
+        description
+          "Import, export, or both.";
+      }
+    }
+  }
+
+  // Static routing with BFD
+
+  grouping ipv4-static-rtg-with-bfd {
+    description
+      "Configuration specific to IPv4 static routing with
+       failure protection (e.g., BFD).";
+    list ipv4-lan-prefix {
+      if-feature "vpn-common:ipv4";
+      key "lan next-hop";
+      description
+        "List of LAN prefixes for the site.";
+      uses ac-common:ipv4-static-rtg-entry;
+      leaf failure-detection-profile {
+        if-feature "vpn-common:bfd";
+        type failure-detection-profile-reference;
+        description
+          "Points to a failure detection profile.";
+      }
+      uses ac-common:service-status;
+    }
+  }
+
+  grouping ipv6-static-rtg-with-bfd {
+    description
+      "Configuration specific to IPv6 static routing with
+       failure protection (e.g., BFD).";
+    list ipv6-lan-prefix {
+      if-feature "vpn-common:ipv6";
+      key "lan next-hop";
+      description
+        "List of LAN prefixes for the site.";
+      uses ac-common:ipv6-static-rtg-entry;
+      leaf failure-detection-profile {
+        if-feature "vpn-common:bfd";
+        type failure-detection-profile-reference;
+        description
+          "Points to a failure detection profile.";
+      }
+      uses ac-common:service-status;
+    }
+  }
+
+  //  BGP Service 
+
+  grouping bgp-neighbor-without-name {
+    description
+      "A grouping with generic parameters for configuring a BGP 
+       neighbor.";
+    leaf remote-address {
+      type inet:ip-address;
+      description
+        "The remote IP address of this entry's BGP peer. This is
+         a customer IP address.
+
+         If this leaf is not present, this means that the primary
+         customer IP address is used as remote IP address.";
+    }
+    leaf local-address {
+      type inet:ip-address;
+      description
+        "The provider's IP address that will be used to establish
+         the BGP session.";
+    }
+    uses ac-common:bgp-peer-group-without-name;
+    container bgp-max-prefix {
+      description
+        "A container for the maximum number of BGP prefixes
+         allowed in the BGP session.";
+      leaf max-prefix {
+        type uint32;
+        description
+          "Indicates the maximum number of BGP prefixes allowed
+           in the BGP session.
+
+           It allows control of how many prefixes can be received
+           from a neighbor.";
+        reference
+          "RFC 4271: A Border Gateway Protocol 4 (BGP-4),
+                     Section 8.2.2";
+      }
+    }
+    uses ac-common:bgp-authentication;
+    uses ac-common:op-instructions;
+    uses ac-common:service-status;
+  }
+
+  grouping bgp-neighbor-with-name {
+    description
+      "A grouping with generic parameters for configuring a BGP 
+       neighbor with an identifier.";
+    leaf id {
+      type string;
+      description
+        "An identifier that uniquely identifies a neighbor.";
+    }
+    uses ac-svc:bgp-neighbor-without-name;
+  }
+
+  grouping bgp-neighbor-with-server-reference {
+    description
+      "A grouping with generic parameters for configuring a BGP 
+       neighbor with a reference generated by the provider.";
+    leaf server-reference {
+      if-feature "ac-common:server-assigned-reference";
+      type string;
+      config false;
+      description
+        "This is an internal reference for the service provider
+         to identify the BGP session.";
+    }
+    uses ac-svc:bgp-neighbor-without-name;
+  }
+
+  grouping bgp-neighbor-with-name-server-reference {
+    description
+      "A grouping with generic parameters for configuring a BGP 
+       neighbor with an identifier and a reference generated by 
+       the provider.";
+    leaf id {
+      type string;
+      description
+        "An identifier that uniquely identifiers a neighbor.";
+    }
+    uses ac-svc:bgp-neighbor-with-server-reference;
+  }
+
+  grouping bgp-svc {
+    description
+      "Configuration specific to BGP.";
+    container peer-groups {
+      description
+        "Configuration for BGP peer-groups";
+      list peer-group {
+        key "name";
+        description
+          "List of BGP peer-groups configured on the local 
+           system - uniquely identified by peer-group
+           name.";
+        uses ac-common:bgp-peer-group-with-name;
+        leaf local-address {
+          type inet:ip-address;
+          description
+            "The provider's local IP address that will be used to
+             establish the BGP session.";
+        }
+        container bgp-max-prefix {
+          description
+            "A container for the maximum number of BGP prefixes
+             allowed in the BGP session.";
+          leaf max-prefix {
+            type uint32;
+            description
+              "Indicates the maximum number of BGP prefixes allowed
+               in the BGP session.
+
+               It allows control of how many prefixes can be received
+               from a neighbor.";
+            reference
+              "RFC 4271: A Border Gateway Protocol 4 (BGP-4),
+                         Section 8.2.2";
+          }
+        }
+        uses ac-common:bgp-authentication;
+      }
+    }
+    list neighbor {
+      key "id";
+      description
+        "List of BGP neighbors.";
+      uses ac-svc:bgp-neighbor-with-name-server-reference;
+      leaf peer-group {
+        type leafref {
+          path "../../peer-groups/peer-group/name";
+        }
+        description
+          "The peer-group with which this neighbor is associated.";
+      }
+      leaf failure-detection-profile {
+        if-feature "vpn-common:bfd";
+        type failure-detection-profile-reference;
+        description
+          "Points to a failure detection profile.";
+      }
+    }
+  }
+
+  //  OSPF Service 
+
+  grouping ospf-svc {
+    description
+      "Service configuration specific to OSPF.";
+    uses ac-common:ospf-basic;
+    uses ac-common:ospf-authentication;
+    uses ac-common:service-status;
+  }
+
+  //  IS-IS Service 
+
+  grouping isis-svc {
+    description
+      "Service configuration specific to IS-IS.";
+    uses ac-common:isis-basic;
+    uses ac-common:isis-authentication;
+    uses ac-common:service-status;
+  }
+
+  //  RIP Service 
+
+  grouping rip-svc {
+    description
+      "Service configuration specific to RIP routing.";
+    leaf address-family {
+      type identityref {
+        base vpn-common:address-family;
+      }
+      description
+        "Indicates whether IPv4, IPv6, or both address families
+         are to be activated.";
+    }
+    uses ac-common:rip-authentication;
+    uses ac-common:service-status;
+  }
+
+  //  VRRP Service 
+
+  grouping vrrp-svc {
+    description
+      "Service configuration specific to VRRP.";
+    reference
+      "RFC 9568: Virtual Router Redundancy Protocol (VRRP)
+                 Version 3 for IPv4 and IPv6";
+    leaf address-family {
+      type identityref {
+        base vpn-common:address-family;
+      }
+      description
+        "Indicates whether IPv4, IPv6, or both
+         address families are to be enabled.";
+    }
+    uses ac-common:service-status;
+  }
+
+  // Basic routing parameters
+
+  grouping routing-basic {
+    description
+      "Defines basic parameters for routing protocols.";
+    list routing-protocol {
+      key "id";
+      description
+        "List of routing protocols used on the AC.";
+      leaf id {
+        type string;
+        description
+          "Unique identifier for the routing protocol.";
+      }
+      uses routing-protocol-list;
+      container bgp {
+        when
+          "derived-from-or-self(../type, 'vpn-common:bgp-routing')" {
+          description
+            "Only applies when the protocol is BGP.";
+        }
+        if-feature "vpn-common:rtg-bgp";
+        description
+          "Configuration specific to BGP.";
+        container peer-groups {
+          description
+            "Configuration for BGP peer-groups";
+          list peer-group {
+            key "name";
+            description
+              "List of BGP peer-groups configured on the local
+               system - uniquely identified by peer-group
+               name.";
+            uses ac-common:bgp-peer-group-with-name;
+          }
+        }
+      }
+      container ospf {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:ospf-routing')" {
+          description
+            "Only applies when the protocol is OSPF.";
+        }
+        if-feature "vpn-common:rtg-ospf";
+        description
+          "Configuration specific to OSPF.";
+        uses ac-common:ospf-basic;
+      }
+      container isis {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:isis-routing')" {
+          description
+            "Only applies when the protocol is IS-IS.";
+        }
+       if-feature "vpn-common:rtg-isis";
+        description
+          "Configuration specific to IS-IS.";
+        uses ac-common:isis-basic;
+      }
+      container rip {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:rip-routing')" {
+          description
+            "Only applies when the protocol is RIP.
+             For IPv4, the model assumes that RIP
+             version 2 is used.";
+        }
+        if-feature "vpn-common:rtg-rip";
+        description
+          "Configuration specific to RIP routing.";
+        leaf address-family {
+          type identityref {
+            base vpn-common:address-family;
+          }
+          description
+            "Indicates whether IPv4, IPv6, or both
+             address families are to be activated.";
+        }
+      }
+      container vrrp {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:vrrp-routing')" {
+          description
+            "Only applies when the protocol is the
+             Virtual Router Redundancy Protocol (VRRP).";
+        }
+        if-feature "vpn-common:rtg-vrrp";
+        description
+          "Configuration specific to VRRP.";
+        leaf address-family {
+          type identityref {
+            base vpn-common:address-family;
+          }
+          description
+            "Indicates whether IPv4, IPv6, or both address families
+             are to be enabled.";
+        }
+      }
+    }
+  }
+
+  // Full routing parameters
+
+  grouping routing {
+    description
+      "Defines routing protocols.";
+    list routing-protocol {
+      key "id";
+      description
+        "List of routing protocols used on the AC.";
+      leaf id {
+        type string;
+        description
+          "Unique identifier for the routing protocol.";
+      }
+      uses routing-protocol-list;
+      container static {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:static-routing')" {
+          description
+            "Only applies when the protocol is static routing
+             protocol.";
+        }
+        description
+          "Configuration specific to static routing.";
+        container cascaded-lan-prefixes {
+          description
+            "LAN prefixes from the customer.";
+          uses ipv4-static-rtg-with-bfd;
+          uses ipv6-static-rtg-with-bfd;
+        }
+      }
+      container bgp {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:bgp-routing')" {
+          description
+            "Only applies when the protocol is BGP.";
+        }
+        if-feature "vpn-common:rtg-bgp";
+        description
+          "Configuration specific to BGP.";
+        uses bgp-svc;
+      }
+      container ospf {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:ospf-routing')" {
+          description
+            "Only applies when the protocol is OSPF.";
+        }
+        if-feature "vpn-common:rtg-ospf";
+        description
+          "Configuration specific to OSPF.";
+        uses ospf-svc;
+      }
+      container isis {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:isis-routing')" {
+          description
+            "Only applies when the protocol is IS-IS.";
+        }
+        if-feature "vpn-common:rtg-isis";
+        description
+          "Configuration specific to IS-IS.";
+        uses isis-svc;
+      }
+      container rip {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:rip-routing')" {
+          description
+            "Only applies when the protocol is RIP.
+             For IPv4, the model assumes that RIP version 2 is
+             used.";
+        }
+        if-feature "vpn-common:rtg-rip";
+        description
+          "Configuration specific to RIP routing.";
+        uses rip-svc;
+      }
+      container vrrp {
+        when "derived-from-or-self(../type, "
+           + "'vpn-common:vrrp-routing')" {
+          description
+            "Only applies when the protocol is the Virtual Router
+             Redundancy Protocol (VRRP).";
+        }
+        if-feature "vpn-common:rtg-vrrp";
+        description
+          "Configuration specific to VRRP.";
+        uses vrrp-svc;
+      }
+    }
+  }
+
+  // Encryption choice
+
+  grouping encryption-choice {
+    description
+      "Container for the encryption profile.";
+    choice profile {
+      description
+        "Choice for the encryption profile.";
+      case provider-profile {
+        leaf provider-profile {
+          type encryption-profile-reference;
+          description
+            "Reference to a provider encryption profile.";
+        }
+      }
+      case customer-profile {
+        leaf customer-key-chain {
+          type key-chain:key-chain-ref;
+          description
+            "Customer-supplied key chain.";
+        }
+      }
+    }
+  }
+
+  // Basic security parameters
+
+  grouping ac-security-basic {
+    description
+      "AC-specific security parameters.";
+    container encryption {
+      if-feature "vpn-common:encryption";
+      description
+        "Container for AC security encryption.";
+      leaf enabled {
+        type boolean;
+        description
+          "If set to 'true', traffic encryption on the connection
+           is required.  Otherwise, it is disabled.";
+      }
+      leaf layer {
+        when "../enabled = 'true'" {
+          description
+            "Included only when encryption is enabled.";
+        }
+        type enumeration {
+          enum layer2 {
+            description
+              "Encryption occurs at Layer 2.";
+          }
+          enum layer3 {
+            description
+              "Encryption occurs at Layer 3.
+               For example, IPsec may be used when a customer 
+               requests Layer 3 encryption.";
+          }
+        }
+        description
+          "Indicates the layer on which encryption is applied.";
+      }
+    }
+    container encryption-profile {
+      when "../encryption/enabled = 'true'" {
+        description
+          "Indicates the layer on which encryption is enabled.";
+      }
+      description
+        "Container for the encryption profile.";
+      uses encryption-choice;
+    }
+  }
+
+  // Bandwith parameters
+
+  grouping bandwidth {
+    description
+      "Container for bandwidth.";
+    container svc-pe-to-ce-bandwidth {
+      if-feature "vpn-common:inbound-bw";
+      description
+        "From the customer site's perspective, the inbound
+         bandwidth of the AC or download bandwidth from the
+         service provider to the site.";
+      uses ac-common:bandwidth-per-type;
+    }
+    container svc-ce-to-pe-bandwidth {
+      if-feature "vpn-common:outbound-bw";
+      description
+        "From the customer site's perspective, the outbound
+         bandwidth of the AC or upload bandwidth from
+         the CE to the PE.";
+      uses ac-common:bandwidth-per-type;
+    }
+  }
+
+  // Basic AC parameters
+
+  grouping ac-basic {
+    description
+      "Grouping for basic parameters for an attachment circuit.";
+    leaf name {
+      type string;
+      description
+        "A name that uniquely identifies the AC.";
+    }
+    container l2-connection {
+      if-feature "ac-common:layer2-ac";
+      description
+        "Defines Layer 2 protocols and parameters that are required 
+         to enable AC connectivity.";
+      uses l2-connection-basic;
+    }
+    container ip-connection {
+      if-feature "ac-common:layer3-ac";
+      description
+        "Defines IP connection parameters.";
+      uses ip-connection-basic;
+    }
+    container routing-protocols {
+      description
+        "Defines routing protocols.";
+      uses routing-basic;
+    }
+    container oam {
+      description
+        "Defines the Operations, Administration, and Maintenance
+         (OAM) mechanisms used.";
+      container bfd {
+        if-feature "vpn-common:bfd";
+        description
+          "Container for BFD.";
+        uses ac-common:bfd;
+      }
+    }
+    container security {
+      description
+        "AC-specific security parameters.";
+      uses ac-security-basic;
+    }
+    container service {
+      description
+        "AC-specific bandwith parameters.";
+      leaf mtu {
+        type uint32;
+        units "bytes";
+        description
+          "Layer 2 MTU.";
+      }
+      uses bandwidth;
+    }
+  }
+
+  // Full AC parameters
+
+  grouping ac {
+    description
+      "Grouping for an attachment circuit.";
+    leaf name {
+      type string;
+      description
+        "A name of the AC. Data models that need to reference  
+         an attachment circuit should use 
+         attachment-circuit-reference.";
+    }
+    leaf-list service-profile {
+      type service-profile-reference;
+      description
+        "A reference to a service profile.";
+    }
+    container l2-connection {
+      if-feature "ac-common:layer2-ac";
+      description
+        "Defines Layer 2 protocols and parameters that are required 
+         to enable AC connectivity.";
+      uses l2-connection;
+    }
+    container ip-connection {
+      if-feature "ac-common:layer3-ac";
+      description
+        "Defines IP connection parameters.";
+      uses ip-connection;
+    }
+    container routing-protocols {
+      description
+        "Defines routing protocols.";
+      uses routing;
+    }
+    container oam {
+      description
+        "Defines the OAM mechanisms used.";
+      container bfd {
+        if-feature "vpn-common:bfd";
+        description
+          "Container for BFD.";
+        list session {
+          key "id";
+          description
+            "List of BFD sessions.";
+          leaf id {
+             type string;
+             description
+               "A unique identifer for the BFD session.";
+          }
+          leaf local-address {
+            type inet:ip-address;
+            description
+              "Provider's IP address of the BFD session.";
+          }
+          leaf remote-address {
+            type inet:ip-address;
+            description
+              "Customer's IP address of the BFD session.";
+          }
+          leaf profile {
+            type failure-detection-profile-reference;
+            description
+              "Points to a BFD profile.";
+          }
+          uses ac-common:bfd;
+          uses ac-common:service-status;
+        } 
+      }
+    }
+    container security {
+      description
+        "AC-specific security parameters.";
+      uses ac-security-basic;
+    }
+    container service {
+      description
+        "AC-specific bandwith parameters.";
+      leaf mtu {
+        type uint32;
+        units "bytes";
+        description
+          "Layer 2 MTU.";
+      }
+      uses bandwidth;
+      container qos {
+        if-feature "vpn-common:qos";
+        description
+          "QoS configuration.";
+        container qos-profiles {
+          description
+            "QoS profile configuration.";
+          list qos-profile {
+            key "profile";
+            description
+              "Points to a QoS profile.";
+            leaf profile {
+              type qos-profile-reference;
+              description
+                "QoS profile to be used.";
+            }
+            leaf direction {
+              type identityref {
+                base vpn-common:qos-profile-direction;
+              }
+              description
+                "The direction to which the QoS profile
+                 is applied.";
+            }
+          }
+        }
+      }
+      container access-control-list {
+        description
+          "Container for the Access Control List (ACL).";
+        container acl-profiles {
+          description
+            "ACL profile configuration.";
+          list acl-profile {
+            key "profile";
+            description
+              "Points to an ACL profile.";
+            leaf profile {
+              type forwarding-profile-reference;
+              description
+                "Forwarding profile to be used.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // Parent and Child ACs
+
+  grouping ac-hierarchy {
+    description
+      "Container for parent and child AC references.";
+    leaf-list parent-ref {
+      type ac-svc:attachment-circuit-reference;
+      description
+        "Specifies a parent AC that is inherited by an AC.
+         In contexts where dynamic terminating points are 
+         bound to the same AC, a parent AC with stable
+         information is created with a set of child ACs
+         to track dynamic AC information.";
+    }
+    leaf-list child-ref {
+      type ac-svc:attachment-circuit-reference;
+      config false;
+      description
+        "Specifies a child AC that relies upon a parent AC.";
+    }
+  }
+
+  /******************** Main AC containers ********************/
+
+  container specific-provisioning-profiles {
+    description
+      "Contains a set of valid profiles to reference for an AC.";
+    uses ac-common:ac-profile-cfg;
+  }
+  container service-provisioning-profiles {
+    description
+      "Contains a set of valid profiles to reference for an AC.";
+    list service-profile-identifier {
+      key "id";
+      description
+        "List of generic service profile identifiers.";
+      leaf id {
+        type string;
+        description
+          "Identification of the service profile to be used.
+           The profile only has significance within the service
+           provider's administrative domain.";
+      }
+    }
+    nacm:default-deny-write;
+  }
+  container attachment-circuits {
+    description
+      "Main container for the attachment circuits.";
+    list ac-group-profile {
+      key "name";
+      description
+        "Maintains a list of profiles that are shared among
+         a set of ACs.";
+      uses ac;
+    }
+    container placement-constraints {
+      description
+        "Diversity constraint type.";
+      uses vpn-common:placement-constraints;
+    }
+    leaf customer-name {
+      type string;
+      description
+        "Indicates the name of the customer that requested these
+         ACs.";
+    }
+    uses ac-common:op-instructions;
+    list ac {
+      key "name";
+      description
+        "Global provisioning of attachment circuits.";
+      leaf customer-name {
+        type string;
+        description
+          "Indicates the name of the customer that requested this
+           AC.";
+      }
+      leaf description {
+        type string;
+        description
+          "Associates a description with an AC.";
+      }
+      leaf test-only {
+        type empty;
+        description
+         "When present, this indicates that this is a feasibility
+          check request. No resources are commited for such AC 
+          requests.";
+      }
+      uses ac-common:op-instructions;
+      leaf role {
+        type identityref {
+          base ac-common:role;
+        }
+        description
+          "Indicates whether this AC is used as UNI, NNI, etc.";
+      }
+      leaf-list peer-sap-id {
+        type string;
+        description
+          "One or more peer SAPs can be indicated.";
+      }
+      leaf-list group-profile-ref {
+        type ac-group-reference;
+        description
+          "A reference to an AC profile.";
+      }
+      uses ac-hierarchy;
+      uses ac-common:redundancy-group;
+      list service-ref {
+        key "service-type service-id";
+        config false;
+        description
+          "Reports the set of services that are bound to the AC.";
+        leaf service-type {
+          type identityref {
+            base vpn-common:service-type;
+          }
+          description
+            "Indicates the service type (e.g., L3VPN or Network Slice
+             Service).";
+          reference
+            "RFC 9408: A YANG Network Data Model for Service 
+                       Attachment Points (SAPs), Section 5";
+        }
+        leaf service-id {
+          type string;
+          description
+            "Indicates an identifier of a service instance
+             of a given type that uses the AC.";
+        }
+      }
+      leaf server-reference {
+        if-feature "ac-common:server-assigned-reference";
+        type string;
+        config false;
+        description
+          "Reports an internal reference for the service provider
+           to identify the AC.";
+      }
+      uses ac;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ethertypes@2019-03-04.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ethertypes@2019-03-04.yang
new file mode 100644
index 0000000000000000000000000000000000000000..fd055074aeba5c277bbefdce0b81ebd24d0d3551
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-ethertypes@2019-03-04.yang
@@ -0,0 +1,381 @@
+module ietf-ethertypes {
+  namespace "urn:ietf:params:xml:ns:yang:ietf-ethertypes";
+  prefix ethertypes;
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group.";
+
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+     WG List:  <mailto:netmod@ietf.org>
+
+     Editor:   Mahesh Jethanandani
+               <mjethanandani@gmail.com>";
+
+  description
+    "This module contains common definitions for the
+     Ethertype used by different modules.  It is a
+     placeholder module, till such time that IEEE
+     starts a project to define these Ethertypes
+     and publishes a standard.
+
+     At that time, this module can be deprecated.
+
+     Copyright (c) 2019 IETF Trust and the persons identified as
+     the document authors.  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).
+
+     This version of this YANG module is part of RFC 8519; see
+     the RFC itself for full legal notices.";
+
+  revision 2019-03-04 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8519: YANG Data Model for Network Access Control
+                 Lists (ACLs).";
+  }
+
+  typedef ethertype {
+    type union {
+      type uint16;
+      type enumeration {
+        enum ipv4 {
+          value 2048;
+          description
+            "Internet Protocol version 4 (IPv4) with a
+             hex value of 0x0800.";
+          reference
+            "RFC 791: Internet Protocol.";
+        }
+        enum arp {
+          value 2054;
+          description
+            "Address Resolution Protocol (ARP) with a
+             hex value of 0x0806.";
+          reference
+            "RFC 826: An Ethernet Address Resolution Protocol: Or
+                      Converting Network Protocol Addresses to 48.bit
+                      Ethernet Address for Transmission on Ethernet
+                      Hardware.";
+        }
+        enum wlan {
+          value 2114;
+          description
+            "Wake-on-LAN.  Hex value of 0x0842.";
+        }
+        enum trill {
+          value 8947;
+          description
+            "Transparent Interconnection of Lots of Links.
+             Hex value of 0x22F3.";
+          reference
+            "RFC 6325: Routing Bridges (RBridges): Base Protocol
+                       Specification.";
+        }
+        enum srp {
+          value 8938;
+          description
+            "Stream Reservation Protocol.  Hex value of
+             0x22EA.";
+          reference
+            "IEEE 801.1Q-2011.";
+        }
+        enum decnet {
+          value 24579;
+          description
+            "DECnet Phase IV.  Hex value of 0x6003.";
+        }
+        enum rarp {
+          value 32821;
+          description
+            "Reverse Address Resolution Protocol.
+             Hex value 0x8035.";
+          reference
+            "RFC 903: A Reverse Address Resolution Protocol.";
+        }
+        enum appletalk {
+          value 32923;
+          description
+            "Appletalk (Ethertalk).  Hex value of 0x809B.";
+        }
+        enum aarp {
+          value 33011;
+          description
+            "Appletalk Address Resolution Protocol.  Hex value
+             of 0x80F3.";
+        }
+        enum vlan {
+          value 33024;
+          description
+            "VLAN-tagged frame (IEEE 802.1Q) and Shortest Path
+             Bridging IEEE 802.1aq with Network-Network
+             Interface (NNI) compatibility.  Hex value of
+             0x8100.";
+          reference
+            "IEEE 802.1Q.";
+        }
+        enum ipx {
+          value 33079;
+          description
+            "Internetwork Packet Exchange (IPX).  Hex value
+             of 0x8137.";
+        }
+        enum qnx {
+          value 33284;
+          description
+            "QNX Qnet.  Hex value of 0x8204.";
+        }
+        enum ipv6 {
+          value 34525;
+          description
+            "Internet Protocol Version 6 (IPv6).  Hex value
+             of 0x86DD.";
+          reference
+            "RFC 8200: Internet Protocol, Version 6 (IPv6)
+                       Specification
+             RFC 8201: Path MTU Discovery for IP version 6.";
+        }
+        enum efc {
+          value 34824;
+          description
+            "Ethernet flow control using pause frames.
+             Hex value of 0x8808.";
+          reference
+            "IEEE 802.1Qbb.";
+        }
+        enum esp {
+          value 34825;
+          description
+            "Ethernet Slow Protocol.  Hex value of 0x8809.";
+          reference
+            "IEEE 802.3-2015.";
+        }
+        enum cobranet {
+          value 34841;
+          description
+            "CobraNet.  Hex value of 0x8819.";
+        }
+        enum mpls-unicast {
+          value 34887;
+          description
+            "Multiprotocol Label Switching (MPLS) unicast traffic.
+             Hex value of 0x8847.";
+          reference
+            "RFC 3031: Multiprotocol Label Switching Architecture.";
+        }
+        enum mpls-multicast {
+          value 34888;
+          description
+            "MPLS multicast traffic.  Hex value of 0x8848.";
+          reference
+            "RFC 3031: Multiprotocol Label Switching Architecture.";
+        }
+        enum pppoe-discovery {
+          value 34915;
+          description
+            "Point-to-Point Protocol over Ethernet.  Used during
+             the discovery process.  Hex value of 0x8863.";
+          reference
+            "RFC 2516: A Method for Transmitting PPP Over Ethernet
+                       (PPPoE).";
+        }
+        enum pppoe-session {
+          value 34916;
+          description
+            "Point-to-Point Protocol over Ethernet.  Used during
+             session stage.  Hex value of 0x8864.";
+          reference
+            "RFC 2516: A Method for Transmitting PPP Over Ethernet
+                       (PPPoE).";
+        }
+        enum intel-ans {
+          value 34925;
+          description
+            "Intel Advanced Networking Services.  Hex value of
+             0x886D.";
+        }
+        enum jumbo-frames {
+          value 34928;
+          description
+            "Jumbo frames or Ethernet frames with more than
+             1500 bytes of payload, up to 9000 bytes.";
+        }
+        enum homeplug {
+          value 34939;
+          description
+            "Family name for the various power line
+             communications.  Hex value of 0x887B.";
+        }
+        enum eap {
+          value 34958;
+          description
+            "Ethernet Access Protocol (EAP) over LAN.  Hex value
+             of 0x888E.";
+          reference
+            "IEEE 802.1X.";
+        }
+        enum profinet {
+          value 34962;
+          description
+            "PROcess FIeld Net (PROFINET).  Hex value of 0x8892.";
+        }
+        enum hyperscsi {
+          value 34970;
+          description
+            "Small Computer System Interface (SCSI) over Ethernet.
+             Hex value of 0x889A.";
+        }
+        enum aoe {
+          value 34978;
+          description
+            "Advanced Technology Advancement (ATA) over Ethernet.
+             Hex value of 0x88A2.";
+        }
+        enum ethercat {
+          value 34980;
+          description
+            "Ethernet for Control Automation Technology (EtherCAT).
+             Hex value of 0x88A4.";
+        }
+        enum provider-bridging {
+          value 34984;
+          description
+            "Provider Bridging (802.1ad) and Shortest Path Bridging
+             (801.1aq).  Hex value of 0x88A8.";
+          reference
+            "IEEE 802.1ad and IEEE 802.1aq).";
+        }
+        enum ethernet-powerlink {
+          value 34987;
+          description
+            "Ethernet Powerlink.  Hex value of 0x88AB.";
+        }
+        enum goose {
+          value 35000;
+          description
+            "Generic Object Oriented Substation Event (GOOSE).
+             Hex value of 0x88B8.";
+          reference
+            "IEC/ISO 8802-2 and 8802-3.";
+        }
+        enum gse {
+          value 35001;
+          description
+            "Generic Substation Events.  Hex value of 88B9.";
+          reference
+            "IEC 61850.";
+        }
+        enum sv {
+          value 35002;
+          description
+            "Sampled Value Transmission.  Hex value of 0x88BA.";
+          reference
+            "IEC 61850.";
+        }
+        enum lldp {
+          value 35020;
+          description
+            "Link Layer Discovery Protocol (LLDP).  Hex value of
+             0x88CC.";
+          reference
+            "IEEE 802.1AB.";
+        }
+        enum sercos {
+          value 35021;
+          description
+            "Sercos Interface.  Hex value of 0x88CD.";
+        }
+        enum wsmp {
+          value 35036;
+          description
+            "WAVE Short Message Protocol (WSMP).  Hex value of
+             0x88DC.";
+        }
+        enum homeplug-av-mme {
+          value 35041;
+          description
+            "HomePlug AV Mobile Management Entity (MME).  Hex value
+             of 88E1.";
+        }
+        enum mrp {
+          value 35043;
+          description
+            "Media Redundancy Protocol (MRP).  Hex value of
+             0x88E3.";
+          reference
+            "IEC 62439-2.";
+        }
+        enum macsec {
+          value 35045;
+          description
+            "MAC Security.  Hex value of 0x88E5.";
+          reference
+            "IEEE 802.1AE.";
+        }
+        enum pbb {
+          value 35047;
+          description
+            "Provider Backbone Bridges (PBB).  Hex value of
+             0x88E7.";
+          reference
+            "IEEE 802.1ah.";
+        }
+        enum cfm {
+          value 35074;
+          description
+            "Connectivity Fault Management (CFM).  Hex value of
+             0x8902.";
+          reference
+            "IEEE 802.1ag.";
+        }
+        enum fcoe {
+          value 35078;
+          description
+            "Fiber Channel over Ethernet (FCoE).  Hex value of
+             0x8906.";
+          reference
+            "T11 FC-BB-5.";
+        }
+        enum fcoe-ip {
+          value 35092;
+          description
+            "FCoE Initialization Protocol.  Hex value of 0x8914.";
+        }
+        enum roce {
+          value 35093;
+          description
+            "RDMA over Converged Ethernet (RoCE).  Hex value of
+             0x8915.";
+        }
+        enum tte {
+          value 35101;
+          description
+            "TTEthernet Protocol Control Frame (TTE).  Hex value
+             of 0x891D.";
+          reference
+            "SAE AS6802.";
+        }
+        enum hsr {
+          value 35119;
+          description
+            "High-availability Seamless Redundancy (HSR).  Hex
+             value of 0x892F.";
+          reference
+            "IEC 62439-3:2016.";
+        }
+      }
+    }
+    description
+      "The uint16 type placeholder is defined to enable
+       users to manage their own ethertypes not
+       covered by the module.  Otherwise, the module contains
+       enum definitions for the more commonly used ethertypes.";
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-geo-location@2022-02-11.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-geo-location@2022-02-11.yang
new file mode 100644
index 0000000000000000000000000000000000000000..b815446f819ac2dcba50e63e5781e8a1be9b59c6
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-geo-location@2022-02-11.yang
@@ -0,0 +1,278 @@
+module ietf-geo-location {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-geo-location";
+  prefix geo;
+  import ietf-yang-types {
+    prefix yang;
+    reference "RFC 6991: Common YANG Data Types";
+  }
+
+  organization
+    "IETF NETMOD Working Group (NETMOD)";
+  contact
+   "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    Editor:   Christian Hopps
+              <mailto:chopps@chopps.org>";
+
+  description
+    "This module defines a grouping of a container object for
+     specifying a location on or around an astronomical object (e.g.,
+     'earth').
+
+     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
+     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
+     'MAY', and 'OPTIONAL' in this document are to be interpreted as
+     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
+     they appear in all capitals, as shown here.
+
+     Copyright (c) 2022 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
+     Revised BSD License set forth in Section 4.c of the
+     IETF Trust's Legal Provisions Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 9179
+     (https://www.rfc-editor.org/info/rfc9179); see the RFC itself
+     for full legal notices.";
+
+  revision 2022-02-11 {
+    description
+      "Initial Revision";
+    reference
+      "RFC 9179: A YANG Grouping for Geographic Locations";
+  }
+
+  feature alternate-systems {
+    description
+      "This feature means the device supports specifying locations
+       using alternate systems for reference frames.";
+  }
+
+  grouping geo-location {
+    description
+      "Grouping to identify a location on an astronomical object.";
+
+    container geo-location {
+      description
+        "A location on an astronomical body (e.g., 'earth')
+         somewhere in a universe.";
+
+      container reference-frame {
+        description
+          "The Frame of Reference for the location values.";
+
+        leaf alternate-system {
+          if-feature "alternate-systems";
+          type string;
+          description
+            "The system in which the astronomical body and
+             geodetic-datum is defined.  Normally, this value is not
+             present and the system is the natural universe; however,
+             when present, this value allows for specifying alternate
+             systems (e.g., virtual realities).  An alternate-system
+             modifies the definition (but not the type) of the other
+             values in the reference frame.";
+        }
+        leaf astronomical-body {
+          type string {
+            pattern '[ -@\[-\^_-~]*';
+          }
+          default "earth";
+          description
+            "An astronomical body as named by the International
+             Astronomical Union (IAU) or according to the alternate
+             system if specified.  Examples include 'sun' (our star),
+             'earth' (our planet), 'moon' (our moon), 'enceladus' (a
+             moon of Saturn), 'ceres' (an asteroid), and
+             '67p/churyumov-gerasimenko (a comet).  The ASCII value
+             SHOULD have uppercase converted to lowercase and not
+             include control characters (i.e., values 32..64, and
+             91..126).  Any preceding 'the' in the name SHOULD NOT be
+             included.";
+          reference
+            "https://www.iau.org/";
+        }
+        container geodetic-system {
+          description
+            "The geodetic system of the location data.";
+          leaf geodetic-datum {
+            type string {
+              pattern '[ -@\[-\^_-~]*';
+            }
+            description
+              "A geodetic-datum defining the meaning of latitude,
+               longitude, and height.  The default when the
+               astronomical body is 'earth' is 'wgs-84', which is
+               used by the Global Positioning System (GPS).  The
+               ASCII value SHOULD have uppercase converted to
+               lowercase and not include control characters
+               (i.e., values 32..64, and 91..126).  The IANA registry
+               further restricts the value by converting all spaces
+               (' ') to dashes ('-').
+               The specification for the geodetic-datum indicates
+               how accurately it models the astronomical body in
+               question, both for the 'horizontal'
+               latitude/longitude coordinates and for height
+               coordinates.";
+            reference
+              "RFC 9179: A YANG Grouping for Geographic Locations,
+               Section 6.1";
+          }
+          leaf coord-accuracy {
+            type decimal64 {
+              fraction-digits 6;
+            }
+            description
+              "The accuracy of the latitude/longitude pair for
+               ellipsoidal coordinates, or the X, Y, and Z components
+               for Cartesian coordinates.  When coord-accuracy is
+               specified, it indicates how precisely the coordinates
+               in the associated list of locations have been
+               determined with respect to the coordinate system
+               defined by the geodetic-datum.  For example, there
+               might be uncertainty due to measurement error if an
+               experimental measurement was made to determine each
+               location.";
+          }
+          leaf height-accuracy {
+            type decimal64 {
+              fraction-digits 6;
+            }
+            units "meters";
+            description
+              "The accuracy of the height value for ellipsoidal
+               coordinates; this value is not used with Cartesian
+               coordinates.  When height-accuracy is specified, it
+               indicates how precisely the heights in the
+               associated list of locations have been determined
+               with respect to the coordinate system defined by the
+               geodetic-datum.  For example, there might be
+               uncertainty due to measurement error if an
+               experimental measurement was made to determine each
+               location.";
+          }
+        }
+      }
+      choice location {
+        description
+          "The location data either in latitude/longitude or
+           Cartesian values";
+        case ellipsoid {
+          leaf latitude {
+            type decimal64 {
+              fraction-digits 16;
+            }
+            units "decimal degrees";
+            description
+              "The latitude value on the astronomical body.  The
+               definition and precision of this measurement is
+               indicated by the reference-frame.";
+          }
+          leaf longitude {
+            type decimal64 {
+              fraction-digits 16;
+            }
+            units "decimal degrees";
+            description
+              "The longitude value on the astronomical body.  The
+               definition and precision of this measurement is
+               indicated by the reference-frame.";
+          }
+          leaf height {
+            type decimal64 {
+              fraction-digits 6;
+            }
+            units "meters";
+            description
+              "Height from a reference 0 value.  The precision and
+               '0' value is defined by the reference-frame.";
+          }
+        }
+        case cartesian {
+          leaf x {
+            type decimal64 {
+              fraction-digits 6;
+            }
+            units "meters";
+            description
+              "The X value as defined by the reference-frame.";
+          }
+          leaf y {
+            type decimal64 {
+              fraction-digits 6;
+            }
+            units "meters";
+            description
+              "The Y value as defined by the reference-frame.";
+          }
+          leaf z {
+            type decimal64 {
+              fraction-digits 6;
+            }
+            units "meters";
+            description
+              "The Z value as defined by the reference-frame.";
+          }
+        }
+      }
+      container velocity {
+        description
+          "If the object is in motion, the velocity vector describes
+           this motion at the time given by the timestamp.  For a
+           formula to convert these values to speed and heading, see
+           RFC 9179.";
+        reference
+          "RFC 9179: A YANG Grouping for Geographic Locations";
+
+        leaf v-north {
+          type decimal64 {
+            fraction-digits 12;
+          }
+          units "meters per second";
+          description
+            "v-north is the rate of change (i.e., speed) towards
+             true north as defined by the geodetic-system.";
+        }
+
+        leaf v-east {
+          type decimal64 {
+            fraction-digits 12;
+          }
+          units "meters per second";
+          description
+            "v-east is the rate of change (i.e., speed) perpendicular
+             to the right of true north as defined by
+             the geodetic-system.";
+        }
+
+        leaf v-up {
+          type decimal64 {
+            fraction-digits 12;
+          }
+          units "meters per second";
+          description
+            "v-up is the rate of change (i.e., speed) away from the
+             center of mass.";
+        }
+      }
+      leaf timestamp {
+        type yang:date-and-time;
+        description
+          "Reference time when location was recorded.";
+      }
+      leaf valid-until {
+        type yang:date-and-time;
+        description
+          "The timestamp for which this geo-location is valid until.
+           If unspecified, the geo-location has no specific
+           expiration time.";
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-inet-types@2024-10-21.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-inet-types@2024-10-21.yang
new file mode 100644
index 0000000000000000000000000000000000000000..78c5201baf73f339d3ac409083b1f8ea13682faf
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-inet-types@2024-10-21.yang
@@ -0,0 +1,657 @@
+module ietf-inet-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+  prefix "inet";
+
+  organization
+   "IETF Network Modeling (NETMOD) Working Group";
+
+  contact
+   "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:jschoenwaelder@constructor.university>";
+
+  description
+   "This module contains a collection of generally useful derived
+    YANG data types for Internet addresses and related things.
+
+    The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
+    NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
+    'MAY', and 'OPTIONAL' in this document are to be interpreted as
+    described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
+    they appear in all capitals, as shown here.
+
+    Copyright (c) 2024 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 Revised BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (https://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC XXXX;
+    see the RFC itself for full legal notices.";
+
+  revision 2024-10-21 {
+    description
+     "This revision adds the following new data types:
+      - inet:ip-address-and-prefix
+      - inet:ipv4-address-and-prefix
+      - inet:ipv6-address-and-prefix
+      - inet:protocol-number
+      - inet:host-name
+      - inet:email-address
+      - inet:ip-address-link-local
+      - inet:ipv4-address-link-local
+      - inet:ipv6-address-link-local
+      The inet:host union was changed to use inet:host-name instead
+      of inet:domain-name. Several pattern statements have been
+      improved.";
+    reference 
+     "RFC XXXX: Common YANG Data Types";
+  }
+
+  revision 2013-07-15 {
+    description
+     "This revision adds the following new data types:
+      - inet:ip-address-no-zone
+      - inet:ipv4-address-no-zone
+      - inet:ipv6-address-no-zone";
+    reference 
+     "RFC 6991: Common YANG Data Types";
+  }
+
+  revision 2010-09-24 {
+    description
+     "Initial revision.";
+    reference 
+     "RFC 6021: Common YANG Data Types";
+  }
+
+  /*** collection of types related to protocol fields ***/
+
+  typedef ip-version {
+    type enumeration {
+      enum unknown {
+        value "0"; 
+        description
+         "An unknown or unspecified version of the Internet
+          protocol.";
+      }
+      enum ipv4 {
+        value "1";
+        description
+         "The IPv4 protocol as defined in RFC 791.";
+      }
+      enum ipv6 {
+        value "2";
+        description
+         "The IPv6 protocol as defined in RFC 8200.";
+      }
+    }
+    description
+     "This value represents the version of the IP protocol.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetVersion textual convention of the SMIv2.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 8200: Internet Protocol, Version 6 (IPv6) Specification
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef dscp {
+    type uint8 {
+      range "0..63";
+    }
+    description
+     "The dscp type represents a Differentiated Services Code Point
+      that may be used for marking packets in a traffic stream.
+
+      In the value set and its semantics, this type is equivalent
+      to the Dscp textual convention of the SMIv2.";
+    reference 
+     "RFC 3289: Management Information Base for the Differentiated
+                Services Architecture
+      RFC 2474: Definition of the Differentiated Services Field
+                (DS Field) in the IPv4 and IPv6 Headers
+      RFC 2780: IANA Allocation Guidelines For Values In
+                the Internet Protocol and Related Headers";
+  }
+
+  typedef ipv6-flow-label {
+    type uint32 {
+      range "0..1048575";
+    }
+    description
+     "The ipv6-flow-label type represents the flow identifier or 
+      Flow Label in an IPv6 packet header that may be used to
+      discriminate traffic flows.
+
+      In the value set and its semantics, this type is equivalent
+      to the IPv6FlowLabel textual convention of the SMIv2.";
+    reference
+     "RFC 3595: Textual Conventions for IPv6 Flow Label
+      RFC 8200: Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  typedef port-number {
+    type uint16 {
+      range "0..65535";
+    }
+    description
+     "The port-number type represents a 16-bit port number of an 
+      Internet transport-layer protocol such as UDP, TCP, DCCP, or 
+      SCTP.
+
+      Port numbers are assigned by IANA.  The current list of
+      all assignments is available from <https://www.iana.org/>.
+
+      Note that the port number value zero is reserved by IANA.  In
+      situations where the value zero does not make sense, it can
+      be excluded by subtyping the port-number type.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetPortNumber textual convention of the SMIv2.";
+    reference
+     "RFC  768: User Datagram Protocol
+      RFC 9293: Transmission Control Protocol (TCP)
+      RFC 9260: Stream Control Transmission Protocol
+      RFC 4340: Datagram Congestion Control Protocol (DCCP)
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef protocol-number {
+    type uint8;
+    description
+     "The protocol-number type represents an 8-bit Internet
+      protocol number, carried in the 'protocol' field of the
+      IPv4 header or in the 'next header' field of the IPv6
+      header. If IPv6 extension headers are present, then the
+      protocol number type represents the upper layer protocol 
+      number, i.e., the number of the last 'next header' field 
+      of the IPv6 extension headers.
+
+      Protocol numbers are assigned by IANA. The current list of
+      all assignments is available from <https://www.iana.org/>.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 8200: Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  /*** collection of types related to autonomous systems ***/
+
+  typedef as-number {
+    type uint32;
+    description
+     "The as-number type represents autonomous system numbers
+      which identify an Autonomous System (AS).  An AS is a set
+      of routers under a single technical administration, using
+      an interior gateway protocol and common metrics to route
+      packets within the AS, and using an exterior gateway
+      protocol to route packets to other ASes.  IANA maintains
+      the AS number space and has delegated large parts to the
+      regional registries.
+
+      Autonomous system numbers were originally limited to 16 
+      bits.  BGP extensions have enlarged the autonomous system
+      number space to 32 bits.  This type therefore uses an uint32
+      base type without a range restriction in order to support
+      a larger autonomous system number space.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetAutonomousSystemNumber textual convention of 
+      the SMIv2.";
+    reference
+     "RFC 1930: Guidelines for creation, selection, and registration
+                of an Autonomous System (AS)
+      RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+      RFC 4001: Textual Conventions for Internet Network Addresses
+      RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+                Number Space";
+  }
+
+  /*** collection of types related to IP addresses and hostnames ***/
+
+  typedef ip-address {
+    type union {
+      type ipv4-address;
+      type ipv6-address;
+    }
+    description
+     "The ip-address type represents an IP address and is IP 
+      version neutral.  The format of the textual representation
+      implies the IP version.  This type supports scoped addresses
+      by allowing zone identifiers in the address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address {
+    type string {
+      pattern 
+        '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+      +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+      + '(%.+)?';
+    }
+    description
+      "The ipv4-address type represents an IPv4 address in 
+       dotted-quad notation.  The IPv4 address may include a zone
+       index, separated by a % sign. If a system uses zone names
+       that are not represented in UTF-8, then an implementation
+       needs to use some mechanism to transform the local name
+       into UTF-8. The definition of such a mechanism is outside
+       the scope of this document.
+
+       The zone index is used to disambiguate identical address
+       values.  For link-local addresses, the zone index will
+       typically be the interface index number or the name of an
+       interface.  If the zone index is not present, the default
+       zone of the device will be used.
+
+       The canonical format for the zone index is the numerical
+       format";
+  }
+
+  typedef ipv6-address {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(%[A-Za-z0-9][A-Za-z0-9\-\._~/]*)?';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(%.+)?';
+    }
+    description
+     "The ipv6-address type represents an IPv6 address in full,
+      mixed, shortened, and shortened-mixed notation.  The IPv6
+      address may include a zone index, separated by a % sign.
+      If a system uses zone names that are not represented in
+      UTF-8, then an implementation needs to use some mechanism
+      to transform the local name into UTF-8. The definition of
+      such a mechanism is outside the scope of this document.
+
+      The zone index is used to disambiguate identical address
+      values.  For link-local addresses, the zone index will
+      typically be the interface index number or the name of an
+      interface.  If the zone index is not present, the default
+      zone of the device will be used.
+
+      The canonical format of IPv6 addresses uses the textual
+      representation defined in Section 4 of RFC 5952.  The
+      canonical format for the zone index is the numerical
+      format as described in Section 11.2 of RFC 4007.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-address-no-zone {
+    type union {
+      type ipv4-address-no-zone;
+      type ipv6-address-no-zone;
+    }
+    description
+     "The ip-address-no-zone type represents an IP address and is 
+      IP version neutral.  The format of the textual representation
+      implies the IP version.  This type does not support scoped
+      addresses since it does not allow zone identifiers in the
+      address format.";
+    reference
+     "RFC 4007: IPv6 Scoped Address Architecture";
+  }
+
+  typedef ipv4-address-no-zone {
+    type ipv4-address {
+      pattern '[0-9\.]*';
+    }
+    description
+      "An IPv4 address without a zone index.  This type, derived
+       from the type ipv4-address, may be used in situations where
+       the zone is known from the context and no zone index is
+       needed.";
+  }
+
+  typedef ipv6-address-no-zone {
+    type ipv6-address {
+      pattern '[0-9a-fA-F:\.]*';
+    }
+    description
+      "An IPv6 address without a zone index.  This type, derived
+       from the type ipv6-address, may be used in situations where
+       the zone is known from the context and no zone index is
+       needed.";
+    reference
+     "RFC 4291: IP Version 6 Addressing Architecture
+      RFC 4007: IPv6 Scoped Address Architecture
+      RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-address-link-local {
+    type union {
+      type ipv4-address-link-local;
+      type ipv6-address-link-local;
+    }
+    description
+     "The ip-address-link-local type represents a link-local IP
+      address and is IP version neutral. The format of the textual
+      representation implies the IP version.";
+  }
+
+  typedef ipv4-address-link-local {
+    type ipv4-address {
+      pattern '169\.254\..*';
+    }
+    description
+      "A link-local IPv4 address in the prefix 169.254.0.0/16 as
+       defined in section 2.1. of RFC 3927.";
+    reference
+      "RFC 3927: Dynamic Configuration of IPv4 Link-Local Addresses";
+  }
+
+  typedef ipv6-address-link-local {
+    type ipv6-address {
+      pattern '[fF][eE]80:.*';
+    }
+    description
+      "A link-local IPv6 address in the prefix fe80::/10 as defined
+       in section 2.5.6. of RFC 4291.";
+    reference
+      "RFC 4291: IP Version 6 Addressing Architecture";
+  }
+
+  typedef ip-prefix {
+    type union {
+      type ipv4-prefix;
+      type ipv6-prefix;
+    }
+    description
+     "The ip-prefix type represents an IP prefix and is IP
+      version neutral.  The format of the textual representations
+      implies the IP version.";
+  }
+
+  typedef ipv4-prefix {
+    type string {
+      pattern
+         '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+       +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+       + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+    }
+    description
+     "The ipv4-prefix type represents an IPv4 prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 32. 
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format of an IPv4 prefix has all bits of
+      the IPv4 address set to zero that are not part of the
+      IPv4 prefix.
+
+      The definition of ipv4-prefix does not require that bits,
+      which are not part of the prefix, are set to zero. However,
+      implementations have to return values in canonical format,
+      which requires non-prefix bits to be set to zero. This means
+      that 192.0.2.1/24 must be accepted as a valid value but it
+      will be converted into the canonical format 192.0.2.0/24.";
+  }
+
+  typedef ipv6-prefix {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(/.+)';
+    }
+    description
+     "The ipv6-prefix type represents an IPv6 prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 128. 
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format of an IPv6 prefix has all bits of
+      the IPv6 address set to zero that are not part of the
+      IPv6 prefix.  Furthermore, the IPv6 address is represented
+      as defined in Section 4 of RFC 5952.
+
+      The definition of ipv6-prefix does not require that bits,
+      which are not part of the prefix, are set to zero. However,
+      implementations have to return values in canonical format,
+      which requires non-prefix bits to be set to zero. This means
+      that 2001:db8::1/64 must be accepted as a valid value but it
+      will be converted into the canonical format 2001:db8::/64.";
+    reference
+     "RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  typedef ip-address-and-prefix {
+    type union {
+      type ipv4-address-and-prefix;
+      type ipv6-address-and-prefix;
+    }
+    description
+     "The ip-address-and-prefix type represents an IP address and 
+      prefix and is IP version neutral.  The format of the textual
+      representations implies the IP version.";
+  }
+
+  typedef ipv4-address-and-prefix {
+    type string {
+      pattern
+         '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+       +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'
+       + '/(([0-9])|([1-2][0-9])|(3[0-2]))';
+    }
+    description
+     "The ipv4-address-and-prefix type represents an IPv4 
+      address and an associated IPv4 prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 32. 
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.";
+  }
+
+  typedef ipv6-address-and-prefix {
+    type string {
+      pattern '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+            + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+            + '(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}'
+            + '(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))'
+            + '(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+      pattern '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+            + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)'
+            + '(/.+)';
+    }
+    description
+     "The ipv6-address-and-prefix type represents an IPv6
+      address and an associated IPv6 prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 128. 
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format requires that the IPv6 address is
+      represented as defined in Section 4 of RFC 5952.";
+    reference
+     "RFC 5952: A Recommendation for IPv6 Address Text
+                Representation";
+  }
+
+  /*** collection of domain name and URI types ***/
+
+  typedef domain-name {
+    type string {
+      length "1..253";
+      pattern 
+        '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*'
+      + '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'
+      + '|\.';
+    }
+    description
+     "The domain-name type represents a DNS domain name.  The 
+      name SHOULD be fully qualified whenever possible. This
+      type does not support wildcards (see RFC 4592) or
+      classless in-addr.arpa delegations (see RFC 2317).
+
+      Internet domain names are only loosely specified.  Section
+      3.5 of RFC 1034 recommends a syntax (modified in Section 
+      2.1 of RFC 1123).  The pattern above is intended to allow
+      for current practice in domain name use, and some possible
+      future expansion.  Note that Internet host names have a
+      stricter syntax (described in RFC 952) than the DNS 
+      recommendations in RFCs 1034 and 1123. Schema nodes
+      representing host names should use the host-name type
+      instead of the domain-type.
+
+      The encoding of DNS names in the DNS protocol is limited
+      to 255 characters.  Since the encoding consists of labels
+      prefixed by a length bytes and there is a trailing NULL
+      byte, only 253 characters can appear in the textual dotted
+      notation.
+
+      The description clause of schema nodes using the domain-name
+      type MUST describe when and how these names are resolved to
+      IP addresses.  Note that the resolution of a domain-name value
+      may require to query multiple DNS records (e.g., A for IPv4
+      and AAAA for IPv6).  The order of the resolution process and
+      which DNS record takes precedence can either be defined
+      explicitly or may depend on the configuration of the
+      resolver.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be A-labels as per RFC 5890.";
+    reference
+     "RFC  952: DoD Internet Host Table Specification
+      RFC 1034: Domain Names - Concepts and Facilities
+      RFC 1123: Requirements for Internet Hosts -- Application 
+                and Support
+      RFC 2317: Classless IN-ADDR.ARPA delegation
+      RFC 2782: A DNS RR for specifying the location of services
+                (DNS SRV)
+      RFC 4592: The Role of Wildcards in the Domain Name System
+      RFC 5890: Internationalized Domain Names in Applications
+                (IDNA): Definitions and Document Framework
+      RFC 9499: DNS Terminology";
+  }
+
+  typedef host-name {
+    type domain-name {
+      length "2..max";
+      pattern '[a-zA-Z0-9\-\.]+';
+    }
+    description
+     "The host-name type represents (fully qualified) host names.
+      Host names must be at least two characters long (see RFC 952)
+      and they are restricted to labels consisting of letters, digits
+      and hyphens separated by dots (see RFC1123 and RFC 952).";
+    reference
+     "RFC  952: DoD Internet Host Table Specification
+      RFC 1123: Requirements for Internet Hosts -- Application
+                and Support";
+  }
+
+  typedef host {
+    type union {
+      type ip-address;
+      type host-name;
+    }
+    description
+     "The host type represents either an IP address or a (fully
+      qualified) host name.";
+  }
+
+  typedef uri {
+    type string {
+      pattern '[a-z][a-z0-9+.-]*:.*';
+    }
+    description
+     "The uri type represents a Uniform Resource Identifier
+      (URI) as defined by the rule 'URI' in RFC 3986.
+
+      Objects using the uri type MUST be in US-ASCII encoding,
+      and MUST be normalized as described by RFC 3986 Sections
+      6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary
+      percent-encoding is removed, and all case-insensitive
+      characters are set to lowercase except for hexadecimal
+      digits within a percent-encoded triplet, which are
+      normalized to uppercase as described in Section 6.2.2.1
+      of RFC 3986.
+
+      The purpose of this normalization is to help provide
+      unique URIs.  Note that this normalization is not
+      sufficient to provide uniqueness.  Two URIs that are
+      textually distinct after this normalization may still be
+      equivalent.
+
+      Objects using the uri type may restrict the schemes that
+      they permit.  For example, 'data:' and 'urn:' schemes
+      might not be appropriate.
+
+      A zero-length URI is not a valid URI.  This can be used to
+      express 'URI absent' where required.
+
+      In the value set and its semantics, this type is equivalent
+      to the Uri SMIv2 textual convention defined in RFC 5017.";
+    reference
+     "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+      RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+                Group: Uniform Resource Identifiers (URIs), URLs, 
+                and Uniform Resource Names (URNs): Clarifications
+                and Recommendations
+      RFC 5017: MIB Textual Conventions for Uniform Resource 
+                Identifiers (URIs)";
+  }
+
+  typedef email-address {
+    type string {
+      pattern '.+@.+';
+    }
+    description
+     "The email-address type represents an internationalized
+      email address.
+
+      The email address format is defined by the addr-spec
+      ABNF rule in RFC 5322 section 3.4.1. This format has
+      been extended by RFC 6532 to support internationalized
+      email addresses. Implementations MUST support the
+      internationalization extensions of RFC 6532. Support
+      of the obsolete obs-local-part, obs-domain, and
+      obs-qtext parts of RFC 5322 is not required.
+
+      The domain part may use both A-labels and U-labels
+      (see RFC 5890). The canonical format of the domain part
+      uses lowercase characters and U-labels (RFC 5890) where
+      applicable.";
+    reference
+     "RFC 5322: Internet Message Format
+      RFC 5890: Internationalized Domain Names in Applications
+                (IDNA): Definitions and Document Framework
+      RFC 6531: SMTP Extension for Internationalized Email";
+  }
+
+}
\ No newline at end of file
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-key-chain@2017-06-15.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-key-chain@2017-06-15.yang
new file mode 100644
index 0000000000000000000000000000000000000000..445d1994a5ac57366078b198200a9e143d4ccda8
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-key-chain@2017-06-15.yang
@@ -0,0 +1,382 @@
+module ietf-key-chain {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-key-chain";
+  prefix key-chain;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+  import ietf-netconf-acm {
+    prefix nacm;
+  }
+
+  organization
+    "IETF RTGWG - Routing Area Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/group/rtgwg>
+     WG List:  <mailto:rtgwg@ietf.org>
+
+     Editor: Acee Lindem
+             <mailto:acee@cisco.com>
+             Yingzhen Qu
+             <mailto:yingzhen.qu@huawei.com>
+             Derek Yeung
+             <mailto:derek@arrcus.com>
+             Ing-Wher Chen
+             <mailto:Ing-Wher_Chen@jabail.com>
+             Jeffrey Zhang
+             <mailto:zzhang@juniper.net>";
+
+  description
+    "This YANG module defines the generic configuration
+     data for key chains.  It is intended that the module
+     will be extended by vendors to define vendor-specific
+     key chain configuration parameters.
+
+     Copyright (c) 2017 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).
+
+     This version of this YANG module is part of RFC 8177;
+     see the RFC itself for full legal notices.";
+
+  reference "RFC 8177";
+
+  revision 2017-06-15 {
+    description
+      "Initial RFC Revision";
+    reference "RFC 8177: YANG Data Model for Key Chains";
+  }
+
+  feature hex-key-string {
+    description
+      "Support hexadecimal key string.";
+  }
+
+  feature accept-tolerance {
+    description
+      "Support the tolerance or acceptance limit.";
+  }
+
+  feature independent-send-accept-lifetime {
+    description
+      "Support for independent send and accept key lifetimes.";
+  }
+
+  feature crypto-hmac-sha-1-12 {
+    description
+      "Support for TCP HMAC-SHA-1 12-byte digest hack.";
+  }
+
+  feature cleartext {
+    description
+      "Support for cleartext algorithm.  Usage is
+       NOT RECOMMENDED.";
+  }
+
+  feature aes-cmac-prf-128 {
+    description
+      "Support for AES Cipher-based Message Authentication
+       Code Pseudorandom Function.";
+  }
+
+  feature aes-key-wrap {
+    description
+      "Support for Advanced Encryption Standard (AES) Key Wrap.";
+  }
+
+  feature replay-protection-only {
+    description
+      "Provide replay protection without any authentication
+       as required by protocols such as Bidirectional
+       Forwarding Detection (BFD).";
+  }
+  identity crypto-algorithm {
+    description
+      "Base identity of cryptographic algorithm options.";
+  }
+
+  identity hmac-sha-1-12 {
+    base crypto-algorithm;
+    if-feature "crypto-hmac-sha-1-12";
+    description
+      "The HMAC-SHA1-12 algorithm.";
+  }
+
+  identity aes-cmac-prf-128 {
+    base crypto-algorithm;
+    if-feature "aes-cmac-prf-128";
+    description
+      "The AES-CMAC-PRF-128 algorithm - required by
+       RFC 5926 for TCP-AO key derivation functions.";
+  }
+
+  identity md5 {
+    base crypto-algorithm;
+    description
+      "The MD5 algorithm.";
+  }
+
+  identity sha-1 {
+    base crypto-algorithm;
+    description
+      "The SHA-1 algorithm.";
+  }
+
+  identity hmac-sha-1 {
+    base crypto-algorithm;
+    description
+      "HMAC-SHA-1 authentication algorithm.";
+  }
+
+  identity hmac-sha-256 {
+    base crypto-algorithm;
+    description
+      "HMAC-SHA-256 authentication algorithm.";
+  }
+
+  identity hmac-sha-384 {
+    base crypto-algorithm;
+    description
+      "HMAC-SHA-384 authentication algorithm.";
+  }
+
+  identity hmac-sha-512 {
+    base crypto-algorithm;
+    description
+      "HMAC-SHA-512 authentication algorithm.";
+  }
+
+  identity cleartext {
+    base crypto-algorithm;
+    if-feature "cleartext";
+    description
+      "cleartext.";
+  }
+
+  identity replay-protection-only {
+    base crypto-algorithm;
+    if-feature "replay-protection-only";
+    description
+      "Provide replay protection without any authentication as
+       required by protocols such as Bidirectional Forwarding
+       Detection (BFD).";
+  }
+
+  typedef key-chain-ref {
+    type leafref {
+      path
+      "/key-chain:key-chains/key-chain:key-chain/key-chain:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       configured key chains.";
+  }
+
+  grouping lifetime {
+    description
+      "Key lifetime specification.";
+    choice lifetime {
+      default "always";
+      description
+        "Options for specifying key accept or send lifetimes";
+      case always {
+        leaf always {
+          type empty;
+          description
+            "Indicates key lifetime is always valid.";
+        }
+      }
+      case start-end-time {
+        leaf start-date-time {
+          type yang:date-and-time;
+          description
+            "Start time.";
+        }
+        choice end-time {
+          default "infinite";
+          description
+            "End-time setting.";
+          case infinite {
+            leaf no-end-time {
+              type empty;
+              description
+                "Indicates key lifetime end-time is infinite.";
+            }
+          }
+          case duration {
+            leaf duration {
+              type uint32 {
+                range "1..2147483646";
+              }
+              units "seconds";
+              description
+                "Key lifetime duration, in seconds";
+            }
+          }
+          case end-date-time {
+            leaf end-date-time {
+              type yang:date-and-time;
+              description
+                "End time.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  container key-chains {
+    description
+      "All configured key-chains on the device.";
+    list key-chain {
+      key "name";
+      description
+        "List of key-chains.";
+      leaf name {
+        type string;
+        description
+          "Name of the key-chain.";
+      }
+      leaf description {
+        type string;
+        description
+          "A description of the key-chain";
+      }
+      container accept-tolerance {
+        if-feature "accept-tolerance";
+        description
+          "Tolerance for key lifetime acceptance (seconds).";
+        leaf duration {
+          type uint32;
+          units "seconds";
+          default "0";
+          description
+            "Tolerance range, in seconds.";
+        }
+      }
+      leaf last-modified-timestamp {
+        type yang:date-and-time;
+        config false;
+        description
+          "Timestamp of the most recent update to the key-chain";
+      }
+      list key {
+        key "key-id";
+        description
+          "Single key in key chain.";
+        leaf key-id {
+          type uint64;
+          description
+            "Numeric value uniquely identifying the key";
+        }
+        container lifetime {
+          description
+            "Specify a key's lifetime.";
+          choice lifetime {
+            description
+              "Options for specification of send and accept
+               lifetimes.";
+            case send-and-accept-lifetime {
+              description
+                "Send and accept key have the same lifetime.";
+              container send-accept-lifetime {
+                description
+                  "Single lifetime specification for both
+                   send and accept lifetimes.";
+                uses lifetime;
+              }
+            }
+            case independent-send-accept-lifetime {
+              if-feature "independent-send-accept-lifetime";
+              description
+                "Independent send and accept key lifetimes.";
+              container send-lifetime {
+                description
+                  "Separate lifetime specification for send
+                   lifetime.";
+                uses lifetime;
+              }
+              container accept-lifetime {
+                description
+                  "Separate lifetime specification for accept
+                   lifetime.";
+                uses lifetime;
+              }
+            }
+          }
+        }
+        leaf crypto-algorithm {
+          type identityref {
+            base crypto-algorithm;
+          }
+          mandatory true;
+          description
+            "Cryptographic algorithm associated with key.";
+        }
+        container key-string {
+          description
+            "The key string.";
+          nacm:default-deny-all;
+          choice key-string-style {
+            description
+              "Key string styles";
+             case keystring {
+               leaf keystring {
+                type string;
+                description
+                  "Key string in ASCII format.";
+              }
+            }
+            case hexadecimal {
+              if-feature "hex-key-string";
+              leaf hexadecimal-string {
+                type yang:hex-string;
+                description
+                  "Key in hexadecimal string format.  When compared
+                   to ASCII, specification in hexadecimal affords
+                   greater key entropy with the same number of
+                   internal key-string octets.  Additionally, it
+                   discourages usage of well-known words or
+                   numbers.";
+              }
+            }
+          }
+        }
+        leaf send-lifetime-active {
+          type boolean;
+          config false;
+          description
+            "Indicates if the send lifetime of the
+             key-chain key is currently active.";
+           }
+        leaf accept-lifetime-active {
+          type boolean;
+          config false;
+          description
+            "Indicates if the accept lifetime of the
+             key-chain key is currently active.";
+        }
+      }
+    }
+    container aes-key-wrap {
+      if-feature "aes-key-wrap";
+      description
+        "AES Key Wrap encryption for key-chain key-strings.  The
+         encrypted key-strings are encoded as hexadecimal key
+         strings using the hex-key-string leaf.";
+      leaf enable {
+        type boolean;
+        default "false";
+        description
+          "Enable AES Key Wrap encryption.";
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-netconf-acm@2018-02-14.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-netconf-acm@2018-02-14.yang
new file mode 100644
index 0000000000000000000000000000000000000000..bf4855faf0508a152471f6c6c8f756581b8ebb96
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-netconf-acm@2018-02-14.yang
@@ -0,0 +1,464 @@
+module ietf-netconf-acm {
+
+  namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm";
+
+  prefix nacm;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+
+  organization
+    "IETF NETCONF (Network Configuration) Working Group";
+
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/netconf/>
+     WG List:  <mailto:netconf@ietf.org>
+
+     Author:   Andy Bierman
+               <mailto:andy@yumaworks.com>
+
+     Author:   Martin Bjorklund
+               <mailto:mbj@tail-f.com>";
+
+  description
+    "Network Configuration Access Control Model.
+
+     Copyright (c) 2012 - 2018 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8341; see
+     the RFC itself for full legal notices.";
+
+  revision "2018-02-14" {
+    description
+      "Added support for YANG 1.1 actions and notifications tied to
+       data nodes.  Clarified how NACM extensions can be used by
+       other data models.";
+    reference
+      "RFC 8341: Network Configuration Access Control Model";
+  }
+
+  revision "2012-02-22" {
+    description
+      "Initial version.";
+    reference
+      "RFC 6536: Network Configuration Protocol (NETCONF)
+                 Access Control Model";
+  }
+
+  /*
+   * Extension statements
+   */
+
+  extension default-deny-write {
+    description
+      "Used to indicate that the data model node
+       represents a sensitive security system parameter.
+
+       If present, the NETCONF server will only allow the designated
+       'recovery session' to have write access to the node.  An
+       explicit access control rule is required for all other users.
+
+       If the NACM module is used, then it must be enabled (i.e.,
+       /nacm/enable-nacm object equals 'true'), or this extension
+       is ignored.
+
+       The 'default-deny-write' extension MAY appear within a data
+       definition statement.  It is ignored otherwise.";
+  }
+
+  extension default-deny-all {
+    description
+      "Used to indicate that the data model node
+       controls a very sensitive security system parameter.
+
+       If present, the NETCONF server will only allow the designated
+       'recovery session' to have read, write, or execute access to
+       the node.  An explicit access control rule is required for all
+       other users.
+
+       If the NACM module is used, then it must be enabled (i.e.,
+       /nacm/enable-nacm object equals 'true'), or this extension
+       is ignored.
+
+       The 'default-deny-all' extension MAY appear within a data
+       definition statement, 'rpc' statement, or 'notification'
+       statement.  It is ignored otherwise.";
+  }
+
+  /*
+   * Derived types
+   */
+
+  typedef user-name-type {
+    type string {
+      length "1..max";
+    }
+    description
+      "General-purpose username string.";
+  }
+
+  typedef matchall-string-type {
+    type string {
+      pattern '\*';
+    }
+    description
+      "The string containing a single asterisk '*' is used
+       to conceptually represent all possible values
+       for the particular leaf using this data type.";
+  }
+
+  typedef access-operations-type {
+    type bits {
+      bit create {
+        description
+          "Any protocol operation that creates a
+           new data node.";
+      }
+      bit read {
+        description
+          "Any protocol operation or notification that
+           returns the value of a data node.";
+      }
+      bit update {
+        description
+          "Any protocol operation that alters an existing
+           data node.";
+      }
+      bit delete {
+        description
+          "Any protocol operation that removes a data node.";
+      }
+      bit exec {
+        description
+          "Execution access to the specified protocol operation.";
+      }
+    }
+    description
+      "Access operation.";
+  }
+
+  typedef group-name-type {
+    type string {
+      length "1..max";
+      pattern '[^\*].*';
+    }
+    description
+      "Name of administrative group to which
+       users can be assigned.";
+  }
+
+  typedef action-type {
+    type enumeration {
+      enum permit {
+        description
+          "Requested action is permitted.";
+      }
+      enum deny {
+        description
+          "Requested action is denied.";
+      }
+    }
+    description
+      "Action taken by the server when a particular
+       rule matches.";
+  }
+
+  typedef node-instance-identifier {
+    type yang:xpath1.0;
+    description
+      "Path expression used to represent a special
+       data node, action, or notification instance-identifier
+       string.
+
+       A node-instance-identifier value is an
+       unrestricted YANG instance-identifier expression.
+       All the same rules as an instance-identifier apply,
+       except that predicates for keys are optional.  If a key
+       predicate is missing, then the node-instance-identifier
+       represents all possible server instances for that key.
+
+       This XML Path Language (XPath) expression is evaluated in the
+       following context:
+
+          o  The set of namespace declarations are those in scope on
+             the leaf element where this type is used.
+
+          o  The set of variable bindings contains one variable,
+             'USER', which contains the name of the user of the
+             current session.
+
+          o  The function library is the core function library, but
+             note that due to the syntax restrictions of an
+             instance-identifier, no functions are allowed.
+
+          o  The context node is the root node in the data tree.
+
+       The accessible tree includes actions and notifications tied
+       to data nodes.";
+  }
+
+  /*
+   * Data definition statements
+   */
+
+  container nacm {
+    nacm:default-deny-all;
+
+    description
+      "Parameters for NETCONF access control model.";
+
+    leaf enable-nacm {
+      type boolean;
+      default "true";
+      description
+        "Enables or disables all NETCONF access control
+         enforcement.  If 'true', then enforcement
+         is enabled.  If 'false', then enforcement
+         is disabled.";
+    }
+
+    leaf read-default {
+      type action-type;
+      default "permit";
+      description
+        "Controls whether read access is granted if
+         no appropriate rule is found for a
+         particular read request.";
+    }
+
+    leaf write-default {
+      type action-type;
+      default "deny";
+      description
+        "Controls whether create, update, or delete access
+         is granted if no appropriate rule is found for a
+         particular write request.";
+    }
+
+    leaf exec-default {
+      type action-type;
+      default "permit";
+      description
+        "Controls whether exec access is granted if no appropriate
+         rule is found for a particular protocol operation request.";
+    }
+
+    leaf enable-external-groups {
+      type boolean;
+      default "true";
+      description
+        "Controls whether the server uses the groups reported by the
+         NETCONF transport layer when it assigns the user to a set of
+         NACM groups.  If this leaf has the value 'false', any group
+         names reported by the transport layer are ignored by the
+         server.";
+    }
+
+    leaf denied-operations {
+      type yang:zero-based-counter32;
+      config false;
+      mandatory true;
+      description
+        "Number of times since the server last restarted that a
+         protocol operation request was denied.";
+    }
+
+    leaf denied-data-writes {
+      type yang:zero-based-counter32;
+      config false;
+      mandatory true;
+      description
+        "Number of times since the server last restarted that a
+         protocol operation request to alter
+         a configuration datastore was denied.";
+    }
+
+    leaf denied-notifications {
+      type yang:zero-based-counter32;
+      config false;
+      mandatory true;
+      description
+        "Number of times since the server last restarted that
+         a notification was dropped for a subscription because
+         access to the event type was denied.";
+    }
+
+    container groups {
+      description
+        "NETCONF access control groups.";
+
+      list group {
+        key name;
+
+        description
+          "One NACM group entry.  This list will only contain
+           configured entries, not any entries learned from
+           any transport protocols.";
+
+        leaf name {
+          type group-name-type;
+          description
+            "Group name associated with this entry.";
+        }
+
+        leaf-list user-name {
+          type user-name-type;
+          description
+            "Each entry identifies the username of
+             a member of the group associated with
+             this entry.";
+        }
+      }
+    }
+
+    list rule-list {
+      key name;
+      ordered-by user;
+      description
+        "An ordered collection of access control rules.";
+
+      leaf name {
+        type string {
+          length "1..max";
+        }
+        description
+          "Arbitrary name assigned to the rule-list.";
+      }
+      leaf-list group {
+        type union {
+          type matchall-string-type;
+          type group-name-type;
+        }
+        description
+          "List of administrative groups that will be
+           assigned the associated access rights
+           defined by the 'rule' list.
+
+           The string '*' indicates that all groups apply to the
+           entry.";
+      }
+
+      list rule {
+        key name;
+        ordered-by user;
+        description
+          "One access control rule.
+
+           Rules are processed in user-defined order until a match is
+           found.  A rule matches if 'module-name', 'rule-type', and
+           'access-operations' match the request.  If a rule
+           matches, the 'action' leaf determines whether or not
+           access is granted.";
+
+        leaf name {
+          type string {
+            length "1..max";
+          }
+          description
+            "Arbitrary name assigned to the rule.";
+        }
+
+        leaf module-name {
+          type union {
+            type matchall-string-type;
+            type string;
+          }
+          default "*";
+          description
+            "Name of the module associated with this rule.
+
+             This leaf matches if it has the value '*' or if the
+             object being accessed is defined in the module with the
+             specified module name.";
+        }
+        choice rule-type {
+          description
+            "This choice matches if all leafs present in the rule
+             match the request.  If no leafs are present, the
+             choice matches all requests.";
+          case protocol-operation {
+            leaf rpc-name {
+              type union {
+                type matchall-string-type;
+                type string;
+              }
+              description
+                "This leaf matches if it has the value '*' or if
+                 its value equals the requested protocol operation
+                 name.";
+            }
+          }
+          case notification {
+            leaf notification-name {
+              type union {
+                type matchall-string-type;
+                type string;
+              }
+              description
+                "This leaf matches if it has the value '*' or if its
+                 value equals the requested notification name.";
+            }
+          }
+
+          case data-node {
+            leaf path {
+              type node-instance-identifier;
+              mandatory true;
+              description
+                "Data node instance-identifier associated with the
+                 data node, action, or notification controlled by
+                 this rule.
+
+                 Configuration data or state data
+                 instance-identifiers start with a top-level
+                 data node.  A complete instance-identifier is
+                 required for this type of path value.
+
+                 The special value '/' refers to all possible
+                 datastore contents.";
+            }
+          }
+        }
+
+        leaf access-operations {
+          type union {
+            type matchall-string-type;
+            type access-operations-type;
+          }
+          default "*";
+          description
+            "Access operations associated with this rule.
+
+             This leaf matches if it has the value '*' or if the
+             bit corresponding to the requested operation is set.";
+        }
+
+        leaf action {
+          type action-type;
+          mandatory true;
+          description
+            "The access control action associated with the
+             rule.  If a rule has been determined to match a
+             particular request, then this object is used
+             to determine whether to permit or deny the
+             request.";
+        }
+
+        leaf comment {
+          type string;
+          description
+            "A textual description of the access rule.";
+        }
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf-network-slice-service.txt b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice-service.txt
similarity index 100%
rename from src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/ietf-network-slice-service.txt
rename to src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice-service.txt
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice-service@2024-08-28.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice-service@2024-08-28.yang
new file mode 100644
index 0000000000000000000000000000000000000000..d72dd1ed38c6b098c70ab824f98e8029aef7d137
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice-service@2024-08-28.yang
@@ -0,0 +1,1375 @@
+module ietf-network-slice-service {
+  yang-version 1.1;
+  namespace
+    "urn:ietf:params:xml:ns:yang:ietf-network-slice-service";
+  prefix ietf-nss;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Types";
+  }
+  import ietf-yang-types {
+    prefix yang;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+  import ietf-geo-location {
+    prefix geo;
+    reference
+      "RFC 9179: A YANG Grouping for Geographic Locations";
+  }
+  import ietf-vpn-common {
+    prefix vpn-common;
+    reference
+      "RFC 9181: A Common YANG Data Model for Layer 2 and Layer 3
+                 VPNs";
+  }
+  import ietf-network {
+    prefix nw;
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+  import ietf-network-topology {
+    prefix nt;
+    reference
+      "RFC 8345: A YANG Data Model for Network
+                 Topologies, Section 6.2";
+  }
+  import ietf-ac-common {
+    prefix ac-common;
+    reference
+      "RFC BBBB: A Common YANG Data Model for Attachment Circuits";
+  }
+  import ietf-ac-svc {
+    prefix ac-svc;
+    reference
+      "RFC CCCC: YANG Data Models for Bearers and 'Attachment
+                 Circuits'-as-a-Service (ACaaS)";
+  }
+  import ietf-te-types {
+    prefix te-types;
+    reference
+      "RFC DDDD: Common YANG Types for Traffic Engineering";
+  }
+  import ietf-te-packet-types {
+    prefix te-packet-types;
+    reference
+      "RFC DDDD: Common YANG Data Types for Traffic Engineering";
+  }
+
+  organization
+    "IETF Traffic Engineering Architecture and Signaling (TEAS)
+     Working Group";
+  contact
+    "WG Web:  <https://datatracker.ietf.org/wg/teas/>
+     WG List:  <mailto:teas@ietf.org>
+
+     Editor: Bo Wu
+             <lana.wubo@huawei.com>
+     Editor: Dhruv Dhody
+             <dhruv.ietf@gmail.com>
+     Editor: Reza Rokui
+             <rrokui@ciena.com>
+     Editor: Tarek Saad
+             <tsaad@cisco.com>
+     Editor: John Mullooly
+             <jmullool@cisco.com>";
+  description
+    "This YANG module defines a service model for the RFC 9543
+     Network Slice Service.
+
+     Copyright (c) 2024 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 Revised BSD License set
+     forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC AAAA; see the
+     RFC itself for full legal notices.";
+
+  revision 2024-08-28 {
+    description
+      "Initial revision.";
+    reference
+      "RFC AAAA: A YANG Data Model for the RFC 9543 Network Slice
+       Service";
+  }
+
+  /* Identities */
+
+  identity service-tag-type {
+    description
+      "Base identity of Network Slice Service tag type, which is
+       used for management purposes, such as classification
+       (e.g., customer names) and policy constraints
+       (e.g., Layer 2 or Layer 3 technology realization).";
+  }
+
+  identity customer {
+    base service-tag-type;
+    description
+      "The Network Slice Service customer name tag type,
+       e.g., adding tags with 'customer name' when multiple actual
+       customers use the same Network Slice Service.";
+  }
+
+  identity service {
+    base service-tag-type;
+    description
+      "The Network Slice Service tag type, which can indicate the
+       technical constraints used during service realization,
+       for example, Layer 2 or Layer 3 technologies.";
+  }
+
+  identity opaque {
+    base service-tag-type;
+    description
+      "An opaque type, which can be used for future use,
+       such as filtering of services.";
+  }
+
+  identity attachment-circuit-tag-type {
+    description
+      "Base identity for the attachment circuit tag type.";
+  }
+
+  identity vlan-id {
+    base attachment-circuit-tag-type;
+    description
+      "Identity for VLAN ID tag type, 802.1Q dot1Q.";
+    reference
+      "IEEE Std 802.1Q: IEEE Standard for Local and Metropolitan
+                        Area Networks--Bridges and Bridged
+                        Networks";
+  }
+
+  identity cvlan-id {
+    base attachment-circuit-tag-type;
+    description
+      "Identity for C-VLAN ID tag type, 802.1ad QinQ VLAN IDs.";
+    reference
+      "IEEE Std 802.1ad: IEEE Standard for Local and Metropolitan
+                         Area Networks---Virtual Bridged Local
+                         Area Networks---Amendment 4: Provider
+                         Bridges";
+  }
+
+  identity svlan-id {
+    base attachment-circuit-tag-type;
+    description
+      "Identity for S-VLAN ID tag type, 802.1ad QinQ VLAN IDs.";
+    reference
+      "IEEE Std 802.1ad: IEEE Standard for Local and Metropolitan
+                         Area Networks---Virtual Bridged Local
+                         Area Networks---Amendment 4: Provider
+                         Bridges";
+  }
+
+  identity ip-address-mask {
+    base attachment-circuit-tag-type;
+    description
+      "Identity for IP address mask tag type.";
+  }
+
+  identity service-isolation-type {
+    description
+      "Base identity for Network Slice Service isolation type.";
+  }
+
+  identity traffic-isolation {
+    base service-isolation-type;
+    description
+      "Specify the requirement for separating the traffic of the
+       customer's Network Slice Service from other services,
+       which may be provided by the service provider using VPN
+       technologies, such as L3VPN, L2VPN, EVPN, etc.";
+  }
+
+  identity service-security-type {
+    description
+      "Base identity for Network Slice Service security type.";
+  }
+
+  identity authentication {
+    base service-security-type;
+    description
+      "Indicates that the Slice Service requires authentication.";
+  }
+
+  identity integrity {
+    base service-security-type;
+    description
+      "Indicates that the Slice Service requires data integrity.";
+  }
+
+  identity encryption {
+    base service-security-type;
+    description
+      "Indicates that the Slice Service requires data encryption.";
+  }
+
+  identity point-to-point {
+    base vpn-common:vpn-topology;
+    description
+      "Identity for point-to-point Network Slice
+       Service connectivity.";
+  }
+
+  identity point-to-multipoint {
+    base vpn-common:vpn-topology;
+    description
+      "Identity for point-to-multipoint Network Slice
+       Service connectivity.";
+  }
+
+  identity multipoint-to-multipoint {
+    base vpn-common:vpn-topology;
+    description
+      "Identity for multipoint-to-multipoint Network Slice
+       Service connectivity.";
+  }
+
+  identity multipoint-to-point {
+    base vpn-common:vpn-topology;
+    description
+      "Identity for multipoint-to-point Network Slice
+       Service connectivity.";
+  }
+
+  identity sender-role {
+    base vpn-common:role;
+    description
+      "Indicates that an SDP is acting as a sender.";
+  }
+
+  identity receiver-role {
+    base vpn-common:role;
+    description
+      "Indicates that an SDP is acting as a receiver.";
+  }
+
+  identity service-slo-metric-type {
+    description
+      "Base identity for Network Slice Service SLO metric type.";
+  }
+
+  identity one-way-bandwidth {
+    base service-slo-metric-type;
+    description
+      "SLO bandwidth metric. Minimum guaranteed bandwidth between
+       two SDPs at any time and is measured unidirectionally.";
+  }
+
+  identity two-way-bandwidth {
+    base service-slo-metric-type;
+    description
+      "SLO bandwidth metric. Minimum guaranteed bandwidth between
+       two SDPs at any time.";
+  }
+
+  identity shared-bandwidth {
+    base service-slo-metric-type;
+    description
+      "The shared SLO bandwidth bound. It is the limit on the
+       bandwidth that can be shared amongst a group of
+       connectivity constructs of a Slice Service.";
+  }
+
+  identity one-way-delay-maximum {
+    base service-slo-metric-type;
+    description
+      "The SLO objective of this metric is the upper bound of network
+       delay when transmitting between two SDPs.";
+    reference
+      "RFC 7679: A One-Way Delay Metric for IP Performance
+                 Metrics (IPPM)";
+  }
+
+  identity one-way-delay-percentile {
+    base service-slo-metric-type;
+    description
+      "The SLO objective of this metric is percentile objective of
+       network delay when transmitting between two SDPs.
+       The metric is defined in RFC7679.";
+    reference
+      "RFC 7679: A One-Way Delay Metric for IP Performance
+                 Metrics (IPPM)";
+  }
+
+  identity two-way-delay-maximum {
+    base service-slo-metric-type;
+    description
+      "SLO two-way delay is the upper bound of network delay when
+       transmitting between two SDPs";
+    reference
+      "RFC 2681: A Round-trip Delay Metric for IPPM";
+  }
+
+  identity two-way-delay-percentile {
+    base service-slo-metric-type;
+    description
+      "The SLO objective of this metric is the percentile
+       objective of network delay when the traffic transmitting
+       between two SDPs.";
+    reference
+      "RFC 2681: A Round-trip Delay Metric for IPPM";
+  }
+
+  identity one-way-delay-variation-maximum {
+    base service-slo-metric-type;
+    description
+      "The SLO objective of this metric is maximum bound of the
+       difference in the one-way delay between sequential packets
+       between two SDPs.";
+    reference
+      "RFC 3393: IP Packet Delay Variation Metric for IP Performance
+                 Metrics (IPPM)";
+  }
+
+  identity one-way-delay-variation-percentile {
+    base service-slo-metric-type;
+    description
+      "The SLO objective of this metric is the percentile objective
+       in the one-way delay between sequential packets between two
+       SDPs.";
+    reference
+      "RFC 3393: IP Packet Delay Variation Metric for IP Performance
+                 Metrics (IPPM)";
+  }
+
+  identity two-way-delay-variation-maximum {
+    base service-slo-metric-type;
+    description
+      "SLO two-way delay variation is the difference in the
+       round-trip delay between sequential packets between two
+       SDPs.";
+    reference
+      "RFC 5481: Packet Delay Variation Applicability Statement";
+  }
+
+  identity two-way-delay-variation-percentile {
+    base service-slo-metric-type;
+    description
+      "The SLO objective of this metric is the percentile objective
+       in the round-trip delay between sequential packets between
+       two SDPs.";
+    reference
+      "RFC 5481: Packet Delay Variation Applicability Statement";
+  }
+
+  identity one-way-packet-loss {
+    base service-slo-metric-type;
+    description
+      "This metric type refers to the ratio of packets dropped
+       to packets transmitted between two SDPs in one-way.";
+    reference
+      "RFC 7680: A One-Way Loss Metric for IP Performance
+                 Metrics (IPPM)";
+  }
+
+  identity two-way-packet-loss {
+    base service-slo-metric-type;
+    description
+      "This metric type refers to the ratio of packets dropped
+       to packets transmitted between two SDPs in two-way.";
+    reference
+      "RFC 7680: A One-Way Loss Metric for IP Performance
+                 Metrics (IPPM)";
+  }
+
+  identity availability-type {
+    description
+      "Base identity for availability.";
+  }
+
+  identity six-nines {
+    base availability-type;
+    description
+      "Specifies the availability level: 99.9999%";
+  }
+
+  identity five-nines {
+    base availability-type;
+    description
+      "Specifies the availability level: 99.999%";
+  }
+
+  identity four-nines {
+    base availability-type;
+    description
+      "Specifies the availability level: 99.99%";
+  }
+
+  identity three-nines {
+    base availability-type;
+    description
+      "Specifies the availability level: 99.9%";
+  }
+
+  identity two-nines {
+    base availability-type;
+    description
+      "Specifies the availability level: 99%";
+  }
+
+  identity service-match-type {
+    description
+      "Base identity for Network Slice Service traffic
+       match type.";
+  }
+  identity phy-interface {
+    base service-match-type;
+    description
+      "Uses the physical interface as match criteria for
+       Slice Service traffic.";
+  }
+
+  identity vlan {
+    base service-match-type;
+    description
+      "Uses the VLAN ID as match criteria for the Slice Service
+       traffic.";
+  }
+
+  identity label {
+    base service-match-type;
+    description
+      "Uses the MPLS label as match criteria for the Slice Service
+       traffic.";
+  }
+
+  identity source-ip-prefix {
+    base service-match-type;
+    description
+      "Uses source IP prefix as match criteria for the Slice Service
+       traffic. Examples of 'value' of this match type are
+       '192.0.2.0/24' and '2001:db8::1/64'.";
+  }
+
+  identity destination-ip-prefix {
+    base service-match-type;
+    description
+      "Uses destination IP prefix as match criteria for the Slice
+       Service traffic. Examples of 'value' of this match type are
+       '203.0.113.1/32' and '2001:db8::2/128'.";
+  }
+
+  identity dscp {
+    base service-match-type;
+    description
+      "Uses DSCP field in the IP packet header as match criteria
+       for the Slice Service traffic.";
+  }
+
+  identity acl {
+    base service-match-type;
+    description
+      "Uses Access Control List (ACL) as match criteria
+       for the Slice Service traffic.";
+    reference
+      "RFC 8519: YANG Data Model for Network Access Control
+                 Lists (ACLs)";
+  }
+
+  identity any {
+    base service-match-type;
+    description
+      "Matches any Slice Service traffic.";
+  }
+
+  identity source-tcp-port {
+    base service-match-type;
+    description
+      "Uses source TCP port as match criteria for the Slice Service
+      traffic. Examples of 'value' of this match type are
+      '8080' and '22'.";
+  }
+  
+  identity destination-tcp-port {
+    base service-match-type;
+    description
+      "Uses destination TCP port as match criteria for the Slice
+      Service traffic. Examples of 'value' of this match type are
+      '8080' and '22'.";
+  }
+  
+  identity source-udp-port {
+    base service-match-type;
+    description
+      "Uses source UDP port as match criteria for the Slice Service
+      traffic. Examples of 'value' of this match type are
+      '53', '67' and '68'.";
+  }
+ 
+identity destination-udp-port {
+  base service-match-type;
+  description
+    "Uses destination UDP port as match criteria for the Slice
+    Service traffic. Examples of 'value' of this match type are
+    '53', '67' and '68'.";
+}
+
+  identity slo-sle-policy-override {
+    description
+      "Base identity for SLO/SLE policy override options.";
+  }
+
+  identity full-override {
+    base slo-sle-policy-override;
+    description
+      "The SLO/SLE policy defined at the child level overrides a
+       parent SLO/SLE policy, which means that no SLO/SLEs are
+       inherited from parent if a child SLO/SLE policy exists.";
+  }
+
+  identity partial-override {
+    base slo-sle-policy-override;
+    description
+      "The SLO/SLE policy defined at the child level updates the
+       parent SLO/SLE policy. For example, if a specific SLO is
+       defined at the child level, that specific SLO overrides
+       the one inherited from a parent SLO/SLE policy, while all
+       other SLOs in the parent SLO-SLE policy still apply.";
+  }
+
+  /* Typedef */
+
+  typedef percentage {
+    type decimal64 {
+      fraction-digits 5;
+      range "0..100";
+    }
+    description
+      "Percentage to 5 decimal places.";
+  }
+
+  typedef percentile {
+    type decimal64 {
+      fraction-digits 3;
+      range "0..100";
+    }
+    description
+      "The percentile is a value between 0 and 100
+       to 3 decimal places, e.g., 10.000, 99.900,99.990, etc.
+       For example, for a given one-way delay measurement,
+       if the percentile is set to 95.000 and the 95th percentile
+       one-way delay is 2 milliseconds, then the 95 percent of
+       the sample value is less than or equal to 2 milliseconds.";
+  }
+
+  typedef slice-template-ref {
+    type leafref {
+      path "/ietf-nss:network-slice-services"
+         + "/ietf-nss:slo-sle-templates"
+         + "/ietf-nss:slo-sle-template"
+         + "/ietf-nss:id";
+    }
+    description
+      "This type is used by data models that need to reference
+       Network Slice templates.";
+  }
+
+  typedef slice-service-ref {
+    type leafref {
+      path
+        "/ietf-nss:network-slice-services/ietf-nss:slice-service"
+      + "/ietf-nss:id";
+    }
+    description
+      "Defines a reference to a slice service that can be used
+       by other modules.";
+  }
+
+  /* Groupings */
+
+  grouping service-slos {
+    description
+      "A reusable grouping for directly measurable objectives of
+       a Slice Service.";
+    container slo-policy {
+      description
+        "Contains the SLO policy.";
+      list metric-bound {
+        key "metric-type";
+        description
+          "List of Slice Service metric bounds.";
+        leaf metric-type {
+          type identityref {
+            base service-slo-metric-type;
+          }
+          description
+            "Identifies SLO metric type of the Slice Service.";
+        }
+        leaf metric-unit {
+          type string;
+          mandatory true;
+          description
+            "The metric unit of the parameter. For example,
+             for time units, where the options are hours, minutes,
+             seconds, milliseconds, microseconds, and nanoseconds;
+             for bandwidth units, where the options are bps, Kbps,
+             Mbps, Gbps; for the packet loss rate unit,
+             the options can be a percentage.";
+        }
+        leaf value-description {
+          type string;
+          description
+            "The description of the provided value.";
+        }
+        leaf percentile-value {
+          type percentile;
+          description
+            "The percentile value of the metric type.";
+        }
+        leaf bound {
+          type uint64;
+          description
+            "The bound on the Slice Service connection metric.
+             When set to zero, this indicates an unbounded
+             upper limit for the specific metric-type.";
+        }
+      }
+      leaf availability {
+        type identityref {
+          base availability-type;
+        }
+        description
+          "Service availability level";
+      }
+      leaf mtu {
+        type uint32;
+        units "bytes";
+        description
+          "Specifies the maximum length of Layer 2 data
+           packets of the Slice Service.
+           If the customer sends packets that are longer than the
+           requested service MTU, the network may discard them
+           (or for IPv4, fragment them).
+           This service MTU takes precedence over the MTUs of
+           all attachment circuits (ACs). The value needs to be
+           less than or equal to the minimum MTU value of
+           all ACs in the SDPs.";
+      }
+    }
+  }
+
+  grouping service-sles {
+    description
+      "A reusable grouping for indirectly measurable objectives of
+       a Slice Service.";
+    container sle-policy {
+      description
+        "Contains the SLE policy.";
+      leaf-list security {
+        type identityref {
+          base service-security-type;
+        }
+        description
+          "The security functions that the customer requests
+           the operator to apply to traffic between the two SDPs.";
+      }
+      leaf-list isolation {
+        type identityref {
+          base service-isolation-type;
+        }
+        description
+          "The Slice Service isolation requirement.";
+      }
+      leaf max-occupancy-level {
+        type uint8 {
+          range "1..100";
+        }
+        description
+          "The maximal occupancy level specifies the number of flows
+           to be admitted and optionally a maximum number of
+           countable resource units (e.g., IP or MAC addresses)
+           a Network Slice Service can consume.";
+      }
+      container path-constraints {
+        description
+          "Container for the policy of path constraints
+           applicable to the Slice Service.";
+        container service-functions {
+          description
+            "Container for the policy of service function
+             applicable to the Slice Service.";
+        }
+        container diversity {
+          description
+            "Container for the policy of disjointness
+             applicable to the Slice Service.";
+          leaf diversity-type {
+            type te-types:te-path-disjointness;
+            description
+              "The type of disjointness on Slice Service, i.e.,
+               across all connectivity constructs.";
+          }
+        }
+      }
+    }
+  }
+
+  grouping slice-service-template {
+    description
+      "A reusable grouping for Slice Service templates.";
+    container slo-sle-templates {
+      description
+        "Contains a set of Slice Service templates.";
+      list slo-sle-template {
+        key "id";
+        description
+          "List for SLO and SLE template identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the Service Level Objective (SLO)
+             and Service Level Expectation (SLE) template to be used.
+             Local administration meaning.";
+        }
+        leaf description {
+          type string;
+          description
+            "Describes the SLO and SLE policy template.";
+        }
+        leaf template-ref {
+          type slice-template-ref;
+          description
+            "The reference to a standard template. When set it
+              indicates the base template over which further
+              SLO/SLE policy changes are made.";
+        }
+        uses service-slos;
+        uses service-sles;
+      }
+    }
+  }
+
+  grouping service-slo-sle-policy {
+    description
+      "Slice service policy grouping.";
+    choice slo-sle-policy {
+      description
+        "Choice for SLO and SLE policy template.
+         Can be standard template or customized template.";
+      case standard {
+        description
+          "Standard SLO template.";
+        leaf slo-sle-template {
+          type slice-template-ref;
+          description
+            "Standard SLO and SLE template to be used.";
+        }
+      }
+      case custom {
+        description
+          "Customized SLO and SLE template.";
+        container service-slo-sle-policy {
+          description
+            "Contains the SLO and SLE policy.";
+          leaf description {
+            type string;
+            description
+              "Describes the SLO and SLE policy.";
+          }
+          uses service-slos;
+          uses service-sles;
+        }
+      }
+    }
+  }
+
+  grouping service-qos {
+    description
+      "Grouping for the Slice Service QoS policy.";
+    container incoming-qos-policy {
+      description
+        "The QoS policy imposed on ingress direction of the traffic,
+         from the customer network or from another provider's
+         network.";
+      leaf qos-policy-name {
+        type string;
+        description
+          "The name of the QoS policy that is applied to the
+           attachment circuit. The name can reference a QoS
+           profile that is pre-provisioned on the device.";
+      }
+      container rate-limits {
+        description
+          "Container for the asymmetric traffic control.";
+        uses ac-common:bandwidth-parameters;
+        container classes {
+          description
+            "Container for service class bandwidth control.";
+          list cos {
+            key "cos-id";
+            description
+              "List of Class of Services.";
+            leaf cos-id {
+              type uint8;
+              description
+                "Identifier of the CoS, indicated by
+                 a Differentiated Services Code Point
+                 (DSCP) or a CE-CLAN CoS (802.1p)
+                 value in the service frame.";
+              reference
+                "IEEE Std 802.1Q: Bridges and Bridged
+                                  Networks";
+            }
+            uses ac-common:bandwidth-parameters;
+          }
+        }
+      }
+    }
+    container outgoing-qos-policy {
+      description
+        "The QoS policy imposed on egress direction of the traffic,
+         towards the customer network or towards another
+         provider's network.";
+      leaf qos-policy-name {
+        type string;
+        description
+          "The name of the QoS policy that is applied to the
+           attachment circuit. The name can reference a QoS
+           profile that is pre-provisioned on the device.";
+      }
+      container rate-limits {
+        description
+          "The rate-limit imposed on outgoing traffic.";
+        uses ac-common:bandwidth-parameters;
+        container classes {
+          description
+            "Container for classes.";
+          list cos {
+            key "cos-id";
+            description
+              "List of Class of Services.";
+            leaf cos-id {
+              type uint8;
+              description
+                "Identifier of the CoS, indicated by
+                 a Differentiated Services Code Point
+                 (DSCP) or a CE-CLAN CoS (802.1p)
+                 value in the service frame.";
+              reference
+                "IEEE Std 802.1Q: Bridges and Bridged
+                                  Networks";
+            }
+            uses ac-common:bandwidth-parameters;
+          }
+        }
+      }
+    }
+  }
+
+  grouping service-slo-sle-policy-override {
+    description
+      "Slice Service policy override grouping.";
+    leaf service-slo-sle-policy-override {
+      type identityref {
+        base slo-sle-policy-override;
+      }
+      description
+        "SLO/SLE policy override option.";
+    }
+  }
+
+  grouping connectivity-construct-monitoring-metrics {
+    description
+      "Grouping for connectivity construct monitoring metrics.";
+    uses
+      te-packet-types:one-way-performance-metrics-gauge-packet;
+    uses
+      te-packet-types:two-way-performance-metrics-gauge-packet;
+  }
+  /* Main Network Slice Services Container */
+
+  container network-slice-services {
+    description
+      "Contains a list of Network Slice Services";
+    uses slice-service-template;
+    list slice-service {
+      key "id";
+      description
+        "A Slice Service is identified by a service id.";
+      leaf id {
+        type string;
+        description
+          "A unique Slice Service identifier within an NSC.";
+      }
+      leaf description {
+        type string;
+        description
+          "Textual description of the Slice Service.";
+      }
+      container service-tags {
+        description
+          "Container for a list of service tags for management
+           purposes, such as policy constraints
+           (e.g., Layer 2 or Layer 3 technology realization),
+           classification (e.g., customer names, opaque values).";
+        list tag-type {
+          key "tag-type";
+          description
+            "The service tag list.";
+          leaf tag-type {
+            type identityref {
+              base service-tag-type;
+            }
+            description
+              "Slice Service tag type, e.g., realization technology
+               constraints, customer name, or other customer-defined
+               opaque types.";
+          }
+          leaf-list value {
+            type string;
+            description
+              "The tag values, e.g., 5G customer names when multiple
+               customers share the same Slice Service in 5G scenario,
+               or Slice realization technology (such as Layer 2 or
+               Layer 3).";
+          }
+        }
+      }
+      uses service-slo-sle-policy;
+      leaf compute-only {
+        type empty;
+        description
+          "When present, this is a feasibility check. That is, no
+           resources are reserved in the network.";
+      }
+      uses ac-common:service-status;
+      container sdps {
+        description
+          "Slice Service SDPs.";
+        list sdp {
+          key "id";
+          min-elements 2;
+          description
+            "List of SDPs in this Slice Service.";
+          leaf id {
+            type string;
+            description
+              "The unique identifier of the SDP within the scope of
+               an NSC.";
+          }
+          leaf description {
+            type string;
+            description
+              "Provides a description of the SDP.";
+          }
+          uses geo:geo-location;
+          leaf node-id {
+            type string;
+            description
+              "A unique identifier of an edge node of the SDP
+               within the scope of the NSC.";
+          }
+          leaf-list sdp-ip-address {
+            type inet:ip-address;
+            description
+              "IPv4 or IPv6 address of the SDP.";
+          }
+          leaf tp-ref {
+            type leafref {
+              path
+                "/nw:networks/nw:network[nw:network-id="
+              + "current()/../../../custom-topology/network-ref]/"
+              + "nw:node/nt:termination-point/nt:tp-id";
+            }
+            description
+              "A reference to Termination Point (TP) in the custom
+               topology";
+            reference
+              "RFC 8345: A YANG Data Model for Network Topologies";
+          }
+          container service-match-criteria {
+            description
+              "Describes the Slice Service match criteria.";
+            list match-criterion {
+              key "index";
+              description
+                "List of the Slice Service traffic match criteria.";
+              leaf index {
+                type uint32;
+                description
+                  "The identifier of a match criteria.";
+              }
+              list match-type {
+                key "type";
+                description
+                  "List of the Slice Service traffic match types.";
+                leaf type {
+                  type identityref {
+                    base service-match-type;
+                  }
+                  mandatory true;
+                  description
+                    "Indicates the match type of the entry in the
+                     list of the Slice Service match criteria.";
+                }
+                leaf-list value {
+                  type string;
+                  description
+                    "Provides a value for the Slice Service match
+                     criteria, e.g., IP prefix, VLAN ID, or
+                     ACL name.";
+                }
+              }
+              leaf target-connection-group-id {
+                type leafref {
+                  path
+                    "../../../../../ietf-nss:connection-groups"
+                  + "/ietf-nss:connection-group"
+                  + "/ietf-nss:id";
+                }
+                mandatory true;
+                description
+                  "Reference to the Slice Service connection group.";
+              }
+              leaf connection-group-sdp-role {
+                type identityref {
+                  base vpn-common:role;
+                }
+                description
+                  "Specifies the role of SDP in the connection group
+                   When the service connection type is MP2MP,
+                   such as hub and spoke service connection type.
+                   In addition, this helps to create connectivity
+                   construct automatically, rather than explicitly
+                   specifying each one.";
+              }
+              leaf target-connectivity-construct-id {
+                type leafref {
+                  path
+                    "../../../../../ietf-nss:connection-groups"
+                  + "/ietf-nss:connection-group[ietf-nss:id="
+                  + "current()/../target-connection-group-id]"
+                  + "/ietf-nss:connectivity-construct/ietf-nss:id";
+                }
+                description
+                  "Reference to a Network Slice connection
+                   construct.";
+              }
+            }
+          }
+          uses service-qos;
+          container sdp-peering {
+            description
+              "Describes SDP peering attributes.";
+            leaf-list peer-sap-id {
+              type string;
+              description
+                "Indicates the reference to the remote endpoints of
+                 the attachment circuits. This information can be
+                 used for correlation purposes, such as identifying
+                 SAPs of provider equipments when requesting
+                 a service with CE based SDP attributes.";
+              reference
+                "RFC 9408: A YANG Network Data Model for Service
+                 Attachment Points (SAPs)";
+            }
+            container protocols {
+              description
+                "Serves as an augmentation target.
+                 Protocols can be augmented into this container,
+                 e.g., BGP, static routing.";
+            }
+          }
+          leaf-list ac-svc-ref {
+            type ac-svc:attachment-circuit-reference;
+            description
+              "A reference to the ACs that have been created before
+               the slice creation.";
+            reference
+              "RFC CCCC: YANG Data Models for Bearers and
+                'Attachment Circuits'-as-a-Service (ACaaS)";
+          }
+          leaf ce-mode {
+            type boolean;
+            description
+              "Indicates that SDP is on the CE.";
+          }
+          container attachment-circuits {
+            description
+              "List of attachment circuits.";
+            list attachment-circuit {
+              key "id";
+              description
+                "The Network Slice Service SDP attachment circuit
+                 related parameters.";
+              leaf id {
+                type string;
+                description
+                  "The identifier of attachment circuit.";
+              }
+              leaf description {
+                type string;
+                description
+                  "The attachment circuit's description.";
+              }
+              leaf ac-svc-ref {
+                type ac-svc:attachment-circuit-reference;
+                description
+                  "A reference to the AC service that has been
+                   created before the slice creation.";
+                reference
+                  "RFC CCCC: YANG Data Models for Bearers and
+                    'Attachment Circuits'-as-a-Service (ACaaS)";
+              }
+              leaf ac-node-id {
+                type string;
+                description
+                  "The attachment circuit node ID in the case of
+                   multi-homing.";
+              }
+              leaf ac-tp-id {
+                type string;
+                description
+                  "The termination port ID of the
+                   attachment circuit.";
+              }
+              leaf ac-ipv4-address {
+                type inet:ipv4-address;
+                description
+                  "The IPv4 address of the AC.";
+              }
+              leaf ac-ipv4-prefix-length {
+                type uint8;
+                description
+                  "The IPv4 subnet prefix length expressed in bits.";
+              }
+              leaf ac-ipv6-address {
+                type inet:ipv6-address;
+                description
+                  "The IPv6 address of the AC.";
+              }
+              leaf ac-ipv6-prefix-length {
+                type uint8;
+                description
+                  "The IPv6 subnet prefix length expressed in bits.";
+              }
+              leaf mtu {
+                type uint32;
+                units "bytes";
+                description
+                  "Maximum size of the Slice Service Layer 2 data
+                   packet that can traverse an SDP.";
+              }
+              container ac-tags {
+                description
+                  "Container for the attachment circuit tags.";
+                list ac-tag {
+                  key "tag-type";
+                  description
+                    "The attachment circuit tag list.";
+                  leaf tag-type {
+                    type identityref {
+                      base attachment-circuit-tag-type;
+                    }
+                    description
+                      "The attachment circuit tag type.";
+                  }
+                  leaf-list value {
+                    type string;
+                    description
+                      "The attachment circuit tag values.
+                       For example, the tag may indicate
+                       multiple VLAN identifiers.";
+                  }
+                }
+              }
+              uses service-qos;
+              container sdp-peering {
+                description
+                  "Describes SDP peering attributes.";
+                leaf peer-sap-id {
+                  type string;
+                  description
+                    "Indicates a reference to the remote endpoints
+                     of an attachment circuit. This information can
+                     be used for correlation purposes, such as
+                     identifying a service attachment point (SAP)
+                     of a provider equipment when requesting a
+                     service with CE based SDP attributes.";
+                  reference
+                    "RFC 9408: A YANG Network Data Model for
+                               Service Attachment Points (SAPs)";
+                }
+                container protocols {
+                  description
+                    "Serves as an augmentation target.
+                     Protocols can be augmented into this container,
+                     e.g., BGP or static routing.";
+                }
+              }
+              uses ac-common:service-status;
+            }
+          }
+          uses ac-common:service-status;
+          container sdp-monitoring {
+            config false;
+            description
+              "Container for SDP monitoring metrics.";
+            leaf incoming-bw-value {
+              type yang:gauge64;
+              units "bps";
+              description
+                "Indicates the absolute value of the incoming
+                 bandwidth at an SDP from the customer network or
+                 from another provider's network.";
+            }
+            leaf incoming-bw-percent {
+              type percentage;
+              units "percent";
+              description
+                "Indicates a percentage of the incoming bandwidth
+                 at an SDP from the customer network or
+                 from another provider's network.";
+            }
+            leaf outgoing-bw-value {
+              type yang:gauge64;
+              units "bps";
+              description
+                "Indicates the absolute value of the outgoing
+                 bandwidth at an SDP towards the customer network or
+                 towards another provider's network.";
+            }
+            leaf outgoing-bw-percent {
+              type percentage;
+              units "percent";
+              description
+                "Indicates a percentage of the outgoing bandwidth
+                 at an SDP towards the customer network or towards
+                 another provider's network.";
+            }
+          }
+        }
+      }
+      container connection-groups {
+        description
+          "Contains connection groups.";
+        list connection-group {
+          key "id";
+          description
+            "List of connection groups.";
+          leaf id {
+            type string;
+            description
+              "The connection group identifier.";
+          }
+          leaf connectivity-type {
+            type identityref {
+              base vpn-common:vpn-topology;
+            }
+            description
+              "Connection group connectivity type.";
+          }
+          uses service-slo-sle-policy;
+          /* Per connection group SLO/SLE policy
+           * overrides the per Slice SLO/SLE policy.
+           */
+          uses service-slo-sle-policy-override;
+          list connectivity-construct {
+            key "id";
+            description
+              "List of connectivity constructs.";
+            leaf id {
+              type string;
+              description
+                "The connectivity construct identifier.";
+            }
+            choice type {
+              default "p2p";
+              description
+                "Choice for connectivity construct type.";
+              case p2p {
+                description
+                  "P2P connectivity construct.";
+                leaf p2p-sender-sdp {
+                  type leafref {
+                    path "../../../../sdps/sdp/id";
+                  }
+                  description
+                    "Reference to a sender SDP.";
+                }
+                leaf p2p-receiver-sdp {
+                  type leafref {
+                    path "../../../../sdps/sdp/id";
+                  }
+                  description
+                    "Reference to a receiver SDP.";
+                }
+              }
+              case p2mp {
+                description
+                  "P2MP connectivity construct.";
+                leaf p2mp-sender-sdp {
+                  type leafref {
+                    path "../../../../sdps/sdp/id";
+                  }
+                  description
+                    "Reference to a sender SDP.";
+                }
+                leaf-list p2mp-receiver-sdp {
+                  type leafref {
+                    path "../../../../sdps/sdp/id";
+                  }
+                  description
+                    "Reference to a receiver SDP.";
+                }
+              }
+              case a2a {
+                description
+                  "A2A connectivity construct.";
+                list a2a-sdp {
+                  key "sdp-id";
+                  description
+                    "List of included A2A SDPs.";
+                  leaf sdp-id {
+                    type leafref {
+                      path "../../../../../sdps/sdp/id";
+                    }
+                    description
+                      "Reference to an SDP.";
+                  }
+                  uses service-slo-sle-policy;
+                }
+              }
+            }
+            uses service-slo-sle-policy;
+            /* Per connectivity construct SLO/SLE policy
+             * overrides the per slice SLO/SLE policy.
+             */
+            uses service-slo-sle-policy-override;
+            uses ac-common:service-status;
+            container connectivity-construct-monitoring {
+              config false;
+              description
+                "SLO status per connectivity construct.";
+              uses connectivity-construct-monitoring-metrics;
+            }
+          }
+          container connection-group-monitoring {
+            config false;
+            description
+              "SLO status per connection group.";
+            uses connectivity-construct-monitoring-metrics;
+          }
+        }
+      }
+      container custom-topology {
+        description
+          "Serves as an augmentation target.
+           Container for custom topology, which is indicated by the
+           referenced topology predefined, e.g., an abstract RFC8345
+           topology.";
+        uses nw:network-ref;
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice@2022-03-04.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice@2022-03-04.yang
new file mode 100644
index 0000000000000000000000000000000000000000..b1ead4bf025c59065d01172f309af188c0ee2f75
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-slice@2022-03-04.yang
@@ -0,0 +1,1130 @@
+module ietf-network-slice {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network-slice";
+  prefix ietf-ns;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Types.";
+  }
+  import ietf-te-types {
+    prefix te-types;
+    reference
+      "RFC 8776: Common YANG Data Types for Traffic Engineering.";
+  }
+  import ietf-te-packet-types {
+    prefix te-packet-types;
+    reference
+      "RFC 8776: Common YANG Data Types for Traffic Engineering.";
+  }
+
+  organization
+    "IETF Traffic Engineering Architecture and Signaling (TEAS)
+     Working Group";
+  contact
+    "WG Web:  <https://tools.ietf.org/wg/teas/>
+     WG List:  <mailto:teas@ietf.org>
+
+     Editor: Bo Wu
+          <lana.wubo@huawei.com>
+     Editor: Dhruv Dhody
+          <dhruv.ietf@gmail.com>
+     Editor: Reza Rokui
+          <reza.rokui@nokia.com>
+     Editor: Tarek Saad
+          <tsaad@juniper.net>
+     Author: Liuyan Han
+          <hanliuyan@chinamobile.com>";
+  description
+    "This module contains a YANG module for the IETF Network Slice.
+
+        Copyright (c) 2022 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 Revised BSD License
+        set forth in Section 4.c of the IETF Trust's Legal Provisions
+        Relating to IETF Documents
+        (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX; see the
+     RFC itself for full legal notices.";
+
+  revision 2022-03-04 {
+    description
+      "initial version.";
+    reference
+      "RFC XXXX: A Yang Data Model for IETF Network Slice Operation";
+  }
+
+  /* Features */
+  /* Identities */
+
+  identity ns-tag-type {
+    description
+      "Base identity for IETF Network Slice tag type.";
+  }
+
+  identity ns-tag-customer {
+    base ns-tag-type;
+    description
+      "The IETF Network Slice customer ID tag type.";
+  }
+
+  identity ns-tag-service {
+    base ns-tag-type;
+    description
+      "The IETF Network Slice service tag type.";
+  }
+
+  identity ns-tag-opaque {
+    base ns-tag-type;
+    description
+      "The IETF Network Slice opaque tag type.";
+  }
+
+  identity network-access-tag-type {
+    description
+      "Base identity for the network access tag type.";
+  }
+
+  identity network-access-tag-vlan-id {
+    base network-access-tag-type;
+    description
+      "The network access interface VLAN ID tag type.";
+  }
+
+  identity network-access-tag-ip-mask {
+    base network-access-tag-type;
+    description
+      "The network access tag IP mask.";
+  }
+
+  identity network-access-tag-opaque {
+    base network-access-tag-type;
+    description
+      "The network access opaque tag type.";
+  }
+
+  identity ns-isolation-type {
+    description
+      "Base identity for IETF Network slice isolation level.";
+  }
+
+  identity ns-isolation-shared {
+    base ns-isolation-type;
+    description
+      "Shared resources (e.g. queues) are associated with the Network
+       Slice traffic. Hence, the IETF network slice traffic can be
+       impacted by effects of other services traffic sharing
+       the same resources.";
+  }
+
+  identity ns-isolation-dedicated {
+    base ns-isolation-type;
+    description
+      "Dedicated resources (e.g. queues) are associated with the
+       Network Slice traffic. Hence, the IETF network slice traffic
+       is isolated from other servceis traffic sharing the same
+       resources.";
+  }
+
+  identity ns-security-type {
+    description
+      "Base identity for for IETF Network security level.";
+  }
+
+  identity ns-security-authenticate {
+    base ns-security-type;
+    description
+      "IETF Network Slice requires authentication.";
+  }
+
+  identity ns-security-integrity {
+    base ns-security-type;
+    description
+      "IETF Network Slice requires data integrity.";
+  }
+
+  identity ns-security-encryption {
+    base ns-security-type;
+    description
+      "IETF Network Slice requires data encryption.";
+  }
+
+  identity ns-connectivity-type {
+    description
+      "Base identity for IETF Network Slice connectivity.";
+  }
+
+  identity point-to-point {
+    base ns-connectivity-type;
+    description
+      "Identity for point-to-point IETF Network Slice connectivity.";
+  }
+
+  identity point-to-multipoint {
+    base ns-connectivity-type;
+    description
+      "Identity for point-to-multipoint IETF Network Slice
+       connectivity.";
+  }
+
+  identity multipoint-to-multipoint {
+    base ns-connectivity-type;
+    description
+      "Identity for multipoint-to-multipoint IETF Network Slice
+       connectivity.";
+  }
+
+  identity any-to-any {
+    base ns-connectivity-type;
+    description
+      "Identity for any-to-any IETF Network Slice connectivity.";
+  }
+
+  identity hub-spoke {
+    base ns-connectivity-type;
+    description
+      "Identity for Hub-and-Spoke IETF Network Slice connectivity.";
+  }
+
+  identity custom {
+    base ns-connectivity-type;
+    description
+      "Identity of a custom NS topology where Hubs can act as
+       Spoke for certain parts of the network or Spokes as Hubs.";
+  }
+
+  identity endpoint-role {
+    description
+      "Base identity of a NSE role in an IETF Network Slice topology.";
+  }
+
+  identity any-to-any-role {
+    base endpoint-role;
+    description
+      "Identity of any-to-any NS.";
+  }
+
+  identity spoke-role {
+    base endpoint-role;
+    description
+      "A NSE is acting as a Spoke.";
+  }
+
+  identity hub-role {
+    base endpoint-role;
+    description
+      "A NSE is acting as a Hub.";
+  }
+
+  identity ns-slo-metric-type {
+    description
+      "Base identity for IETF Network Slice SLO metric type.";
+  }
+
+  identity ns-slo-one-way-bandwidth {
+    base ns-slo-metric-type;
+    description
+      "SLO bandwidth metric. Minimum guaranteed bandwidth between
+       two endpoints at any time and is measured unidirectionally.";
+  }
+
+  identity ns-slo-two-way-bandwidth {
+    base ns-slo-metric-type;
+    description
+      "SLO bandwidth metric. Minimum guaranteed bandwidth between
+       two endpoints at any time.";
+  }
+
+  identity ns-slo-shared-bandwidth {
+    base ns-slo-metric-type;
+    description
+      "The shared SLO bandwidth bound. It is the limit on the
+       bandwidth that can be shared amongst a group of connections
+       of an IETF Network Slice.";
+  }
+
+  identity ns-slo-one-way-delay {
+    base ns-slo-metric-type;
+    description
+      "SLO one-way-delay is the upper bound of network delay when
+       transmitting between two endpoints. The metric is defined in
+       RFC7679.";
+  }
+
+  identity ns-slo-two-way-delay {
+    base ns-slo-metric-type;
+    description
+      "SLO two-way delay is the upper bound of network delay when
+       transmitting between two endpoints. The metric is defined in
+       RFC2681.";
+  }
+  identity ns-slo-one-way-delay-variation {
+    base ns-slo-metric-type;
+    description
+      "SLO one-way delay variation is defined by RFC3393, is the
+       difference in the one-way delay between sequential packets
+       between two endpoints.";
+  }
+
+  identity ns-slo-two-way-delay-variation {
+    base ns-slo-metric-type;
+    description
+      "SLO two-way delay variation is defined by RFC5481, is the
+       difference in the round-trip delay between sequential packets
+       between two endpoints.";
+  }
+
+  identity ns-slo-one-way-packet-loss {
+    base ns-slo-metric-type;
+    description
+      "SLO loss metric. The ratio of packets dropped to packets
+       transmitted between two endpoints in one-way
+       over a period of time as specified in RFC7680.";
+  }
+
+  identity ns-slo-two-way-packet-loss {
+    base ns-slo-metric-type;
+    description
+      "SLO loss metric. The ratio of packets dropped to packets
+       transmitted between two endpoints in two-way
+       over a period of time as specified in RFC7680.";
+  }
+
+  identity ns-slo-availability {
+    base ns-slo-metric-type;
+    description
+      "SLO availability level.";
+  }
+
+  identity ns-match-type {
+    description
+      "Base identity for IETF Network Slice traffic match type.";
+  }
+
+  identity ns-phy-interface-match {
+    base ns-match-type;
+    description
+      "Use the physical interface as match criteria for the IETF
+       Network Slice traffic.";
+  }
+
+  identity ns-vlan-match {
+    base ns-match-type;
+    description
+      "Use the VLAN ID as match criteria for the IETF Network Slice
+       traffic.";
+  }
+
+  identity ns-label-match {
+    base ns-match-type;
+    description
+      "Use the MPLS label as match criteria for the IETF Network
+       Slice traffic.";
+  }
+
+  identity peering-protocol-type {
+    description
+      "Base identity for NSE peering protocol type.";
+  }
+
+  identity peering-protocol-bgp {
+    base peering-protocol-type;
+    description
+      "Use BGP as protocol for NSE peering with customer device.";
+  }
+
+  identity peering-static-routing {
+    base peering-protocol-type;
+    description
+      "Use static routing for NSE peering with customer device.";
+  }
+
+  /*
+   * Identity for availability-type
+   */
+
+  identity availability-type {
+    description
+      "Base identity from which specific availability types are
+       derived.";
+  }
+
+  identity level-1 {
+    base availability-type;
+    description
+      "level 1: 99.9999%";
+  }
+  identity level-2 {
+    base availability-type;
+    description
+      "level 2: 99.999%";
+  }
+
+  identity level-3 {
+    base availability-type;
+    description
+      "level 3: 99.99%";
+  }
+
+  identity level-4 {
+    base availability-type;
+    description
+      "level 4: 99.9%";
+  }
+
+  identity level-5 {
+    base availability-type;
+    description
+      "level 5: 99%";
+  }
+
+  /* typedef */
+
+  typedef operational-type {
+    type enumeration {
+      enum up {
+        value 0;
+        description
+          "Operational status UP.";
+      }
+      enum down {
+        value 1;
+        description
+          "Operational status DOWN.";
+      }
+      enum unknown {
+        value 2;
+        description
+          "Operational status UNKNOWN.";
+      }
+    }
+    description
+      "This is a read-only attribute used to determine the
+       status of a particular element.";
+  }
+  typedef ns-monitoring-type {
+    type enumeration {
+      enum one-way {
+        description
+          "Represents one-way measurments monitoring type.";
+      }
+      enum two-way {
+        description
+          "represents two-way measurements monitoring type.";
+      }
+    }
+    description
+      "An enumerated type for monitoring on a IETF Network Slice
+       connection.";
+  }
+
+  /* Groupings */
+
+  grouping status-params {
+    description
+      "A grouping used to join operational and administrative status.";
+    container status {
+      description
+        "A container for the administrative and operational state.";
+      leaf admin-enabled {
+        type boolean;
+        description
+          "The administrative status.";
+      }
+      leaf oper-status {
+        type operational-type;
+        config false;
+        description
+          "The operational status.";
+      }
+    }
+  }
+
+  grouping ns-match-criteria {
+    description
+      "A grouping for the IETF Network Slice match definition.";
+    container ns-match-criteria {
+      description
+        "Describes the IETF Network Slice match criteria.";
+      list ns-match-criterion {
+        key "index";
+        description
+          "List of the IETF Network Slice traffic match criteria.";
+        leaf index {
+          type uint32;
+          description
+            "The entry index.";
+        }
+        leaf match-type {
+          type identityref {
+            base ns-match-type;
+          }
+          description
+            "Identifies an entry in the list of the IETF Network Slice
+             match criteria.";
+        }
+        list values {
+          key "index";
+          description
+            "List of match criteria values.";
+          leaf index {
+            type uint8;
+            description
+              "Index of an entry in the list.";
+          }
+          leaf value {
+            type string;
+            description
+              "Describes the IETF Network Slice match criteria, e.g.
+               IP address, VLAN, etc.";
+          }
+        }
+        leaf target-ns-connection-group-id {
+          type leafref {
+            path "/network-slices/network-slice"
+               + "/ns-connection-groups/ns-connection-group"
+               + "/ns-connection-group-id";
+          }
+          description
+            "reference to a Network Slice connection group.";
+        }
+      }
+    }
+  }
+
+  grouping ns-sles {
+    description
+      "Indirectly Measurable Objectives of a IETF Network
+       Slice.";
+    leaf-list security {
+      type identityref {
+        base ns-security-type;
+      }
+      description
+        "The IETF Network Slice security SLE(s)";
+    }
+    leaf isolation {
+      type identityref {
+        base ns-isolation-type;
+      }
+      default "ns-isolation-shared";
+      description
+        "The IETF Network Slice isolation SLE requirement.";
+    }
+    leaf max-occupancy-level {
+      type uint8 {
+        range "1..100";
+      }
+      description
+        "The maximal occupancy level specifies the number of flows to
+         be admitted.";
+    }
+    leaf mtu {
+      type uint16;
+      units "bytes";
+      mandatory true;
+      description
+        "The MTU specifies the maximum length in octets of data
+         packets that can be transmitted by the NS. The value needs
+         to be less than or equal to the minimum MTU value of
+         all 'ep-network-access-points' in the NSEs of the NS.";
+    }
+    container steering-constraints {
+      description
+        "Container for the policy of steering constraints
+         applicable to IETF Network Slice.";
+      container path-constraints {
+        description
+          "Container for the policy of path constraints
+           applicable to IETF Network Slice.";
+      }
+      container service-function {
+        description
+          "Container for the policy of service function
+           applicable to IETF Network Slice.";
+      }
+    }
+  }
+
+  grouping ns-metric-bounds {
+    description
+      "IETF Network Slice metric bounds grouping.";
+    container ns-metric-bounds {
+      description
+        "IETF Network Slice metric bounds container.";
+      list ns-metric-bound {
+        key "metric-type";
+        description
+          "List of IETF Network Slice metric bounds.";
+        leaf metric-type {
+          type identityref {
+            base ns-slo-metric-type;
+          }
+          description
+            "Identifies an entry in the list of metric type
+             bounds for the IETF Network Slice.";
+        }
+        leaf metric-unit {
+          type string;
+          mandatory true;
+          description
+            "The metric unit of the parameter. For example,
+             s, ms, ns, and so on.";
+        }
+        leaf value-description {
+          type string;
+          description
+            "The description of previous value.";
+        }
+        leaf bound {
+          type uint64;
+          default "0";
+          description
+            "The Bound on the Network Slice connection metric. A
+             zero indicate an unbounded upper limit for the
+             specific metric-type.";
+        }
+      }
+    }
+  }
+
+  grouping ep-peering {
+    description
+      "A grouping for the IETF Network Slice Endpoint peering.";
+    container ep-peering {
+      description
+        "Describes NSE peering attributes.";
+      list protocol {
+        key "protocol-type";
+        description
+          "List of the NSE peering protocol.";
+        leaf protocol-type {
+          type identityref {
+            base peering-protocol-type;
+          }
+          description
+            "Identifies an entry in the list of NSE peering
+             protocol type.";
+        }
+        list attribute {
+          key "index";
+          description
+            "List of protocol attribute.";
+          leaf index {
+            type uint8;
+            description
+              "Index of an entry in the list.";
+          }
+          leaf attribute-description {
+            type string;
+            description
+              "The description of the attribute.";
+          }
+          leaf value {
+            type string;
+            description
+              "Describes the value of protocol attribute, e.g.
+               nexthop address, peer address, etc.";
+          }
+        }
+      }
+    }
+  }
+
+  grouping ep-network-access-points {
+    description
+      "Grouping for the endpoint network access definition.";
+    container ep-network-access-points {
+      description
+        "List of network access points.";
+      list ep-network-access-point {
+        key "network-access-id";
+        description
+          "The IETF Network Slice network access points
+           related parameters.";
+        leaf network-access-id {
+          type string;
+          description
+            "Uniquely identifier a network access point.";
+        }
+        leaf network-access-description {
+          type string;
+          description
+            "The network access point description.";
+        }
+        leaf network-access-node-id {
+          type string;
+          description
+            "The network access point node ID in the case of
+             multi-homing.";
+        }
+        leaf network-access-tp-id {
+          type string;
+          description
+            "The termination port ID of the EP network access
+             point.";
+        }
+        leaf network-access-tp-ip-address {
+          type inet:ip-address;
+          description
+            "The IP address of the EP network access point.";
+        }
+        leaf network-access-tp-ip-prefix-length {
+          type uint8;
+          description
+            "The subnet prefix length expressed in bits.";
+        }
+        leaf network-access-qos-policy-name {
+          type string;
+          description
+            "The name of the QoS policy that is applied to the
+             network access point. The name can reference a QoS
+             profile that is pre-provisioned on the device.";
+        }
+        leaf mtu {
+          type uint16;
+          units "bytes";
+          mandatory true;
+          description
+            "Maximum size in octets of a data packet that
+             can traverse a NSE network access point.";
+        }
+        container network-access-tags {
+          description
+            "Container for the network access tags.";
+          list network-access-tag {
+            key "index";
+            description
+              "The network access point tags list.";
+            leaf index {
+              type uint32;
+              description
+                "The entry index.";
+            }
+            leaf network-access-tag-type {
+              type identityref {
+                base network-access-tag-type;
+              }
+              description
+                "The network access point tag type.";
+            }
+            leaf network-access-tag-value {
+              type string;
+              description
+                "The network access point tag value.";
+            }
+          }
+        }
+        /* Per ep-network-access-point rate limits */
+        uses ns-match-criteria;
+        uses ep-peering;
+        uses ns-rate-limit;
+      }
+    }
+  }
+
+  grouping ep-monitoring-metrics {
+    description
+      "Grouping for the NS endpoint monitoring metrics.";
+    container ep-monitoring {
+      config false;
+      description
+        "Container for NS endpoint monitoring metrics.";
+      leaf incoming-utilized-bandwidth {
+        type te-types:te-bandwidth;
+        description
+          "Incoming bandwidth utilization at an endpoint.";
+      }
+      leaf incoming-bw-utilization {
+        type decimal64 {
+          fraction-digits 5;
+          range "0..100";
+        }
+        units "percent";
+        mandatory true;
+        description
+          "To be used to define the bandwidth utilization
+           as a percentage of the available bandwidth.";
+      }
+      leaf outgoing-utilized-bandwidth {
+        type te-types:te-bandwidth;
+        description
+          "Outoing bandwidth utilization at an endpoint.";
+      }
+      leaf outgoing-bw-utilization {
+        type decimal64 {
+          fraction-digits 5;
+          range "0..100";
+        }
+        units "percent";
+        mandatory true;
+        description
+          "To be used to define the bandwidth utilization
+           as a percentage of the available bandwidth.";
+      }
+    }
+  }
+
+  grouping ns-connection-monitoring-metrics {
+    description
+      "Grouping for NS connection monitoring metrics.";
+    uses te-packet-types:one-way-performance-metrics-packet;
+    uses te-packet-types:two-way-performance-metrics-packet;
+  }
+
+  grouping geolocation-container {
+    description
+      "A grouping containing a GPS location.";
+    container location {
+      description
+        "A container containing a GPS location.";
+      leaf altitude {
+        type int64;
+        units "millimeter";
+        description
+          "Distance above the sea level.";
+      }
+      leaf latitude {
+        type decimal64 {
+          fraction-digits 8;
+          range "-90..90";
+        }
+        description
+          "Relative position north or south on the Earth's surface.";
+      }
+      leaf longitude {
+        type decimal64 {
+          fraction-digits 8;
+          range "-180..180";
+        }
+        description
+          "Angular distance east or west on the Earth's surface.";
+      }
+    }
+    // gps-location
+  }
+
+  // geolocation-container
+
+  grouping bw-rate-limits {
+    description
+      "Bandwidth rate limits grouping.";
+    reference
+      "RFC 7640: Traffic Management Benchmarking";
+    leaf cir {
+      type uint64;
+      units "bps";
+      description
+        "Committed Information Rate. The maximum number of bits
+         that a port can receive or send during one-second over an
+         interface.";
+    }
+    leaf cbs {
+      type uint64;
+      units "bytes";
+      description
+        "Committed Burst Size. CBS controls the bursty nature
+         of the traffic. Traffic that does not use the configured
+         CIR accumulates credits until the credits reach the
+         configured CBS.";
+    }
+    leaf eir {
+      type uint64;
+      units "bps";
+      description
+        "Excess Information Rate, i.e., excess frame delivery
+         allowed not subject to SLA. The traffic rate can be
+         limited by EIR.";
+    }
+    leaf ebs {
+      type uint64;
+      units "bytes";
+      description
+        "Excess Burst Size. The bandwidth available for burst
+         traffic from the EBS is subject to the amount of
+         bandwidth that is accumulated during periods when
+         traffic allocated by the EIR policy is not used.";
+    }
+    leaf pir {
+      type uint64;
+      units "bps";
+      description
+        "Peak Information Rate, i.e., maximum frame delivery
+         allowed. It is equal to or less than sum of CIR and EIR.";
+    }
+    leaf pbs {
+      type uint64;
+      units "bytes";
+      description
+        "Peak Burst Size.";
+    }
+  }
+
+  grouping ns-rate-limit {
+    description
+      "The rate limits grouping.";
+    container incoming-rate-limits {
+      description
+        "Container for the asymmetric traffic control.";
+      uses bw-rate-limits;
+    }
+    container outgoing-rate-limits {
+      description
+        "The rate-limit imposed on outgoing traffic.";
+      uses bw-rate-limits;
+    }
+  }
+
+  grouping endpoint {
+    description
+      "IETF Network Slice endpoint related information";
+    leaf ep-id {
+      type string;
+      description
+        "Unique identifier for the referred IETF Network
+         Slice endpoint.";
+    }
+    leaf ep-description {
+      type string;
+      description
+        "Give more description of the Network Slice endpoint.";
+    }
+    uses geolocation-container;
+    leaf node-id {
+      type string;
+      description
+        "Uniquely identifies an edge node within the IETF slice
+         network.";
+    }
+    leaf ep-ip {
+      type inet:ip-address;
+      description
+        "The IP address of the endpoint.";
+    }
+    uses ns-match-criteria;
+    uses ep-peering;
+    uses ep-network-access-points;
+    uses ns-rate-limit;
+    /* Per NSE rate limits */
+    uses status-params;
+    uses ep-monitoring-metrics;
+  }
+
+  //ns-endpoint
+
+  grouping ns-connection {
+    description
+      "The network slice connection grouping.";
+    list ns-connection {
+      key "ns-connection-id";
+      description
+        "List of Network Slice connections.";
+      leaf ns-connection-id {
+        type uint32;
+        description
+          "The Network Slice connection identifier.";
+      }
+      leaf ns-connectivity-type {
+        type identityref {
+          base ns-connectivity-type;
+        }
+        default "point-to-point";
+        description
+          "Network Slice connection construct type.";
+      }
+      leaf-list src-nse {
+        type leafref {
+          path "/network-slices/network-slice"
+             + "/ns-endpoints/ns-endpoint/ep-id";
+        }
+        description
+          "reference to source Network Slice endpoint.";
+      }
+      leaf-list dest-nse {
+        type leafref {
+          path "/network-slices/network-slice"
+             + "/ns-endpoints/ns-endpoint/ep-id";
+        }
+        description
+          "reference to source Network Slice endpoint.";
+      }
+      uses ns-slo-sle-policy;
+      /* Per connection ns-slo-sle-policy overrides
+       * the per network slice ns-slo-sle-policy.
+       */
+      container ns-connection-monitoring {
+        config false;
+        description
+          "SLO status Per NS connection.";
+        uses ns-connection-monitoring-metrics;
+      }
+    }
+  }
+
+  //ns-connection
+
+  grouping ns-connection-group {
+    description
+      "The Network Slice connection group is described in this
+       container.";
+    leaf ns-connection-group-id {
+      type string;
+      description
+        "The Network Slice connection group identifier.";
+    }
+    uses ns-slo-sle-policy;
+    uses ns-connection;
+    /* Per connection ns-slo-sle-policy overrides
+     * the per network slice ns-slo-sle-policy.
+     */
+    container ns-connection-group-monitoring {
+      config false;
+      description
+        "SLO status Per NS connection.";
+      uses ns-connection-monitoring-metrics;
+    }
+  }
+
+  //ns-connection-group
+
+  grouping slice-template {
+    description
+      "Grouping for slice-templates.";
+    container ns-slo-sle-templates {
+      description
+        "Contains a set of network slice templates to
+         reference in the IETF network slice.";
+      list ns-slo-sle-template {
+        key "id";
+        leaf id {
+          type string;
+          description
+            "Identification of the Service Level Objective (SLO)
+             and Service Level Expectation (SLE) template to be used.
+             Local administration meaning.";
+        }
+        leaf template-description {
+          type string;
+          description
+            "Description of the SLO &amp; SLE policy template.";
+        }
+        description
+          "List for SLO and SLE template identifiers.";
+      }
+    }
+  }
+
+  /* Configuration data nodes */
+
+  grouping ns-slo-sle-policy {
+    description
+      "Network Slice policy grouping.";
+    choice ns-slo-sle-policy {
+      description
+        "Choice for SLO and SLE policy template.
+         Can be standard template or customized template.";
+      case standard {
+        description
+          "Standard SLO template.";
+        leaf slo-sle-template {
+          type leafref {
+            path "/network-slices"
+               + "/ns-slo-sle-templates/ns-slo-sle-template/id";
+          }
+          description
+            "Standard SLO and SLE template to be used.";
+        }
+      }
+      case custom {
+        description
+          "Customized SLO template.";
+        container slo-sle-policy {
+          description
+            "Contains the SLO policy.";
+          leaf policy-description {
+            type string;
+            description
+              "Description of the SLO policy.";
+          }
+          uses ns-metric-bounds;
+          uses ns-sles;
+        }
+      }
+    }
+  }
+
+  container network-slices {
+    description
+      "Containes a list of IETF network slice";
+    uses slice-template;
+    list network-slice {
+      key "ns-id";
+      description
+        "A network-slice is identified by a ns-id.";
+      leaf ns-id {
+        type string;
+        description
+          "A unique network-slice identifier across an IETF NSC.";
+      }
+      leaf ns-description {
+        type string;
+        description
+          "Give more description of the network slice.";
+      }
+      container ns-tags {
+        description
+          "Container for the list of IETF Network Slice tags.";
+        list ns-tag {
+          key "index";
+          description
+            "IETF Network Slice tag list.";
+          leaf index {
+            type uint32;
+            description
+              "The entry index.";
+          }
+          leaf ns-tag-type {
+            type identityref {
+              base ns-tag-type;
+            }
+            description
+              "The IETF Network Slice tag type.";
+          }
+          leaf ns-tag-value {
+            type string;
+            description
+              "The IETF Network Slice tag value.";
+          }
+        }
+      }
+      uses ns-slo-sle-policy;
+      uses status-params;
+      container ns-endpoints {
+        description
+          "NS Endpoints.";
+        list ns-endpoint {
+          key "ep-id";
+          uses endpoint;
+          description
+            "List of endpoints in this slice.";
+        }
+      }
+      container ns-connection-groups {
+        description
+          "Contains NS connections group.";
+        list ns-connection-group {
+          key "ns-connection-group-id";
+          description
+            "List of Network Slice connections.";
+          uses ns-connection-group;
+        }
+      }
+    }
+    //ietf-network-slice list
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-topology@2018-02-26.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-topology@2018-02-26.yang
new file mode 100644
index 0000000000000000000000000000000000000000..1ec944d791db1da1b8236c6069f10d65b1b6f97f
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network-topology@2018-02-26.yang
@@ -0,0 +1,294 @@
+module ietf-network-topology {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network-topology";
+  prefix nt;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+  import ietf-network {
+    prefix nw;
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  organization
+    "IETF I2RS (Interface to the Routing System) Working Group";
+
+  contact
+    "WG Web:    <https://datatracker.ietf.org/wg/i2rs/>
+     WG List:   <mailto:i2rs@ietf.org>
+
+     Editor:    Alexander Clemm
+                <mailto:ludwig@clemm.org>
+
+     Editor:    Jan Medved
+                <mailto:jmedved@cisco.com>
+
+     Editor:    Robert Varga
+                <mailto:robert.varga@pantheon.tech>
+
+     Editor:    Nitin Bahadur
+                <mailto:nitin_bahadur@yahoo.com>
+
+     Editor:    Hariharan Ananthakrishnan
+                <mailto:hari@packetdesign.com>
+
+     Editor:    Xufeng Liu
+                <mailto:xufeng.liu.ietf@gmail.com>";
+
+  description
+    "This module defines a common base model for a network topology,
+     augmenting the base network data model with links to connect
+     nodes, as well as termination points to terminate links
+     on nodes.
+
+     Copyright (c) 2018 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8345;
+     see the RFC itself for full legal notices.";
+
+  revision 2018-02-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  typedef link-id {
+    type inet:uri;
+    description
+      "An identifier for a link in a topology.  The precise
+       structure of the link-id will be up to the implementation.
+       The identifier SHOULD be chosen such that the same link in a
+       real network topology will always be identified through the
+       same identifier, even if the data model is instantiated in
+       separate datastores.  An implementation MAY choose to capture
+       semantics in the identifier -- for example, to indicate the
+       type of link and/or the type of topology of which the link is
+       a part.";
+  }
+
+  typedef tp-id {
+    type inet:uri;
+    description
+      "An identifier for termination points on a node.  The precise
+       structure of the tp-id will be up to the implementation.
+       The identifier SHOULD be chosen such that the same termination
+       point in a real network topology will always be identified
+       through the same identifier, even if the data model is
+       instantiated in separate datastores.  An implementation MAY
+       choose to capture semantics in the identifier -- for example,
+       to indicate the type of termination point and/or the type of
+       node that contains the termination point.";
+  }
+
+  grouping link-ref {
+    description
+      "This grouping can be used to reference a link in a specific
+       network.  Although it is not used in this module, it is
+       defined here for the convenience of augmenting modules.";
+    leaf link-ref {
+      type leafref {
+        path "/nw:networks/nw:network[nw:network-id=current()/../"+
+          "network-ref]/nt:link/nt:link-id";
+        require-instance false;
+      }
+      description
+        "A type for an absolute reference to a link instance.
+         (This type should not be used for relative references.
+         In such a case, a relative path should be used instead.)";
+    }
+    uses nw:network-ref;
+  }
+
+  grouping tp-ref {
+    description
+      "This grouping can be used to reference a termination point
+       in a specific node.  Although it is not used in this module,
+       it is defined here for the convenience of augmenting
+       modules.";
+    leaf tp-ref {
+      type leafref {
+        path "/nw:networks/nw:network[nw:network-id=current()/../"+
+          "network-ref]/nw:node[nw:node-id=current()/../"+
+          "node-ref]/nt:termination-point/nt:tp-id";
+        require-instance false;
+      }
+      description
+        "A type for an absolute reference to a termination point.
+         (This type should not be used for relative references.
+         In such a case, a relative path should be used instead.)";
+    }
+    uses nw:node-ref;
+  }
+
+  augment "/nw:networks/nw:network" {
+    description
+      "Add links to the network data model.";
+    list link {
+      key "link-id";
+      description
+        "A network link connects a local (source) node and
+         a remote (destination) node via a set of the respective
+         node's termination points.  It is possible to have several
+         links between the same source and destination nodes.
+         Likewise, a link could potentially be re-homed between
+         termination points.  Therefore, in order to ensure that we
+         would always know to distinguish between links, every link
+         is identified by a dedicated link identifier.  Note that a
+         link models a point-to-point link, not a multipoint link.";
+      leaf link-id {
+        type link-id;
+        description
+          "The identifier of a link in the topology.
+           A link is specific to a topology to which it belongs.";
+      }
+      container source {
+        description
+          "This container holds the logical source of a particular
+           link.";
+        leaf source-node {
+          type leafref {
+            path "../../../nw:node/nw:node-id";
+            require-instance false;
+          }
+          description
+            "Source node identifier.  Must be in the same topology.";
+        }
+        leaf source-tp {
+          type leafref {
+            path "../../../nw:node[nw:node-id=current()/../"+
+              "source-node]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "This termination point is located within the source node
+             and terminates the link.";
+        }
+      }
+
+      container destination {
+        description
+          "This container holds the logical destination of a
+           particular link.";
+        leaf dest-node {
+          type leafref {
+            path "../../../nw:node/nw:node-id";
+          require-instance false;
+          }
+          description
+            "Destination node identifier.  Must be in the same
+             network.";
+        }
+        leaf dest-tp {
+          type leafref {
+            path "../../../nw:node[nw:node-id=current()/../"+
+              "dest-node]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "This termination point is located within the
+             destination node and terminates the link.";
+        }
+      }
+      list supporting-link {
+        key "network-ref link-ref";
+        description
+          "Identifies the link or links on which this link depends.";
+        leaf network-ref {
+          type leafref {
+            path "../../../nw:supporting-network/nw:network-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which underlay topology
+             the supporting link is present.";
+        }
+
+        leaf link-ref {
+          type leafref {
+            path "/nw:networks/nw:network[nw:network-id=current()/"+
+              "../network-ref]/link/link-id";
+            require-instance false;
+          }
+          description
+            "This leaf identifies a link that is a part
+             of this link's underlay.  Reference loops in which
+             a link identifies itself as its underlay, either
+             directly or transitively, are not allowed.";
+        }
+      }
+    }
+  }
+  augment "/nw:networks/nw:network/nw:node" {
+    description
+      "Augments termination points that terminate links.
+       Termination points can ultimately be mapped to interfaces.";
+    list termination-point {
+      key "tp-id";
+      description
+        "A termination point can terminate a link.
+         Depending on the type of topology, a termination point
+         could, for example, refer to a port or an interface.";
+      leaf tp-id {
+        type tp-id;
+        description
+          "Termination point identifier.";
+      }
+      list supporting-termination-point {
+        key "network-ref node-ref tp-ref";
+        description
+          "This list identifies any termination points on which a
+           given termination point depends or onto which it maps.
+           Those termination points will themselves be contained
+           in a supporting node.  This dependency information can be
+           inferred from the dependencies between links.  Therefore,
+           this item is not separately configurable.  Hence, no
+           corresponding constraint needs to be articulated.
+           The corresponding information is simply provided by the
+           implementing system.";
+
+        leaf network-ref {
+          type leafref {
+            path "../../../nw:supporting-node/nw:network-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which topology the
+             supporting termination point is present.";
+        }
+        leaf node-ref {
+          type leafref {
+            path "../../../nw:supporting-node/nw:node-ref";
+          require-instance false;
+          }
+          description
+            "This leaf identifies in which node the supporting
+             termination point is present.";
+        }
+        leaf tp-ref {
+          type leafref {
+            path "/nw:networks/nw:network[nw:network-id=current()/"+
+              "../network-ref]/nw:node[nw:node-id=current()/../"+
+              "node-ref]/termination-point/tp-id";
+            require-instance false;
+          }
+          description
+            "Reference to the underlay node (the underlay node must
+             be in a different topology).";
+        }
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network@2018-02-26.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network@2018-02-26.yang
new file mode 100644
index 0000000000000000000000000000000000000000..6a03d7e41614cc8dc017cfb4d5aacfb4ca60bc2c
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-network@2018-02-26.yang
@@ -0,0 +1,192 @@
+module ietf-network {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-network";
+  prefix nw;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+
+  organization
+    "IETF I2RS (Interface to the Routing System) Working Group";
+
+  contact
+    "WG Web:    <https://datatracker.ietf.org/wg/i2rs/>
+     WG List:   <mailto:i2rs@ietf.org>
+
+     Editor:    Alexander Clemm
+                <mailto:ludwig@clemm.org>
+
+     Editor:    Jan Medved
+                <mailto:jmedved@cisco.com>
+
+     Editor:    Robert Varga
+                <mailto:robert.varga@pantheon.tech>
+
+     Editor:    Nitin Bahadur
+                <mailto:nitin_bahadur@yahoo.com>
+
+     Editor:    Hariharan Ananthakrishnan
+                <mailto:hari@packetdesign.com>
+
+     Editor:    Xufeng Liu
+                <mailto:xufeng.liu.ietf@gmail.com>";
+  description
+    "This module defines a common base data model for a collection
+     of nodes in a network.  Node definitions are further used
+     in network topologies and inventories.
+
+     Copyright (c) 2018 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8345;
+     see the RFC itself for full legal notices.";
+
+  revision 2018-02-26 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  typedef node-id {
+    type inet:uri;
+    description
+      "Identifier for a node.  The precise structure of the node-id
+       will be up to the implementation.  For example, some
+       implementations MAY pick a URI that includes the network-id
+       as part of the path.  The identifier SHOULD be chosen
+       such that the same node in a real network topology will
+       always be identified through the same identifier, even if
+       the data model is instantiated in separate datastores.  An
+       implementation MAY choose to capture semantics in the
+       identifier -- for example, to indicate the type of node.";
+  }
+
+  typedef network-id {
+    type inet:uri;
+    description
+      "Identifier for a network.  The precise structure of the
+       network-id will be up to the implementation.  The identifier
+       SHOULD be chosen such that the same network will always be
+       identified through the same identifier, even if the data model
+       is instantiated in separate datastores.  An implementation MAY
+       choose to capture semantics in the identifier -- for example,
+       to indicate the type of network.";
+  }
+
+  grouping network-ref {
+    description
+      "Contains the information necessary to reference a network --
+       for example, an underlay network.";
+    leaf network-ref {
+      type leafref {
+        path "/nw:networks/nw:network/nw:network-id";
+      require-instance false;
+      }
+      description
+        "Used to reference a network -- for example, an underlay
+         network.";
+    }
+  }
+
+  grouping node-ref {
+    description
+      "Contains the information necessary to reference a node.";
+    leaf node-ref {
+      type leafref {
+        path "/nw:networks/nw:network[nw:network-id=current()/../"+
+          "network-ref]/nw:node/nw:node-id";
+        require-instance false;
+      }
+      description
+        "Used to reference a node.
+         Nodes are identified relative to the network that
+         contains them.";
+    }
+    uses network-ref;
+  }
+
+  container networks {
+    description
+      "Serves as a top-level container for a list of networks.";
+    list network {
+      key "network-id";
+      description
+        "Describes a network.
+         A network typically contains an inventory of nodes,
+         topological information (augmented through the
+         network-topology data model), and layering information.";
+      leaf network-id {
+        type network-id;
+        description
+          "Identifies a network.";
+      }
+      container network-types {
+        description
+          "Serves as an augmentation target.
+           The network type is indicated through corresponding
+           presence containers augmented into this container.";
+      }
+      list supporting-network {
+        key "network-ref";
+        description
+          "An underlay network, used to represent layered network
+           topologies.";
+        leaf network-ref {
+          type leafref {
+            path "/nw:networks/nw:network/nw:network-id";
+          require-instance false;
+          }
+          description
+            "References the underlay network.";
+        }
+      }
+
+      list node {
+        key "node-id";
+        description
+          "The inventory of nodes of this network.";
+        leaf node-id {
+          type node-id;
+          description
+            "Uniquely identifies a node within the containing
+             network.";
+        }
+        list supporting-node {
+          key "network-ref node-ref";
+          description
+            "Represents another node that is in an underlay network
+             and that supports this node.  Used to represent layering
+             structure.";
+          leaf network-ref {
+            type leafref {
+              path "../../../nw:supporting-network/nw:network-ref";
+            require-instance false;
+            }
+            description
+              "References the underlay network of which the
+               underlay node is a part.";
+          }
+          leaf node-ref {
+            type leafref {
+              path "/nw:networks/nw:network/nw:node/nw:node-id";
+            require-instance false;
+            }
+            description
+              "References the underlay node itself.";
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-packet-fields@2019-03-04.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-packet-fields@2019-03-04.yang
new file mode 100644
index 0000000000000000000000000000000000000000..2fb797bd87bf4ed825f83ec788df707b94c5f68b
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-packet-fields@2019-03-04.yang
@@ -0,0 +1,576 @@
+module ietf-packet-fields {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-packet-fields";
+  prefix packet-fields;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991 - Common YANG Data Types.";
+  }
+
+  import ietf-yang-types {
+    prefix yang;
+    reference
+      "RFC 6991 - Common YANG Data Types.";
+  }
+
+  import ietf-ethertypes {
+    prefix eth;
+    reference
+      "RFC 8519 - YANG Data Model for Network Access Control
+                  Lists (ACLs).";
+  }
+
+  organization
+    "IETF NETMOD (Network Modeling) Working Group.";
+
+  contact
+    "WG Web:  <https://datatracker.ietf.org/wg/netmod/>
+     WG List: netmod@ietf.org
+
+     Editor: Mahesh Jethanandani
+             mjethanandani@gmail.com
+     Editor: Lisa Huang
+             huangyi_99@yahoo.com
+     Editor: Sonal Agarwal
+             sagarwal12@gmail.com
+     Editor: Dana Blair
+             dana@blairhome.com";
+
+  description
+    "This YANG module defines groupings that are used by
+     the ietf-access-control-list YANG module.  Their usage
+     is not limited to ietf-access-control-list and can be
+     used anywhere as applicable.
+
+     Copyright (c) 2019 IETF Trust and the persons identified as
+     the document authors.  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).
+
+     This version of this YANG module is part of RFC 8519; see
+     the RFC itself for full legal notices.";
+
+  revision 2019-03-04 {
+    description
+      "Initial version.";
+    reference
+      "RFC 8519: YANG Data Model for Network Access Control
+                 Lists (ACLs).";
+  }
+
+  /*
+   * Typedefs
+   */
+  typedef operator {
+    type enumeration {
+      enum lte {
+        description
+          "Less than or equal to.";
+      }
+      enum gte {
+        description
+          "Greater than or equal to.";
+      }
+      enum eq {
+        description
+          "Equal to.";
+      }
+      enum neq {
+        description
+          "Not equal to.";
+      }
+    }
+    description
+      "The source and destination port range definitions
+       can be further qualified using an operator.  An
+       operator is needed only if the lower-port is specified
+       and the upper-port is not specified.  The operator
+       therefore further qualifies the lower-port only.";
+  }
+
+  /*
+   * Groupings
+   */
+  grouping port-range-or-operator {
+    choice port-range-or-operator {
+      case range {
+        leaf lower-port {
+          type inet:port-number;
+          must '. <= ../upper-port' {
+            error-message
+              "The lower-port must be less than or equal to
+               the upper-port.";
+          }
+          mandatory true;
+          description
+            "Lower boundary for a port.";
+        }
+        leaf upper-port {
+          type inet:port-number;
+          mandatory true;
+          description
+            "Upper boundary for a port.";
+        }
+      }
+      case operator {
+        leaf operator {
+          type operator;
+          default "eq";
+          description
+            "Operator to be applied on the port below.";
+        }
+        leaf port {
+          type inet:port-number;
+          mandatory true;
+          description
+            "Port number along with the operator on which to
+             match.";
+        }
+      }
+      description
+        "Choice of specifying a port range or a single
+         port along with an operator.";
+    }
+    description
+      "Grouping for port definitions in the form of a
+       choice statement.";
+  }
+
+  grouping acl-ip-header-fields {
+    description
+      "IP header fields common to IPv4 and IPv6";
+    reference
+      "RFC 791: Internet Protocol.";
+
+    leaf dscp {
+      type inet:dscp;
+      description
+        "Differentiated Services Code Point.";
+      reference
+        "RFC 2474: Definition of the Differentiated Services
+                   Field (DS Field) in the IPv4 and IPv6
+                   Headers.";
+    }
+
+    leaf ecn {
+      type uint8 {
+        range "0..3";
+      }
+      description
+        "Explicit Congestion Notification.";
+      reference
+        "RFC 3168: The Addition of Explicit Congestion
+                   Notification (ECN) to IP.";
+    }
+
+    leaf length {
+      type uint16;
+      description
+        "In the IPv4 header field, this field is known as the Total
+         Length.  Total Length is the length of the datagram, measured
+         in octets, including internet header and data.
+
+         In the IPv6 header field, this field is known as the Payload
+         Length, which is the length of the IPv6 payload, i.e., the rest
+         of the packet following the IPv6 header, in octets.";
+      reference
+        "RFC 791: Internet Protocol
+         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
+    }
+    leaf ttl {
+      type uint8;
+      description
+        "This field indicates the maximum time the datagram is allowed
+         to remain in the internet system.  If this field contains the
+         value zero, then the datagram must be dropped.
+
+         In IPv6, this field is known as the Hop Limit.";
+      reference
+        "RFC 791: Internet Protocol
+         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
+    }
+    leaf protocol {
+      type uint8;
+      description
+        "Internet Protocol number.  Refers to the protocol of the
+         payload.  In IPv6, this field is known as 'next-header',
+         and if extension headers are present, the protocol is
+         present in the 'upper-layer' header.";
+      reference
+        "RFC 791: Internet Protocol
+         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
+    }
+  }
+
+  grouping acl-ipv4-header-fields {
+    description
+      "Fields in the IPv4 header.";
+    leaf ihl {
+      type uint8 {
+        range "5..60";
+      }
+      description
+        "In an IPv4 header field, the Internet Header Length (IHL) is
+         the length of the internet header in 32-bit words and
+         thus points to the beginning of the data.  Note that the
+         minimum value for a correct header is 5.";
+    }
+    leaf flags {
+      type bits {
+        bit reserved {
+          position 0;
+          description
+            "Reserved.  Must be zero.";
+        }
+        bit fragment {
+          position 1;
+          description
+            "Setting the value to 0 indicates may fragment, while
+             setting the value to 1 indicates do not fragment.";
+        }
+        bit more {
+          position 2;
+          description
+            "Setting the value to 0 indicates this is the last fragment,
+             and setting the value to 1 indicates more fragments are
+             coming.";
+        }
+      }
+      description
+        "Bit definitions for the Flags field in the IPv4 header.";
+    }
+    leaf offset {
+      type uint16 {
+        range "20..65535";
+      }
+      description
+        "The fragment offset is measured in units of 8 octets (64 bits).
+         The first fragment has offset zero.  The length is 13 bits";
+    }
+    leaf identification {
+      type uint16;
+      description
+        "An identifying value assigned by the sender to aid in
+         assembling the fragments of a datagram.";
+    }
+
+    choice destination-network {
+      case destination-ipv4-network {
+        leaf destination-ipv4-network {
+          type inet:ipv4-prefix;
+          description
+            "Destination IPv4 address prefix.";
+        }
+      }
+      description
+        "Choice of specifying a destination IPv4 address or
+         referring to a group of IPv4 destination addresses.";
+    }
+
+    choice source-network {
+      case source-ipv4-network {
+        leaf source-ipv4-network {
+          type inet:ipv4-prefix;
+          description
+            "Source IPv4 address prefix.";
+        }
+      }
+      description
+        "Choice of specifying a source IPv4 address or
+         referring to a group of IPv4 source addresses.";
+    }
+  }
+
+  grouping acl-ipv6-header-fields {
+    description
+      "Fields in the IPv6 header.";
+
+    choice destination-network {
+      case destination-ipv6-network {
+        leaf destination-ipv6-network {
+          type inet:ipv6-prefix;
+          description
+            "Destination IPv6 address prefix.";
+        }
+      }
+      description
+        "Choice of specifying a destination IPv6 address
+         or referring to a group of IPv6 destination
+         addresses.";
+    }
+
+    choice source-network {
+      case source-ipv6-network {
+        leaf source-ipv6-network {
+          type inet:ipv6-prefix;
+          description
+            "Source IPv6 address prefix.";
+        }
+      }
+      description
+        "Choice of specifying a source IPv6 address or
+         referring to a group of IPv6 source addresses.";
+    }
+
+    leaf flow-label {
+      type inet:ipv6-flow-label;
+      description
+        "IPv6 Flow label.";
+    }
+    reference
+      "RFC 4291: IP Version 6 Addressing Architecture
+       RFC 4007: IPv6 Scoped Address Architecture
+       RFC 5952: A Recommendation for IPv6 Address Text
+                 Representation.";
+  }
+
+  grouping acl-eth-header-fields {
+    description
+      "Fields in the Ethernet header.";
+    leaf destination-mac-address {
+      type yang:mac-address;
+      description
+        "Destination IEEE 802 Media Access Control (MAC)
+         address.";
+    }
+    leaf destination-mac-address-mask {
+      type yang:mac-address;
+      description
+        "Destination IEEE 802 MAC address mask.";
+    }
+    leaf source-mac-address {
+      type yang:mac-address;
+      description
+        "Source IEEE 802 MAC address.";
+    }
+    leaf source-mac-address-mask {
+      type yang:mac-address;
+      description
+        "Source IEEE 802 MAC address mask.";
+    }
+    leaf ethertype {
+      type eth:ethertype;
+      description
+        "The Ethernet Type (or Length) value represented
+         in the canonical order defined by IEEE 802.
+         The canonical representation uses lowercase
+         characters.";
+      reference
+        "IEEE 802-2014, Clause 9.2.";
+    }
+    reference
+      "IEEE 802: IEEE Standard for Local and Metropolitan
+       Area Networks: Overview and Architecture.";
+  }
+
+  grouping acl-tcp-header-fields {
+    description
+      "Collection of TCP header fields that can be used to
+       set up a match filter.";
+    leaf sequence-number {
+      type uint32;
+      description
+        "Sequence number that appears in the packet.";
+    }
+    leaf acknowledgement-number {
+      type uint32;
+      description
+        "The acknowledgement number that appears in the
+         packet.";
+    }
+    leaf data-offset {
+      type uint8 {
+        range "5..15";
+      }
+      description
+        "Specifies the size of the TCP header in 32-bit
+         words.  The minimum size header is 5 words and
+         the maximum is 15 words; thus, this gives a
+         minimum size of 20 bytes and a maximum of 60
+         bytes, allowing for up to 40 bytes of options
+         in the header.";
+    }
+    leaf reserved {
+      type uint8;
+      description
+        "Reserved for future use.";
+    }
+    leaf flags {
+      type bits {
+        bit cwr {
+          position 1;
+          description
+            "The Congestion Window Reduced (CWR) flag is set
+             by the sending host to indicate that it received
+             a TCP segment with the ECN-Echo (ECE) flag set
+             and had responded in the congestion control
+             mechanism.";
+          reference
+            "RFC 3168: The Addition of Explicit Congestion
+                       Notification (ECN) to IP.";
+        }
+        bit ece {
+          position 2;
+          description
+            "ECN-Echo has a dual role, depending on the value
+             of the SYN flag.  It indicates the following: if
+             the SYN flag is set (1), the TCP peer is ECN
+             capable, and if the SYN flag is clear (0), a packet
+             with the Congestion Experienced flag set (ECN=11)
+             in the IP header was received during normal
+             transmission (added to the header by RFC 3168).
+             This serves as an indication of network congestion
+             (or impending congestion) to the TCP sender.";
+          reference
+            "RFC 3168: The Addition of Explicit Congestion
+                       Notification (ECN) to IP.";
+        }
+        bit urg {
+          position 3;
+          description
+            "Indicates that the Urgent Pointer field is significant.";
+        }
+        bit ack {
+          position 4;
+          description
+            "Indicates that the Acknowledgement field is significant.
+             All packets after the initial SYN packet sent by the
+             client should have this flag set.";
+        }
+        bit psh {
+          position 5;
+          description
+            "Push function.  Asks to push the buffered data to the
+             receiving application.";
+        }
+        bit rst {
+          position 6;
+          description
+            "Reset the connection.";
+        }
+        bit syn {
+          position 7;
+          description
+            "Synchronize sequence numbers.  Only the first packet
+             sent from each end should have this flag set.  Some
+             other flags and fields change meaning based on this
+             flag, and some are only valid for when it is set,
+             and others when it is clear.";
+        }
+        bit fin {
+          position 8;
+          description
+            "Last package from the sender.";
+        }
+      }
+      description
+        "Also known as Control Bits.  Contains nine 1-bit flags.";
+      reference
+        "RFC 793: Transmission Control Protocol.";
+    }
+    leaf window-size {
+      type uint16;
+      units "bytes";
+      description
+        "The size of the receive window, which specifies
+         the number of window size units beyond the segment
+         identified by the sequence number in the Acknowledgement
+         field that the sender of this segment is currently
+         willing to receive.";
+    }
+    leaf urgent-pointer {
+      type uint16;
+      description
+        "This field is an offset from the sequence number
+         indicating the last urgent data byte.";
+    }
+    leaf options {
+      type binary {
+        length "1..40";
+      }
+      description
+        "The length of this field is determined by the
+         Data Offset field.  Options have up to three
+         fields: Option-Kind (1 byte), Option-Length
+         (1 byte), and Option-Data (variable).  The Option-Kind
+         field indicates the type of option and is the
+         only field that is not optional.  Depending on
+         what kind of option we are dealing with,
+         the next two fields may be set: the Option-Length
+         field indicates the total length of the option,
+         and the Option-Data field contains the value of
+         the option, if applicable.";
+    }
+  }
+
+  grouping acl-udp-header-fields {
+    description
+      "Collection of UDP header fields that can be used
+       to set up a match filter.";
+    leaf length {
+      type uint16;
+      description
+        "A field that specifies the length in bytes of
+         the UDP header and UDP data.  The minimum
+         length is 8 bytes because that is the length of
+         the header.  The field size sets a theoretical
+         limit of 65,535 bytes (8-byte header plus 65,527
+         bytes of data) for a UDP datagram.  However, the
+         actual limit for the data length, which is
+         imposed by the underlying IPv4 protocol, is
+         65,507 bytes (65,535 minus 8-byte UDP header
+         minus 20-byte IP header).
+
+         In IPv6 jumbograms, it is possible to have
+         UDP packets of a size greater than 65,535 bytes.
+         RFC 2675 specifies that the Length field is set
+         to zero if the length of the UDP header plus
+         UDP data is greater than 65,535.";
+    }
+  }
+
+  grouping acl-icmp-header-fields {
+    description
+      "Collection of ICMP header fields that can be
+       used to set up a match filter.";
+    leaf type {
+      type uint8;
+      description
+        "Also known as control messages.";
+      reference
+        "RFC 792: Internet Control Message Protocol
+         RFC 4443: Internet Control Message Protocol (ICMPv6)
+                   for Internet Protocol Version 6 (IPv6)
+                   Specification.";
+    }
+    leaf code {
+      type uint8;
+      description
+        "ICMP subtype.  Also known as control messages.";
+      reference
+        "RFC 792: Internet Control Message Protocol
+         RFC 4443: Internet Control Message Protocol (ICMPv6)
+                   for Internet Protocol Version 6 (IPv6)
+                   Specification.";
+    }
+    leaf rest-of-header {
+      type binary;
+      description
+        "Unbounded in length, the contents vary based on the
+         ICMP type and code.  Also referred to as 'Message Body'
+         in ICMPv6.";
+      reference
+        "RFC 792: Internet Control Message Protocol
+         RFC 4443: Internet Control Message Protocol (ICMPv6)
+                   for Internet Protocol Version 6 (IPv6)
+                   Specification.";
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-routing-types@2017-12-04.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-routing-types@2017-12-04.yang
new file mode 100644
index 0000000000000000000000000000000000000000..24319c155fb104e20bee79e5b257317b01323197
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-routing-types@2017-12-04.yang
@@ -0,0 +1,771 @@
+module ietf-routing-types {
+  namespace "urn:ietf:params:xml:ns:yang:ietf-routing-types";
+  prefix rt-types;
+
+  import ietf-yang-types {
+    prefix yang;
+  }
+  import ietf-inet-types {
+    prefix inet;
+  }
+
+  organization
+    "IETF RTGWG - Routing Area Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/rtgwg/>
+     WG List:  <mailto:rtgwg@ietf.org>
+
+     Editors:  Xufeng Liu
+               <mailto:Xufeng_Liu@jabail.com>
+               Yingzhen Qu
+               <mailto:yingzhen.qu@huawei.com>
+               Acee Lindem
+               <mailto:acee@cisco.com>
+               Christian Hopps
+               <mailto:chopps@chopps.org>
+               Lou Berger
+               <mailto:lberger@labn.com>";
+
+  description
+    "This module contains a collection of YANG data types
+     considered generally useful for routing protocols.
+
+     Copyright (c) 2017 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
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC 8294; see
+     the RFC itself for full legal notices.";
+   revision 2017-12-04 {
+     description "Initial revision.";
+     reference
+       "RFC 8294: Common YANG Data Types for the Routing Area.
+        Section 3.";
+  }
+
+  /*** Identities related to MPLS/GMPLS ***/
+
+  identity mpls-label-special-purpose-value {
+    description
+      "Base identity for deriving identities describing
+       special-purpose Multiprotocol Label Switching (MPLS) label
+       values.";
+    reference
+      "RFC 7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.";
+  }
+
+  identity ipv4-explicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the IPv4 Explicit NULL Label.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.  Section 2.1.";
+  }
+
+  identity router-alert-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Router Alert Label.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.  Section 2.1.";
+  }
+
+  identity ipv6-explicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the IPv6 Explicit NULL Label.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.  Section 2.1.";
+  }
+
+  identity implicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Implicit NULL Label.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.  Section 2.1.";
+  }
+
+  identity entropy-label-indicator {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Entropy Label Indicator.";
+    reference
+      "RFC 6790: The Use of Entropy Labels in MPLS Forwarding.
+       Sections 3 and 10.1.";
+  }
+
+  identity gal-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Generic Associated Channel
+       (G-ACh) Label (GAL).";
+    reference
+      "RFC 5586: MPLS Generic Associated Channel.
+       Sections 4 and 10.";
+  }
+
+  identity oam-alert-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the OAM Alert Label.";
+    reference
+      "RFC 3429: Assignment of the 'OAM Alert Label' for
+       Multiprotocol Label Switching Architecture (MPLS)
+       Operation and Maintenance (OAM) Functions.
+       Sections 3 and 6.";
+  }
+
+  identity extension-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Extension Label.";
+    reference
+      "RFC 7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.  Sections 3.1 and 5.";
+  }
+
+  /*** Collection of types related to routing ***/
+
+  typedef router-id {
+    type yang:dotted-quad;
+    description
+      "A 32-bit number in the dotted-quad format assigned to each
+       router.  This number uniquely identifies the router within
+       an Autonomous System.";
+  }
+
+  /*** Collection of types related to VPNs ***/
+
+  typedef route-target {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+      +     '6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0):(429496729[0-5]|'
+      +     '42949672[0-8][0-9]|'
+      +     '4294967[01][0-9]{2}|429496[0-6][0-9]{3}|'
+      +     '42949[0-5][0-9]{4}|'
+      +     '4294[0-8][0-9]{5}|429[0-3][0-9]{6}|'
+      +     '42[0-8][0-9]{7}|4[01][0-9]{8}|'
+      +     '[1-3][0-9]{9}|[1-9][0-9]{0,8}|0))|'
+      + '(1:((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|'
+      +     '25[0-5])\.){3}([0-9]|[1-9][0-9]|'
+      +     '1[0-9]{2}|2[0-4][0-9]|25[0-5])):(6553[0-5]|'
+      +     '655[0-2][0-9]|'
+      +     '65[0-4][0-9]{2}|6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0))|'
+      + '(2:(429496729[0-5]|42949672[0-8][0-9]|'
+      +     '4294967[01][0-9]{2}|'
+      +     '429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|'
+      +     '4294[0-8][0-9]{5}|'
+      +     '429[0-3][0-9]{6}|42[0-8][0-9]{7}|4[01][0-9]{8}|'
+      +     '[1-3][0-9]{9}|[1-9][0-9]{0,8}|0):'
+      +     '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+      +     '6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0))|'
+      + '(6(:[a-fA-F0-9]{2}){6})|'
+      + '(([3-57-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]{1,3}):'
+      +     '[0-9a-fA-F]{1,12})';
+    }
+
+    description
+      "A Route Target is an 8-octet BGP extended community
+       initially identifying a set of sites in a BGP VPN
+       (RFC 4364).  However, it has since taken on a more general
+       role in BGP route filtering.  A Route Target consists of two
+       or three fields: a 2-octet Type field, an administrator
+       field, and, optionally, an assigned number field.
+
+       According to the data formats for types 0, 1, 2, and 6 as
+       defined in RFC 4360, RFC 5668, and RFC 7432, the encoding
+       pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number
+       6:6-octet-mac-address
+
+       Additionally, a generic pattern is defined for future
+       Route Target types:
+
+       2-octet-other-hex-number:6-octet-hex-number
+
+       Some valid examples are 0:100:100, 1:1.1.1.1:100,
+       2:1234567890:203, and 6:26:00:08:92:78:00.";
+    reference
+      "RFC 4360: BGP Extended Communities Attribute.
+       RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs).
+       RFC 5668: 4-Octet AS Specific BGP Extended Community.
+       RFC 7432: BGP MPLS-Based Ethernet VPN.";
+  }
+
+  typedef ipv6-route-target {
+    type string {
+      pattern
+          '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+          + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+          + '(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}'
+          + '(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])))'
+          + ':'
+          + '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+          + '6[0-4][0-9]{3}|'
+          + '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0)';
+      pattern '((([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+          + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?))'
+          + ':'
+          + '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+          + '6[0-4][0-9]{3}|'
+          + '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0)';
+    }
+    description
+      "An IPv6 Route Target is a 20-octet BGP IPv6 Address
+       Specific Extended Community serving the same function
+       as a standard 8-octet Route Target, except that it only
+       allows an IPv6 address as the global administrator.
+       The format is <ipv6-address:2-octet-number>.
+
+       Two valid examples are 2001:db8::1:6544 and
+       2001:db8::5eb1:791:6b37:17958.";
+    reference
+      "RFC 5701: IPv6 Address Specific BGP Extended Community
+       Attribute.";
+  }
+
+  typedef route-target-type {
+    type enumeration {
+      enum import {
+        value 0;
+        description
+          "The Route Target applies to route import.";
+      }
+      enum export {
+        value 1;
+        description
+          "The Route Target applies to route export.";
+      }
+
+      enum both {
+        value 2;
+        description
+          "The Route Target applies to both route import and
+           route export.";
+      }
+    }
+    description
+      "Indicates the role a Route Target takes in route filtering.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs).";
+  }
+
+  typedef route-distinguisher {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+      +     '6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0):(429496729[0-5]|'
+      +     '42949672[0-8][0-9]|'
+      +     '4294967[01][0-9]{2}|429496[0-6][0-9]{3}|'
+      +     '42949[0-5][0-9]{4}|'
+      +     '4294[0-8][0-9]{5}|429[0-3][0-9]{6}|'
+      +     '42[0-8][0-9]{7}|4[01][0-9]{8}|'
+      +     '[1-3][0-9]{9}|[1-9][0-9]{0,8}|0))|'
+      + '(1:((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|'
+      +     '25[0-5])\.){3}([0-9]|[1-9][0-9]|'
+      +     '1[0-9]{2}|2[0-4][0-9]|25[0-5])):(6553[0-5]|'
+      +     '655[0-2][0-9]|'
+      +     '65[0-4][0-9]{2}|6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0))|'
+      + '(2:(429496729[0-5]|42949672[0-8][0-9]|'
+      +     '4294967[01][0-9]{2}|'
+      +     '429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|'
+      +     '4294[0-8][0-9]{5}|'
+      +     '429[0-3][0-9]{6}|42[0-8][0-9]{7}|4[01][0-9]{8}|'
+      +     '[1-3][0-9]{9}|[1-9][0-9]{0,8}|0):'
+      +     '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+      +     '6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0))|'
+      + '(6(:[a-fA-F0-9]{2}){6})|'
+      + '(([3-57-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]{1,3}):'
+      +     '[0-9a-fA-F]{1,12})';
+    }
+
+    description
+      "A Route Distinguisher is an 8-octet value used to
+       distinguish routes from different BGP VPNs (RFC 4364).
+       A Route Distinguisher will have the same format as a
+       Route Target as per RFC 4360 and will consist of
+       two or three fields: a 2-octet Type field, an administrator
+       field, and, optionally, an assigned number field.
+
+       According to the data formats for types 0, 1, 2, and 6 as
+       defined in RFC 4360, RFC 5668, and RFC 7432, the encoding
+       pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number
+       6:6-octet-mac-address
+
+       Additionally, a generic pattern is defined for future
+       route discriminator types:
+
+       2-octet-other-hex-number:6-octet-hex-number
+
+       Some valid examples are 0:100:100, 1:1.1.1.1:100,
+       2:1234567890:203, and 6:26:00:08:92:78:00.";
+    reference
+      "RFC 4360: BGP Extended Communities Attribute.
+       RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs).
+       RFC 5668: 4-Octet AS Specific BGP Extended Community.
+       RFC 7432: BGP MPLS-Based Ethernet VPN.";
+  }
+
+  typedef route-origin {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+      +     '6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0):(429496729[0-5]|'
+      +     '42949672[0-8][0-9]|'
+      +     '4294967[01][0-9]{2}|429496[0-6][0-9]{3}|'
+      +     '42949[0-5][0-9]{4}|'
+      +     '4294[0-8][0-9]{5}|429[0-3][0-9]{6}|'
+      +     '42[0-8][0-9]{7}|4[01][0-9]{8}|'
+      +     '[1-3][0-9]{9}|[1-9][0-9]{0,8}|0))|'
+      + '(1:((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|'
+      +     '25[0-5])\.){3}([0-9]|[1-9][0-9]|'
+      +     '1[0-9]{2}|2[0-4][0-9]|25[0-5])):(6553[0-5]|'
+      +     '655[0-2][0-9]|'
+      +     '65[0-4][0-9]{2}|6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0))|'
+      + '(2:(429496729[0-5]|42949672[0-8][0-9]|'
+      +     '4294967[01][0-9]{2}|'
+      +     '429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|'
+      +     '4294[0-8][0-9]{5}|'
+      +     '429[0-3][0-9]{6}|42[0-8][0-9]{7}|4[01][0-9]{8}|'
+      +     '[1-3][0-9]{9}|[1-9][0-9]{0,8}|0):'
+      +     '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+      +     '6[0-4][0-9]{3}|'
+      +     '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0))|'
+      + '(6(:[a-fA-F0-9]{2}){6})|'
+      + '(([3-57-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]{1,3}):'
+      +    '[0-9a-fA-F]{1,12})';
+    }
+    description
+      "A Route Origin is an 8-octet BGP extended community
+       identifying the set of sites where the BGP route
+       originated (RFC 4364).  A Route Origin will have the same
+       format as a Route Target as per RFC 4360 and will consist
+       of two or three fields: a 2-octet Type field, an
+       administrator field, and, optionally, an assigned number
+       field.
+
+       According to the data formats for types 0, 1, 2, and 6 as
+       defined in RFC 4360, RFC 5668, and RFC 7432, the encoding
+       pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number
+       6:6-octet-mac-address
+       Additionally, a generic pattern is defined for future
+       Route Origin types:
+
+       2-octet-other-hex-number:6-octet-hex-number
+
+       Some valid examples are 0:100:100, 1:1.1.1.1:100,
+       2:1234567890:203, and 6:26:00:08:92:78:00.";
+    reference
+      "RFC 4360: BGP Extended Communities Attribute.
+       RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs).
+       RFC 5668: 4-Octet AS Specific BGP Extended Community.
+       RFC 7432: BGP MPLS-Based Ethernet VPN.";
+  }
+
+  typedef ipv6-route-origin {
+    type string {
+      pattern
+          '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}'
+          + '((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|'
+          + '(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}'
+          + '(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])))'
+          + ':'
+          + '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+          + '6[0-4][0-9]{3}|'
+          + '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0)';
+      pattern '((([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|'
+          + '((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?))'
+          + ':'
+          + '(6553[0-5]|655[0-2][0-9]|65[0-4][0-9]{2}|'
+          + '6[0-4][0-9]{3}|'
+          + '[1-5][0-9]{4}|[1-9][0-9]{0,3}|0)';
+    }
+    description
+      "An IPv6 Route Origin is a 20-octet BGP IPv6 Address
+       Specific Extended Community serving the same function
+       as a standard 8-octet route, except that it only allows
+       an IPv6 address as the global administrator.  The format
+       is <ipv6-address:2-octet-number>.
+
+       Two valid examples are 2001:db8::1:6544 and
+       2001:db8::5eb1:791:6b37:17958.";
+    reference
+      "RFC 5701: IPv6 Address Specific BGP Extended Community
+       Attribute.";
+  }
+
+  /*** Collection of types common to multicast ***/
+
+  typedef ipv4-multicast-group-address {
+    type inet:ipv4-address {
+      pattern '(2((2[4-9])|(3[0-9]))\.).*';
+    }
+    description
+      "This type represents an IPv4 multicast group address,
+       which is in the range of 224.0.0.0 to 239.255.255.255.";
+    reference
+      "RFC 1112: Host Extensions for IP Multicasting.";
+  }
+
+  typedef ipv6-multicast-group-address {
+    type inet:ipv6-address {
+      pattern '(([fF]{2}[0-9a-fA-F]{2}):).*';
+    }
+    description
+      "This type represents an IPv6 multicast group address,
+       which is in the range of ff00::/8.";
+    reference
+      "RFC 4291: IP Version 6 Addressing Architecture.  Section 2.7.
+       RFC 7346: IPv6 Multicast Address Scopes.";
+  }
+
+  typedef ip-multicast-group-address {
+    type union {
+      type ipv4-multicast-group-address;
+      type ipv6-multicast-group-address;
+    }
+    description
+      "This type represents a version-neutral IP multicast group
+       address.  The format of the textual representation implies
+       the IP version.";
+  }
+
+  typedef ipv4-multicast-source-address {
+    type union {
+      type enumeration {
+        enum * {
+          description
+            "Any source address.";
+        }
+      }
+      type inet:ipv4-address;
+    }
+    description
+      "Multicast source IPv4 address type.";
+  }
+
+  typedef ipv6-multicast-source-address {
+    type union {
+      type enumeration {
+        enum * {
+          description
+            "Any source address.";
+        }
+      }
+      type inet:ipv6-address;
+    }
+    description
+      "Multicast source IPv6 address type.";
+  }
+
+  /*** Collection of types common to protocols ***/
+
+  typedef bandwidth-ieee-float32 {
+    type string {
+      pattern
+        '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+      + '1(\.([0-9a-fA-F]{0,5}[02468aAcCeE]?)?)?[pP](\+)?(12[0-7]|'
+      + '1[01][0-9]|0?[0-9]?[0-9])?)';
+    }
+    description
+      "Bandwidth in IEEE 754 floating-point 32-bit binary format:
+       (-1)**(S) * 2**(Exponent-127) * (1 + Fraction),
+       where Exponent uses 8 bits and Fraction uses 23 bits.
+       The units are octets per second.
+       The encoding format is the external hexadecimal-significant
+       character sequences specified in IEEE 754 and ISO/IEC C99.
+       The format is restricted to be normalized, non-negative, and
+       non-fraction: 0x1.hhhhhhp{+}d, 0X1.HHHHHHP{+}D, or 0x0p0,
+       where 'h' and 'H' are hexadecimal digits and 'd' and 'D' are
+       integers in the range of [0..127].
+       When six hexadecimal digits are used for 'hhhhhh' or
+       'HHHHHH', the least significant digit must be an even
+       number.  'x' and 'X' indicate hexadecimal; 'p' and 'P'
+       indicate a power of two.  Some examples are 0x0p0, 0x1p10,
+       and 0x1.abcde2p+20.";
+    reference
+      "IEEE Std 754-2008: IEEE Standard for Floating-Point
+       Arithmetic.
+       ISO/IEC C99: Information technology - Programming
+       Languages - C.";
+  }
+
+  typedef link-access-type {
+    type enumeration {
+      enum broadcast {
+        description
+          "Specify broadcast multi-access network.";
+      }
+      enum non-broadcast-multiaccess {
+        description
+          "Specify Non-Broadcast Multi-Access (NBMA) network.";
+      }
+      enum point-to-multipoint {
+        description
+          "Specify point-to-multipoint network.";
+      }
+      enum point-to-point {
+        description
+          "Specify point-to-point network.";
+      }
+    }
+    description
+      "Link access type.";
+  }
+
+  typedef timer-multiplier {
+    type uint8;
+    description
+      "The number of timer value intervals that should be
+       interpreted as a failure.";
+  }
+
+  typedef timer-value-seconds16 {
+    type union {
+      type uint16 {
+        range "1..65535";
+      }
+      type enumeration {
+        enum infinity {
+          description
+            "The timer is set to infinity.";
+        }
+        enum not-set {
+          description
+            "The timer is not set.";
+        }
+      }
+    }
+    units "seconds";
+    description
+      "Timer value type, in seconds (16-bit range).";
+  }
+
+  typedef timer-value-seconds32 {
+    type union {
+      type uint32 {
+        range "1..4294967295";
+      }
+      type enumeration {
+        enum infinity {
+          description
+            "The timer is set to infinity.";
+        }
+        enum not-set {
+          description
+            "The timer is not set.";
+        }
+      }
+    }
+    units "seconds";
+    description
+      "Timer value type, in seconds (32-bit range).";
+  }
+
+  typedef timer-value-milliseconds {
+    type union {
+      type uint32 {
+        range "1..4294967295";
+      }
+      type enumeration {
+        enum infinity {
+          description
+            "The timer is set to infinity.";
+        }
+        enum not-set {
+          description
+            "The timer is not set.";
+        }
+      }
+    }
+    units "milliseconds";
+    description
+      "Timer value type, in milliseconds.";
+  }
+
+  typedef percentage {
+    type uint8 {
+      range "0..100";
+    }
+    description
+      "Integer indicating a percentage value.";
+  }
+
+  typedef timeticks64 {
+    type uint64;
+    description
+      "This type is based on the timeticks type defined in
+       RFC 6991, but with 64-bit width.  It represents the time,
+       modulo 2^64, in hundredths of a second between two epochs.";
+    reference
+      "RFC 6991: Common YANG Data Types.";
+  }
+
+  typedef uint24 {
+    type uint32 {
+      range "0..16777215";
+    }
+    description
+      "24-bit unsigned integer.";
+  }
+
+  /*** Collection of types related to MPLS/GMPLS ***/
+
+  typedef generalized-label {
+    type binary;
+    description
+      "Generalized Label.  Nodes sending and receiving the
+       Generalized Label are aware of the link-specific
+       label context and type.";
+    reference
+      "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+       Signaling Functional Description.  Section 3.2.";
+  }
+
+  typedef mpls-label-special-purpose {
+    type identityref {
+      base mpls-label-special-purpose-value;
+    }
+    description
+      "This type represents the special-purpose MPLS label values.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.
+       RFC 7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.";
+  }
+
+  typedef mpls-label-general-use {
+    type uint32 {
+      range "16..1048575";
+    }
+    description
+      "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 (Time to Live).
+       The label range specified by this type is for general use,
+       with special-purpose MPLS label values excluded.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.";
+  }
+
+  typedef mpls-label {
+    type union {
+      type mpls-label-special-purpose;
+      type mpls-label-general-use;
+    }
+    description
+      "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.";
+    reference
+      "RFC 3032: MPLS Label Stack Encoding.";
+  }
+
+  /*** Groupings **/
+
+  grouping mpls-label-stack {
+    description
+      "This grouping specifies an MPLS label stack.  The label
+       stack is encoded as a list of label stack entries.  The
+       list key is an identifier that indicates the relative
+       ordering of each entry, with the lowest-value identifier
+       corresponding to the top of the label stack.";
+    container mpls-label-stack {
+      description
+        "Container for a list of MPLS label stack entries.";
+      list entry {
+        key "id";
+        description
+          "List of MPLS label stack entries.";
+        leaf id {
+          type uint8;
+          description
+            "Identifies the entry in a sequence of MPLS label
+             stack entries.  An entry with a smaller identifier
+             value precedes an entry with a larger identifier
+             value in the label stack.  The value of this ID has
+             no semantic meaning other than relative ordering
+             and referencing the entry.";
+        }
+        leaf label {
+          type rt-types:mpls-label;
+          description
+            "Label value.";
+        }
+
+        leaf ttl {
+          type uint8;
+          description
+            "Time to Live (TTL).";
+          reference
+            "RFC 3032: MPLS Label Stack Encoding.";
+        }
+        leaf traffic-class {
+          type uint8 {
+            range "0..7";
+          }
+          description
+            "Traffic Class (TC).";
+          reference
+            "RFC 5462: Multiprotocol Label Switching (MPLS) Label
+             Stack Entry: 'EXP' Field Renamed to 'Traffic Class'
+             Field.";
+        }
+      }
+    }
+  }
+
+  grouping vpn-route-targets {
+    description
+      "A grouping that specifies Route Target import-export rules
+       used in BGP-enabled VPNs.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs).
+       RFC 4664: Framework for Layer 2 Virtual Private Networks
+       (L2VPNs).";
+    list vpn-target {
+      key "route-target";
+      description
+        "List of Route Targets.";
+      leaf route-target {
+        type rt-types:route-target;
+        description
+          "Route Target value.";
+      }
+      leaf route-target-type {
+        type rt-types:route-target-type;
+        mandatory true;
+        description
+          "Import/export type of the Route Target.";
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-te-packet-types@2024-10-30.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-te-packet-types@2024-10-30.yang
new file mode 100644
index 0000000000000000000000000000000000000000..70bead463820694c7f88c977f8ef28df0bb3db7a
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-te-packet-types@2024-10-30.yang
@@ -0,0 +1,806 @@
+module ietf-te-packet-types {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-te-packet-types";
+  prefix te-packet-types;
+
+  import ietf-yang-types {
+    prefix yang;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+
+  import ietf-te-types {
+    prefix te-types;
+    reference
+      "RFC XXXX: Common YANG Data Types for Traffic Engineering";
+  }
+  // RFC Editor: replace XXXX with actual RFC number
+  // and remove this note
+
+  organization
+    "IETF Traffic Engineering Architecture and Signaling (TEAS)
+     Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/teas/>
+     WG List:  <mailto:teas@ietf.org>
+
+     Editor:   Tarek Saad
+               <mailto:tsaad.net@gmail.com>
+
+     Editor:   Rakesh Gandhi
+               <mailto:rgandhi@cisco.com>
+
+     Editor:   Vishnu Pavan Beeram
+               <mailto:vbeeram@juniper.net>
+
+     Editor:   Xufeng Liu
+               <mailto:xufeng.liu.ietf@gmail.com>
+
+     Editor:   Igor Bryskin
+               <mailto:i_bryskin@yahoo.com>";
+  description
+    "This YANG module contains a collection of generally useful YANG
+     data type definitions specific to Packet Traffic Enginnering
+     (TE).
+
+     The model fully conforms to the Network Management Datastore
+     Architecture (NMDA).
+
+     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
+     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
+     'MAY', and 'OPTIONAL' in this document are to be interpreted as
+     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
+     they appear in all capitals, as shown here.
+
+     Copyright (c) 2024 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 Revised BSD License set
+     forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX
+     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
+     for full legal notices.";
+  revision 2024-10-30 {
+    description
+      "This revision adds the following new identities:
+       - bandwidth-profile-type;
+       - link-metric-delay-variation;
+       - link-metric-loss;
+       - path-metric-delay-variation;
+       - path-metric-loss.
+
+      This revision adds the following new groupings:
+       - bandwidth-profile-parameters;
+       - te-packet-path-bandwidth;
+       - te-packet-link-bandwidth.
+
+      This revision provides also few editorial changes.";
+    reference
+      "RFC XXXX: Common YANG Data Types for Traffic Engineering";
+  }
+  // RFC Editor: replace XXXX with actual RFC number, update date
+  // information and remove this note
+
+  revision 2020-06-10 {
+    description
+      "Latest revision of TE MPLS types.";
+    reference
+      "RFC 8776: Common YANG Data Types for Traffic Engineering";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity bandwidth-profile-type {
+    description
+      "Bandwidth Profile Types";
+  }
+
+    identity mef-10 {
+      base bandwidth-profile-type;
+      description
+        "MEF 10 Bandwidth Profile";
+      reference
+        "MEF 10.3: Ethernet Services Attributes Phase 3";
+    }
+
+    identity rfc-2697 {
+      base bandwidth-profile-type;
+      description
+        "RFC 2697 Bandwidth Profile";
+      reference
+        "RFC 2697: A Single Rate Three Color Marker";
+    }
+
+    identity rfc-2698 {
+      base bandwidth-profile-type;
+      description
+        "RFC 2698 Bandwidth Profile";
+      reference
+        "RFC 2698: A Two Rate Three Color Marker";
+    }
+
+  // Derived identities from te-types:link-metric-type
+
+    identity link-metric-delay-variation {
+      base te-types:link-metric-type;
+      description
+        "The Unidirectional Delay Variation Metric,
+         measured in units of microseconds.";
+      reference
+        "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions,
+                   Section 4.3
+         RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions,
+                   Section 4.3";
+    }
+
+    identity link-metric-loss {
+      base te-types:link-metric-type;
+      description
+        "The Unidirectional Link Loss Metric,
+         measured in units of 0.000003%.";
+      reference
+        "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions,
+                   Section 4.4
+         RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions,
+                   Section 4.4";
+    }
+
+  // Derived identities from te-types:link-metric-type
+
+    identity path-metric-delay-variation {
+      base te-types:path-metric-type;
+      description
+        "The Path Delay Variation Metric,
+         measured in units of microseconds.";
+      reference
+        "RFC 8233: Extensions to the Path Computation Element
+                   Communication Protocol (PCEP) to Compute
+                   Service-Aware Label Switched Paths (LSPs),
+                   Section 3.1.2";
+    }
+
+    identity path-metric-loss {
+      base te-types:path-metric-type;
+      description
+        "The Path Loss Metric, measured in units of 0.000003%.";
+      reference
+        "RFC 8233: Extensions to the Path Computation Element
+                   Communication Protocol (PCEP) to Compute
+                   Service-Aware Label Switched Paths (LSPs),
+                   Section 3.1.3";
+    }
+
+  /*
+   * Typedefs
+   */
+
+  typedef te-bandwidth-requested-type {
+    type enumeration {
+      enum specified-value {
+        description
+          "Bandwidth value is explicitly specified.";
+      }
+      enum specified-profile {
+        description
+          "Bandwidth profile is explicitly specified.";
+      }
+      enum auto {
+        description
+          "Bandwidth is automatically computed.";
+      }
+    }
+    description
+      "Enumerated type for specifying whether bandwidth is
+       explicitly specified or automatically computed.";
+  }
+
+  typedef te-class-type {
+    type uint8;
+    description
+      "Diffserv-TE Class-Type.  Defines a set of Traffic Trunks
+       crossing a link that is governed by a specific set of
+       bandwidth constraints.  Class-Type is used for the purposes
+       of link bandwidth allocation, constraint-based routing, and
+       admission control.";
+    reference
+      "RFC 4124: Protocol Extensions for Support of Diffserv-aware
+                 MPLS Traffic Engineering";
+  }
+
+  typedef bc-type {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "Diffserv-TE bandwidth constraints as defined in RFC 4124.";
+    reference
+      "RFC 4124: Protocol Extensions for Support of Diffserv-aware
+                 MPLS Traffic Engineering";
+  }
+
+  typedef bandwidth-kbps {
+    type uint64;
+    units "Kbps";
+    description
+      "Bandwidth values, expressed in kilobits per second.";
+  }
+
+  typedef bandwidth-mbps {
+    type uint64;
+    units "Mbps";
+    description
+      "Bandwidth values, expressed in megabits per second.";
+  }
+
+  typedef bandwidth-gbps {
+    type uint64;
+    units "Gbps";
+    description
+      "Bandwidth values, expressed in gigabits per second.";
+  }
+
+  identity backup-protection-type {
+    description
+      "Base identity for the backup protection type.";
+  }
+
+  identity backup-protection-link {
+    base backup-protection-type;
+    description
+      "Backup provides link protection only.";
+  }
+
+  identity backup-protection-node-link {
+    base backup-protection-type;
+    description
+      "Backup offers node (preferred) or link protection.";
+  }
+
+  identity bc-model-type {
+    description
+      "Base identity for the Diffserv-TE Bandwidth Constraints
+       Model type.";
+    reference
+      "RFC 4124: Protocol Extensions for Support of Diffserv-aware
+                 MPLS Traffic Engineering";
+  }
+
+  identity bc-model-rdm {
+    base bc-model-type;
+    description
+      "Russian Dolls Bandwidth Constraints Model type.";
+    reference
+      "RFC 4127: Russian Dolls Bandwidth Constraints Model for
+                 Diffserv-aware MPLS Traffic Engineering";
+  }
+
+  identity bc-model-mam {
+    base bc-model-type;
+    description
+      "Maximum Allocation Bandwidth Constraints Model type.";
+    reference
+      "RFC 4125: Maximum Allocation Bandwidth Constraints Model for
+                 Diffserv-aware MPLS Traffic Engineering";
+  }
+
+  identity bc-model-mar {
+    base bc-model-type;
+    description
+      "Maximum Allocation with Reservation Bandwidth Constraints
+       Model type.";
+    reference
+      "RFC 4126: Max Allocation with Reservation Bandwidth
+                 Constraints Model for Diffserv-aware MPLS Traffic
+                 Engineering & Performance Comparisons";
+  }
+
+  /*
+   * Groupings
+   */
+
+  grouping performance-metrics-attributes-packet {
+    description
+      "Contains PM attributes.";
+    uses te-types:performance-metrics-attributes {
+      augment "performance-metrics-one-way" {
+        leaf one-way-min-delay {
+          type uint32 {
+            range "0..16777215";
+          }
+          description
+            "One-way minimum delay or latency in microseconds.";
+        }
+        leaf one-way-min-delay-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "One-way minimum delay or latency normality.";
+        }
+        leaf one-way-max-delay {
+          type uint32 {
+            range "0..16777215";
+          }
+          description
+            "One-way maximum delay or latency in microseconds.";
+        }
+        leaf one-way-max-delay-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "One-way maximum delay or latency normality.";
+        }
+        leaf one-way-delay-variation {
+          type uint32 {
+            range "0..16777215";
+          }
+          description
+            "One-way delay variation in microseconds.";
+          reference
+            "RFC 5481: Packet Delay Variation Applicability
+                       Statement, Section 4.2";
+        }
+        leaf one-way-delay-variation-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "One-way delay variation normality.";
+          reference
+            "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 7823: Performance-Based Path Selection for
+                       Explicitly Routed Label Switched Paths (LSPs)
+                       Using TE Metric Extensions";
+        }
+        leaf one-way-packet-loss {
+          type decimal64 {
+            fraction-digits 6;
+            range "0..50.331642";
+          }
+          description
+            "One-way packet loss as a percentage of the total traffic
+             sent over a configurable interval.  The finest precision
+             is 0.000003%, where the maximum is 50.331642%.";
+          reference
+            "RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                       Extensions, Section 4.4";
+        }
+        leaf one-way-packet-loss-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "Packet loss normality.";
+          reference
+            "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 7823: Performance-Based Path Selection for
+                       Explicitly Routed Label Switched Paths (LSPs)
+                       Using TE Metric Extensions";
+        }
+        description
+          "PM one-way packet-specific augmentation for a generic PM
+           grouping.";
+      }
+      augment "performance-metrics-two-way" {
+        leaf two-way-min-delay {
+          type uint32 {
+            range "0..16777215";
+          }
+          default "0";
+          description
+            "Two-way minimum delay or latency in microseconds.";
+        }
+        leaf two-way-min-delay-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "Two-way minimum delay or latency normality.";
+          reference
+            "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 7823: Performance-Based Path Selection for
+                       Explicitly Routed Label Switched Paths (LSPs)
+                       Using TE Metric Extensions";
+        }
+        leaf two-way-max-delay {
+          type uint32 {
+            range "0..16777215";
+          }
+          default "0";
+          description
+            "Two-way maximum delay or latency in microseconds.";
+        }
+        leaf two-way-max-delay-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "Two-way maximum delay or latency normality.";
+          reference
+            "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 7823: Performance-Based Path Selection for
+                       Explicitly Routed Label Switched Paths (LSPs)
+                       Using TE Metric Extensions";
+        }
+        leaf two-way-delay-variation {
+          type uint32 {
+            range "0..16777215";
+          }
+          default "0";
+          description
+            "Two-way delay variation in microseconds.";
+          reference
+            "RFC 5481: Packet Delay Variation Applicability
+                       Statement, Section 4.2";
+        }
+        leaf two-way-delay-variation-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "Two-way delay variation normality.";
+          reference
+            "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                       Extensions
+             RFC 7823: Performance-Based Path Selection for
+                       Explicitly Routed Label Switched Paths (LSPs)
+                       Using TE Metric Extensions";
+        }
+        leaf two-way-packet-loss {
+          type decimal64 {
+            fraction-digits 6;
+            range "0..50.331642";
+          }
+          default "0";
+          description
+            "Two-way packet loss as a percentage of the total traffic
+             sent over a configurable interval.  The finest precision
+             is 0.000003%.";
+        }
+        leaf two-way-packet-loss-normality {
+          type te-types:performance-metrics-normality;
+          default "normal";
+          description
+            "Two-way packet loss normality.";
+        }
+        description
+          "PM two-way packet-specific augmentation for a generic PM
+           grouping.";
+        reference
+          "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+           RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions
+           RFC 7823: Performance-Based Path Selection for Explicitly
+                     Routed Label Switched Paths (LSPs) Using TE
+                     Metric Extensions";
+      }
+    }
+  }
+
+  grouping one-way-performance-metrics-packet {
+    description
+      "One-way packet PM throttle grouping.";
+    leaf one-way-min-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "One-way minimum delay or latency in microseconds.";
+    }
+    leaf one-way-max-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "One-way maximum delay or latency in microseconds.";
+    }
+    leaf one-way-delay-variation {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "One-way delay variation in microseconds.";
+    }
+    leaf one-way-packet-loss {
+      type decimal64 {
+        fraction-digits 6;
+        range "0..50.331642";
+      }
+      default "0";
+      description
+        "One-way packet loss as a percentage of the total traffic
+         sent over a configurable interval.  The finest precision is
+         0.000003%.";
+    }
+  }
+
+  grouping one-way-performance-metrics-gauge-packet {
+    description
+      "One-way packet PM throttle grouping.
+
+       This grouping is used to report the same metrics defined in
+       the one-way-performance-metrics-packet grouping, using gauges
+       instead of uint32 data types and referencing IPPM RFCs
+       instead of IGP-TE RFCs.";
+    leaf one-way-min-delay {
+      type yang:gauge64;
+      description
+        "One-way minimum delay or latency in microseconds.";
+    }
+    leaf one-way-max-delay {
+      type yang:gauge64;
+      description
+        "One-way maximum delay or latency in microseconds.";
+      reference
+        "RFC 7679: A One-Way Delay Metric for IP Performance
+                   Metrics (IPPM)";
+    }
+    leaf one-way-delay-variation {
+      type yang:gauge64;
+      description
+        "One-way delay variation in microseconds.";
+      reference
+        "RFC 3393: IP Packet Delay Variation Metric for IP
+                   Performance Metrics (IPPM)";
+    }
+    leaf one-way-packet-loss {
+      type decimal64 {
+        fraction-digits 5;
+        range "0..100";
+      }
+      description
+        "The ratio of packets dropped to packets transmitted between
+         two endpoints.";
+      reference
+        "RFC 7680: A One-Way Loss Metric for IP Performance
+                   Metrics (IPPM)";
+    }
+  }
+
+  grouping two-way-performance-metrics-packet {
+    description
+      "Two-way packet PM throttle grouping.";
+    leaf two-way-min-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "Two-way minimum delay or latency in microseconds.";
+    }
+    leaf two-way-max-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "Two-way maximum delay or latency in microseconds.";
+    }
+    leaf two-way-delay-variation {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "Two-way delay variation in microseconds.";
+    }
+    leaf two-way-packet-loss {
+      type decimal64 {
+        fraction-digits 6;
+        range "0..50.331642";
+      }
+      default "0";
+      description
+        "Two-way packet loss as a percentage of the total traffic
+         sent over a configurable interval.  The finest precision is
+         0.000003%.";
+    }
+  }
+
+  grouping two-way-performance-metrics-gauge-packet {
+    description
+      "Two-way packet PM throttle grouping.
+
+       This grouping is used to report the same metrics defined in
+       the two-way-performance-metrics-packet grouping, using gauges
+       instead of uint32 data types and referencing IPPM RFCs
+       instead of IGP-TE RFCs.";
+    leaf two-way-min-delay {
+      type yang:gauge64;
+      description
+        "Two-way minimum delay or latency in microseconds.";
+      reference
+        "RFC 2681: A Round-trip Delay Metric for IPPM";
+    }
+    leaf two-way-max-delay {
+      type yang:gauge64;
+      description
+        "Two-way maximum delay or latency in microseconds.";
+      reference
+        "RFC 2681: A Round-trip Delay Metric for IPPM";
+    }
+    leaf two-way-delay-variation {
+      type yang:gauge64;
+      description
+        "Two-way delay variation in microseconds.";
+      reference
+        "RFC 5481: Packet Delay Variation Applicability Statement";
+    }
+    leaf two-way-packet-loss {
+      type decimal64 {
+        fraction-digits 5;
+        range "0..100";
+      }
+      description
+        "The ratio of packets dropped to packets transmitted between
+         two endpoints.";
+    }
+  }
+
+  grouping performance-metrics-throttle-container-packet {
+    description
+      "Packet PM threshold grouping.";
+    uses te-types:performance-metrics-throttle-container {
+      augment "throttle/threshold-out" {
+        uses one-way-performance-metrics-packet;
+        uses two-way-performance-metrics-packet;
+        description
+          "PM threshold-out packet augmentation for a
+           generic grouping.";
+      }
+      augment "throttle/threshold-in" {
+        uses one-way-performance-metrics-packet;
+        uses two-way-performance-metrics-packet;
+        description
+          "PM threshold-in packet augmentation for a
+           generic grouping.";
+      }
+      augment "throttle/threshold-accelerated-advertisement" {
+        uses one-way-performance-metrics-packet;
+        uses two-way-performance-metrics-packet;
+        description
+          "PM accelerated advertisement packet augmentation for a
+           generic grouping.";
+      }
+    }
+  }
+
+  grouping bandwidth-profile-parameters {
+    description
+      "Common parameters to define bandwidth profiles in packet
+       networks.";
+    leaf cir {
+      type uint64;
+      units "bits/second";
+      description
+        "Committed Information Rate (CIR).";
+    }
+    leaf cbs {
+      type uint64;
+      units "bytes";
+      description
+        "Committed Burst Size (CBS).";
+    }
+    leaf eir {
+      type uint64;
+      units "bits/second";
+      description
+        "Excess Information Rate (EIR).";
+    }
+    leaf ebs {
+      type uint64;
+      units "bytes";
+      description
+        "Excess Burst Size (EBS).";
+    }
+    leaf pir {
+      type uint64;
+      units "bits/second";
+      description
+        "Peak Information Rate (PIR).";
+    }
+    leaf pbs {
+      type uint64;
+      units "bytes";
+      description
+        "Peak Burst Size (PBS).";
+    }
+  }
+
+  grouping te-packet-path-bandwidth {
+    description
+      "Bandwidth attributes for TE Packet paths.";
+    container packet-bandwidth {
+      description
+        "Bandwidth attributes for TE Packet paths.";
+      leaf specification-type {
+        type te-bandwidth-requested-type;
+        description
+          "The bandwidth specification type, either explicitly
+           specified or automatically computed.";
+      }
+      leaf set-bandwidth {
+        when "../specification-type = 'specified-value'" {
+          description
+            "When the bandwidth value is explicitly specified.";
+        }
+        type bandwidth-kbps;
+        description
+          "Set the bandwidth value explicitly, e.g., using offline
+           calculation.";
+      }
+      container bandwidth-profile {
+        when "../specification-type = 'specified-profile'" {
+          description
+            "When the bandwidth profile is explicitly specified.";
+        }
+        description
+          "Set the bandwidth profile attributes explicitly.";
+        leaf bandwidth-profile-name {
+          type string;
+          description
+            "Name of Bandwidth Profile.";
+        }
+        leaf bandwidth-profile-type {
+          type identityref {
+            base bandwidth-profile-type;
+          }
+          description
+            "Type of Bandwidth Profile.";
+        }
+        uses bandwidth-profile-parameters;
+      }
+      leaf class-type {
+        type te-types:te-ds-class;
+        description
+          "The Class-Type of traffic transported by the LSP.";
+        reference
+          "RFC 4124: Protocol Extensions for Support of
+                     Diffserv-aware MPLS Traffic Engineering,
+                     Section 4.3.1";
+      }
+      leaf signaled-bandwidth {
+        type te-packet-types:bandwidth-kbps;
+        config false;
+        description
+          "The currently signaled bandwidth of the LSP.
+
+           In the case where the bandwidth is specified
+           explicitly, then this will match the value of the
+           set-bandwidth leaf.
+
+           In the cases where the bandwidth is dynamically
+           computed by the system, the current value of the
+           bandwidth should be reflected.";
+      }
+    }
+  }
+
+  grouping te-packet-link-bandwidth {
+    description
+      "Bandwidth attributes for Packet TE links.";
+    leaf packet-bandwidth {
+      type uint64;
+      units "bits/second";
+      description
+        "Bandwidth value for Packet TE links.";
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-te-types@2024-10-30.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-te-types@2024-10-30.yang
new file mode 100644
index 0000000000000000000000000000000000000000..5d9ae16f4bb43b5389217771a9b3f83d177449ca
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-te-types@2024-10-30.yang
@@ -0,0 +1,4399 @@
+module ietf-te-types {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-te-types";
+  prefix te-types;
+
+  import ietf-inet-types {
+    prefix inet;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+  import ietf-yang-types {
+    prefix yang;
+    reference
+      "RFC 6991: Common YANG Data Types";
+  }
+  import ietf-routing-types {
+    prefix rt-types;
+    reference
+      "RFC 8294: Common YANG Data Types for the Routing Area";
+  }
+
+  import ietf-network {
+    prefix "nw";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  import ietf-network-topology {
+    prefix "nt";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  organization
+    "IETF Traffic Engineering Architecture and Signaling (TEAS)
+     Working Group";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/teas/>
+     WG List:  <mailto:teas@ietf.org>
+
+     Editor:   Tarek Saad
+               <mailto:tsaad.net@gmail.com>
+
+     Editor:   Rakesh Gandhi
+               <mailto:rgandhi@cisco.com>
+
+     Editor:   Vishnu Pavan Beeram
+               <mailto:vbeeram@juniper.net>
+
+     Editor:   Xufeng Liu
+               <mailto:xufeng.liu.ietf@gmail.com>
+
+     Editor:   Igor Bryskin
+               <mailto:i_bryskin@yahoo.com>";
+  description
+    "This YANG module contains a collection of generally useful
+     YANG data type definitions specific to TE.  The model fully
+     conforms to the Network Management Datastore Architecture
+     (NMDA).
+
+     The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', 'SHALL
+     NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', 'NOT RECOMMENDED',
+     'MAY', and 'OPTIONAL' in this document are to be interpreted as
+     described in BCP 14 (RFC 2119) (RFC 8174) when, and only when,
+     they appear in all capitals, as shown here.
+
+     Copyright (c) 2024 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 Revised BSD License set
+     forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (https://trustee.ietf.org/license-info).
+
+     This version of this YANG module is part of RFC XXXX
+     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC itself
+     for full legal notices.";
+  revision 2024-10-30 {
+    description
+      "This revision adds the following new identities:
+      - lsp-provisioning-error-reason;
+      - association-type-diversity;
+      - tunnel-admin-state-auto;
+      - lsp-restoration-restore-none;
+      - restoration-scheme-rerouting;
+      - path-metric-optimization-type;
+      - link-path-metric-type;
+      - link-metric-type and its derived identities;
+      - path-computation-error-reason and its derived identities;
+      - protocol-origin-type and its derived identities;
+      - svec-objective-function-type and its derived identities;
+      - svec-metric-type and its derived identities.
+
+      This revision adds the following new data types:
+      - path-type.
+
+      This revision adds the following new groupings:
+      - encoding-and-switching-type;
+      - te-generic-node-id.
+
+      This revision updates the following identities:
+      - objective-function-type;
+      - action-exercise;
+      - path-metric-type;
+      - path-metric-te;
+      - path-metric-igp;
+      - path-metric-hop;
+      - path-metric-delay-average;
+      - path-metric-delay-minimum;
+      - path-metric-residual-bandwidth;
+      - path-metric-optimize-includes;
+      - path-metric-optimize-excludes;
+      - te-optimization-criterion.
+
+      This revision updates the following data types:
+      - te-node-id.
+
+      This revision updates the following groupings:
+      - explicit-route-hop:
+        - adds the following leaves:
+          - node-id-uri;
+          - link-tp-id-uri;
+        - updates the following leaves:
+          - node-id;
+          - link-tp-id;
+      - record-route-state:
+        - adds the following leaves:
+          - node-id-uri;
+          - link-tp-id-uri;
+        - updates the following leaves:
+          - node-id;
+          - link-tp-id;
+      - optimization-metric-entry:
+        - updates the following leaves:
+          - metric-type;
+      - tunnel-constraints;
+        - adds the following leaves:
+          - network-id;
+      - path-constraints-route-objects:
+        - updates the following containers:
+          - explicit-route-objects-always;
+      - generic-path-metric-bounds:
+        - updates the following leaves:
+          - metric-type;
+      - generic-path-optimization
+        - adds the following leaves:
+          - tiebreaker;
+        - deprecate the following containers:
+          - tiebreakers.
+
+      This revision obsoletes the following identities:
+      - of-minimize-agg-bandwidth-consumption;
+      - of-minimize-load-most-loaded-link;
+      - of-minimize-cost-path-set;
+      - lsp-protection-reroute-extra;
+      - lsp-protection-reroute.
+
+      This revision provides also few editorial changes.";
+    reference
+      "RFC XXXX: Common YANG Data Types for Traffic Engineering";
+  }
+  // RFC Editor: replace XXXX with actual RFC number, update date
+  // information and remove this note
+
+  revision 2020-06-10 {
+    description
+      "Initial Version of TE types.";
+    reference
+      "RFC 8776: Common YANG Data Types for Traffic Engineering";
+  }
+
+  /**
+   * Typedefs
+   */
+
+  typedef admin-group {
+    type yang:hex-string {
+      /* 01:02:03:04 */
+      length "1..11";
+    }
+    description
+      "Administrative group / resource class / color representation
+       in 'hex-string' type.
+
+       The most significant byte in the hex-string is the farthest
+       to the left in the byte sequence.  Leading zero bytes in the
+       configured value may be omitted for brevity.";
+    reference
+      "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                 Version 2
+       RFC 5305: IS-IS Extensions for Traffic Engineering
+       RFC 7308: Extended Administrative Groups in MPLS Traffic
+                 Engineering (MPLS-TE)";
+  }
+
+  typedef admin-groups {
+    type union {
+      type admin-group;
+      type extended-admin-group;
+    }
+    description
+      "Derived types for TE administrative groups.";
+  }
+
+  typedef extended-admin-group {
+    type yang:hex-string;
+    description
+      "Extended administrative group / resource class / color
+       representation in 'hex-string' type.
+
+       The most significant byte in the hex-string is the farthest
+       to the left in the byte sequence.  Leading zero bytes in the
+       configured value may be omitted for brevity.";
+    reference
+      "RFC 7308: Extended Administrative Groups in MPLS Traffic
+                 Engineering (MPLS-TE)";
+  }
+
+  typedef path-attribute-flags {
+    type union {
+      type identityref {
+        base session-attributes-flags;
+      }
+      type identityref {
+        base lsp-attributes-flags;
+      }
+    }
+    description
+      "Path attributes flags type.";
+  }
+
+  typedef performance-metrics-normality {
+    type enumeration {
+      enum unknown {
+        value 0;
+        description
+          "Unknown.";
+      }
+      enum normal {
+        value 1;
+        description
+          "Normal.  Indicates that the anomalous bit is not set.";
+      }
+      enum abnormal {
+        value 2;
+        description
+          "Abnormal.  Indicates that the anomalous bit is set.";
+      }
+    }
+    description
+      "Indicates whether a performance metric is normal (anomalous
+       bit not set), abnormal (anomalous bit set), or unknown.";
+    reference
+      "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+       RFC 7823: Performance-Based Path Selection for Explicitly
+                 Routed Label Switched Paths (LSPs) Using TE Metric
+                 Extensions
+       RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions";
+  }
+
+  typedef srlg {
+    type uint32;
+    description
+      "SRLG type.";
+    reference
+      "RFC 4203: OSPF Extensions in Support of Generalized
+                 Multi-Protocol Label Switching (GMPLS)
+       RFC 5307: IS-IS Extensions in Support of Generalized
+                 Multi-Protocol Label Switching (GMPLS)";
+  }
+
+  typedef te-common-status {
+    type enumeration {
+      enum up {
+        description
+          "Enabled.";
+      }
+      enum down {
+        description
+          "Disabled.";
+      }
+      enum testing {
+        description
+          "In some test mode.";
+      }
+      enum preparing-maintenance {
+        description
+          "The resource is disabled in the control plane to prepare
+           for a graceful shutdown for maintenance purposes.";
+        reference
+          "RFC 5817: Graceful Shutdown in MPLS and Generalized MPLS
+                     Traffic Engineering Networks";
+      }
+      enum maintenance {
+        description
+          "The resource is disabled in the data plane for maintenance
+           purposes.";
+      }
+      enum unknown {
+        description
+          "Status is unknown.";
+      }
+    }
+    description
+      "Defines a type representing the common states of a TE
+       resource.";
+  }
+
+  typedef te-bandwidth {
+    type string {
+      pattern '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+            + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?'
+            + '[pP](\+)?(12[0-7]|'
+            + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+'
+            + '(,(0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+            + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?'
+            + '[pP](\+)?(12[0-7]|'
+            + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+))*';
+    }
+    description
+      "This is the generic bandwidth type.  It is a string containing
+       a list of numbers separated by commas, where each of these
+       numbers can be non-negative decimal, hex integer, or
+       hex float:
+
+       (dec | hex | float)[*(','(dec | hex | float))]
+
+       For the packet-switching type, the string encoding follows
+       the type 'bandwidth-ieee-float32' as defined in RFC 8294
+       (e.g., 0x1p10), where the units are in bytes per second.
+
+       For the Optical Transport Network (OTN) switching type,
+       a list of integers can be used, such as '0,2,3,1', indicating
+       two ODU0s and one ODU3.  ('ODU' stands for 'Optical Data
+       Unit'.)  For Dense Wavelength Division Multiplexing (DWDM),
+       a list of pairs of slot numbers and widths can be used,
+       such as '0,2,3,3', indicating a frequency slot 0 with
+       slot width 2 and a frequency slot 3 with slot width 3.
+       Canonically, the string is represented as all lowercase and in
+       hex, where the prefix '0x' precedes the hex number.";
+    reference
+      "RFC 8294: Common YANG Data Types for the Routing Area
+       ITU-T G.709: Interfaces for the optical transport network -
+                    Edition 6.0 (06/2020)";
+  }
+
+  typedef te-ds-class {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "The Differentiated Services Class-Type of traffic.";
+    reference
+      "RFC 4124: Protocol Extensions for Support of Diffserv-aware
+                 MPLS Traffic Engineering, Section 4.3.1";
+  }
+
+  typedef te-global-id {
+    type uint32;
+    description
+      "An identifier to uniquely identify an operator, which can be
+       either a provider or a client.
+
+       The definition of this type is taken from RFCs 6370 and 5003.
+
+       This attribute type is used solely to provide a globally
+       unique context for TE topologies.";
+    reference
+      "RFC 5003: Attachment Individual Identifier (AII) Types for
+                 Aggregation
+       RFC 6370: MPLS Transport Profile (MPLS-TP) Identifiers";
+  }
+
+  typedef te-hop-type {
+    type enumeration {
+      enum loose {
+        description
+          "A loose hop in an explicit path.";
+      }
+      enum strict {
+        description
+          "A strict hop in an explicit path.";
+      }
+    }
+    description
+      "Enumerated type for specifying loose or strict paths.";
+    reference
+      "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                 Section 4.3.3";
+  }
+
+  typedef te-link-access-type {
+    type enumeration {
+      enum point-to-point {
+        description
+          "The link is point-to-point.";
+      }
+      enum multi-access {
+        description
+          "The link is multi-access, including broadcast and NBMA.";
+      }
+    }
+    description
+      "Defines a type representing the access type of a TE link.";
+    reference
+      "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                 Version 2";
+  }
+
+  typedef te-label-direction {
+    type enumeration {
+      enum forward {
+        description
+          "Label allocated for the forward LSP direction.";
+      }
+      enum reverse {
+        description
+          "Label allocated for the reverse LSP direction.";
+      }
+    }
+    description
+      "Enumerated type for specifying the forward or reverse
+       label.";
+  }
+
+  typedef te-link-direction {
+    type enumeration {
+      enum incoming {
+        description
+          "The explicit route represents an incoming link on
+           a node.";
+      }
+      enum outgoing {
+        description
+          "The explicit route represents an outgoing link on
+           a node.";
+      }
+    }
+    description
+      "Enumerated type for specifying the direction of a link on
+       a node.";
+  }
+
+  typedef te-metric {
+    type uint32;
+    description
+      "TE metric.";
+    reference
+      "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric as a
+                 second MPLS Traffic Engineering (TE) Metric";
+  }
+
+  typedef te-node-id {
+    type union {
+      type yang:dotted-quad;
+      type inet:ipv6-address-no-zone;
+    }
+    description
+      "A type representing the identifier for a node in a TE
+       topology.
+
+       The identifier is represented either as 4 octets in
+       dotted-quad notation, or as 16 octets in full, mixed,
+       shortened, or shortened-mixed IPv6 address notation.
+
+       This attribute MAY be mapped to the Router Address TLV
+       described in Section 2.4.1 of RFC 3630, the TE Router ID
+       described in Section 3 of RFC 6827, the Traffic Engineering
+       Router ID TLV described in Section 4.3 of RFC 5305, the TE
+       Router ID TLV described in Section 3.2.1 of RFC 6119, or the
+       IPv6 TE Router ID TLV described in Section 4.1 of RFC 6119.
+
+       The reachability of such a TE node MAY be achieved by a
+       mechanism such as that described in Section 6.2 of RFC 6827.";
+    reference
+      "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                 Version 2, Section 2.4.1
+       RFC 5305: IS-IS Extensions for Traffic Engineering,
+                 Section 4.3
+       RFC 6119: IPv6 Traffic Engineering in IS-IS, Section 3.2.1
+       RFC 6827: Automatically Switched Optical Network (ASON)
+                 Routing for OSPFv2 Protocols, Section 3";
+  }
+
+  typedef te-oper-status {
+    type te-common-status;
+    description
+      "Defines a type representing the operational status of
+       a TE resource.";
+  }
+
+  typedef te-admin-status {
+    type te-common-status;
+    description
+      "Defines a type representing the administrative status of
+       a TE resource.";
+  }
+
+  typedef te-path-disjointness {
+    type bits {
+      bit node {
+        position 0;
+        description
+          "Node disjoint.";
+      }
+      bit link {
+        position 1;
+        description
+          "Link disjoint.";
+      }
+      bit srlg {
+        position 2;
+        description
+          "SRLG (Shared Risk Link Group) disjoint.";
+      }
+    }
+    description
+      "Type of the resource disjointness for a TE tunnel path.";
+    reference
+      "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                 Generalized Multi-Protocol Label Switching (GMPLS)
+                 Recovery";
+  }
+
+  typedef te-recovery-status {
+    type enumeration {
+      enum normal {
+        description
+          "Both the recovery span and the working span are fully
+           allocated and active, data traffic is being
+           transported over (or selected from) the working
+           span, and no trigger events are reported.";
+      }
+      enum recovery-started {
+        description
+          "The recovery action has been started but not completed.";
+      }
+      enum recovery-succeeded {
+        description
+          "The recovery action has succeeded.  The working span has
+           reported a failure/degrade condition, and the user traffic
+           is being transported (or selected) on the recovery span.";
+      }
+      enum recovery-failed {
+        description
+          "The recovery action has failed.";
+      }
+      enum reversion-started {
+        description
+          "The reversion has started.";
+      }
+      enum reversion-succeeded {
+        description
+          "The reversion action has succeeded.";
+      }
+      enum reversion-failed {
+        description
+          "The reversion has failed.";
+      }
+      enum recovery-unavailable {
+        description
+          "The recovery is unavailable, as a result of either an
+           operator's lockout command or a failure condition
+           detected on the recovery span.";
+      }
+      enum recovery-admin {
+        description
+          "The operator has issued a command to switch the user
+           traffic to the recovery span.";
+      }
+      enum wait-to-restore {
+        description
+          "The recovery domain is recovering from a failure/degrade
+           condition on the working span that is being controlled by
+           the Wait-to-Restore (WTR) timer.";
+      }
+    }
+    description
+      "Defines the status of a recovery action.";
+    reference
+      "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+       RFC 4427: Recovery (Protection and Restoration) Terminology
+                 for Generalized Multi-Protocol Label Switching
+                 (GMPLS)";
+  }
+
+  typedef te-template-name {
+    type string {
+      pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
+    }
+    description
+      "A type for the name of a TE node template or TE link
+       template.";
+  }
+
+  typedef te-topology-event-type {
+    type enumeration {
+      enum add {
+        value 0;
+        description
+          "A TE node or TE link has been added.";
+      }
+      enum remove {
+        value 1;
+        description
+          "A TE node or TE link has been removed.";
+      }
+      enum update {
+        value 2;
+        description
+          "A TE node or TE link has been updated.";
+      }
+    }
+    description
+      "TE event type for notifications.";
+  }
+
+  typedef te-topology-id {
+    type union {
+      type string {
+        length "0";
+        // empty string
+      }
+      type string {
+        pattern '([a-zA-Z0-9\-_.]+:)*'
+              + '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
+      }
+    }
+    description
+      "An identifier for a topology.
+
+       It is optional to have one or more prefixes at the beginning,
+       separated by colons.  The prefixes can be 'network-types' as
+       defined in the 'ietf-network' module in RFC 8345, to help the
+       user better understand the topology before further inquiry
+       is made.";
+    reference
+      "RFC 8345: A YANG Data Model for Network Topologies";
+  }
+
+  typedef te-tp-id {
+    type union {
+      type uint32;
+      // Unnumbered
+      type inet:ip-address;
+      // IPv4 or IPv6 address
+    }
+    description
+      "An identifier for a TE link endpoint on a node.
+
+       This attribute is mapped to a local or remote link identifier
+       as defined in RFCs 3630 and 5305.";
+    reference
+      "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                 Version 2
+       RFC 5305: IS-IS Extensions for Traffic Engineering";
+  }
+
+  typedef path-type {
+    type enumeration {
+      enum primary-path {
+        description
+          "Indicates that the TE path is a primary path.";
+      }
+      enum secondary-path {
+        description
+          "Indicates that the TE path is a secondary path.";
+      }
+      enum primary-reverse-path {
+        description
+          "Indicates that the TE path is a primary reverse path.";
+      }
+      enum secondary-reverse-path {
+        description
+          "Indicates that the TE path is a secondary reverse path.";
+      }
+    }
+    description
+      "The type of TE path, indicating whether a path is a primary, 
+       or a reverse primary, or a secondary, or a reverse secondary 
+       path.";
+  }
+
+  /* TE features */
+
+  feature p2mp-te {
+    description
+      "Indicates support for Point-to-Multipoint TE (P2MP-TE).";
+    reference
+      "RFC 4875: Extensions to Resource Reservation Protocol -
+                 Traffic Engineering (RSVP-TE) for
+                 Point-to-Multipoint TE Label Switched Paths (LSPs)";
+  }
+
+  feature frr-te {
+    description
+      "Indicates support for TE Fast Reroute (FRR).";
+    reference
+      "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP Tunnels";
+  }
+
+  feature extended-admin-groups {
+    description
+      "Indicates support for TE link extended administrative
+       groups.";
+    reference
+      "RFC 7308: Extended Administrative Groups in MPLS Traffic
+                 Engineering (MPLS-TE)";
+  }
+
+  feature named-path-affinities {
+    description
+      "Indicates support for named path affinities.";
+  }
+
+  feature named-extended-admin-groups {
+    description
+      "Indicates support for named extended administrative groups.";
+  }
+
+  feature named-srlg-groups {
+    description
+      "Indicates support for named SRLG groups.";
+  }
+
+  feature named-path-constraints {
+    description
+      "Indicates support for named path constraints.";
+  }
+
+  feature path-optimization-metric {
+    description
+      "Indicates support for path optimization metrics.";
+  }
+
+  feature path-optimization-objective-function {
+    description
+      "Indicates support for path optimization objective functions.";
+  }
+
+  /*
+   * Identities
+   */
+
+  identity lsp-provisioning-error-reason {
+    description
+      "Base identity for LSP provisioning errors.";
+  }
+
+  identity session-attributes-flags {
+    description
+      "Base identity for the RSVP-TE session attributes flags.";
+  }
+
+    identity local-protection-desired {
+      base session-attributes-flags;
+      description
+        "Local protection is desired.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                  Section 4.7.1";
+    }
+
+    identity se-style-desired {
+      base session-attributes-flags;
+      description
+        "Shared explicit style, to allow the LSP to be established
+         and share resources with the old LSP.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
+    }
+
+    identity local-recording-desired {
+      base session-attributes-flags;
+      description
+        "Label recording is desired.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                  Section 4.7.1";
+    }
+
+    identity bandwidth-protection-desired {
+      base session-attributes-flags;
+      description
+        "Requests FRR bandwidth protection on LSRs, if present.";
+      reference
+        "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP
+                   Tunnels";
+    }
+
+    identity node-protection-desired {
+      base session-attributes-flags;
+      description
+        "Requests FRR node protection on LSRs, if present.";
+      reference
+        "RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP
+                   Tunnels";
+    }
+
+    identity path-reevaluation-request {
+      base session-attributes-flags;
+      description
+        "This flag indicates that a path re-evaluation (of the
+         current path in use) is requested.  Note that this does
+         not trigger any LSP reroutes but instead just signals a
+         request to evaluate whether a preferable path exists.";
+      reference
+        "RFC 4736: Reoptimization of Multiprotocol Label Switching
+                  (MPLS) Traffic Engineering (TE) Loosely Routed
+                  Label Switched Path (LSP)";
+    }
+
+    identity soft-preemption-desired {
+      base session-attributes-flags;
+      description
+        "Soft preemption of LSP resources is desired.";
+      reference
+        "RFC 5712: MPLS Traffic Engineering Soft Preemption";
+    }
+
+  identity lsp-attributes-flags {
+    description
+      "Base identity for LSP attributes flags.";
+  }
+
+    identity end-to-end-rerouting-desired {
+      base lsp-attributes-flags;
+      description
+        "Indicates end-to-end rerouting behavior for an LSP
+         undergoing establishment.  This MAY also be used to
+         specify the behavior of end-to-end LSP recovery for
+         established LSPs.";
+      reference
+        "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS
+                   RSVP-TE
+         RFC 5420: Encoding of Attributes for MPLS LSP Establishment
+                   Using Resource Reservation Protocol Traffic
+                   Engineering (RSVP-TE)
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity boundary-rerouting-desired {
+      base lsp-attributes-flags;
+      description
+        "Indicates boundary rerouting behavior for an LSP undergoing
+         establishment.  This MAY also be used to specify
+         segment-based LSP recovery through nested crankback for
+         established LSPs.  The boundary Area Border Router (ABR) /
+         Autonomous System Border Router (ASBR) can decide to forward
+         the PathErr message upstream to either an upstream boundary
+         ABR/ASBR or the ingress LSR.  Alternatively, it can try to
+         select another egress boundary LSR.";
+      reference
+        "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS
+                   RSVP-TE
+         RFC 5420: Encoding of Attributes for MPLS LSP Establishment
+                   Using Resource Reservation Protocol Traffic
+                   Engineering (RSVP-TE)
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity segment-based-rerouting-desired {
+      base lsp-attributes-flags;
+      description
+        "Indicates segment-based rerouting behavior for an LSP
+         undergoing establishment.  This MAY also be used to specify
+         segment-based LSP recovery for established LSPs.";
+      reference
+        "RFC 4920: Crankback Signaling Extensions for MPLS and GMPLS
+                   RSVP-TE
+         RFC 5420: Encoding of Attributes for MPLS LSP Establishment
+                   Using Resource Reservation Protocol
+                   Traffic Engineering (RSVP-TE)
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity lsp-integrity-required {
+      base lsp-attributes-flags;
+      description
+        "Indicates that LSP integrity is required.";
+      reference
+        "RFC 4875: Extensions to Resource Reservation Protocol -
+                   Traffic Engineering (RSVP-TE) for
+                   Point-to-Multipoint TE Label Switched Paths (LSPs)
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity contiguous-lsp-desired {
+      base lsp-attributes-flags;
+      description
+        "Indicates that a contiguous LSP is desired.";
+      reference
+        "RFC 5151: Inter-Domain MPLS and GMPLS Traffic Engineering --
+                   Resource Reservation Protocol-Traffic Engineering
+                   (RSVP-TE) Extensions
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity lsp-stitching-desired {
+      base lsp-attributes-flags;
+      description
+        "Indicates that LSP stitching is desired.";
+      reference
+        "RFC 5150: Label Switched Path Stitching with Generalized
+                   Multiprotocol Label Switching Traffic Engineering
+                   (GMPLS TE)
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity pre-planned-lsp-flag {
+      base lsp-attributes-flags;
+      description
+        "Indicates that the LSP MUST be provisioned in the
+         control plane only.";
+      reference
+        "RFC 6001: Generalized MPLS (GMPLS) Protocol Extensions for
+                   Multi-Layer and Multi-Region Networks (MLN/MRN)
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity non-php-behavior-flag {
+      base lsp-attributes-flags;
+      description
+        "Indicates that non-PHP (non-Penultimate Hop Popping)
+         behavior for the LSP is desired.";
+      reference
+        "RFC 6511: Non-Penultimate Hop Popping Behavior and
+                   Out-of-Band Mapping for RSVP-TE Label Switched
+                   Paths
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity oob-mapping-flag {
+      base lsp-attributes-flags;
+      description
+        "Indicates that signaling of the egress binding information
+         is out of band (e.g., via the Border Gateway Protocol
+         (BGP)).";
+      reference
+        "RFC 6511: Non-Penultimate Hop Popping Behavior and
+                   Out-of-Band Mapping for RSVP-TE Label Switched
+                   Paths
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity entropy-label-capability {
+      base lsp-attributes-flags;
+      description
+        "Indicates entropy label capability.";
+      reference
+        "RFC 6790: The Use of Entropy Labels in MPLS Forwarding
+         RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)";
+    }
+
+    identity oam-mep-entity-desired {
+      base lsp-attributes-flags;
+      description
+        "OAM Maintenance Entity Group End Point (MEP) entities
+         desired.";
+      reference
+        "RFC 7260: GMPLS RSVP-TE Extensions for Operations,
+                   Administration, and Maintenance (OAM)
+                   Configuration";
+    }
+
+    identity oam-mip-entity-desired {
+      base lsp-attributes-flags;
+      description
+        "OAM Maintenance Entity Group Intermediate Points (MIP)
+         entities desired.";
+      reference
+        "RFC 7260: GMPLS RSVP-TE Extensions for Operations,
+                   Administration, and Maintenance (OAM)
+                   Configuration";
+    }
+
+    identity srlg-collection-desired {
+      base lsp-attributes-flags;
+      description
+        "SRLG collection desired.";
+      reference
+        "RFC 7570: Label Switched Path (LSP) Attribute in the
+                   Explicit Route Object (ERO)
+         RFC 8001: RSVP-TE Extensions for Collecting Shared Risk
+                   Link Group (SRLG) Information";
+    }
+
+    identity loopback-desired {
+      base lsp-attributes-flags;
+      description
+        "This flag indicates that a particular node on the LSP is
+         required to enter loopback mode.  This can also be
+         used to specify the loopback state of the node.";
+      reference
+        "RFC 7571: GMPLS RSVP-TE Extensions for Lock Instruct and
+                   Loopback";
+    }
+
+    identity p2mp-te-tree-eval-request {
+      base lsp-attributes-flags;
+      description
+        "P2MP-TE tree re-evaluation request.";
+      reference
+        "RFC 8149: RSVP Extensions for Reoptimization of Loosely
+                   Routed Point-to-Multipoint Traffic Engineering
+                   Label Switched Paths (LSPs)";
+    }
+
+    identity rtm-set-desired {
+      base lsp-attributes-flags;
+      description
+        "Residence Time Measurement (RTM) attribute flag requested.";
+      reference
+        "RFC 8169: Residence Time Measurement in MPLS Networks";
+    }
+
+  identity link-protection-type {
+    description
+      "Base identity for the link protection type.";
+  }
+
+    identity link-protection-unprotected {
+      base link-protection-type;
+      description
+        "Unprotected link type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity link-protection-extra-traffic {
+      base link-protection-type;
+      description
+        "Extra-Traffic protected link type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity link-protection-shared {
+      base link-protection-type;
+      description
+        "Shared protected link type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity link-protection-1-for-1 {
+      base link-protection-type;
+      description
+        "One-for-one (1:1) protected link type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity link-protection-1-plus-1 {
+      base link-protection-type;
+      description
+        "One-plus-one (1+1) protected link type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity link-protection-enhanced {
+      base link-protection-type;
+      description
+        "A compound link protection type derived from the underlay
+         TE tunnel protection configuration supporting the TE link.";
+    }
+
+  identity association-type {
+    description
+      "Base identity for the tunnel association.";
+  }
+
+    identity association-type-recovery {
+      base association-type;
+      description
+        "Association type for recovery, used to associate LSPs of the
+         same tunnel for recovery.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery
+         RFC 6780: RSVP ASSOCIATION Object Extensions";
+    }
+
+    identity association-type-resource-sharing {
+      base association-type;
+      description
+        "Association type for resource sharing, used to enable
+         resource sharing during make-before-break.";
+      reference
+        "RFC 4873: GMPLS Segment Recovery
+         RFC 6780: RSVP ASSOCIATION Object Extensions";
+    }
+
+    identity association-type-double-sided-bidir {
+      base association-type;
+      description
+        "Association type for double-sided bidirectional LSPs,
+         used to associate two LSPs of two tunnels that are
+         independently configured on either endpoint.";
+      reference
+        "RFC 7551: RSVP-TE Extensions for Associated Bidirectional
+                   Label Switched Paths (LSPs)";
+    }
+
+    identity association-type-single-sided-bidir {
+      base association-type;
+      description
+        "Association type for single-sided bidirectional LSPs,
+         used to associate two LSPs of two tunnels, where one
+         tunnel is configured on one side/endpoint and the other
+         tunnel is dynamically created on the other endpoint.";
+      reference
+        "RFC 6780: RSVP ASSOCIATION Object Extensions
+         RFC 7551: RSVP-TE Extensions for Associated Bidirectional
+                   Label Switched Paths (LSPs)";
+    }
+
+    identity association-type-diversity {
+      base association-type;
+      description
+        "Association Type diversity used to associate LSPs whose
+         paths are to be diverse from each other.";
+      reference
+        "RFC 8800: Path Computation Element Communication Protocol
+                   (PCEP) Extension for Label Switched Path (LSP)
+                   Diversity Constraint Signaling";
+    }
+
+  identity objective-function-type {
+    description
+      "Base identity for path objective function types.";
+  }
+
+    identity of-minimize-cost-path {
+      base objective-function-type;
+      description
+        "Objective function for minimizing path cost.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity of-minimize-load-path {
+      base objective-function-type;
+      description
+        "Objective function for minimizing the load on one or more
+         paths.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity of-maximize-residual-bandwidth {
+      base objective-function-type;
+      description
+        "Objective function for maximizing residual bandwidth.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity of-minimize-agg-bandwidth-consumption {
+      base objective-function-type;
+      status obsolete;
+      description
+        "Objective function for minimizing aggregate bandwidth
+         consumption.
+
+         This identity has been obsoleted: the
+         'svec-of-minimize-agg-bandwidth-consumption' identity SHOULD
+         be used instead.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity of-minimize-load-most-loaded-link {
+      base objective-function-type;
+      status obsolete;
+      description
+        "Objective function for minimizing the load on the link that
+         is carrying the highest load.
+
+         This identity has been obsoleted: the
+         'svec-of-minimize-load-most-loaded-link' identity SHOULD
+         be used instead.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity of-minimize-cost-path-set {
+      base objective-function-type;
+      status obsolete;
+      description
+        "Objective function for minimizing the cost on a path set.
+
+         This identity has been obsoleted: the
+         'svec-of-minimize-cost-path-set' identity SHOULD
+         be used instead.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+  identity path-computation-method {
+    description
+      "Base identity for supported path computation mechanisms.";
+  }
+
+    identity path-locally-computed {
+      base path-computation-method;
+      description
+        "Indicates a constrained-path LSP in which the
+         path is computed by the local LER.";
+      reference
+        "RFC 9522: Overview and Principles of Internet Traffic
+                   Engineering, Section 4.4";
+    }
+
+    identity path-externally-queried {
+      base path-computation-method;
+      description
+        "Constrained-path LSP in which the path is obtained by
+         querying an external source, such as a PCE server.
+         In the case that an LSP is defined to be externally queried,
+         it may also have associated explicit definitions (provided
+         to the external source to aid computation).  The path that
+         is returned by the external source may require further local
+         computation on the device.";
+      reference
+        "RFC 9522: Overview and Principles of Internet Traffic
+                   Engineering
+         RFC 4657: Path Computation Element (PCE) Communication
+                   Protocol Generic Requirements";
+    }
+
+    identity path-explicitly-defined {
+      base path-computation-method;
+      description
+        "Constrained-path LSP in which the path is
+         explicitly specified as a collection of strict and/or loose
+         hops.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+         RFC 9522: Overview and Principles of Internet Traffic
+                   Engineering";
+    }
+
+  identity lsp-metric-type {
+    description
+      "Base identity for the LSP metric specification types.";
+  }
+
+    identity lsp-metric-relative {
+      base lsp-metric-type;
+      description
+        "The metric specified for the LSPs to which this identity
+         refers is specified as a value relative to the IGP metric
+         cost to the LSP's tail end.";
+      reference
+        "RFC 4657: Path Computation Element (PCE) Communication
+                   Protocol Generic Requirements";
+    }
+
+    identity lsp-metric-absolute {
+      base lsp-metric-type;
+      description
+        "The metric specified for the LSPs to which this identity
+         refers is specified as an absolute value.";
+      reference
+        "RFC 4657: Path Computation Element (PCE) Communication
+                   Protocol Generic Requirements";
+    }
+
+    identity lsp-metric-inherited {
+      base lsp-metric-type;
+      description
+        "The metric for the LSPs to which this identity refers is
+         not specified explicitly; rather, it is directly inherited
+         from the IGP cost.";
+      reference
+        "RFC 4657: Path Computation Element (PCE) Communication
+                   Protocol Generic Requirements";
+    }
+
+  identity te-tunnel-type {
+    description
+      "Base identity from which specific tunnel types are derived.";
+  }
+
+    identity te-tunnel-p2p {
+      base te-tunnel-type;
+      description
+        "TE Point-to-Point (P2P) tunnel type.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
+    }
+
+    identity te-tunnel-p2mp {
+      base te-tunnel-type;
+      description
+        "TE P2MP tunnel type.";
+      reference
+        "RFC 4875: Extensions to Resource Reservation Protocol -
+                   Traffic Engineering (RSVP-TE) for
+                   Point-to-Multipoint TE Label Switched Paths
+                   (LSPs)";
+    }
+
+  identity tunnel-action-type {
+    description
+      "Base identity from which specific tunnel action types
+       are derived.";
+  }
+
+    identity tunnel-action-resetup {
+      base tunnel-action-type;
+      description
+        "TE tunnel action that tears down the tunnel's current LSP
+         (if any) and attempts to re-establish a new LSP.";
+    }
+
+    identity tunnel-action-reoptimize {
+      base tunnel-action-type;
+      description
+        "TE tunnel action that reoptimizes the placement of the
+         tunnel LSP(s).";
+    }
+
+    identity tunnel-action-switchpath {
+      base tunnel-action-type;
+      description
+        "TE tunnel action that switches the tunnel's LSP to use the
+         specified path.";
+    }
+
+  identity te-action-result {
+    description
+      "Base identity from which specific TE action results
+       are derived.";
+  }
+
+    identity te-action-success {
+      base te-action-result;
+      description
+        "TE action was successful.";
+    }
+
+    identity te-action-fail {
+      base te-action-result;
+      description
+        "TE action failed.";
+    }
+
+    identity tunnel-action-inprogress {
+      base te-action-result;
+      description
+        "TE action is in progress.";
+    }
+
+  identity tunnel-admin-state-type {
+    description
+      "Base identity for TE tunnel administrative states.";
+  }
+
+    identity tunnel-admin-state-up {
+      base tunnel-admin-state-type;
+      description
+        "Tunnel's administrative state is up.";
+    }
+
+    identity tunnel-admin-state-down {
+      base tunnel-admin-state-type;
+      description
+        "Tunnel's administrative state is down.";
+    }
+
+    identity tunnel-admin-state-auto {
+      base tunnel-admin-state-type;
+      description
+        "Tunnel administrative auto state. The administrative status
+         in state datastore transitions to 'tunnel-admin-up' when the
+         tunnel used by the client layer, and to 'tunnel-admin-down'
+         when it is not used by the client layer.";
+    }
+
+  identity tunnel-state-type {
+    description
+      "Base identity for TE tunnel states.";
+  }
+
+    identity tunnel-state-up {
+      base tunnel-state-type;
+      description
+        "Tunnel's state is up.";
+    }
+
+    identity tunnel-state-down {
+      base tunnel-state-type;
+      description
+        "Tunnel's state is down.";
+    }
+
+  identity lsp-state-type {
+    description
+      "Base identity for TE LSP states.";
+  }
+
+    identity lsp-path-computing {
+      base lsp-state-type;
+      description
+        "State path computation is in progress.";
+    }
+
+    identity lsp-path-computation-ok {
+      base lsp-state-type;
+      description
+        "State path computation was successful.";
+    }
+
+    identity lsp-path-computation-failed {
+      base lsp-state-type;
+      description
+        "State path computation failed.";
+    }
+
+    identity lsp-state-setting-up {
+      base lsp-state-type;
+      description
+        "State is being set up.";
+    }
+
+    identity lsp-state-setup-ok {
+      base lsp-state-type;
+      description
+        "State setup was successful.";
+    }
+
+    identity lsp-state-setup-failed {
+      base lsp-state-type;
+      description
+        "State setup failed.";
+    }
+
+    identity lsp-state-up {
+      base lsp-state-type;
+      description
+        "State is up.";
+    }
+
+    identity lsp-state-tearing-down {
+      base lsp-state-type;
+      description
+        "State is being torn down.";
+    }
+
+    identity lsp-state-down {
+      base lsp-state-type;
+      description
+        "State is down.";
+    }
+
+  identity path-invalidation-action-type {
+    description
+      "Base identity for TE path invalidation action types.";
+  }
+
+    identity path-invalidation-action-drop {
+      base path-invalidation-action-type;
+      description
+        "Upon invalidation of the TE tunnel path, the tunnel remains
+         valid, but any packet mapped over the tunnel is dropped.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                   Section 2.5";
+    }
+
+    identity path-invalidation-action-teardown {
+      base path-invalidation-action-type;
+      description
+        "TE path invalidation action teardown.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                   Section 2.5";
+    }
+
+  identity lsp-restoration-type {
+    description
+      "Base identity from which LSP restoration types are derived.";
+  }
+
+    identity lsp-restoration-restore-none {
+      base lsp-restoration-type;
+      description
+        "No LSP affected by a failure is restored.";
+    }
+
+    identity lsp-restoration-restore-any {
+      base lsp-restoration-type;
+      description
+        "Any LSP affected by a failure is restored.";
+    }
+
+    identity lsp-restoration-restore-all {
+      base lsp-restoration-type;
+      description
+        "Affected LSPs are restored after all LSPs of the tunnel are
+         broken.";
+    }
+
+  identity restoration-scheme-type {
+    description
+      "Base identity for LSP restoration schemes.";
+  }
+
+    identity restoration-scheme-rerouting {
+      base restoration-scheme-type;
+      description
+        "Restoration LSP is computed after the failure detection.
+
+         This restoration scheme is also known as
+         'Full LSP Re-routing.'";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity restoration-scheme-preconfigured {
+      base restoration-scheme-type;
+      description
+        "Restoration LSP is preconfigured prior to the failure.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                  Generalized Multi-Protocol Label Switching (GMPLS)
+                  Recovery";
+    }
+
+    identity restoration-scheme-precomputed {
+      base restoration-scheme-type;
+      description
+        "Restoration LSP is precomputed prior to the failure.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                  Generalized Multi-Protocol Label Switching (GMPLS)
+                  Recovery";
+    }
+
+    identity restoration-scheme-presignaled {
+      base restoration-scheme-type;
+      description
+        "Restoration LSP is presignaled prior to the failure.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                  Generalized Multi-Protocol Label Switching (GMPLS)
+                  Recovery";
+    }
+
+  identity lsp-protection-type {
+    description
+      "Base identity from which LSP protection types are derived.";
+    reference
+      "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                 Generalized Multi-Protocol Label Switching (GMPLS)
+                 Recovery";
+  }
+
+    identity lsp-protection-unprotected {
+      base lsp-protection-type;
+      description
+        "'Unprotected' LSP protection type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-reroute-extra {
+      base lsp-protection-type;
+      status obsolete;
+      description
+        "'(Full) Rerouting' LSP protection type.
+
+         This identity has been obsoleted: the
+         'restoration-scheme-rerouting' identity SHOULD be used
+         instead.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-reroute {
+      base lsp-protection-type;
+      status obsolete;
+      description
+        "'Rerouting without Extra-Traffic' LSP protection type.
+
+         This identity has been obsoleted: the
+         'restoration-scheme-rerouting' identity SHOULD be used
+         instead.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-1-for-n {
+      base lsp-protection-type;
+      description
+        "'1:N Protection with Extra-Traffic' LSP protection type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-1-for-1 {
+      base lsp-protection-type;
+      description
+        "LSP protection '1:1 Protection Type'.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-unidir-1-plus-1 {
+      base lsp-protection-type;
+      description
+        "'1+1 Unidirectional Protection' LSP protection type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-bidir-1-plus-1 {
+      base lsp-protection-type;
+      description
+        "'1+1 Bidirectional Protection' LSP protection type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+    identity lsp-protection-extra-traffic {
+      base lsp-protection-type;
+      description
+        "Extra-Traffic LSP protection type.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery";
+    }
+
+  identity lsp-protection-state {
+    description
+      "Base identity of protection states for reporting purposes.";
+  }
+
+    identity normal {
+      base lsp-protection-state;
+      description
+        "Normal state.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity signal-fail-of-protection {
+      base lsp-protection-state;
+      description
+        "The protection transport entity has a signal fail condition
+         that is of higher priority than the forced switchover
+         command.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity lockout-of-protection {
+      base lsp-protection-state;
+      description
+        "A Loss of Protection (LoP) command is active.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity forced-switch {
+      base lsp-protection-state;
+      description
+        "A forced switchover command is active.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity signal-fail {
+      base lsp-protection-state;
+      description
+        "There is a signal fail condition on either the working path
+         or the protection path.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity signal-degrade {
+      base lsp-protection-state;
+      description
+        "There is a signal degrade condition on either the working
+         path or the protection path.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity manual-switch {
+      base lsp-protection-state;
+      description
+        "A manual switchover command is active.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity wait-to-restore {
+      base lsp-protection-state;
+      description
+        "A Wait-to-Restore (WTR) timer is running.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity do-not-revert {
+      base lsp-protection-state;
+      description
+        "A Do Not Revert (DNR) condition is active because of
+         non-revertive behavior.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity failure-of-protocol {
+      base lsp-protection-state;
+      description
+        "LSP protection is not working because of a protocol failure
+         condition.";
+      reference
+        "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection
+                   to Match the Operational Expectations of
+                   Synchronous Digital Hierarchy, Optical Transport
+                   Network, and Ethernet Transport Network Operators
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+  identity protection-external-commands {
+    description
+      "Base identity from which protection-related external commands
+       used for troubleshooting purposes are derived.";
+  }
+
+    identity action-freeze {
+      base protection-external-commands;
+      description
+        "A temporary configuration action initiated by an operator
+         command that prevents any switchover action from being taken
+         and, as such, freezes the current state.";
+      reference
+        "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection
+                   to Match the Operational Expectations of
+                   Synchronous Digital Hierarchy, Optical Transport
+                   Network, and Ethernet Transport Network Operators
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity clear-freeze {
+      base protection-external-commands;
+      description
+        "An action that clears the active freeze state.";
+      reference
+        "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection
+                   to Match the Operational Expectations of
+                   Synchronous Digital Hierarchy, Optical Transport
+                   Network, and Ethernet Transport Network Operators
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity action-lockout-of-normal {
+      base protection-external-commands;
+      description
+        "A temporary configuration action initiated by an operator
+         command to ensure that the normal traffic is not allowed
+         to use the protection transport entity.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                  for Generalized Multi-Protocol Label Switching
+                  (GMPLS)";
+    }
+
+    identity clear-lockout-of-normal {
+      base protection-external-commands;
+      description
+        "An action that clears the active lockout of the
+         normal state.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                  for Generalized Multi-Protocol Label Switching
+                  (GMPLS)";
+    }
+
+    identity action-lockout-of-protection {
+      base protection-external-commands;
+      description
+        "A temporary configuration action initiated by an operator
+         command to ensure that the protection transport entity is
+         temporarily not available to transport a traffic signal
+         (either normal or Extra-Traffic).";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                  for Generalized Multi-Protocol Label Switching
+                  (GMPLS)";
+    }
+
+    identity action-forced-switch {
+      base protection-external-commands;
+      description
+        "A switchover action initiated by an operator command to
+         switch the Extra-Traffic signal, the normal traffic signal,
+         or the null signal to the protection transport entity,
+         unless a switchover command of equal or higher priority is
+         in effect.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                  for Generalized Multi-Protocol Label Switching
+                  (GMPLS)";
+    }
+
+    identity action-manual-switch {
+      base protection-external-commands;
+      description
+        "A switchover action initiated by an operator command to
+         switch the Extra-Traffic signal, the normal traffic signal,
+         or the null signal to the protection transport entity,
+         unless a fault condition exists on other transport entities
+         or a switchover command of equal or higher priority is in
+         effect.";
+      reference
+        "RFC 4872: RSVP-TE Extensions in Support of End-to-End
+                   Generalized Multi-Protocol Label Switching (GMPLS)
+                   Recovery
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                  for Generalized Multi-Protocol Label Switching
+                  (GMPLS)";
+    }
+
+    identity action-exercise {
+      base protection-external-commands;
+      description
+        "An action that starts testing whether or not Automatic 
+        Protection Switching (APS) communication is operating 
+        correctly.  It is of lower priority than any
+        other state or command.";
+      reference
+        "RFC 7271: MPLS Transport Profile (MPLS-TP) Linear Protection
+                   to Match the Operational Expectations of
+                   Synchronous Digital Hierarchy, Optical Transport
+                   Network, and Ethernet Transport Network Operators
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+    identity clear {
+      base protection-external-commands;
+      description
+        "An action that clears the active near-end lockout of a
+         protection, forced switchover, manual switchover,
+         Wait-to-Restore (WTR) state, or exercise command.";
+      reference
+        "RFC 6378: MPLS Transport Profile (MPLS-TP) Linear Protection
+         RFC 4427: Recovery (Protection and Restoration) Terminology
+                   for Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+
+  identity switching-capabilities {
+    description
+      "Base identity for interface switching capabilities.";
+    reference
+      "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                 Signaling Functional Description";
+  }
+
+    identity switching-psc1 {
+      base switching-capabilities;
+      description
+        "Packet-Switch Capable-1 (PSC-1).";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity switching-evpl {
+      base switching-capabilities;
+      description
+        "Ethernet Virtual Private Line (EVPL).";
+      reference
+        "RFC 6004: Generalized MPLS (GMPLS) Support for Metro
+                   Ethernet Forum and G.8011 Ethernet Service
+                   Switching";
+    }
+
+    identity switching-l2sc {
+      base switching-capabilities;
+      description
+        "Layer-2 Switch Capable (L2SC).";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity switching-tdm {
+      base switching-capabilities;
+      description
+        "Time-Division-Multiplex Capable (TDM).";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity switching-otn {
+      base switching-capabilities;
+      description
+        "OTN-TDM capable.";
+      reference
+        "RFC 7138: Traffic Engineering Extensions to OSPF for GMPLS
+                  Control of Evolving G.709 Optical Transport
+                  Networks";
+    }
+
+    identity switching-dcsc {
+      base switching-capabilities;
+      description
+        "Data Channel Switching Capable (DCSC).";
+      reference
+        "RFC 6002: Generalized MPLS (GMPLS) Data Channel
+                   Switching Capable (DCSC) and Channel Set Label
+                   Extensions";
+    }
+
+    identity switching-lsc {
+      base switching-capabilities;
+      description
+        "Lambda-Switch Capable (LSC).";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity switching-fsc {
+      base switching-capabilities;
+      description
+        "Fiber-Switch Capable (FSC).";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+  identity lsp-encoding-types {
+    description
+      "Base identity for encoding types.";
+    reference
+      "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                 Signaling Functional Description";
+  }
+
+    identity lsp-encoding-packet {
+      base lsp-encoding-types;
+      description
+        "Packet LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-ethernet {
+      base lsp-encoding-types;
+      description
+        "Ethernet LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-pdh {
+      base lsp-encoding-types;
+      description
+        "ANSI/ETSI PDH LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-sdh {
+      base lsp-encoding-types;
+      description
+        "SDH ITU-T G.707 / SONET ANSI T1.105 LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-digital-wrapper {
+      base lsp-encoding-types;
+      description
+        "Digital Wrapper LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-lambda {
+      base lsp-encoding-types;
+      description
+        "Lambda (photonic) LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-fiber {
+      base lsp-encoding-types;
+      description
+        "Fiber LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-fiber-channel {
+      base lsp-encoding-types;
+      description
+        "FiberChannel LSP encoding.";
+      reference
+        "RFC 3471: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Functional Description";
+    }
+
+    identity lsp-encoding-oduk {
+      base lsp-encoding-types;
+      description
+        "G.709 ODUk (Digital Path) LSP encoding.";
+      reference
+        "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Extensions for G.709 Optical Transport
+                   Networks Control";
+    }
+
+    identity lsp-encoding-optical-channel {
+      base lsp-encoding-types;
+      description
+        "G.709 Optical Channel LSP encoding.";
+      reference
+        "RFC 4328: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Signaling Extensions for G.709 Optical Transport
+                   Networks Control";
+    }
+
+    identity lsp-encoding-line {
+      base lsp-encoding-types;
+      description
+        "Line (e.g., 8B/10B) LSP encoding.";
+      reference
+        "RFC 6004: Generalized MPLS (GMPLS) Support for Metro
+                   Ethernet Forum and G.8011 Ethernet Service
+                   Switching";
+    }
+
+  identity path-signaling-type {
+    description
+      "Base identity from which specific LSP path setup types
+       are derived.";
+  }
+
+    identity path-setup-static {
+      base path-signaling-type;
+      description
+        "Static LSP provisioning path setup.";
+    }
+
+    identity path-setup-rsvp {
+      base path-signaling-type;
+      description
+        "RSVP-TE signaling path setup.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
+    }
+
+    identity path-setup-sr {
+      base path-signaling-type;
+      description
+        "Segment-routing path setup.";
+    }
+
+  identity path-scope-type {
+    description
+      "Base identity from which specific path scope types are
+       derived.";
+  }
+
+    identity path-scope-segment {
+      base path-scope-type;
+      description
+        "Path scope segment.";
+      reference
+        "RFC 4873: GMPLS Segment Recovery";
+    }
+
+    identity path-scope-end-to-end {
+      base path-scope-type;
+      description
+        "Path scope end to end.";
+      reference
+        "RFC 4873: GMPLS Segment Recovery";
+    }
+
+  identity route-usage-type {
+    description
+      "Base identity for route usage.";
+  }
+
+    identity route-include-object {
+      base route-usage-type;
+      description
+        "'Include route' object.";
+    }
+
+    identity route-exclude-object {
+      base route-usage-type;
+      description
+        "'Exclude route' object.";
+      reference
+        "RFC 4874: Exclude Routes - Extension to Resource ReserVation
+                   Protocol-Traffic Engineering (RSVP-TE)";
+    }
+
+    identity route-exclude-srlg {
+      base route-usage-type;
+      description
+        "Excludes SRLGs.";
+      reference
+        "RFC 4874: Exclude Routes - Extension to Resource ReserVation
+                   Protocol-Traffic Engineering (RSVP-TE)";
+    }
+
+  identity path-metric-optimization-type {
+    description
+      "Base identity used to define the path metric optimization
+       types.";
+  }
+
+  identity link-path-metric-type {
+    description
+      "Base identity used to define the link and the path metric
+       types.
+
+       The unit of the path metric value is interpreted in the
+       context of the path metric type and the derived identities
+       SHOULD describe the unit of the path metric types they
+       define.";
+  }
+
+    identity link-metric-type {
+      base link-path-metric-type;
+      description
+        "Base identity for the link metric types.";
+    }
+
+      identity link-metric-te {
+        base link-metric-type;
+        description
+          "Traffic Engineering (TE) Link Metric.";
+        reference
+          "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                     Version 2, Section 2.5.5
+           RFC 5305: IS-IS Extensions for Traffic Engineering,
+                     Section 3.7";
+      }
+
+      identity link-metric-igp {
+        base link-metric-type;
+        description
+          "Interior Gateway Protocol (IGP) Link Metric.";
+        reference
+          "RFC 3785: Use of Interior Gateway Protocol (IGP) Metric
+                     as a second MPLS Traffic Engineering (TE)
+                     Metric";
+      }
+
+      identity link-metric-delay-average {
+        base link-metric-type;
+        description
+          "Unidirectional Link Delay, measured in units of
+           microseconds.";
+        reference
+          "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                     Extensions, Section 4.1        
+           RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                     Extensions, Section 4.1";
+      }
+
+      identity link-metric-delay-minimum {
+        base link-metric-type;
+        description
+          "Minimum unidirectional Link Delay, measured in units of
+           microseconds.";
+        reference
+          "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                     Extensions, Section 4.2
+           RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                     Extensions, Section 4.2";
+      }
+
+      identity link-metric-delay-maximum {
+        base link-metric-type;
+        description
+          "Maximum unidirectional Link Delay, measured in units of
+           microseconds.";
+        reference
+          "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                     Extensions, Section 4.2
+           RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                     Extensions, Section 4.2";
+      }
+
+      identity link-metric-residual-bandwidth {
+        base link-metric-type;
+        description
+          "Unidirectional Residual Bandwidth, measured in units of
+           bytes per second.
+
+           It is defined to be Maximum Bandwidth minus the bandwidth
+           currently allocated to LSPs.";
+        reference
+          "RFC 7471: OSPF Traffic Engineering (TE) Metric
+                     Extensions, Section 4.5
+           RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                     Extensions, Section 4.5";
+      }
+
+    identity path-metric-type {
+      base link-path-metric-type;
+      base path-metric-optimization-type;
+      description
+        "Base identity for the path metric types.";
+    }
+
+      identity path-metric-te {
+        base path-metric-type;
+        description
+          "Traffic Engineering (TE) Path Metric.";
+        reference
+          "RFC 5440: Path Computation Element (PCE) Communication
+                     Protocol (PCEP), Section 7.8";
+      }
+
+      identity path-metric-igp {
+        base path-metric-type;
+        description
+          "Interior Gateway Protocol (IGP) Path Metric.";
+        reference
+          "RFC 5440: Path Computation Element (PCE) Communication
+                     Protocol (PCEP), section 7.8";
+      }
+
+      identity path-metric-hop {
+        base path-metric-type;
+        description
+          "Hop Count Path Metric.";
+        reference
+          "RFC 5440: Path Computation Element (PCE) Communication
+                     Protocol (PCEP), Section 7.8";
+      }
+
+      identity path-metric-delay-average {
+        base path-metric-type;
+        description
+          "The Path Delay Metric, measured in units of
+           microseconds.";
+        reference
+          "RFC8233: Extensions to the Path Computation Element
+                    Communication Protocol (PCEP) to Compute
+                    Service-Aware Label Switched Paths (LSPs),
+                    Section 3.1.1";
+      }
+
+      identity path-metric-delay-minimum {
+        base path-metric-type;
+        description
+          "The Path Min Delay Metric, measured in units of
+           microseconds.";
+        reference
+          "I-D.ietf-pce-sid-algo: Carrying SR-Algorithm information
+                                  in PCE-based Networks,
+                                  draft-ietf-pce-sid-algo-14,
+                                  Sections 3.5.1 and 3.5.2";
+      }
+
+      identity path-metric-residual-bandwidth {
+        base path-metric-type;
+        description
+          "The Path Residual Bandwidth, defined as the minimum Link
+           Residual Bandwidth all the links along the path.
+
+           The Path Residual Bandwidth can be seen as the path
+           metric associated with the Maximum residual Bandwidth Path
+           (MBP) objective function.";
+        reference
+          "RFC 5541: Encoding of Objective Functions in the Path
+                     Computation Element Communication Protocol
+                     (PCEP)";
+      }
+
+    identity path-metric-optimize-includes {
+      base path-metric-optimization-type;
+      description
+        "A metric that optimizes the number of included resources
+         specified in a set.";
+    }
+
+    identity path-metric-optimize-excludes {
+      base path-metric-optimization-type;
+      description
+        "A metric that optimizes to a maximum the number of excluded
+         resources specified in a set.";
+    }
+
+  identity path-tiebreaker-type {
+    description
+      "Base identity for the path tiebreaker type.";
+  }
+
+    identity path-tiebreaker-minfill {
+      base path-tiebreaker-type;
+      description
+        "Min-Fill LSP path placement: selects the path with the most
+         available bandwidth (load balance LSPs over more links).";
+    }
+
+    identity path-tiebreaker-maxfill {
+      base path-tiebreaker-type;
+      description
+        "Max-Fill LSP path placement: selects the path with the least
+         available bandwidth (packing more LSPs over few links).";
+    }
+
+    identity path-tiebreaker-random {
+      base path-tiebreaker-type;
+      description
+        "Random LSP path placement.";
+    }
+
+  identity resource-affinities-type {
+    description
+      "Base identity for resource class affinities.";
+    reference
+      "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+       RFC 2702: Requirements for Traffic Engineering Over MPLS";
+  }
+
+    identity resource-aff-include-all {
+      base resource-affinities-type;
+      description
+        "The set of attribute filters associated with a
+         tunnel, all of which must be present for a link
+         to be acceptable.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+         RFC 2702: Requirements for Traffic Engineering Over MPLS";
+    }
+
+    identity resource-aff-include-any {
+      base resource-affinities-type;
+      description
+        "The set of attribute filters associated with a
+         tunnel, any of which must be present for a link
+         to be acceptable.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+         RFC 2702: Requirements for Traffic Engineering Over MPLS";
+    }
+
+    identity resource-aff-exclude-any {
+      base resource-affinities-type;
+      description
+        "The set of attribute filters associated with a
+         tunnel, any of which renders a link unacceptable.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+         RFC 2702: Requirements for Traffic Engineering Over MPLS";
+    }
+
+  identity te-optimization-criterion {
+    description
+      "Base identity for the TE optimization criteria.";
+    reference
+      "RFC 9522: Overview and Principles of Internet Traffic
+                 Engineering";
+  }
+
+    identity not-optimized {
+      base te-optimization-criterion;
+      description
+        "Optimization is not applied.";
+    }
+
+    identity cost {
+      base te-optimization-criterion;
+      description
+        "Optimized on cost.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                    Computation Element Communication Protocol
+                    (PCEP)";
+    }
+
+    identity delay {
+      base te-optimization-criterion;
+      description
+        "Optimized on delay.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                    Computation Element Communication Protocol
+                    (PCEP)";
+    }
+
+  identity path-computation-srlg-type {
+    description
+      "Base identity for SRLG path computation.";
+  }
+
+    identity srlg-ignore {
+      base path-computation-srlg-type;
+      description
+        "Ignores SRLGs in the path computation.";
+    }
+
+    identity srlg-strict {
+      base path-computation-srlg-type;
+      description
+        "Includes a strict SRLG check in the path computation.";
+    }
+
+    identity srlg-preferred {
+      base path-computation-srlg-type;
+      description
+        "Includes a preferred SRLG check in the path computation.";
+    }
+
+    identity srlg-weighted {
+      base path-computation-srlg-type;
+      description
+        "Includes a weighted SRLG check in the path computation.";
+    }
+
+  identity path-computation-error-reason {
+    description
+      "Base identity for path computation error reasons.";
+  }
+
+    identity path-computation-error-path-not-found {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because of an unspecified 
+         reason.";
+      reference
+        "RFC 5440: Path Computation Element (PCE) Communication
+                   Protocol (PCEP), Section 7.5";
+    }
+
+    identity path-computation-error-no-topology {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because there is no topology
+         with the provided topology-identifier.";
+    }
+
+    identity path-computation-error-no-dependent-server {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because one or more dependent
+         path computation servers are unavailable.
+
+         The dependent path computation server could be
+         a Backward-Recursive Path Computation (BRPC) downstream
+         PCE or a child PCE.";
+      reference
+        "RFC 5441: A Backward-Recursive PCE-Based Computation (BRPC)
+                   Procedure to Compute Shortest Constrained
+                   Inter-Domain Traffic Engineering Label Switched
+                   Paths
+         RFC 8685: Path Computation Element Communication Protocol
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture";
+    }
+
+    identity path-computation-error-pce-unavailable {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because PCE is not available.
+
+         It corresponds to bit 31 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5440: Path Computation Element (PCE) Communication
+                   Protocol (PCEP)
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-no-inclusion-hop {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because there is no
+         node or link provided by one or more inclusion hops.";
+    }
+
+    identity path-computation-error-destination-unknown-in-domain {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because the destination node is
+         unknown in indicated destination domain.
+
+         It corresponds to bit 19 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-no-resource {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because there is no
+         available resource in one or more domains.
+
+         It corresponds to bit 20 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-child-pce-unresponsive {
+      base path-computation-error-no-dependent-server;
+      description
+        "Path computation has failed because child PCE is not
+         responsive.
+
+         It corresponds to bit 21 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-destination-domain-unknown {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because the destination domain
+         was unknown.
+
+         It corresponds to bit 22 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-p2mp {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because of P2MP reachability
+         problem.
+
+         It corresponds to bit 24 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 8306: Extensions to the Path Computation Element
+                   Communication Protocol (PCEP) for
+                   Point-to-Multipoint Traffic Engineering Label
+                   Switched Paths
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-no-gco-migration {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because of no Global Concurrent
+         Optimization (GCO) migration path found.
+
+         It corresponds to bit 26 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5557: Path Computation Element Communication Protocol
+                   (PCEP) Requirements and Protocol Extensions in
+                   Support of Global Concurrent Optimization
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-no-gco-solution {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because of no GCO solution
+         found.
+
+         It corresponds to bit 25 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5557: Path Computation Element Communication Protocol
+                   (PCEP) Requirements and Protocol Extensions in
+                   Support of Global Concurrent Optimization
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-pks-expansion {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because of Path-Key Subobject
+         (PKS)  expansion failure.
+
+         It corresponds to bit 27 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5520: Preserving Topology Confidentiality in
+                   Inter-Domain Path Computation Using a
+                   Path-Key-Based Mechanism
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-brpc-chain-unavailable {
+      base path-computation-error-no-dependent-server;
+      description
+        "Path computation has failed because PCE BRPC chain
+         unavailable.
+
+         It corresponds to bit 28 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5441: A Backward-Recursive PCE-Based Computation (BRPC)
+                   Procedure to Compute Shortest Constrained
+                   Inter-Domain Traffic Engineering Label Switched
+                   Paths
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-source-unknown {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because source node is 
+         unknown.
+
+         It corresponds to bit 29 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5440: Path Computation Element (PCE) Communication
+                   Protocol (PCEP);
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-destination-unknown {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because destination node is
+         unknown.
+
+         It corresponds to bit 30 of the Flags field of the 
+         NO-PATH-VECTOR TLV.";
+      reference
+        "RFC 5440: Path Computation Element (PCE) Communication
+        Protocol (PCEP);
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+    identity path-computation-error-no-server {
+      base path-computation-error-reason;
+      description
+        "Path computation has failed because path computation
+         server is unavailable.";
+      reference
+        "RFC 5440: Path Computation Element (PCE) Communication
+                   Protocol (PCEP);
+
+         https://www.iana.org/assignments/pcep
+         /pcep.xhtml#no-path-vector-tlv";
+    }
+
+  identity protocol-origin-type {
+    description
+      "Base identity for protocol origin type.";
+  }
+
+    identity protocol-origin-api {
+      base protocol-origin-type;
+      description
+        "Protocol origin is via Application Programming Interface
+         (API).";
+    }
+
+    identity protocol-origin-pcep {
+      base protocol-origin-type;
+      description
+        "Protocol origin is Path Computation Engine Protocol 
+         (PCEP).";
+      reference
+        "RFC 5440: Path Computation Element (PCE) Communication
+                   Protocol (PCEP)";
+    }
+
+    identity protocol-origin-bgp {
+      base protocol-origin-type;
+      description
+        "Protocol origin is Border Gateway Protocol (BGP).";
+      reference
+        "RFC 9012: The BGP Tunnel Encapsulation Attribute";
+    }
+
+  identity svec-objective-function-type {
+    description
+      "Base identity for SVEC objective function type.";
+    reference
+      "RFC 5541: Encoding of Objective Functions in the Path
+                 Computation Element Communication Protocol (PCEP)";
+  }
+
+    identity svec-of-minimize-agg-bandwidth-consumption {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing aggregate bandwidth 
+         consumption (MBC).";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-of-minimize-load-most-loaded-link {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing the load on the link that 
+         is carrying the highest load (MLL).";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-of-minimize-cost-path-set {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing the cost on a path set 
+         (MCC).";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-of-minimize-common-transit-domain {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing the number of common 
+         transit domains (MCTD).";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol 
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture.";
+    }
+
+    identity svec-of-minimize-shared-link {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing the number of shared 
+         links (MSL).";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol 
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture.";
+    }
+
+    identity svec-of-minimize-shared-srlg {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing the number of shared 
+         Shared Risk Link Groups (SRLG) (MSS).";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol 
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture.";
+    }
+
+    identity svec-of-minimize-shared-nodes {
+      base svec-objective-function-type;
+      description
+        "Objective function for minimizing the number of shared 
+         nodes (MSN).";
+      reference
+        "RFC 8685: Path Computation Element Communication Protocol
+                   (PCEP) Extensions for the Hierarchical Path
+                   Computation Element (H-PCE) Architecture.";
+    }
+
+  identity svec-metric-type {
+    description
+      "Base identity for SVEC metric type.";
+    reference
+      "RFC 5541: Encoding of Objective Functions in the Path
+                 Computation Element Communication Protocol (PCEP)";
+  }
+
+    identity svec-metric-cumulative-te {
+      base svec-metric-type;
+      description
+        "Cumulative TE cost.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-metric-cumulative-igp {
+      base svec-metric-type;
+      description
+        "Cumulative IGP cost.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-metric-cumulative-hop {
+      base svec-metric-type;
+      description
+        "Cumulative Hop path metric.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-metric-aggregate-bandwidth-consumption {
+      base svec-metric-type;
+      description
+        "Aggregate bandwidth consumption.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+    identity svec-metric-load-of-the-most-loaded-link {
+      base svec-metric-type;
+      description
+        "Load of the most loaded link.";
+      reference
+        "RFC 5541: Encoding of Objective Functions in the Path
+                   Computation Element Communication Protocol
+                   (PCEP)";
+    }
+
+  /**
+   * TE bandwidth groupings
+   **/
+
+  grouping te-bandwidth {
+    description
+      "This grouping defines the generic TE bandwidth.
+       For some known data-plane technologies, specific modeling
+       structures are specified.  The string-encoded 'te-bandwidth'
+       type is used for unspecified technologies.
+       The modeling structure can be augmented later for other
+       technologies.";
+    container te-bandwidth {
+      description
+        "Container that specifies TE bandwidth.  The choices
+         can be augmented for specific data-plane technologies.";
+      choice technology {
+        default "generic";
+        description
+          "Data-plane technology type.";
+        case generic {
+          leaf generic {
+            type te-bandwidth;
+            description
+              "Bandwidth specified in a generic format.";
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * TE label groupings
+   **/
+
+  grouping te-label {
+    description
+      "This grouping defines the generic TE label.
+       The modeling structure can be augmented for each technology.
+       For unspecified technologies, 'rt-types:generalized-label'
+       is used.";
+    container te-label {
+      description
+        "Container that specifies the TE label.  The choices can
+         be augmented for specific data-plane technologies.";
+      choice technology {
+        default "generic";
+        description
+          "Data-plane technology type.";
+        case generic {
+          leaf generic {
+            type rt-types:generalized-label;
+            description
+              "TE label specified in a generic format.";
+          }
+        }
+      }
+      leaf direction {
+        type te-label-direction;
+        default "forward";
+        description
+          "Label direction.";
+      }
+    }
+  }
+
+  grouping te-topology-identifier {
+    description
+      "Augmentation for a TE topology.";
+    container te-topology-identifier {
+      description
+        "TE topology identifier container.";
+      leaf provider-id {
+        type te-global-id;
+        default "0";
+        description
+          "An identifier to uniquely identify a provider.
+           If omitted, it assumes that the topology provider ID
+           value = 0 (the default).";
+      }
+      leaf client-id {
+        type te-global-id;
+        default "0";
+        description
+          "An identifier to uniquely identify a client.
+           If omitted, it assumes that the topology client ID
+           value = 0 (the default).";
+      }
+      leaf topology-id {
+        type te-topology-id;
+        default "";
+        description
+          "When the datastore contains several topologies,
+           'topology-id' distinguishes between them.  If omitted,
+           the default (empty) string for this leaf is assumed.";
+      }
+    }
+  }
+
+  /**
+   * TE performance metrics groupings
+   **/
+
+  grouping performance-metrics-one-way-delay-loss {
+    description
+      "Performance Metrics (PM) information in real time that can
+       be applicable to links or connections.  PM defined in this
+       grouping are applicable to generic TE PM as well as packet TE
+       PM.";
+    reference
+      "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+       RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions
+       RFC 7823: Performance-Based Path Selection for Explicitly
+                 Routed Label Switched Paths (LSPs) Using TE Metric
+                 Extensions";
+    leaf one-way-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      description
+        "One-way delay or latency in microseconds.";
+    }
+    leaf one-way-delay-normality {
+      type te-types:performance-metrics-normality;
+      description
+        "One-way delay normality.";
+    }
+  }
+
+  grouping performance-metrics-two-way-delay-loss {
+    description
+      "PM information in real time that can be applicable to links or
+       connections.  PM defined in this grouping are applicable to
+       generic TE PM as well as packet TE PM.";
+    reference
+      "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+       RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions
+       RFC 7823: Performance-Based Path Selection for Explicitly
+                 Routed Label Switched Paths (LSPs) Using TE Metric
+                 Extensions";
+    leaf two-way-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      description
+        "Two-way delay or latency in microseconds.";
+    }
+    leaf two-way-delay-normality {
+      type te-types:performance-metrics-normality;
+      description
+        "Two-way delay normality.";
+    }
+  }
+
+  grouping performance-metrics-one-way-bandwidth {
+    description
+      "PM information in real time that can be applicable to links.
+       PM defined in this grouping are applicable to generic TE PM
+       as well as packet TE PM.";
+    reference
+      "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+       RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions
+       RFC 7823: Performance-Based Path Selection for Explicitly
+                 Routed Label Switched Paths (LSPs) Using TE Metric
+                 Extensions";
+    leaf one-way-residual-bandwidth {
+      type rt-types:bandwidth-ieee-float32;
+      units "bytes per second";
+      default "0x0p0";
+      description
+        "Residual bandwidth that subtracts tunnel reservations from
+         Maximum Bandwidth (or link capacity) (RFC 3630) and
+         provides an aggregated remainder across QoS classes.";
+      reference
+        "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                   Version 2";
+    }
+    leaf one-way-residual-bandwidth-normality {
+      type te-types:performance-metrics-normality;
+      default "normal";
+      description
+        "Residual bandwidth normality.";
+    }
+    leaf one-way-available-bandwidth {
+      type rt-types:bandwidth-ieee-float32;
+      units "bytes per second";
+      default "0x0p0";
+      description
+        "Available bandwidth that is defined to be residual
+         bandwidth minus the measured bandwidth used for the
+         actual forwarding of non-RSVP-TE LSP packets.  For a
+         bundled link, available bandwidth is defined to be the
+         sum of the component link available bandwidths.";
+    }
+    leaf one-way-available-bandwidth-normality {
+      type te-types:performance-metrics-normality;
+      default "normal";
+      description
+        "Available bandwidth normality.";
+    }
+    leaf one-way-utilized-bandwidth {
+      type rt-types:bandwidth-ieee-float32;
+      units "bytes per second";
+      default "0x0p0";
+      description
+        "Bandwidth utilization that represents the actual
+         utilization of the link (i.e., as measured in the router).
+         For a bundled link, bandwidth utilization is defined to
+         be the sum of the component link bandwidth utilizations.";
+    }
+    leaf one-way-utilized-bandwidth-normality {
+      type te-types:performance-metrics-normality;
+      default "normal";
+      description
+        "Bandwidth utilization normality.";
+    }
+  }
+
+  grouping one-way-performance-metrics {
+    description
+      "One-way PM throttle grouping.";
+    leaf one-way-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "One-way delay or latency in microseconds.";
+    }
+    leaf one-way-residual-bandwidth {
+      type rt-types:bandwidth-ieee-float32;
+      units "bytes per second";
+      default "0x0p0";
+      description
+        "Residual bandwidth that subtracts tunnel reservations from
+         Maximum Bandwidth (or link capacity) (RFC 3630) and
+         provides an aggregated remainder across QoS classes.";
+      reference
+        "RFC 3630: Traffic Engineering (TE) Extensions to OSPF
+                   Version 2";
+    }
+    leaf one-way-available-bandwidth {
+      type rt-types:bandwidth-ieee-float32;
+      units "bytes per second";
+      default "0x0p0";
+      description
+        "Available bandwidth that is defined to be residual
+         bandwidth minus the measured bandwidth used for the
+         actual forwarding of non-RSVP-TE LSP packets.  For a
+         bundled link, available bandwidth is defined to be the
+         sum of the component link available bandwidths.";
+    }
+    leaf one-way-utilized-bandwidth {
+      type rt-types:bandwidth-ieee-float32;
+      units "bytes per second";
+      default "0x0p0";
+      description
+        "Bandwidth utilization that represents the actual
+         utilization of the link (i.e., as measured in the router).
+         For a bundled link, bandwidth utilization is defined to
+         be the sum of the component link bandwidth utilizations.";
+    }
+  }
+
+  grouping two-way-performance-metrics {
+    description
+      "Two-way PM throttle grouping.";
+    leaf two-way-delay {
+      type uint32 {
+        range "0..16777215";
+      }
+      default "0";
+      description
+        "Two-way delay or latency in microseconds.";
+    }
+  }
+
+  grouping performance-metrics-thresholds {
+    description
+      "Grouping for configurable thresholds for measured
+       attributes.";
+    uses one-way-performance-metrics;
+    uses two-way-performance-metrics;
+  }
+
+  grouping performance-metrics-attributes {
+    description
+      "Contains PM attributes.";
+    container performance-metrics-one-way {
+      description
+        "One-way link performance information in real time.";
+      reference
+        "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+         RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions
+         RFC 7823: Performance-Based Path Selection for Explicitly
+                   Routed Label Switched Paths (LSPs) Using TE Metric
+                   Extensions";
+      uses performance-metrics-one-way-delay-loss;
+      uses performance-metrics-one-way-bandwidth;
+    }
+    container performance-metrics-two-way {
+      description
+        "Two-way link performance information in real time.";
+      reference
+        "RFC 6374: Packet Loss and Delay Measurement for MPLS
+                   Networks";
+      uses performance-metrics-two-way-delay-loss;
+    }
+  }
+
+  grouping performance-metrics-throttle-container {
+    description
+      "Controls PM throttling.";
+    container throttle {
+      must 'suppression-interval >= measure-interval' {
+        error-message "'suppression-interval' cannot be less than "
+                    + "'measure-interval'.";
+        description
+          "Constraint on 'suppression-interval' and
+           'measure-interval'.";
+      }
+      description
+        "Link performance information in real time.";
+      reference
+        "RFC 7471: OSPF Traffic Engineering (TE) Metric Extensions
+         RFC 8570: IS-IS Traffic Engineering (TE) Metric Extensions
+         RFC 7823: Performance-Based Path Selection for Explicitly
+                   Routed Label Switched Paths (LSPs) Using TE Metric
+                   Extensions";
+      leaf one-way-delay-offset {
+        type uint32 {
+          range "0..16777215";
+        }
+        default "0";
+        description
+          "Offset value to be added to the measured delay value.";
+      }
+      leaf measure-interval {
+        type uint32;
+        default "30";
+        description
+          "Interval, in seconds, to measure the extended metric
+           values.";
+      }
+      leaf advertisement-interval {
+        type uint32;
+        default "0";
+        description
+          "Interval, in seconds, to advertise the extended metric
+           values.";
+      }
+      leaf suppression-interval {
+        type uint32 {
+          range "1..max";
+        }
+        default "120";
+        description
+          "Interval, in seconds, to suppress advertisement of the
+           extended metric values.";
+        reference
+          "RFC 8570: IS-IS Traffic Engineering (TE) Metric
+                     Extensions, Section 6";
+      }
+      container threshold-out {
+        uses performance-metrics-thresholds;
+        description
+          "If the measured parameter falls outside an upper bound
+           for all but the minimum-delay metric (or a lower bound
+           for the minimum-delay metric only) and the advertised
+           value is not already outside that bound, an 'anomalous'
+           announcement (anomalous bit set) will be triggered.";
+      }
+      container threshold-in {
+        uses performance-metrics-thresholds;
+        description
+          "If the measured parameter falls inside an upper bound
+           for all but the minimum-delay metric (or a lower bound
+           for the minimum-delay metric only) and the advertised
+           value is not already inside that bound, a 'normal'
+           announcement (anomalous bit cleared) will be triggered.";
+      }
+      container threshold-accelerated-advertisement {
+        description
+          "When the difference between the last advertised value and
+           the current measured value exceeds this threshold, an
+           'anomalous' announcement (anomalous bit set) will be
+           triggered.";
+        uses performance-metrics-thresholds;
+      }
+    }
+  }
+
+  /**
+   * TE tunnel generic groupings
+   **/
+
+  grouping explicit-route-hop {
+    description
+      "The explicit route entry grouping.";
+    choice type {
+      description
+        "The explicit route entry type.";
+      case numbered-node-hop {
+        container numbered-node-hop {
+          must "node-id-uri or node-id" {
+            description
+              "At least one node identifier MUST be present.";
+          }
+          leaf node-id-uri {
+            type nw:node-id;
+            description
+              "The identifier of a node in the topology.";
+          }
+          leaf node-id {
+            type te-node-id;
+            description
+              "The identifier of a node in the TE topology.";
+          }
+          leaf hop-type {
+            type te-hop-type;
+            default "strict";
+            description
+              "Strict or loose hop.";
+          }
+          description
+            "Numbered node route hop.";
+          reference
+            "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                       Section 4.3, EXPLICIT_ROUTE in RSVP-TE
+             RFC 3477: Signalling Unnumbered Links in Resource
+                       ReSerVation Protocol - Traffic Engineering
+                       (RSVP-TE)";
+        }
+      }
+      case numbered-link-hop {
+        container numbered-link-hop {
+          leaf link-tp-id {
+            type te-tp-id;
+            mandatory true;
+            description
+              "TE Link Termination Point (LTP) identifier.";
+          }
+          leaf hop-type {
+            type te-hop-type;
+            default "strict";
+            description
+              "Strict or loose hop.";
+          }
+          leaf direction {
+            type te-link-direction;
+            default "outgoing";
+            description
+              "Link route object direction.";
+          }
+          description
+            "Numbered link explicit route hop.";
+          reference
+            "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                       Section 4.3, EXPLICIT_ROUTE in RSVP-TE
+             RFC 3477: Signalling Unnumbered Links in Resource
+                       ReSerVation Protocol - Traffic Engineering
+                       (RSVP-TE)";
+        }
+      }
+      case unnumbered-link-hop {
+        container unnumbered-link-hop {
+          must "(link-tp-id-uri or link-tp-id) and " +
+                "(node-id-uri or node-id)" {
+            description
+              "At least one node identifier and at least one Link 
+              Termination Point (LTP) identifier MUST be present.";
+          }
+          leaf link-tp-id-uri {
+            type nt:tp-id;
+            description
+              "Link Termination Point (LTP) identifier.";
+          }
+          leaf link-tp-id {
+            type te-tp-id;
+            description
+              "TE LTP identifier.  The combination of the TE link ID
+               and the TE node ID is used to identify an unnumbered
+               TE link.";
+          }
+          leaf node-id-uri {
+            type nw:node-id;
+            description
+              "The identifier of a node in the topology.";
+          }
+          leaf node-id {
+            type te-node-id;
+            description
+              "The identifier of a node in the TE topology.";
+          }
+          leaf hop-type {
+            type te-hop-type;
+            default "strict";
+            description
+              "Strict or loose hop.";
+          }
+          leaf direction {
+            type te-link-direction;
+            default "outgoing";
+            description
+              "Link route object direction.";
+          }
+          description
+            "Unnumbered link explicit route hop.";
+          reference
+            "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels,
+                       Section 4.3, EXPLICIT_ROUTE in RSVP-TE
+             RFC 3477: Signalling Unnumbered Links in Resource
+                       ReSerVation Protocol - Traffic Engineering
+                       (RSVP-TE)";
+        }
+      }
+      case as-number {
+        container as-number-hop {
+          leaf as-number {
+            type inet:as-number;
+            mandatory true;
+            description
+              "The Autonomous System (AS) number.";
+          }
+          leaf hop-type {
+            type te-hop-type;
+            default "strict";
+            description
+              "Strict or loose hop.";
+          }
+          description
+            "AS explicit route hop.";
+        }
+      }
+      case label {
+        container label-hop {
+          description
+            "Label hop type.";
+          uses te-label;
+        }
+        description
+          "The label explicit route hop type.";
+      }
+    }
+  }
+
+  grouping record-route-state {
+    description
+      "The Record Route grouping.";
+    leaf index {
+      type uint32;
+      description
+        "Record Route hop index.  The index is used to
+         identify an entry in the list.  The order of entries
+         is defined by the user without relying on key values.";
+    }
+    choice type {
+      description
+        "The Record Route entry type.";
+      case numbered-node-hop {
+        container numbered-node-hop {
+          must "node-id-uri or node-id" {
+            description
+              "At least one node identifier MUST be present.";
+          }
+          description
+            "Numbered node route hop container.";
+          leaf node-id-uri {
+            type nw:node-id;
+            description
+              "The identifier of a node in the topology.";
+          }
+          leaf node-id {
+            type te-node-id;
+            description
+              "The identifier of a node in the TE topology.";
+          }
+          leaf-list flags {
+            type path-attribute-flags;
+            description
+              "Path attributes flags.";
+            reference
+              "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+               RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP
+                         Tunnels
+               RFC 4561: Definition of a Record Route Object (RRO)
+                         Node-Id Sub-Object";
+          }
+        }
+        description
+          "Numbered node route hop.";
+      }
+      case numbered-link-hop {
+        container numbered-link-hop {
+          description
+            "Numbered link route hop container.";
+          leaf link-tp-id {
+            type te-tp-id;
+            mandatory true;
+            description
+              "Numbered TE LTP identifier.";
+          }
+          leaf-list flags {
+            type path-attribute-flags;
+            description
+              "Path attributes flags.";
+            reference
+              "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+               RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP
+                         Tunnels
+               RFC 4561: Definition of a Record Route Object (RRO)
+                         Node-Id Sub-Object";
+          }
+        }
+        description
+          "Numbered link route hop.";
+      }
+      case unnumbered-link-hop {
+        container unnumbered-link-hop {
+          must "(link-tp-id-uri or link-tp-id) and " +
+              "(node-id-uri or node-id)" {
+            description
+              "At least one node identifier and at least one Link 
+              Termination Point (LTP) identifier MUST be present.";
+          }
+          leaf link-tp-id-uri {
+            type nt:tp-id;
+            description
+              "Link Termination Point (LTP) identifier.";
+          }
+          leaf link-tp-id {
+            type te-tp-id;
+            description
+              "TE LTP identifier.  The combination of the TE link ID
+               and the TE node ID is used to identify an unnumbered
+               TE link.";
+          }
+          leaf node-id-uri {
+            type nw:node-id;
+            description
+              "The identifier of a node in the topology.";
+          }
+          leaf node-id {
+            type te-node-id;
+            description
+              "The identifier of a node in the TE topology.";
+          }
+          leaf-list flags {
+            type path-attribute-flags;
+            description
+              "Path attributes flags.";
+            reference
+              "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+               RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP
+                         Tunnels
+               RFC 4561: Definition of a Record Route Object (RRO)
+                         Node-Id Sub-Object";
+          }
+          description
+            "Unnumbered link Record Route hop.";
+          reference
+            "RFC 3477: Signalling Unnumbered Links in Resource
+                       ReSerVation Protocol - Traffic Engineering
+                       (RSVP-TE)";
+        }
+        description
+          "Unnumbered link route hop.";
+      }
+      case label {
+        container label-hop {
+          description
+            "Label route hop type.";
+          uses te-label;
+          leaf-list flags {
+            type path-attribute-flags;
+            description
+              "Path attributes flags.";
+            reference
+              "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels
+               RFC 4090: Fast Reroute Extensions to RSVP-TE for LSP
+                         Tunnels
+               RFC 4561: Definition of a Record Route Object (RRO)
+                         Node-Id Sub-Object";
+          }
+        }
+        description
+          "The label Record Route entry types.";
+      }
+    }
+  }
+
+  grouping label-restriction-info {
+    description
+      "Label set item information.";
+    leaf restriction {
+      type enumeration {
+        enum inclusive {
+          description
+            "The label or label range is inclusive.";
+        }
+        enum exclusive {
+          description
+            "The label or label range is exclusive.";
+        }
+      }
+      default "inclusive";
+      description
+        "Indicates whether the list item is inclusive or exclusive.";
+    }
+    leaf index {
+      type uint32;
+      description
+        "The index of the label restriction list entry.";
+    }
+    container label-start {
+      must "(not(../label-end/te-label/direction) and"
+         + " not(te-label/direction))"
+         + " or "
+         + "(../label-end/te-label/direction = te-label/direction)"
+         + " or "
+         + "(not(te-label/direction) and"
+         + " (../label-end/te-label/direction = 'forward'))"
+         + " or "
+         + "(not(../label-end/te-label/direction) and"
+         + " (te-label/direction = 'forward'))" {
+        error-message "'label-start' and 'label-end' must have the "
+                    + "same direction.";
+      }
+      description
+        "This is the starting label if a label range is specified.
+         This is the label value if a single label is specified,
+         in which case the 'label-end' attribute is not set.";
+      uses te-label;
+    }
+    container label-end {
+      must "(not(../label-start/te-label/direction) and"
+         + " not(te-label/direction))"
+         + " or "
+         + "(../label-start/te-label/direction = te-label/direction)"
+         + " or "
+         + "(not(te-label/direction) and"
+         + " (../label-start/te-label/direction = 'forward'))"
+         + " or "
+         + "(not(../label-start/te-label/direction) and"
+         + " (te-label/direction = 'forward'))" {
+        error-message "'label-start' and 'label-end' must have the "
+                    + "same direction.";
+      }
+      description
+        "This is the ending label if a label range is specified.
+         This attribute is not set if a single label is specified.";
+      uses te-label;
+    }
+    container label-step {
+      description
+        "The step increment between labels in the label range.
+         The label start/end values will have to be consistent
+         with the sign of label step.  For example,
+         'label-start' < 'label-end' enforces 'label-step' > 0
+         'label-start' > 'label-end' enforces 'label-step' < 0.";
+      choice technology {
+        default "generic";
+        description
+          "Data-plane technology type.";
+        case generic {
+          leaf generic {
+            type int32;
+            default "1";
+            description
+              "Label range step.";
+          }
+        }
+      }
+    }
+    leaf range-bitmap {
+      type yang:hex-string;
+      description
+        "When there are gaps between 'label-start' and 'label-end',
+         this attribute is used to specify the positions
+         of the used labels.  This is represented in big endian as
+         'hex-string'.
+
+         In case the restriction is 'inclusive', the bit-position is
+         set if the corresponding mapped label is available.
+         In this case, if the range-bitmap is not present, all the
+         labels in the range are available.
+
+         In case the restriction is 'exclusive', the bit-position is
+         set if the corresponding mapped label is not available.
+         In this case, if the range-bitmap is not present, all the
+         labels in the range are not available.
+
+         The most significant byte in the hex-string is the farthest
+         to the left in the byte sequence.  Leading zero bytes in the
+         configured value may be omitted for brevity.
+         Each bit position in the 'range-bitmap' 'hex-string' maps
+         to a label in the range derived from 'label-start'.
+
+         For example, assuming that 'label-start' = 16000 and
+         'range-bitmap' = 0x01000001, then:
+
+         - bit position (0) is set, and the corresponding mapped
+           label from the range is 16000 + (0 * 'label-step') or
+           16000 for default 'label-step' = 1.
+         - bit position (24) is set, and the corresponding mapped
+           label from the range is 16000 + (24 * 'label-step') or
+           16024 for default 'label-step' = 1.";
+    }
+  }
+
+  grouping label-set-info {
+    description
+      "Grouping for the list of label restrictions specifying what
+       labels may or may not be used.";
+    container label-restrictions {
+      description
+        "The label restrictions container.";
+      list label-restriction {
+        key "index";
+        description
+          "The absence of the label restrictions container implies
+           that all labels are acceptable; otherwise, only restricted
+           labels are available.";
+        reference
+          "RFC 7579: General Network Element Constraint Encoding
+                     for GMPLS-Controlled Networks";
+        uses label-restriction-info;
+      }
+    }
+  }
+
+  grouping optimization-metric-entry {
+    description
+      "Optimization metrics configuration grouping.";
+    leaf metric-type {
+      type identityref {
+        base path-metric-optimization-type;
+      }
+      description
+        "Identifies the 'metric-type' that the path computation
+         process uses for optimization.";
+    }
+    leaf weight {
+      type uint8;
+      default "1";
+      description
+        "TE path metric normalization weight.";
+    }
+    container explicit-route-exclude-objects {
+      when "../metric-type = "
+         + "'te-types:path-metric-optimize-excludes'";
+      description
+        "Container for the 'exclude route' object list.";
+      uses path-route-exclude-objects;
+    }
+    container explicit-route-include-objects {
+      when "../metric-type = "
+         + "'te-types:path-metric-optimize-includes'";
+      description
+        "Container for the 'include route' object list.";
+      uses path-route-include-objects;
+    }
+  }
+
+  grouping common-constraints {
+    description
+      "Common constraints grouping that can be set on
+       a constraint set or directly on the tunnel.";
+    uses te-bandwidth {
+      description
+        "A requested bandwidth to use for path computation.";
+    }
+    leaf link-protection {
+      type identityref {
+        base link-protection-type;
+      }
+      default "te-types:link-protection-unprotected";
+      description
+        "Link protection type required for the links included
+         in the computed path.";
+      reference
+        "RFC 4202: Routing Extensions in Support of
+                   Generalized Multi-Protocol Label Switching
+                   (GMPLS)";
+    }
+    leaf setup-priority {
+      type uint8 {
+        range "0..7";
+      }
+      default "7";
+      description
+        "TE LSP requested setup priority.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
+    }
+    leaf hold-priority {
+      type uint8 {
+        range "0..7";
+      }
+      default "7";
+      description
+        "TE LSP requested hold priority.";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
+    }
+    leaf signaling-type {
+      type identityref {
+        base path-signaling-type;
+      }
+      default "te-types:path-setup-rsvp";
+      description
+        "TE tunnel path signaling type.";
+    }
+  }
+
+  grouping tunnel-constraints {
+    description
+      "Tunnel constraints grouping that can be set on
+       a constraint set or directly on the tunnel.";
+    leaf network-id {
+      type nw:network-id;
+      description
+        "The network topology identifier.";
+    }
+    uses te-topology-identifier;
+    uses common-constraints;
+  }
+
+  grouping path-constraints-route-objects {
+    description
+      "List of route entries to be included or excluded when
+       performing the path computation.";
+    container explicit-route-objects {
+      description
+        "Container for the explicit route object lists.";
+      list route-object-exclude-always {
+        key "index";
+        ordered-by user;
+        description
+          "List of route objects to always exclude from the path
+           computation.";
+        leaf index {
+          type uint32;
+          description
+            "Explicit Route Object index.  The index is used to
+             identify an entry in the list.  The order of entries
+             is defined by the user without relying on key values.";
+        }
+        uses explicit-route-hop;
+      }
+      list route-object-include-exclude {
+        key "index";
+        ordered-by user;
+        description
+          "List of route objects to include or exclude in the path
+           computation.";
+        leaf explicit-route-usage {
+          type identityref {
+            base route-usage-type;
+          }
+          default "te-types:route-include-object";
+          description
+            "Indicates whether to include or exclude the
+             route object.  The default is to include it.";
+        }
+        leaf index {
+          type uint32;
+          description
+            "Route object include-exclude index.  The index is used
+             to identify an entry in the list.  The order of entries
+             is defined by the user without relying on key values.";
+        }
+        uses explicit-route-hop {
+          augment "type" {
+            case srlg {
+              container srlg {
+                description
+                  "SRLG container.";
+                leaf srlg {
+                  type uint32;
+                  description
+                    "SRLG value.";
+                }
+              }
+              description
+                "An SRLG value to be included or excluded.";
+            }
+            description
+              "Augmentation for a generic explicit route for SRLG
+               exclusion.";
+          }
+        }
+      }
+    }
+  }
+
+  grouping path-route-include-objects {
+    description
+      "List of route objects to be included when performing
+       the path computation.";
+    list route-object-include-object {
+      key "index";
+      ordered-by user;
+      description
+        "List of Explicit Route Objects to be included in the
+         path computation.";
+      leaf index {
+        type uint32;
+        description
+          "Route object entry index.  The index is used to
+           identify an entry in the list.  The order of entries
+           is defined by the user without relying on key values.";
+      }
+      uses explicit-route-hop;
+    }
+  }
+
+  grouping path-route-exclude-objects {
+    description
+      "List of route objects to be excluded when performing
+       the path computation.";
+    list route-object-exclude-object {
+      key "index";
+      ordered-by user;
+      description
+        "List of Explicit Route Objects to be excluded in the
+         path computation.";
+      leaf index {
+        type uint32;
+        description
+          "Route object entry index.  The index is used to
+           identify an entry in the list.  The order of entries
+           is defined by the user without relying on key values.";
+      }
+      uses explicit-route-hop {
+        augment "type" {
+          case srlg {
+            container srlg {
+              description
+                "SRLG container.";
+              leaf srlg {
+                type uint32;
+                description
+                  "SRLG value.";
+              }
+            }
+            description
+              "An SRLG value to be included or excluded.";
+          }
+          description
+            "Augmentation for a generic explicit route for SRLG
+             exclusion.";
+        }
+      }
+    }
+  }
+
+  grouping generic-path-metric-bounds {
+    description
+      "TE path metric bounds grouping.";
+    container path-metric-bounds {
+      description
+        "Top-level container for the list of path metric bounds.";
+      list path-metric-bound {
+        key "metric-type";
+        description
+          "List of path metric bounds, which can apply to link and
+           path metrics.
+
+           TE paths which have at least one path metric which
+           exceeds the specified bounds MUST NOT be selected.
+
+           TE paths that traverse TE links which have at least one
+           link metric which exceeds the specified bounds MUST NOT
+           be selected.";
+        leaf metric-type {
+          type identityref {
+            base link-path-metric-type;
+          }
+          description
+            "Identifies an entry in the list of 'metric-type' items
+             bound for the TE path.";
+        }
+        leaf upper-bound {
+          type uint64;
+          default "0";
+          description
+            "Upper bound on the specified 'metric-type'.
+
+             A zero indicates an unbounded upper limit for the
+             specificied 'metric-type'.
+
+             The unit of is interpreted in the context of the
+             'metric-type' identity.";
+        }
+      }
+    }
+  }
+
+  grouping generic-path-optimization {
+    description
+      "TE generic path optimization grouping.";
+    container optimizations {
+      description
+        "The objective function container that includes
+         attributes to impose when computing a TE path.";
+      choice algorithm {
+        description
+          "Optimizations algorithm.";
+        case metric {
+          if-feature "path-optimization-metric";
+          /* Optimize by metric */
+          list optimization-metric {
+            key "metric-type";
+            description
+              "TE path metric type.";
+            uses optimization-metric-entry;
+          }
+          /* Tiebreakers */
+          container tiebreakers {
+            status deprecated;
+            description
+              "Container for the list of tiebreakers.
+
+               This container has been deprecated by the tiebreaker
+               leaf.";
+            list tiebreaker {
+              key "tiebreaker-type";
+              status deprecated;
+              description
+                "The list of tiebreaker criteria to apply on an
+                 equally favored set of paths, in order to pick
+                 the best.";
+              leaf tiebreaker-type {
+                type identityref {
+                  base path-metric-type;
+                }
+                status deprecated;
+                description
+                  "Identifies an entry in the list of tiebreakers.";
+              }
+            }
+          }
+        }
+        case objective-function {
+          if-feature "path-optimization-objective-function";
+          /* Objective functions */
+          container objective-function {
+            description
+              "The objective function container that includes
+               attributes to impose when computing a TE path.";
+            leaf objective-function-type {
+              type identityref {
+                base objective-function-type;
+              }
+              default "te-types:of-minimize-cost-path";
+              description
+                "Objective function entry.";
+            }
+          }
+        }
+      }
+    }
+    leaf tiebreaker {
+      type identityref {
+        base path-tiebreaker-type;
+      }
+      default "te-types:path-tiebreaker-random";
+      description
+        "The tiebreaker criteria to apply on an equally favored set
+         of paths, in order to pick the best.";
+    }
+  }
+
+  grouping generic-path-affinities {
+    description
+      "Path affinities grouping.";
+    container path-affinities-values {
+      description
+        "Path affinities represented as values.";
+      list path-affinities-value {
+        key "usage";
+        description
+          "List of named affinity constraints.";
+        leaf usage {
+          type identityref {
+            base resource-affinities-type;
+          }
+          description
+            "Identifies an entry in the list of value affinity
+             constraints.";
+        }
+        leaf value {
+          type admin-groups;
+          default "";
+          description
+            "The affinity value.  The default is empty.";
+        }
+      }
+    }
+    container path-affinity-names {
+      description
+        "Path affinities represented as names.";
+      list path-affinity-name {
+        key "usage";
+        description
+          "List of named affinity constraints.";
+        leaf usage {
+          type identityref {
+            base resource-affinities-type;
+          }
+          description
+            "Identifies an entry in the list of named affinity
+             constraints.";
+        }
+        list affinity-name {
+          key "name";
+          leaf name {
+            type string;
+            description
+              "Identifies a named affinity entry.";
+          }
+          description
+            "List of named affinities.";
+        }
+      }
+    }
+  }
+
+  grouping generic-path-srlgs {
+    description
+      "Path SRLG grouping.";
+    container path-srlgs-lists {
+      description
+        "Path SRLG properties container.";
+      list path-srlgs-list {
+        key "usage";
+        description
+          "List of SRLG values to be included or excluded.";
+        leaf usage {
+          type identityref {
+            base route-usage-type;
+          }
+          description
+            "Identifies an entry in a list of SRLGs to either
+             include or exclude.";
+        }
+        leaf-list values {
+          type srlg;
+          description
+            "List of SRLG values.";
+        }
+      }
+    }
+    container path-srlgs-names {
+      description
+        "Container for the list of named SRLGs.";
+      list path-srlgs-name {
+        key "usage";
+        description
+          "List of named SRLGs to be included or excluded.";
+        leaf usage {
+          type identityref {
+            base route-usage-type;
+          }
+          description
+            "Identifies an entry in a list of named SRLGs to either
+             include or exclude.";
+        }
+        leaf-list names {
+          type string;
+          description
+            "List of named SRLGs.";
+        }
+      }
+    }
+  }
+
+  grouping generic-path-disjointness {
+    description
+      "Path disjointness grouping.";
+    leaf disjointness {
+      type te-path-disjointness;
+      description
+        "The type of resource disjointness.
+         When configured for a primary path, the disjointness level
+         applies to all secondary LSPs.  When configured for a
+         secondary path, the disjointness level overrides the level
+         configured for the primary path.";
+    }
+  }
+
+  grouping common-path-constraints-attributes {
+    description
+      "Common path constraints configuration grouping.";
+    uses common-constraints;
+    uses generic-path-metric-bounds;
+    uses generic-path-affinities;
+    uses generic-path-srlgs;
+  }
+
+  grouping generic-path-constraints {
+    description
+      "Global named path constraints configuration grouping.";
+    container path-constraints {
+      description
+        "TE named path constraints container.";
+      uses common-path-constraints-attributes;
+      uses generic-path-disjointness;
+    }
+  }
+
+  grouping generic-path-properties {
+    description
+      "TE generic path properties grouping.";
+    container path-properties {
+      config false;
+      description
+        "The TE path properties.";
+      list path-metric {
+        key "metric-type";
+        description
+          "TE path metric type.";
+        leaf metric-type {
+          type identityref {
+            base path-metric-type;
+          }
+          description
+            "TE path metric type.";
+        }
+        leaf accumulative-value {
+          type uint64;
+          description
+            "TE path metric accumulative value.";
+        }
+      }
+      uses generic-path-affinities;
+      uses generic-path-srlgs;
+      container path-route-objects {
+        description
+          "Container for the list of route objects either returned by
+           the computation engine or actually used by an LSP.";
+        list path-route-object {
+          key "index";
+          ordered-by user;
+          description
+            "List of route objects either returned by the computation
+             engine or actually used by an LSP.";
+          leaf index {
+            type uint32;
+            description
+              "Route object entry index.  The index is used to
+               identify an entry in the list.  The order of entries
+               is defined by the user without relying on key
+               values.";
+          }
+          uses explicit-route-hop;
+        }
+      }
+    }
+  }
+
+  grouping encoding-and-switching-type {
+    description
+      "Common grouping to define the LSP encoding and
+       switching types";
+    leaf encoding {
+      type identityref {
+        base te-types:lsp-encoding-types;
+      }
+      description
+        "LSP encoding type.";
+      reference
+        "RFC 3945: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Architecture";
+    }
+    leaf switching-type {
+      type identityref {
+        base te-types:switching-capabilities;
+      }
+      description
+        "LSP switching type.";
+      reference
+        "RFC 3945: Generalized Multi-Protocol Label Switching (GMPLS)
+                   Architecture";
+    }
+  }
+
+  grouping te-generic-node-id {
+    description
+      "A reusable grouping for a TE generic node identifier.";
+    leaf id {
+      type union {
+        type te-node-id;
+        type inet:ip-address;
+        type nw:node-id;
+      }
+      description
+        "The identifier of the node.
+
+         It can be represented as IP address or dotted quad address
+         or as an URI.
+
+         The type data node disambiguates the union type.";
+    }
+    leaf type {
+      type enumeration {
+        enum ip {
+          description
+            "IP address representation of the node identifier.";
+        }
+        enum te-id {
+          description
+            "TE identifier of the node";
+        }
+        enum node-id {
+          description
+            "URI representation of the node identifier.";
+        }
+      }
+      description
+        "Type of node identifier representation.";
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-vpn-common@2021-09-10.yang b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-vpn-common@2021-09-10.yang
new file mode 100644
index 0000000000000000000000000000000000000000..075437d3a43dd7d81f98f1103fd2e34e2571005b
--- /dev/null
+++ b/src/nbi/service/rest_server/nbi_plugins/ietf_network_slice/yang/ietf-vpn-common@2021-09-10.yang
@@ -0,0 +1,2205 @@
+module ietf-vpn-common {
+  yang-version 1.1;
+  namespace "urn:ietf:params:xml:ns:yang:ietf-vpn-common";
+  prefix vpn-common;
+
+  import ietf-netconf-acm {
+    prefix nacm;
+    reference
+      "RFC 8341: Network Configuration Access Control Model";
+  }
+  import ietf-routing-types {
+    prefix rt-types;
+    reference
+      "RFC 8294: Common YANG Data Types for the Routing Area";
+  }
+  import ietf-yang-types {
+    prefix yang;
+    reference
+      "RFC 6991: Common YANG Data Types, Section 3";
+  }
+  import ietf-packet-fields {
+    prefix packet-fields;
+    reference
+      "RFC 8519: YANG Data Model for Network Access
+                 Control Lists (ACLs)";
+  }
+
+  organization
+    "IETF OPSAWG (Operations and Management Area Working Group)";
+  contact
+    "WG Web:   <https://datatracker.ietf.org/wg/opsawg/>
+     WG List:  <mailto:opsawg@ietf.org>
+
+     Editor:  Mohamed Boucadair
+              <mailto:mohamed.boucadair@orange.com>
+     Author:  Samier Barguil
+              <mailto:samier.barguilgiraldo.ext@telefonica.com>
+     Author:  Oscar Gonzalez de Dios
+              <mailto:oscar.gonzalezdedios@telefonica.com>
+     Author:  Qin Wu
+              <mailto:bill.wu@huawei.com>";
+  description
+    "This YANG module defines a common module that is meant
+     to be reused by various VPN-related modules (e.g.,
+     Layer 3 VPN Service Model (L3SM), Layer 2 VPN Service
+     Model (L2SM), Layer 3 VPN Network Model (L3NM), Layer 2
+     VPN Network Model (L2NM)).
+
+     Copyright (c) 2021 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).
+
+     This version of this YANG module is part of RFC XXXX; see
+     the RFC itself for full legal notices.";
+
+  revision 2021-09-10 {
+    description
+      "Initial revision.";
+    reference
+      "RFC XXXX: A Layer 2/3 VPN Common YANG Model";
+  }
+
+  /******** Collection of VPN-related Features ********/
+  /*
+   * Features related to encapsulation schemes
+   */
+
+  feature dot1q {
+    description
+      "Indicates the support for the Dot1q encapsulation.";
+    reference
+      "IEEE Std 802.1Q: Bridges and Bridged Networks";
+  }
+
+  feature qinq {
+    description
+      "Indicates the support for the QinQ encapsulation.";
+    reference
+      "IEEE Std 802.1ad: Provider Bridges";
+  }
+
+  feature vxlan {
+    description
+      "Indicates the support for the Virtual eXtensible
+       Local Area Network (VXLAN) encapsulation.";
+    reference
+      "RFC 7348: Virtual eXtensible Local Area  Network (VXLAN):
+                 A Framework for Overlaying Virtualized Layer 2
+                 Networks over Layer 3 Networks";
+  }
+
+  feature qinany {
+    description
+      "Indicates the support for the QinAny encapsulation.
+       The outer VLAN tag is set to a specific value but
+       the inner VLAN tag is set to any.";
+  }
+
+  feature lag-interface {
+    description
+      "Indicates the support for Link Aggregation Group (LAG)
+       between VPN network accesses.";
+    reference
+      "IEEE Std. 802.1AX: Link Aggregation";
+  }
+
+  /*
+   * Features related to multicast
+   */
+
+  feature multicast {
+    description
+      "Indicates multicast capabilities support in a VPN.";
+    reference
+      "RFC 6513: Multicast in MPLS/BGP IP VPNs";
+  }
+
+  feature igmp {
+    description
+      "Indicates support for Internet Group Management Protocol
+       (IGMP).";
+    reference
+      "RFC 1112: Host Extensions for IP Multicasting
+       RFC 2236: Internet Group Management Protocol, Version 2
+       RFC 3376: Internet Group Management Protocol, Version 3";
+  }
+
+  feature mld {
+    description
+      "Indicates support for Multicast Listener Discovery (MLD).";
+    reference
+      "RFC 2710: Multicast Listener Discovery (MLD) for IPv6
+       RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
+                 for IPv6";
+  }
+
+  feature pim {
+    description
+      "Indicates support for Protocol Independent Multicast (PIM).";
+    reference
+      "RFC 7761: Protocol Independent Multicast - Sparse Mode
+                (PIM-SM): Protocol Specification (Revised)";
+  }
+
+  /*
+   * Features related to address family types
+   */
+
+  feature ipv4 {
+    description
+      "Indicates IPv4 support in a VPN. That is, IPv4 traffic
+       can be carried in the VPN, IPv4 addresses/prefixes can
+       be assigned to a VPN network access, IPv4 routes can be
+       installed for the CE/PE link, etc.";
+    reference
+      "RFC 791: Internet Protocol";
+  }
+
+  feature ipv6 {
+    description
+      "Indicates IPv6 support in a VPN. That is, IPv6 traffic
+       can be carried in the VPN, IPv6 addresses/prefixes can
+       be assigned to a VPN network access, IPv6 routes can be
+       installed for the CE/PE link, etc.";
+    reference
+      "RFC 8200: Internet Protocol, Version 6 (IPv6)";
+  }
+
+  /*
+   * Features related to routing protocols
+   */
+
+  feature rtg-ospf {
+    description
+      "Indicates support for the OSPF as the Provider Edge (PE)/
+       Customer Edge (CE) routing protocol.";
+    reference
+      "RFC 4577: OSPF as the Provider/Customer Edge Protocol
+                 for BGP/MPLS IP Virtual Private Networks (VPNs)
+       RFC 6565: OSPFv3 as a Provider Edge to Customer Edge
+                 (PE-CE) Routing Protocol";
+  }
+
+  feature rtg-ospf-sham-link {
+    description
+      "Indicates support for OSPF sham links.";
+    reference
+      "RFC 4577: OSPF as the Provider/Customer Edge Protocol
+                 for BGP/MPLS IP Virtual Private Networks (VPNs),
+                 Section 4.2.7
+       RFC 6565: OSPFv3 as a Provider Edge to Customer Edge
+                 (PE-CE) Routing Protocol, Section 5";
+  }
+
+  feature rtg-bgp {
+    description
+      "Indicates support for BGP as the PE/CE routing protocol.";
+    reference
+      "RFC 4271: A Border Gateway Protocol 4 (BGP-4)";
+  }
+  feature rtg-rip {
+    description
+      "Indicates support for RIP as the PE/CE routing protocol.";
+    reference
+      "RFC 2453: RIP Version 2
+       RFC 2080: RIPng for IPv6";
+  }
+
+  feature rtg-isis {
+    description
+      "Indicates support for IS-IS as the PE/CE routing protocol.";
+    reference
+      "ISO10589: Intermediate System to Intermediate System intra-
+                 domain routeing information exchange protocol for
+                 use in conjunction with the protocol for providing
+                 the connectionless-mode network service
+                 (ISO 8473)";
+  }
+
+  feature rtg-vrrp {
+    description
+      "Indicates support for the Virtual Router Redundancy
+       Protocol (VRRP) in CE/PE link.";
+    reference
+      "RFC 5798: Virtual Router Redundancy Protocol (VRRP) Version 3
+                 for IPv4 and IPv6";
+  }
+
+  feature bfd {
+    description
+      "Indicates support for Bidirectional Forwarding Detection (BFD)
+       between the CE and the PE.";
+    reference
+      "RFC 5880: Bidirectional Forwarding Detection (BFD)";
+  }
+
+  /*
+   * Features related to VPN service constraints
+   */
+
+  feature bearer-reference {
+    description
+      "A bearer refers to properties of the CE-PE attachment that
+       are below Layer 3.
+       This feature indicates support for the bearer reference access
+       constraint. That is, the reuse of a network connection that was
+       already ordered to the service provider apart from the IP VPN
+       site.";
+  }
+
+  feature placement-diversity {
+    description
+      "Indicates support for placement diversity constraints in the
+       customer premises. An example of these constraints may be to
+       avoid connecting a site network access to the same Provider
+       Edge as a target site network access.";
+  }
+
+  /*
+   * Features related to bandwidth and Quality of Service (QoS)
+   */
+
+  feature qos {
+    description
+      "Indicates support for Classes of Service (CoSes) in the VPN.";
+  }
+
+  feature inbound-bw {
+    description
+      "Indicates support for the inbound bandwidth in a VPN. That is,
+       support for specifying the download bandwidth from the service
+       provider network to the VPN site. Note that the L3SM uses
+       'input' to identify the same feature. That terminology should
+       be deprecated in favor of the one defined in this module.";
+  }
+
+  feature outbound-bw {
+    description
+      "Indicates support for the outbound bandwidth in a VPN. That is,
+       support for specifying the upload bandwidth from the VPN site
+       to the service provider network. Note that the L3SM uses
+       'output' to identify the same feature. That terminology should
+       be deprecated in favor of the one defined in this module.";
+  }
+
+  /*
+   * Features related to security and resilience
+   */
+
+  feature encryption {
+    description
+      "Indicates support for encryption in the VPN.";
+  }
+
+  feature fast-reroute {
+    description
+      "Indicates support for Fast Reroute (FRR) capabilities for
+       a VPN site.";
+  }
+
+  /*
+   * Features related to advanced VPN options
+   */
+
+  feature external-connectivity {
+    description
+      "Indicates support for the VPN to provide external
+       connectivity (e.g., Internet, private or public cloud).";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks
+                 (VPNs), Section 11";
+  }
+
+  feature extranet-vpn {
+    description
+      "Indicates support for extranet VPNs. That is, the capability of
+       a VPN to access a list of other VPNs.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks
+                 (VPNs), Section 1.1";
+  }
+
+  feature carriers-carrier {
+    description
+      "Indicates support for Carrier-of-Carrier VPNs.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks
+                 (VPNs), Section 9";
+  }
+
+  /*
+   * Address family related identities
+   */
+
+  identity address-family {
+    description
+      "Defines a type for the address family.";
+  }
+
+  identity ipv4 {
+    base address-family;
+    description
+      "Identity for IPv4 address family.";
+  }
+  identity ipv6 {
+    base address-family;
+    description
+      "Identity for IPv6 address family.";
+  }
+
+  identity dual-stack {
+    base address-family;
+    description
+      "Identity for IPv4 and IPv6 address family.";
+  }
+
+  /*
+   * Identities related to VPN topology
+   */
+
+  identity vpn-topology {
+    description
+      "Base identity of the VPN topology.";
+  }
+
+  identity any-to-any {
+    base vpn-topology;
+    description
+      "Identity for any-to-any VPN topology. All VPN sites
+       can communicate with each other without any restrictions.";
+  }
+
+  identity hub-spoke {
+    base vpn-topology;
+    description
+      "Identity for Hub-and-Spoke VPN topology. All Spokes can
+       communicate only with Hubs but not with each other. Hubs
+       can communicate with each other.";
+  }
+
+  identity hub-spoke-disjoint {
+    base vpn-topology;
+    description
+      "Identity for Hub-and-Spoke VPN topology where Hubs cannot
+       communicate with each other.";
+  }
+
+  identity custom {
+    base vpn-topology;
+    description
+      "Identity for custom VPN topologies where the role of the nodes
+       is not strictly Hub or Spoke. The VPN topology is controlled by
+       the import/export policies. The custom topology reflects more
+       complex VPN nodes such as VPN node that acts as Hub for certain
+       nodes and Spoke to others.";
+  }
+
+  /*
+   * Identities related to network access types
+   */
+
+  identity site-network-access-type {
+    description
+      "Base identity for site network access type.";
+  }
+
+  identity point-to-point {
+    base site-network-access-type;
+    description
+      "Point-to-point access type.";
+  }
+
+  identity multipoint {
+    base site-network-access-type;
+    description
+      "Multipoint access type.";
+  }
+
+  identity irb {
+    base site-network-access-type;
+    description
+      "Integrated Routing Bridge (IRB).
+       Identity for pseudowire connections.";
+  }
+
+  identity loopback {
+    base site-network-access-type;
+    description
+      "Loopback access type.";
+  }
+
+  /*
+   * Identities related to operational and administrative status
+   */
+
+  identity operational-status {
+    description
+      "Base identity for the operational status.";
+  }
+
+  identity op-up {
+    base operational-status;
+    description
+      "Operational status is Up/Enabled.";
+  }
+
+  identity op-down {
+    base operational-status;
+    description
+      "Operational status is Down/Disabled.";
+  }
+
+  identity op-unknown {
+    base operational-status;
+    description
+      "Operational status is Unknown.";
+  }
+
+  identity administrative-status {
+    description
+      "Base identity for administrative status.";
+  }
+
+  identity admin-up {
+    base administrative-status;
+    description
+      "Administrative status is Up/Enabled.";
+  }
+
+  identity admin-down {
+    base administrative-status;
+    description
+      "Administrative status is Down/Disabled.";
+  }
+
+  identity admin-testing {
+    base administrative-status;
+    description
+      "Administrative status is up for testing purposes.";
+  }
+
+  identity admin-pre-deployment {
+    base administrative-status;
+    description
+      "Administrative status is pre-deployment phase. That is,
+       prior to the actual deployment of a service.";
+  }
+
+  /*
+   * Identities related to site or node role
+   */
+
+  identity role {
+    description
+      "Base identity of a site or a node role.";
+  }
+
+  identity any-to-any-role {
+    base role;
+    description
+      "Any-to-any role.";
+  }
+
+  identity spoke-role {
+    base role;
+    description
+      "A node or a site is acting as a Spoke.";
+  }
+
+  identity hub-role {
+    base role;
+    description
+      "A node or a site is acting as a Hub.";
+  }
+
+  identity custom-role {
+    base role;
+    description
+      "VPN node with custom or complex role in the VPN. For some
+       sources/destinations it can behave as a Hub, but for others it
+       can act as a Spoke depending on the configured policy.";
+  }
+
+  /*
+   * Identities related to VPN service constraints
+   */
+
+  identity placement-diversity {
+    description
+      "Base identity for access placement constraints.";
+  }
+
+  identity bearer-diverse {
+    base placement-diversity;
+    description
+      "Bearer diversity.
+       The bearers should not use common elements.";
+  }
+
+  identity pe-diverse {
+    base placement-diversity;
+    description
+      "PE diversity.";
+  }
+
+  identity pop-diverse {
+    base placement-diversity;
+    description
+      "Point Of Presence (POP) diversity.";
+  }
+
+  identity linecard-diverse {
+    base placement-diversity;
+    description
+      "Linecard diversity.";
+  }
+
+  identity same-pe {
+    base placement-diversity;
+    description
+      "Having sites connected on the same PE.";
+  }
+
+  identity same-bearer {
+    base placement-diversity;
+    description
+      "Having sites connected using the same bearer.";
+  }
+
+  /*
+   * Identities related to service types
+   */
+
+  identity service-type {
+    description
+      "Base identity for service type.";
+  }
+
+  identity l3vpn {
+    base service-type;
+    description
+      "L3VPN service.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs)";
+  }
+
+  identity vpls {
+    base service-type;
+    description
+      "VPLS service.";
+    reference
+      "RFC 4761: Virtual Private LAN Service (VPLS) Using BGP for
+                 Auto-Discovery and Signaling
+       RFC 4762: Virtual Private LAN Service (VPLS) Using Label
+                 Distribution Protocol (LDP) Signaling";
+  }
+
+  identity vpws {
+    base service-type;
+    description
+      "Virtual Private Wire Service (VPWS) service.";
+    reference
+      "RFC 4664: Framework for Layer 2 Virtual Private Networks
+                 (L2VPNs), Section 3.1.1";
+  }
+
+  identity vpws-evpn {
+    base service-type;
+    description
+      "EVPN used to support VPWS service.";
+    reference
+      "RFC 8214: Virtual Private Wire Service Support in Ethernet VPN";
+  }
+
+  identity pbb-evpn {
+    base service-type;
+    description
+      "Provider Backbone Bridging (PBB) EVPNs service.";
+    reference
+      "RFC 7623: Provider Backbone Bridging Combined with Ethernet VPN
+                (PBB-EVPN)";
+  }
+
+  identity mpls-evpn {
+    base service-type;
+    description
+      "MPLS-based EVPN service.";
+    reference
+      "RFC 7432: BGP MPLS-Based Ethernet VPN";
+  }
+
+  identity vxlan-evpn {
+    base service-type;
+    description
+      "VXLAN-based EVPN service.";
+    reference
+      "RFC 8365: A Network Virtualization Overlay Solution Using
+                 Ethernet VPN (EVPN)";
+  }
+
+  /*
+   * Identities related to VPN signaling type
+   */
+
+  identity vpn-signaling-type {
+    description
+      "Base identity for VPN signaling types";
+  }
+
+  identity bgp-signaling {
+    base vpn-signaling-type;
+    description
+      "Layer 2 VPNs using BGP signaling.";
+    reference
+      "RFC 6624: Layer 2 Virtual Private Networks Using BGP for
+                 Auto-Discovery and Signaling
+       RFC 7432: BGP MPLS-Based Ethernet VPN";
+  }
+
+  identity ldp-signaling {
+    base vpn-signaling-type;
+    description
+      "Targeted Label Distribution Protocol (LDP) signaling.";
+    reference
+      "RFC 5036: LDP Specification";
+  }
+
+  identity l2tp-signaling {
+    base vpn-signaling-type;
+    description
+      "Layer Two Tunneling Protocol (L2TP) signaling.";
+    reference
+      "RFC 3931: Layer Two Tunneling Protocol - Version 3 (L2TPv3)";
+  }
+
+  /*
+   * Identities related to routing protocols
+   */
+
+  identity routing-protocol-type {
+    description
+      "Base identity for routing protocol type.";
+  }
+
+  identity static-routing {
+    base routing-protocol-type;
+    description
+      "Static routing protocol.";
+  }
+
+  identity bgp-routing {
+    if-feature "rtg-bgp";
+    base routing-protocol-type;
+    description
+      "BGP routing protocol.";
+    reference
+      "RFC 4271: A Border Gateway Protocol 4 (BGP-4)";
+  }
+
+  identity ospf-routing {
+    if-feature "rtg-ospf";
+    base routing-protocol-type;
+    description
+      "OSPF routing protocol.";
+    reference
+      "RFC 4577: OSPF as the Provider/Customer Edge Protocol
+                 for BGP/MPLS IP Virtual Private Networks(VPNs)
+       RFC 6565: OSPFv3 as a Provider Edge to Customer Edge
+                 (PE-CE) Routing Protocol";
+  }
+
+  identity rip-routing {
+    if-feature "rtg-rip";
+    base routing-protocol-type;
+    description
+      "RIP routing protocol.";
+    reference
+      "RFC 2453: RIP Version 2
+       RFC 2080: RIPng for IPv6";
+  }
+
+  identity isis-routing {
+    if-feature "rtg-isis";
+    base routing-protocol-type;
+    description
+      "IS-IS routing protocol.";
+    reference
+      "ISO10589: Intermediate System to Intermediate System intra-
+                 domain routeing information exchange protocol for
+                 use in conjunction with the protocol for providing
+                 the connectionless-mode network service
+                 (ISO 8473)";
+  }
+
+  identity vrrp-routing {
+    if-feature "rtg-vrrp";
+    base routing-protocol-type;
+    description
+      "VRRP protocol.
+
+       This is to be used when LANs are directly connected to PEs.";
+    reference
+      "RFC 5798: Virtual Router Redundancy Protocol (VRRP) Version 3
+                 for IPv4 and IPv6";
+  }
+
+  identity direct-routing {
+    base routing-protocol-type;
+    description
+      "Direct routing.
+
+       This is to be used when LANs are directly connected to PEs
+       and must be advertised in the VPN.";
+  }
+
+  identity any-routing {
+    base routing-protocol-type;
+    description
+      "Any routing protocol.
+
+       This can be, e.g., used to set policies that apply to any
+       routing protocol in place.";
+  }
+
+  identity isis-level {
+    if-feature "rtg-isis";
+    description
+      "Base identity for the IS-IS level.";
+    reference
+      "ISO10589: Intermediate System to Intermediate System intra-
+                 domain routeing information exchange protocol for
+                 use in conjunction with the protocol for providing
+                 the connectionless-mode network service
+                 (ISO 8473)";
+  }
+
+  identity level-1 {
+    base isis-level;
+    description
+      "IS-IS level 1.";
+  }
+
+  identity level-2 {
+    base isis-level;
+    description
+      "IS-IS level 2.";
+  }
+
+  identity level-1-2 {
+    base isis-level;
+    description
+      "IS-IS levels 1 and 2.";
+  }
+
+  identity bfd-session-type {
+    if-feature "bfd";
+    description
+      "Base identity for the BFD session type.";
+  }
+
+  identity classic-bfd {
+    base bfd-session-type;
+    description
+      "Classic BFD.";
+    reference
+      "RFC 5880: Bidirectional Forwarding Detection (BFD)";
+  }
+
+  identity s-bfd {
+    base bfd-session-type;
+    description
+      "Seamless BFD.";
+    reference
+      "RFC 7880: Seamless Bidirectional Forwarding Detection (S-BFD)";
+  }
+
+  /*
+   * Identities related to Routes Import and Export
+   */
+
+  identity ie-type {
+    description
+      "Base identity for 'import/export' routing profiles.
+       These profiles can be reused between VPN nodes.";
+  }
+
+  identity import {
+    base ie-type;
+    description
+      "'Import' routing profile.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks
+                 (VPNs), Section 4.3.1";
+  }
+
+  identity export {
+    base ie-type;
+    description
+      "'Export' routing profile.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks
+                 (VPNs), Section 4.3.1";
+  }
+
+  identity import-export {
+    base ie-type;
+    description
+      "'Import/export' routing profile.";
+  }
+
+  /*
+   * Identities related to bandwidth and QoS
+   */
+
+  identity bw-direction {
+    description
+      "Base identity for the bandwidth direction.";
+  }
+
+  identity inbound-bw {
+    if-feature "inbound-bw";
+    base bw-direction;
+    description
+      "Inbound bandwidth.";
+  }
+
+  identity outbound-bw {
+    if-feature "outbound-bw";
+    base bw-direction;
+    description
+      "Outbound bandwidth.";
+  }
+  identity bw-type {
+    description
+      "Base identity for the bandwidth type.";
+  }
+
+  identity bw-per-cos {
+    if-feature "qos";
+    base bw-type;
+    description
+      "The bandwidth is per-CoS.";
+  }
+
+  identity bw-per-port {
+    base bw-type;
+    description
+      "The bandwidth is per-site network access.";
+  }
+
+  identity bw-per-site {
+    base bw-type;
+    description
+      "The bandwidth is per-site. It is applicable to all the site
+       network accesses within a site.";
+  }
+
+  identity bw-per-service {
+    base bw-type;
+    description
+      "The bandwidth is per-VPN service.";
+  }
+
+  identity qos-profile-direction {
+    if-feature "qos";
+    description
+      "Base identity for the QoS profile direction.";
+  }
+
+  identity site-to-wan {
+    base qos-profile-direction;
+    description
+      "Customer site to provider's network direction.
+       This is typically the CE-to-PE direction.";
+  }
+
+  identity wan-to-site {
+    base qos-profile-direction;
+    description
+      "Provider's network to customer site direction.
+       This is typically the PE-to-CE direction.";
+  }
+
+  identity both {
+    base qos-profile-direction;
+    description
+      "Both WAN-to-Site and Site-to-WAN directions.";
+  }
+
+  /*
+   *  Identities related to underlay transport instances
+   */
+
+  identity transport-instance-type {
+    description
+      "Base identity for underlay transport instance type.";
+  }
+
+  identity virtual-network {
+    base transport-instance-type;
+    description
+      "Virtual network.";
+    reference
+      "RFC 8453: Framework for Abstraction and Control of TE
+                 Networks (ACTN)";
+  }
+
+  identity enhanced-vpn {
+    base transport-instance-type;
+    description
+      "Enhanced VPN (VPN+). VPN+ is an approach that is
+       based on existing VPN and Traffic Engineering (TE)
+       technologies but adds characteristics that specific
+       services require over and above classical VPNs.";
+    reference
+      "I-D.ietf-teas-enhanced-vpn:
+         A Framework for Enhanced Virtual Private Network
+         (VPN+) Services";
+  }
+
+  identity ietf-network-slice {
+    base transport-instance-type;
+    description
+      "IETF network slice. An IETF network slice
+       is a logical network topology connecting a number of
+       endpoints using a set of shared or dedicated network
+       resources that are used to satisfy specific service
+       objectives.";
+    reference
+      "I-D.ietf-teas-ietf-network-slices:
+         Framework for IETF Network Slices";
+  }
+
+  /*
+   *  Identities related to protocol types. These types are typically
+   *  used to identify the underlay transport.
+   */
+
+  identity protocol-type {
+    description
+      "Base identity for Protocol Type.";
+  }
+
+  identity ip-in-ip {
+    base protocol-type;
+    description
+      "Transport is based on IP-in-IP.";
+    reference
+      "RFC 2003: IP Encapsulation within IP
+       RFC 2473: Generic Packet Tunneling in IPv6 Specification";
+  }
+
+  identity ip-in-ipv4 {
+    base ip-in-ip;
+    description
+      "Transport is based on IP over IPv4.";
+    reference
+      "RFC 2003: IP Encapsulation within IP";
+  }
+
+  identity ip-in-ipv6 {
+    base ip-in-ip;
+    description
+      "Transport is based on IP over IPv6.";
+    reference
+      "RFC 2473: Generic Packet Tunneling in IPv6 Specification";
+  }
+
+  identity gre {
+    base protocol-type;
+    description
+      "Transport is based on Generic Routing Encapsulation (GRE).";
+    reference
+      "RFC 1701: Generic Routing Encapsulation (GRE)
+       RFC 1702: Generic Routing Encapsulation over IPv4 networks
+       RFC 7676: IPv6 Support for Generic Routing Encapsulation (GRE)";
+  }
+
+  identity gre-v4 {
+    base gre;
+    description
+      "Transport is based on GRE over IPv4.";
+    reference
+      "RFC 1702: Generic Routing Encapsulation over IPv4 networks";
+  }
+
+  identity gre-v6 {
+    base gre;
+    description
+      "Transport is based on GRE over IPv6.";
+    reference
+      "RFC 7676: IPv6 Support for Generic Routing Encapsulation (GRE)";
+  }
+
+  identity vxlan-trans {
+    base protocol-type;
+    description
+      "Transport is based on VXLAN.";
+    reference
+      "RFC 7348: Virtual eXtensible Local Area  Network (VXLAN):
+                 A Framework for Overlaying Virtualized Layer 2
+                 Networks over Layer 3 Networks";
+  }
+
+  identity geneve {
+    base protocol-type;
+    description
+      "Transport is based on Generic Network Virtualization
+       Encapsulation (GENEVE).";
+    reference
+      "RFC 8926: Geneve: Generic Network Virtualization Encapsulation";
+  }
+
+  identity ldp {
+    base protocol-type;
+    description
+      "Transport is based on LDP.";
+    reference
+      "RFC 5036: LDP Specification";
+  }
+
+  identity mpls-in-udp {
+    base protocol-type;
+    description
+      "Transport is MPLS in UDP.";
+    reference
+      "RFC 7510: Encapsulating MPLS in UDP";
+  }
+
+  identity sr {
+    base protocol-type;
+    description
+      "Transport is based on Segment Routing (SR).";
+    reference
+      "RFC 8660: Segment Routing with the MPLS Data Plane
+       RFC 8663: MPLS Segment Routing over IP
+       RFC 8754: IPv6 Segment Routing Header (SRH)";
+  }
+
+  identity sr-mpls {
+    base sr;
+    description
+      "Transport is based on SR with MPLS.";
+    reference
+      "RFC 8660: Segment Routing with the MPLS Data Plane";
+  }
+
+  identity srv6 {
+    base sr;
+    description
+      "Transport is based on SR over IPv6.";
+    reference
+      "RFC 8754: IPv6 Segment Routing Header (SRH)";
+  }
+
+  identity sr-mpls-over-ip {
+    base sr;
+    description
+      "Transport is based on SR over MPLS over IP.";
+    reference
+      "RFC 8663: MPLS Segment Routing over IP";
+  }
+
+  identity rsvp-te {
+    base protocol-type;
+    description
+      "Transport setup relies upon RSVP-TE.";
+    reference
+      "RFC 3209: RSVP-TE: Extensions to RSVP for LSP Tunnels";
+  }
+
+  identity bgp-lu {
+    base protocol-type;
+    description
+      "Transport setup relies upon BGP-LU.";
+    reference
+      "RFC 8277: Using BGP to Bind MPLS Labels to Address Prefixes";
+  }
+
+  identity unknown {
+    base protocol-type;
+    description
+      "Not known protocol type.";
+  }
+
+  /*
+   * Identities related to encapsulations
+   */
+
+  identity encapsulation-type {
+    description
+      "Base identity for the encapsulation type.";
+  }
+
+  identity priority-tagged {
+    base encapsulation-type;
+    description
+      "Priority-tagged interface.";
+  }
+
+  identity dot1q {
+    if-feature "dot1q";
+    base encapsulation-type;
+    description
+      "Dot1q encapsulation.";
+  }
+
+  identity qinq {
+    if-feature "qinq";
+    base encapsulation-type;
+    description
+      "QinQ encapsulation.";
+  }
+
+  identity qinany {
+    if-feature "qinany";
+    base encapsulation-type;
+    description
+      "QinAny encapsulation.";
+  }
+  identity vxlan {
+    if-feature "vxlan";
+    base encapsulation-type;
+    description
+      "VxLAN encapsulation.";
+  }
+
+  identity ethernet-type {
+    base encapsulation-type;
+    description
+      "Ethernet encapsulation type.";
+  }
+
+  identity vlan-type {
+    base encapsulation-type;
+    description
+      "VLAN encapsulation type.";
+  }
+
+  identity untagged-int {
+    base encapsulation-type;
+    description
+      "Untagged interface type.";
+  }
+
+  identity tagged-int {
+    base encapsulation-type;
+    description
+      "Tagged interface type.";
+  }
+
+  identity lag-int {
+    if-feature "lag-interface";
+    base encapsulation-type;
+    description
+      "LAG interface type.";
+  }
+
+  /*
+   * Identities related to VLAN Tag
+   */
+
+  identity tag-type {
+    description
+      "Base identity for the tag types.";
+  }
+
+  identity c-vlan {
+    base tag-type;
+    description
+      "Indicates Customer VLAN (C-VLAN) tag, normally using
+       the 0x8100 Ethertype.";
+  }
+
+  identity s-vlan {
+    base tag-type;
+    description
+      "Indicates Service VLAN (S-VLAN) tag.";
+  }
+
+  identity s-c-vlan {
+    base tag-type;
+    description
+      "Uses both an S-VLAN tag and a C-VLAN tag.";
+  }
+
+  /*
+   * Identities related to VXLAN
+   */
+
+  identity vxlan-peer-mode {
+    if-feature "vxlan";
+    description
+      "Base identity for the VXLAN peer mode.";
+  }
+
+  identity static-mode {
+    base vxlan-peer-mode;
+    description
+      "VXLAN access in the static mode.";
+  }
+
+  identity bgp-mode {
+    base vxlan-peer-mode;
+    description
+      "VXLAN access by BGP EVPN learning.";
+  }
+
+  /*
+   * Identities related to multicast
+   */
+
+  identity multicast-gp-address-mapping {
+    if-feature "multicast";
+    description
+      "Base identity for multicast group mapping type.";
+  }
+
+  identity static-mapping {
+    base multicast-gp-address-mapping;
+    description
+      "Static mapping, i.e., attach the interface to the
+       multicast group as a static member.";
+  }
+
+  identity dynamic-mapping {
+    base multicast-gp-address-mapping;
+    description
+      "Dynamic mapping, i.e., an interface is added to the
+       multicast group as a result of snooping.";
+  }
+
+  identity multicast-tree-type {
+    if-feature "multicast";
+    description
+      "Base identity for multicast tree type.";
+  }
+
+  identity ssm-tree-type {
+    base multicast-tree-type;
+    description
+      "Source-Specific Multicast (SSM) tree type.";
+  }
+
+  identity asm-tree-type {
+    base multicast-tree-type;
+    description
+      "Any-Source Multicast (ASM) tree type.";
+  }
+
+  identity bidir-tree-type {
+    base multicast-tree-type;
+    description
+      "Bidirectional tree type.";
+  }
+
+  identity multicast-rp-discovery-type {
+    if-feature "multicast";
+    description
+      "Base identity for Rendezvous Point (RP) discovery type.";
+  }
+
+  identity auto-rp {
+    base multicast-rp-discovery-type;
+    description
+      "Auto-RP discovery type.";
+  }
+
+  identity static-rp {
+    base multicast-rp-discovery-type;
+    description
+      "Static type.";
+  }
+
+  identity bsr-rp {
+    base multicast-rp-discovery-type;
+    description
+      "Bootstrap Router (BSR) discovery type.";
+  }
+
+  identity group-management-protocol {
+    if-feature "multicast";
+    description
+      "Base identity for multicast group management protocol.";
+  }
+
+  identity igmp-proto {
+    base group-management-protocol;
+    description
+      "IGMP.";
+    reference
+      "RFC 1112: Host Extensions for IP Multicasting
+       RFC 2236: Internet Group Management Protocol, Version 2
+       RFC 3376: Internet Group Management Protocol, Version 3";
+  }
+
+  identity mld-proto {
+    base group-management-protocol;
+    description
+      "MLD.";
+    reference
+      "RFC 2710: Multicast Listener Discovery (MLD) for IPv6
+       RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
+                 for IPv6";
+  }
+
+  identity pim-proto {
+    if-feature "pim";
+    base routing-protocol-type;
+    description
+      "PIM.";
+    reference
+      "RFC 7761: Protocol Independent Multicast - Sparse Mode
+                (PIM-SM): Protocol Specification (Revised)";
+  }
+
+  identity igmp-version {
+    if-feature "igmp";
+    description
+      "Base identity for IGMP version.";
+  }
+
+  identity igmpv1 {
+    base igmp-version;
+    description
+      "IGMPv1.";
+    reference
+      "RFC 1112: Host Extensions for IP Multicasting";
+  }
+
+  identity igmpv2 {
+    base igmp-version;
+    description
+      "IGMPv2.";
+    reference
+      "RFC 2236: Internet Group Management Protocol, Version 2";
+  }
+
+  identity igmpv3 {
+    base igmp-version;
+    description
+      "IGMPv3.";
+    reference
+      "RFC 3376: Internet Group Management Protocol, Version 3";
+  }
+
+  identity mld-version {
+    if-feature "mld";
+    description
+      "Base identity for MLD version.";
+  }
+
+  identity mldv1 {
+    base mld-version;
+    description
+      "MLDv1.";
+    reference
+      "RFC 2710: Multicast Listener Discovery (MLD) for IPv6";
+  }
+
+  identity mldv2 {
+    base mld-version;
+    description
+      "MLDv2.";
+    reference
+      "RFC 3810: Multicast Listener Discovery Version 2 (MLDv2)
+                 for IPv6";
+  }
+
+  /*
+   * Identities related to traffic types
+   */
+
+  identity tf-type {
+    description
+      "Base identity for the traffic type.";
+  }
+
+  identity multicast-traffic {
+    base tf-type;
+    description
+      "Multicast traffic.";
+  }
+
+  identity broadcast-traffic {
+    base tf-type;
+    description
+      "Broadcast traffic.";
+  }
+
+  identity unknown-unicast-traffic {
+    base tf-type;
+    description
+      "Unknown unicast traffic.";
+  }
+
+  /*
+   * Identities related to customer applications
+   */
+
+  identity customer-application {
+    description
+      "Base identity for customer applications.";
+  }
+
+  identity web {
+    base customer-application;
+    description
+      "Web applications (e.g., HTTP, HTTPS).";
+  }
+
+  identity mail {
+    base customer-application;
+    description
+      "Mail application.";
+  }
+
+  identity file-transfer {
+    base customer-application;
+    description
+      "File transfer application (e.g., FTP, SFTP).";
+  }
+
+  identity database {
+    base customer-application;
+    description
+      "Database application.";
+  }
+
+  identity social {
+    base customer-application;
+    description
+      "Social-network application.";
+  }
+
+  identity games {
+    base customer-application;
+    description
+      "Gaming application.";
+  }
+
+  identity p2p {
+    base customer-application;
+    description
+      "Peer-to-peer application.";
+  }
+
+  identity network-management {
+    base customer-application;
+    description
+      "Management application (e.g., Telnet, syslog,
+       SNMP).";
+  }
+
+  identity voice {
+    base customer-application;
+    description
+      "Voice application.";
+  }
+
+  identity video {
+    base customer-application;
+    description
+      "Video conference application.";
+  }
+
+  identity embb {
+    base customer-application;
+    description
+      "Enhanced Mobile Broadband (eMBB) application.
+       Note that an eMBB application demands network performance with a
+       wide variety of characteristics, such as data rate, latency,
+       loss rate, reliability, and many other parameters.";
+  }
+
+  identity urllc {
+    base customer-application;
+    description
+      "Ultra-Reliable and Low Latency Communications
+       (URLLC) application.  Note that an URLLC application demands
+       network performance with a wide variety of characteristics, such
+       as latency, reliability, and many other parameters.";
+  }
+
+  identity mmtc {
+    base customer-application;
+    description
+      "Massive Machine Type Communications (mMTC) application.
+       Note that an mMTC application demands network performance with
+       a wide variety of characteristics, such as data rate, latency,
+       loss rate, reliability, and many other parameters.";
+  }
+
+  /*
+   * Identities related to service bundling
+   */
+
+  identity bundling-type {
+    description
+      "The base identity for the bundling type. It supports a subset or
+       all CE-VLANs associated with an L2VPN service.";
+  }
+
+  identity multi-svc-bundling {
+    base bundling-type;
+    description
+      "Multi-service bundling, i.e., multiple C-VLAN IDs
+       can be associated with an L2VPN service at a site.";
+  }
+
+  identity one2one-bundling {
+    base bundling-type;
+    description
+      "One-to-one service bundling, i.e., each L2VPN can
+       be associated with only one C-VLAN ID at a site.";
+  }
+
+  identity all2one-bundling {
+    base bundling-type;
+    description
+      "All-to-one bundling, i.e., all C-VLAN IDs are mapped
+       to one L2VPN service.";
+  }
+
+  /*
+   * Identities related to Ethernet Services
+   */
+
+  identity control-mode {
+    description
+      "Base Identity for the type of control mode on Layer 2
+       Control Protocol (L2CP).";
+  }
+
+  identity peer {
+    base control-mode;
+    description
+      "'peer' mode, i.e., participate in the protocol towards the CE.
+       Peering is common for Link Aggregation Control Protocol (LACP)
+       and the Ethernet Local Management Interface (E-LMI) and,
+       occasionally, for Link Layer Discovery Protocol (LLDP).
+       For VPLSs and VPWSs, the subscriber can also request that the
+       peer service provider enables spanning tree.";
+  }
+
+  identity tunnel {
+    base control-mode;
+    description
+      "'tunnel' mode, i.e., pass to the egress or destination site. For
+       Ethernet Private Lines (EPLs), the expectation is that L2CP
+       frames are tunnelled.";
+  }
+  identity discard {
+    base control-mode;
+    description
+      "'Discard' mode, i.e., discard the frame.";
+  }
+
+  identity neg-mode {
+    description
+      "Base identity for the negotiation mode.";
+  }
+
+  identity full-duplex {
+    base neg-mode;
+    description
+      "Full-duplex negotiation mode.";
+  }
+
+  identity auto-neg {
+    base neg-mode;
+    description
+      "Auto-negotiation mode.";
+  }
+
+  /******** Collection of VPN-related Types ********/
+
+  typedef vpn-id {
+    type string;
+    description
+      "Defines an identifier that is used with a VPN module.
+       This can be, for example, a service identifier, a node
+       identifier, etc.";
+  }
+
+  /******* VPN-related reusable groupings *******/
+
+  grouping vpn-description {
+    description
+      "Provides common VPN information.";
+    leaf vpn-id {
+      type vpn-common:vpn-id;
+      description
+        "A VPN identifier that uniquely identifies a VPN.
+         This identifier has a local meaning, e.g., within
+         a service provider network.";
+    }
+    leaf vpn-name {
+      type string;
+      description
+        "Used to associate a name with the service
+         in order to facilitate the identification of
+         the service.";
+    }
+    leaf vpn-description {
+      type string;
+      description
+        "Textual description of a VPN.";
+    }
+    leaf customer-name {
+      type string;
+      description
+        "Name of the customer that actually uses the VPN.";
+    }
+  }
+
+  grouping vpn-profile-cfg {
+    description
+      "Grouping for VPN Profile configuration.";
+    container valid-provider-identifiers {
+      description
+        "Container for valid provider profile identifiers.";
+      list external-connectivity-identifier {
+        if-feature "external-connectivity";
+        key "id";
+        description
+          "List for profile identifiers that uniquely identify profiles
+           governing how external connectivity is provided to a VPN.
+           A profile indicates the type of external connectivity
+           (Internet, cloud, etc.), the sites/nodes that are associated
+           with a connectivity profile, etc. A profile can also indicate
+           filtering rules and/or address translation rules. Such
+           features may involve PE, P, or dedicated nodes as a function
+           of the deployment.";
+        leaf id {
+          type string;
+          description
+            "Identification of an external connectivity profile. The
+             profile only has significance within the service provider's
+             administrative domain.";
+        }
+      }
+      list encryption-profile-identifier {
+        key "id";
+        description
+          "List for encryption profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the encryption profile to be used. The
+             profile only has significance within the service provider's
+             administrative domain.";
+        }
+      }
+      list qos-profile-identifier {
+        key "id";
+        description
+          "List for QoS Profile Identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the QoS profile to be used. The
+             profile only has significance within the service provider's
+             administrative domain.";
+        }
+      }
+      list bfd-profile-identifier {
+        key "id";
+        description
+          "List for BFD profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the BFD profile to be used. The
+             profile only has significance within the service provider's
+             administrative domain.";
+        }
+      }
+      list forwarding-profile-identifier {
+        key "id";
+        description
+          "List for forwarding profile identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the forwarding profile to be used.
+             The profile only has significance within the service
+             provider's administrative domain.";
+        }
+      }
+      list routing-profile-identifier {
+        key "id";
+        description
+          "List for Routing Profile Identifiers.";
+        leaf id {
+          type string;
+          description
+            "Identification of the routing profile to be used by the
+             routing protocols within sites, vpn-network-accesses, or
+             vpn-nodes for refering VRF's import/export policies.
+
+             The profile only has significance within the service
+             provider's administrative domain.";
+        }
+      }
+      nacm:default-deny-write;
+    }
+  }
+
+  grouping oper-status-timestamp {
+    description
+      "This grouping defines some operational parameters for the
+       service.";
+    leaf status {
+      type identityref {
+        base operational-status;
+      }
+      config false;
+      description
+        "Operations status.";
+    }
+    leaf last-change {
+      type yang:date-and-time;
+      config false;
+      description
+        "Indicates the actual date and time of the service status
+         change.";
+    }
+  }
+
+  grouping service-status {
+    description
+      "Service status grouping.";
+    container status {
+      description
+        "Service status.";
+      container admin-status {
+        description
+          "Administrative service status.";
+        leaf status {
+          type identityref {
+            base administrative-status;
+          }
+          description
+            "Administrative service status.";
+        }
+        leaf last-change {
+          type yang:date-and-time;
+          description
+            "Indicates the actual date and time of the service status
+             change.";
+        }
+      }
+      container oper-status {
+        description
+          "Operational service status.";
+        uses oper-status-timestamp;
+      }
+    }
+  }
+
+  grouping underlay-transport {
+    description
+      "This grouping defines the type of underlay transport for the
+       VPN service or how that underlay is set. It can include an
+       identifier to an abstract transport instance to which the VPN
+       is grafted or indicate a technical implementation that is
+       expressed as an ordered list of protocols.";
+    choice type {
+      description
+        "A choice based on the type of underlay transport
+         constraints.";
+      case abstract {
+        description
+          "Indicates that the transport constraint is an abstract
+           concept.";
+        leaf transport-instance-id {
+          type string;
+          description
+            "An optional identifier of the abstract transport instance.";
+        }
+        leaf instance-type {
+          type identityref {
+            base transport-instance-type;
+          }
+          description
+            "Indicates a transport instance type. For example, it can
+             be a VPN+, an IETF network slice, a virtual network, etc.";
+        }
+      }
+      case protocol {
+        description
+          "Indicates a list of protocols.";
+        leaf-list protocol {
+          type identityref {
+            base protocol-type;
+          }
+          ordered-by user;
+          description
+            "A client ordered list of transport protocols.";
+        }
+      }
+    }
+  }
+
+  grouping vpn-route-targets {
+    description
+      "A grouping that specifies Route Target (RT) import-export rules
+       used in a BGP-enabled VPN.";
+    reference
+      "RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs)
+       RFC 4664: Framework for Layer 2 Virtual Private Networks
+                 (L2VPNs)";
+    list vpn-target {
+      key "id";
+      description
+        "Route targets. AND/OR operations may be defined
+         based on the RTs assigment.";
+      leaf id {
+        type uint8;
+        description
+          "Identifies each VPN Target.";
+      }
+      list route-targets {
+        key "route-target";
+        description
+          "List of RTs.";
+        leaf route-target {
+          type rt-types:route-target;
+          description
+            "Conveys an RT value.";
+        }
+      }
+      leaf route-target-type {
+        type rt-types:route-target-type;
+        mandatory true;
+        description
+          "Import/export type of the RT.";
+      }
+    }
+    container vpn-policies {
+      description
+        "VPN service policies. It contains references to the
+         import and export policies to be associated with the
+         VPN service.";
+      leaf import-policy {
+        type string;
+        description
+          "Identifies the 'import' policy.";
+      }
+      leaf export-policy {
+        type string;
+        description
+          "Identifies the 'export' policy.";
+      }
+    }
+  }
+
+  grouping route-distinguisher {
+    description
+      "Grouping for route distinguisher (RD).";
+    choice rd-choice {
+      description
+        "Route distinguisher choice between several options
+         on providing the route distinguisher value.";
+      case directly-assigned {
+        description
+          "Explicitly assign an RD value.";
+        leaf rd {
+          type rt-types:route-distinguisher;
+          description
+            "Indicates an RD value that is explicitly
+             assigned.";
+        }
+      }
+      case directly-assigned-suffix {
+        description
+          "The value of the Assigned Number subfield of the RD.
+           The Administrator subfield of the RD will be
+           based on other configuration information such as
+           router-id or ASN.";
+        leaf rd-suffix {
+          type uint16;
+          description
+            "Indicates the value of the Assigned Number
+             subfield that is explicitly assigned.";
+        }
+      }
+      case auto-assigned {
+        description
+          "The RD is auto-assigned.";
+        container rd-auto {
+          description
+            "The RD is auto-assigned.";
+          choice auto-mode {
+            description
+              "Indicates the auto-assignment mode. RD can be
+               automatically assigned with or without
+               indicating a pool from which the RD should be
+               taken.
+
+               For both cases, the server will auto-assign an RD
+               value 'auto-assigned-rd' and use that value
+               operationally.";
+            case from-pool {
+              leaf rd-pool-name {
+                type string;
+                description
+                  "The auto-assignment will be made from the pool
+                   identified by the rd-pool-name.";
+              }
+            }
+            case full-auto {
+              leaf auto {
+                type empty;
+                description
+                  "Indicates an RD is fully auto-assigned.";
+              }
+            }
+          }
+          leaf auto-assigned-rd {
+            type rt-types:route-distinguisher;
+            config false;
+            description
+              "The value of the auto-assigned RD.";
+          }
+        }
+      }
+      case auto-assigned-suffix {
+        description
+          "The value of the Assigned Number subfield will
+           be auto-assigned. The Administrator subfield
+           will be based on other configuration information such as
+           router-id or ASN.";
+        container rd-auto-suffix {
+          description
+            "The Assigned Number subfield is auto-assigned.";
+          choice auto-mode {
+            description
+              "Indicates the auto-assignment mode of the Assigned Number
+               subfield. This number can be automatically assigned
+               with or without indicating a pool from which the value
+               should be taken.
+
+               For both cases, the server will auto-assign
+               'auto-assigned-rd-suffix' and use that value to build
+               the RD that will be used operationally.";
+            case from-pool {
+              leaf rd-pool-name {
+                type string;
+                description
+                  "The assignment will be made from the pool identified
+                   by the rd-pool-name.";
+              }
+            }
+            case full-auto {
+              leaf auto {
+                type empty;
+                description
+                  "Indicates that the Assigned Number is fully auto
+                   assigned.";
+              }
+            }
+          }
+          leaf auto-assigned-rd-suffix {
+            type uint16;
+            config false;
+            description
+              "Includes the value of the Assigned Number subfield that
+               is auto-assigned .";
+          }
+        }
+      }
+      case no-rd {
+        description
+          "Use the empty type to indicate RD has no value and is not to
+           be auto-assigned.";
+        leaf no-rd {
+          type empty;
+          description
+            "No RD is assigned.";
+        }
+      }
+    }
+  }
+
+  grouping vpn-components-group {
+    description
+      "Grouping definition to assign group-ids to associate VPN nodes,
+       sites, or network accesses.";
+    container groups {
+      description
+        "Lists the groups to which a VPN node, a site, or a network
+         access belongs to.";
+      list group {
+        key "group-id";
+        description
+          "List of group-ids.";
+        leaf group-id {
+          type string;
+          description
+            "Is the group-id to which a VPN node, a site, or a network
+             access belongs to.";
+        }
+      }
+    }
+  }
+
+  grouping placement-constraints {
+    description
+      "Constraints for placing a network access.";
+    list constraint {
+      key "constraint-type";
+      description
+        "List of constraints.";
+      leaf constraint-type {
+        type identityref {
+          base placement-diversity;
+        }
+        description
+          "Diversity constraint type.";
+      }
+      container target {
+        description
+          "The constraint will apply against this list of groups.";
+        choice target-flavor {
+          description
+            "Choice for the group definition.";
+          case id {
+            list group {
+              key "group-id";
+              description
+                "List of groups.";
+              leaf group-id {
+                type string;
+                description
+                  "The constraint will apply against this particular
+                   group-id.";
+              }
+            }
+          }
+          case all-accesses {
+            leaf all-other-accesses {
+              type empty;
+              description
+                "The constraint will apply against all other network
+                 accesses of a site.";
+            }
+          }
+          case all-groups {
+            leaf all-other-groups {
+              type empty;
+              description
+                "The constraint will apply against all other groups that
+                 the customer is managing.";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping ports {
+    description
+      "Choice of specifying a source or destination port numbers.";
+    choice source-port {
+      description
+        "Choice of specifying the source port or referring to a group
+         of source port numbers.";
+      container source-port-range-or-operator {
+        description
+          "Source port definition.";
+        uses packet-fields:port-range-or-operator;
+      }
+    }
+    choice destination-port {
+      description
+        "Choice of specifying a destination port or referring to a group
+         of destination port numbers.";
+      container destination-port-range-or-operator {
+        description
+          "Destination port definition.";
+        uses packet-fields:port-range-or-operator;
+      }
+    }
+  }
+
+  grouping qos-classification-policy {
+    description
+      "Configuration of the traffic classification policy.";
+    list rule {
+      key "id";
+      ordered-by user;
+      description
+        "List of marking rules.";
+      leaf id {
+        type string;
+        description
+          "An identifier of the QoS classification policy rule.";
+      }
+      choice match-type {
+        default "match-flow";
+        description
+          "Choice for classification.";
+        case match-flow {
+          choice l3 {
+            description
+              "Either IPv4 or IPv6.";
+            container ipv4 {
+              description
+                "Rule set that matches IPv4 header.";
+              uses packet-fields:acl-ip-header-fields;
+              uses packet-fields:acl-ipv4-header-fields;
+            }
+            container ipv6 {
+              description
+                "Rule set that matches IPv6 header.";
+              uses packet-fields:acl-ip-header-fields;
+              uses packet-fields:acl-ipv6-header-fields;
+            }
+          }
+          choice l4 {
+            description
+              "Includes Layer 4 specific information.
+               This version focuses on TCP and UDP.";
+            container tcp {
+              description
+                "Rule set that matches TCP header.";
+              uses packet-fields:acl-tcp-header-fields;
+              uses ports;
+            }
+            container udp {
+              description
+                "Rule set that matches UDP header.";
+              uses packet-fields:acl-udp-header-fields;
+              uses ports;
+            }
+          }
+        }
+        case match-application {
+          leaf match-application {
+            type identityref {
+              base customer-application;
+            }
+            description
+              "Defines the application to match.";
+          }
+        }
+      }
+      leaf target-class-id {
+        if-feature "qos";
+        type string;
+        description
+          "Identification of the class of service. This identifier is
+           internal to the administration.";
+      }
+    }
+  }
+}
diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py
index eaa21352527a95591829e6bad87de8ecef1df521..ab608f2d746a2faffc819f25cc026ce9b949aff7 100644
--- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py
+++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/Resources.py
@@ -177,6 +177,11 @@ class Topology(_Resource):
     def delete(self, context_uuid : str, topology_uuid : str):
         return format_grpc_to_json(self.context_client.RemoveTopology(grpc_topology_id(context_uuid, topology_uuid)))
 
+class TopologyDetails(_Resource):
+    def get(self, context_uuid : str, topology_uuid : str):
+        topology_id = grpc_topology_id(context_uuid, topology_uuid)
+        return format_grpc_to_json(self.context_client.GetTopologyDetails(topology_id))
+
 class ServiceIds(_Resource):
     def get(self, context_uuid : str):
         return format_grpc_to_json(self.context_client.ListServiceIds(grpc_context_id(context_uuid)))
@@ -301,16 +306,20 @@ class Link(_Resource):
     def put(self, link_uuid : str):
         link_json = request.get_json()
         link = grpc_link(link_json)
-        virtual_types = {LinkTypeEnum.LINKTYPE_VIRTUAL_COPPER, LinkTypeEnum.LINKTYPE_VIRTUAL_OPTICAL}
         if link_uuid != link.link_id.link_uuid.uuid:
             raise BadRequest('Mismatching link_uuid')
-        elif link.link_type in virtual_types:
-            link = grpc_link(link_json)
-            return format_grpc_to_json(self.vntmanager_client.SetVirtualLink(link))    
-        return format_grpc_to_json(self.context_client.SetLink(grpc_link(link)))
+        if link.link_type == LinkTypeEnum.LINKTYPE_VIRTUAL:
+            return format_grpc_to_json(self.vntmanager_client.SetVirtualLink(link))
+        else:
+            return format_grpc_to_json(self.context_client.SetLink(link))
 
     def delete(self, link_uuid : str):
-        return format_grpc_to_json(self.context_client.RemoveLink(grpc_link_id(link_uuid)))
+        link_id = grpc_link_id(link_uuid)
+        link = self.context_client.GetLink(link_id)
+        if link.link_type == LinkTypeEnum.LINKTYPE_VIRTUAL:
+            return format_grpc_to_json(self.vntmanager_client.RemoveVirtualLink(link_id))
+        else:
+            return format_grpc_to_json(self.context_client.RemoveLink(link_id))
 
 class ConnectionIds(_Resource):
     def get(self, context_uuid : str, service_uuid : str):
diff --git a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py
index 304a326481f4713f4b2e4f860fd2d42c25ae656b..6605557ca1b1aa7d6eb8db55287beb19e3db62a5 100644
--- a/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py
+++ b/src/nbi/service/rest_server/nbi_plugins/tfs_api/__init__.py
@@ -22,7 +22,7 @@ from .Resources import (
     PolicyRule, PolicyRuleIds, PolicyRules,
     Service, ServiceIds, Services,
     Slice, SliceIds, Slices,
-    Topologies, Topology, TopologyIds
+    Topologies, Topology, TopologyDetails, TopologyIds
 )
 
 URL_PREFIX = '/tfs-api'
@@ -30,38 +30,39 @@ URL_PREFIX = '/tfs-api'
 # Use 'path' type since some identifiers might contain char '/' and Flask is unable to recognize them in 'string' type.
 RESOURCES = [
     # (endpoint_name, resource_class, resource_url)
-    ('api.context_ids',    ContextIds,    '/context_ids'),
-    ('api.contexts',       Contexts,      '/contexts'),
-    ('api.dummy_contexts', DummyContexts, '/dummy_contexts'),
-    ('api.context',        Context,       '/context/<path:context_uuid>'),
+    ('api.context_ids',      ContextIds,      '/context_ids'),
+    ('api.contexts',         Contexts,        '/contexts'),
+    ('api.dummy_contexts',   DummyContexts,   '/dummy_contexts'),
+    ('api.context',          Context,         '/context/<path:context_uuid>'),
 
-    ('api.topology_ids',   TopologyIds,   '/context/<path:context_uuid>/topology_ids'),
-    ('api.topologies',     Topologies,    '/context/<path:context_uuid>/topologies'),
-    ('api.topology',       Topology,      '/context/<path:context_uuid>/topology/<path:topology_uuid>'),
+    ('api.topology_ids',     TopologyIds,     '/context/<path:context_uuid>/topology_ids'),
+    ('api.topologies',       Topologies,      '/context/<path:context_uuid>/topologies'),
+    ('api.topology',         Topology,        '/context/<path:context_uuid>/topology/<path:topology_uuid>'),
+    ('api.topology_details', TopologyDetails, '/context/<path:context_uuid>/topology_details/<path:topology_uuid>'),
 
-    ('api.service_ids',    ServiceIds,    '/context/<path:context_uuid>/service_ids'),
-    ('api.services',       Services,      '/context/<path:context_uuid>/services'),
-    ('api.service',        Service,       '/context/<path:context_uuid>/service/<path:service_uuid>'),
+    ('api.service_ids',      ServiceIds,      '/context/<path:context_uuid>/service_ids'),
+    ('api.services',         Services,        '/context/<path:context_uuid>/services'),
+    ('api.service',          Service,         '/context/<path:context_uuid>/service/<path:service_uuid>'),
 
-    ('api.slice_ids',      SliceIds,      '/context/<path:context_uuid>/slice_ids'),
-    ('api.slices',         Slices,        '/context/<path:context_uuid>/slices'),
-    ('api.slice',          Slice,         '/context/<path:context_uuid>/slice/<path:slice_uuid>'),
+    ('api.slice_ids',        SliceIds,        '/context/<path:context_uuid>/slice_ids'),
+    ('api.slices',           Slices,          '/context/<path:context_uuid>/slices'),
+    ('api.slice',            Slice,           '/context/<path:context_uuid>/slice/<path:slice_uuid>'),
 
-    ('api.device_ids',     DeviceIds,     '/device_ids'),
-    ('api.devices',        Devices,       '/devices'),
-    ('api.device',         Device,        '/device/<path:device_uuid>'),
+    ('api.device_ids',       DeviceIds,       '/device_ids'),
+    ('api.devices',          Devices,         '/devices'),
+    ('api.device',           Device,          '/device/<path:device_uuid>'),
 
-    ('api.link_ids',       LinkIds,       '/link_ids'),
-    ('api.links',          Links,         '/links'),
-    ('api.link',           Link,          '/link/<path:link_uuid>'),
+    ('api.link_ids',         LinkIds,         '/link_ids'),
+    ('api.links',            Links,           '/links'),
+    ('api.link',             Link,            '/link/<path:link_uuid>'),
 
-    ('api.connection_ids', ConnectionIds, '/context/<path:context_uuid>/service/<path:service_uuid>/connection_ids'),
-    ('api.connections',    Connections,   '/context/<path:context_uuid>/service/<path:service_uuid>/connections'),
-    ('api.connection',     Connection,    '/connection/<path:connection_uuid>'),
+    ('api.connection_ids',   ConnectionIds,   '/context/<path:context_uuid>/service/<path:service_uuid>/connection_ids'),
+    ('api.connections',      Connections,     '/context/<path:context_uuid>/service/<path:service_uuid>/connections'),
+    ('api.connection',       Connection,      '/connection/<path:connection_uuid>'),
 
-    ('api.policyrule_ids', PolicyRuleIds, '/policyrule_ids'),
-    ('api.policyrules',    PolicyRules,   '/policyrules'),
-    ('api.policyrule',     PolicyRule,    '/policyrule/<path:policyrule_uuid>'),
+    ('api.policyrule_ids',   PolicyRuleIds,   '/policyrule_ids'),
+    ('api.policyrules',      PolicyRules,     '/policyrules'),
+    ('api.policyrule',       PolicyRule,      '/policyrule/<path:policyrule_uuid>'),
 ]
 
 def register_tfs_api(rest_server : RestServer):
diff --git a/src/nbi/tests/data/agg-net-topology.json b/src/nbi/tests/data/agg-net-topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..bb27d6f258fb317662a30ab746bbe0d0ffff331f
--- /dev/null
+++ b/src/nbi/tests/data/agg-net-topology.json
@@ -0,0 +1,858 @@
+{
+    "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": "ip-net-controller"
+                }
+            },
+            "name": "ip-net-controller",
+            "device_type": "ip-sdn-controller",
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "device_config": {
+                "config_rules": [
+                    {
+                        "action": 1,
+                        "custom": {
+                            "resource_key": "_connect/address",
+                            "resource_value": "10.0.58.29"
+                        }
+                    },
+                    {
+                        "action": 1,
+                        "custom": {
+                            "resource_key": "_connect/port",
+                            "resource_value": "80"
+                        }
+                    },
+                    {
+                        "action": 1,
+                        "custom": {
+                            "resource_key": "_connect/settings",
+                            "resource_value": {
+                                "endpoints": [
+                                    {
+                                        "uuid": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    }
+                                ],
+                                "scheme": "http",
+                                "username": "admin",
+                                "password": "admin",
+                                "base_url": "/restconf/v2/data",
+                                "timeout": 120,
+                                "verify": false
+                            }
+                        }
+                    }
+                ]
+            },
+            "device_endpoints": []
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.182.25"
+                }
+            },
+            "name": "172.16.182.25",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "200",
+                                        "name": "200",
+                                        "type": "optical",
+                                        "address_ip": "128.32.33.254",
+                                        "address_prefix": "24",
+                                        "site_location": "access"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.31"
+                }
+            },
+            "name": "172.16.185.31",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.33"
+                }
+            },
+            "name": "172.16.185.33",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.32"
+                }
+            },
+            "name": "172.16.185.32",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "200",
+                                        "name": "200",
+                                        "type": "optical",
+                                        "address_ip": "172.10.33.254",
+                                        "address_prefix": "24",
+                                        "site_location": "cloud"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.204.220"
+                }
+            },
+            "device_type": "emu-datacenter",
+            "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": [],
+                                        "type": "optical",
+                                        "uuid": "500"
+                                    },
+                                    {
+                                        "sample_types": [],
+                                        "type": "optical",
+                                        "uuid": "200"
+                                    },
+                                    {
+                                        "sample_types": [],
+                                        "type": "optical",
+                                        "uuid": "201"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        }
+    ],
+    "links": [
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.182.25/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.182.25/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.185.31/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.185.31/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.185.33/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.185.33/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.185.32/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.185.32/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.182.25-500"
+                }
+            },
+            "name": "172.16.182.25-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.33-500"
+                }
+            },
+            "name": "172.16.185.33-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.182.25-501"
+                }
+            },
+            "name": "172.16.182.25-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.31-501"
+                }
+            },
+            "name": "172.16.185.31-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.31-500"
+                }
+            },
+            "name": "172.16.185.31-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-500"
+                }
+            },
+            "name": "172.16.185.32-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.33-501"
+                }
+            },
+            "name": "172.16.185.33-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-501"
+                }
+            },
+            "name": "172.16.185.32-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-200"
+                }
+            },
+            "name": "172.16.185.32-200",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "200"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.204.220"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.204.220-500"
+                }
+            },
+            "name": "172.16.204.220-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.204.220"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "200"
+                    }
+                }
+            ]
+        }
+    ]
+}
diff --git a/src/nbi/tests/data/camara-e2e-topology.json b/src/nbi/tests/data/camara-e2e-topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..02a21e6918c5d8fb49016d7babe75a51bf751979
--- /dev/null
+++ b/src/nbi/tests/data/camara-e2e-topology.json
@@ -0,0 +1,1725 @@
+{
+  "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": "ip-transport-controller"
+        }
+      },
+      "name": "ip-transport-controller",
+      "device_type": "ietf-slice",
+      "device_operational_status": 1,
+      "device_drivers": [
+        14
+      ],
+      "device_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/address",
+              "resource_value": "10.0.58.9"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/port",
+              "resource_value": "80"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/settings",
+              "resource_value": {
+                "endpoints": [
+                  {
+                    "uuid": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  }
+                ],
+                "scheme": "http",
+                "username": "admin",
+                "password": "admin",
+                "base_url": "/restconf/v2/data",
+                "timeout": 120,
+                "verify": false
+              }
+            }
+          }
+        ]
+      },
+      "device_endpoints": []
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "agg-net-controller"
+        }
+      },
+      "name": "agg-net-controller",
+      "device_type": "ietf-slice",
+      "device_operational_status": 1,
+      "device_drivers": [
+        14
+      ],
+      "device_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/address",
+              "resource_value": "10.0.58.9"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/port",
+              "resource_value": "80"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/settings",
+              "resource_value": {
+                "endpoints": [
+                  {
+                    "uuid": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  }
+                ],
+                "scheme": "http",
+                "username": "admin",
+                "password": "admin",
+                "base_url": "/restconf/v2/data",
+                "timeout": 120,
+                "verify": false
+              }
+            }
+          }
+        ]
+      },
+      "device_endpoints": []
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "name": "nce-controller",
+      "device_type": "nce",
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "80"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/settings",
+              "resource_value": {
+                "endpoints": [
+                  {
+                    "uuid": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  }
+                ],
+                "scheme": "http",
+                "username": "admin",
+                "password": "admin",
+                "base_url": "/restconf/v2/data",
+                "timeout": 120,
+                "verify": false
+              }
+            }
+          }
+        ]
+      },
+      "device_endpoints": []
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.182.25"
+        }
+      },
+      "name": "172.16.182.25",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "128.32.33.254",
+                    "address_prefix": "24",
+                    "site_location": "access",
+                    "mtu": "1500"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.185.31"
+        }
+      },
+      "name": "172.16.185.31",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.185.33"
+        }
+      },
+      "name": "172.16.185.33",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.185.32"
+        }
+      },
+      "name": "172.16.185.32",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "ce-ip": "172.10.33.2",
+                    "address_ip": "172.10.33.254",
+                    "address_prefix": "24",
+                    "site_location": "cloud",
+                    "mtu": "1500"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.58.10"
+        }
+      },
+      "name": "172.16.58.10",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "201",
+                    "name": "201",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical",
+                    "address_ip": "128.32.33.2",
+                    "address_prefix": "24"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.61.10"
+        }
+      },
+      "name": "172.16.61.10",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical",
+                    "address_ip": "128.32.33.2",
+                    "address_prefix": "24"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.61.11"
+        }
+      },
+      "name": "172.16.61.11",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical",
+                    "address_ip": "128.32.33.2",
+                    "address_prefix": "24"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.104.221"
+        }
+      },
+      "device_type": "emu-datacenter",
+      "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": [],
+                    "type": "copper",
+                    "uuid": "eth0"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.104.222"
+        }
+      },
+      "device_type": "emu-datacenter",
+      "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": [],
+                    "type": "copper",
+                    "uuid": "eth0"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.204.220"
+        }
+      },
+      "device_type": "emu-datacenter",
+      "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": [],
+                    "type": "optical",
+                    "uuid": "500"
+                  },
+                  {
+                    "sample_types": [],
+                    "type": "optical",
+                    "uuid": "200"
+                  },
+                  {
+                    "sample_types": [],
+                    "type": "optical",
+                    "uuid": "201"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    }
+  ],
+  "links": [
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "agg-net-controller/mgmt==ip-transport-controller/mgmt"
+        }
+      },
+      "name": "agg-net-controller/mgmt==ip-transport-controller/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "agg-net-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "nce-controller/mgmt==172.16.61.11/mgmt"
+        }
+      },
+      "name": "nce-controller/mgmt==172.16.61.11/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "nce-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "nce-controller/mgmt==172.16.61.10/mgmt"
+        }
+      },
+      "name": "nce-controller/mgmt==172.16.61.10/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "nce-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "nce-controller/mgmt==172.16.58.10/mgmt"
+        }
+      },
+      "name": "nce-controller/mgmt==172.16.58.10/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "nce-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.185.33/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.185.33/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.185.31/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.185.31/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.185.32/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.185.32/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.182.25/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.182.25/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.182.25-500"
+        }
+      },
+      "name": "172.16.182.25-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.33-500"
+        }
+      },
+      "name": "172.16.185.33-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.182.25-501"
+        }
+      },
+      "name": "172.16.182.25-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.31-501"
+        }
+      },
+      "name": "172.16.185.31-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.31-500"
+        }
+      },
+      "name": "172.16.185.31-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.32-500"
+        }
+      },
+      "name": "172.16.185.32-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.33-501"
+        }
+      },
+      "name": "172.16.185.33-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.32-501"
+        }
+      },
+      "name": "172.16.185.32-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.32-200"
+        }
+      },
+      "name": "172.16.185.32-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.204.220"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.204.220-500"
+        }
+      },
+      "name": "172.16.204.220-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.204.220"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.182.25-200"
+        }
+      },
+      "name": "172.16.182.25-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.58.10-500"
+        }
+      },
+      "name": "172.16.58.10-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.58.10-200"
+        }
+      },
+      "name": "172.16.58.10-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.10-500"
+        }
+      },
+      "name": "172.16.61.10-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.58.10-201"
+        }
+      },
+      "name": "172.16.58.10-201",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "201"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.11-500"
+        }
+      },
+      "name": "172.16.61.11-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "201"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.10-200"
+        }
+      },
+      "name": "172.16.61.10-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.221"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.104.221-eth0"
+        }
+      },
+      "name": "172.16.104.221-eth0",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.221"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.11-200"
+        }
+      },
+      "name": "172.16.61.11-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.222"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.104.222-eth0"
+        }
+      },
+      "name": "172.16.104.222-eth0",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.222"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/src/nbi/tests/data/ip-net-descriptor.json b/src/nbi/tests/data/ip-net-descriptor.json
new file mode 100644
index 0000000000000000000000000000000000000000..dafeeb5bc22dd457fa7b924a30feac660b38f491
--- /dev/null
+++ b/src/nbi/tests/data/ip-net-descriptor.json
@@ -0,0 +1,535 @@
+{
+    "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": "172.16.182.25"
+                }
+            },
+            "name": "172.16.182.25",
+            "device_type": "emu-packet-router",
+            "device_operational_status": 1,
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "200",
+                                        "name": "200",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.31"
+                }
+            },
+            "name": "172.16.185.31",
+            "device_type": "emu-packet-router",
+            "device_operational_status": 1,
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.33"
+                }
+            },
+            "name": "172.16.185.33",
+            "device_type": "emu-packet-router",
+            "device_operational_status": 1,
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.32"
+                }
+            },
+            "name": "172.16.185.32",
+            "device_type": "emu-packet-router",
+            "device_operational_status": 1,
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "200",
+                                        "name": "200",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        }
+    ],
+    "links": [
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.182.25-500"
+                }
+            },
+            "name": "172.16.182.25-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.33-500"
+                }
+            },
+            "name": "172.16.185.33-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.182.25-501"
+                }
+            },
+            "name": "172.16.182.25-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.31-501"
+                }
+            },
+            "name": "172.16.185.31-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.31-500"
+                }
+            },
+            "name": "172.16.185.31-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-500"
+                }
+            },
+            "name": "172.16.185.32-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.33-501"
+                }
+            },
+            "name": "172.16.185.33-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-501"
+                }
+            },
+            "name": "172.16.185.32-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_connection_group_to_network_slice1.json b/src/nbi/tests/data/slice/post_connection_group_to_network_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..d39a837bd8c3719463e8ecfd3fbfc2d25111afef
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_connection_group_to_network_slice1.json
@@ -0,0 +1,62 @@
+{
+    "connection-group": [
+        {
+            "id": "line2",
+            "connectivity-type": "point-to-point",
+            "connectivity-construct": [
+                {
+                    "id": 1,
+                    "p2p-sender-sdp": "1",
+                    "p2p-receiver-sdp": "3",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "10"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "5000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "id": 2,
+                    "p2p-sender-sdp": "3",
+                    "p2p-receiver-sdp": "1",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "20"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "1000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_connection_group_to_network_slice2.json b/src/nbi/tests/data/slice/post_connection_group_to_network_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..d39a837bd8c3719463e8ecfd3fbfc2d25111afef
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_connection_group_to_network_slice2.json
@@ -0,0 +1,62 @@
+{
+    "connection-group": [
+        {
+            "id": "line2",
+            "connectivity-type": "point-to-point",
+            "connectivity-construct": [
+                {
+                    "id": 1,
+                    "p2p-sender-sdp": "1",
+                    "p2p-receiver-sdp": "3",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "10"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "5000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "id": 2,
+                    "p2p-sender-sdp": "3",
+                    "p2p-receiver-sdp": "1",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "20"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "1000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice1.json b/src/nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..16a36d45b86230b27eafa45a612b95c248a7b3ac
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice1.json
@@ -0,0 +1,40 @@
+{
+    "match-criterion": [
+        {
+            "index": 2,
+            "match-type": [
+                {
+                    "type": "ietf-network-slice-service:vlan",
+                    "value": [
+                        "101"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-ip-prefix",
+                    "value": [
+                        "172.1.101.22/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-tcp-port",
+                    "value": [
+                        "10200"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-ip-prefix",
+                    "value": [
+                        "172.16.104.222/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-tcp-port",
+                    "value": [
+                        "10500"
+                    ]
+                }
+            ],
+            "target-connection-group-id": "line2"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice2.json b/src/nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..8ceefdc2f2471af225143e5a1def2d7ba71e2ab1
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice2.json
@@ -0,0 +1,40 @@
+{
+    "match-criterion": [
+        {
+            "index": 2,
+            "match-type": [
+                {
+                    "type": "ietf-network-slice-service:vlan",
+                    "value": [
+                        "201"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-ip-prefix",
+                    "value": [
+                        "172.1.201.22/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-tcp-port",
+                    "value": [
+                        "10200"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-ip-prefix",
+                    "value": [
+                        "172.16.104.222/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-tcp-port",
+                    "value": [
+                        "10500"
+                    ]
+                }
+            ],
+            "target-connection-group-id": "line2"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_network_slice1.json b/src/nbi/tests/data/slice/post_network_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..e6e0ee90a25ff12f73c8f8896f9c2c74ab6b4019
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_network_slice1.json
@@ -0,0 +1,188 @@
+{
+    "slice-service": [
+        {
+            "id": "slice1",
+            "description": "network slice 1, connect to VM1",
+            "sdps": {
+                "sdp": [
+                    {
+                        "id": "1",
+                        "node-id": "172.16.204.220",
+                        "sdp-ip-address": [
+                            "172.16.204.220"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "101"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.1.101.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC POP to VM1",
+                                    "description": "AC VM1 connected to POP",
+                                    "ac-node-id": "172.16.204.220",
+                                    "ac-tp-id": "200"
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "id": "2",
+                        "node-id": "172.16.61.10",
+                        "sdp-ip-address": [
+                            "172.16.61.10"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "21"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.1.101.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC ONT",
+                                    "description": "AC connected to PC1",
+                                    "ac-node-id": "172.16.61.10",
+                                    "ac-tp-id": "200"
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "connection-groups": {
+                "connection-group": [
+                    {
+                        "id": "line1",
+                        "connectivity-type": "point-to-point",
+                        "connectivity-construct": [
+                            {
+                                "id": 1,
+                                "p2p-sender-sdp": "1",
+                                "p2p-receiver-sdp": "2",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "10"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "5000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            },
+                            {
+                                "id": 2,
+                                "p2p-sender-sdp": "2",
+                                "p2p-receiver-sdp": "1",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "20"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "1000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_network_slice2.json b/src/nbi/tests/data/slice/post_network_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..97e6ade27449be0a3816085aa31b707ffbb6f813
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_network_slice2.json
@@ -0,0 +1,189 @@
+{
+    "slice-service": [
+        {
+            "id": "slice2",
+            "description": "network slice 2, connect to VM2",
+            "sdps": {
+                "sdp": [
+                    {
+                        "id": "1",
+                        "node-id": "172.16.204.220",
+                        "sdp-ip-address": [
+                            "172.16.204.220"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "201"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.1.201.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC POP to VM2",
+                                    "description": "AC VM2 connected to POP",
+                                    "ac-node-id": "172.16.204.220",
+                                    "ac-tp-id": "201"
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "id": "2",
+                        "node-id": "172.16.61.10",
+                        "sdp-ip-address": [
+                            "172.16.61.10"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "31"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.1.201.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC ONT",
+                                    "description": "AC connected to PC",
+                                    "ac-node-id": "172.16.61.10",
+                                    "ac-tp-id": "200",
+                                    "ac-ipv4-address": "172.16.61.10"
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "connection-groups": {
+                "connection-group": [
+                    {
+                        "id": "line1",
+                        "connectivity-type": "point-to-point",
+                        "connectivity-construct": [
+                            {
+                                "id": 1,
+                                "p2p-sender-sdp": "1",
+                                "p2p-receiver-sdp": "2",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "10"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "5000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            },
+                            {
+                                "id": 2,
+                                "p2p-sender-sdp": "2",
+                                "p2p-receiver-sdp": "1",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "20"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "1000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+    ]
+}
diff --git a/src/nbi/tests/data/slice/post_sdp_to_network_slice1.json b/src/nbi/tests/data/slice/post_sdp_to_network_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..bd3895fc4ae5a9a0b2059be3f6b31a05451abd22
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_sdp_to_network_slice1.json
@@ -0,0 +1,61 @@
+{
+    "sdp": [
+        {
+            "id": "3",
+            "node-id": "172.16.61.11",
+            "sdp-ip-address": [
+                "172.16.61.11"
+            ],
+            "service-match-criteria": {
+                "match-criterion": [
+                    {
+                        "index": 1,
+                        "match-type": [
+                            {
+                                "type": "ietf-network-slice-service:vlan",
+                                "value": [
+                                    "21"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-ip-prefix",
+                                "value": [
+                                    "172.16.104.222/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-tcp-port",
+                                "value": [
+                                    "10500"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-ip-prefix",
+                                "value": [
+                                    "172.1.101.22/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-tcp-port",
+                                "value": [
+                                    "10200"
+                                ]
+                            }
+                        ],
+                        "target-connection-group-id": "line2"
+                    }
+                ]
+            },
+            "attachment-circuits": {
+                "attachment-circuit": [
+                    {
+                        "id": "AC ONT",
+                        "description": "AC connected to PC2",
+                        "ac-node-id": "172.16.61.11",
+                        "ac-tp-id": "200"
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/data/slice/post_sdp_to_network_slice2.json b/src/nbi/tests/data/slice/post_sdp_to_network_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..0b147125bd7eb3efc84c87bebab919639782f760
--- /dev/null
+++ b/src/nbi/tests/data/slice/post_sdp_to_network_slice2.json
@@ -0,0 +1,62 @@
+{
+    "sdp": [
+        {
+            "id": "3",
+            "node-id": "172.16.61.11",
+            "sdp-ip-address": [
+                "172.16.61.11"
+            ],
+            "service-match-criteria": {
+                "match-criterion": [
+                    {
+                        "index": 1,
+                        "match-type": [
+                            {
+                                "type": "ietf-network-slice-service:vlan",
+                                "value": [
+                                    "31"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-ip-prefix",
+                                "value": [
+                                    "172.16.104.222/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-tcp-port",
+                                "value": [
+                                    "10500"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-ip-prefix",
+                                "value": [
+                                    "172.1.201.22/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-tcp-port",
+                                "value": [
+                                    "10200"
+                                ]
+                            }
+                        ],
+                        "target-connection-group-id": "line2"
+                    }
+                ]
+            },
+            "attachment-circuits": {
+                "attachment-circuit": [
+                    {
+                        "id": "AC ONT",
+                        "description": "AC connected to PC2",
+                        "ac-node-id": "172.16.61.11",
+                        "ac-tp-id": "200",
+                        "ac-ipv4-address": "172.16.61.11"
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/nbi/tests/test_slice_2.py b/src/nbi/tests/test_slice_2.py
new file mode 100644
index 0000000000000000000000000000000000000000..5722e3d922a79bd169fc80a5374c4daab4f5d7d9
--- /dev/null
+++ b/src/nbi/tests/test_slice_2.py
@@ -0,0 +1,205 @@
+# Copyright 2022-2024 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+from typing import Optional
+
+from common.proto.context_pb2 import ConfigRule, ServiceConfig, SliceList
+from context.client.ContextClient import ContextClient
+from nbi.service.rest_server.nbi_plugins.ietf_network_slice.ietf_slice_handler import (
+    IETFSliceHandler,
+)
+
+
+def get_custom_config_rule(
+    service_config: ServiceConfig, resource_key: str
+) -> Optional[ConfigRule]:
+    for cr in service_config.config_rules:
+        if (
+            cr.WhichOneof("config_rule") == "custom"
+            and cr.custom.resource_key == resource_key
+        ):
+            return cr
+
+
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
+
+context_client = ContextClient()
+
+with open("nbi/tests/data/slice/post_network_slice1.json", mode="r") as f:
+    post_slice_request = json.load(f)
+
+with open("nbi/tests/data/slice/post_sdp_to_network_slice1.json", mode="r") as f:
+    post_sdp_request = json.load(f)
+
+with open(
+    "nbi/tests/data/slice/post_connection_group_to_network_slice1.json", mode="r"
+) as f:
+    post_connection_group_request = json.load(f)
+
+with open(
+    "nbi/tests/data/slice/post_match_criteria_to_sdp1_in_slice1.json", mode="r"
+) as f:
+    post_match_criteria_request = json.load(f)
+
+slice_1 = None
+
+
+def select_slice(*args) -> SliceList:
+    slice_list = SliceList()
+    slice_list.slices.extend([slice_1])
+    return slice_list
+
+
+def test_create_slice():
+    global slice_1
+
+    slice_1 = IETFSliceHandler.create_slice_service(post_slice_request)
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    assert candidate_ietf_data["network-slice-services"] == post_slice_request
+    assert slice_1.slice_endpoint_ids[0].device_id.device_uuid.uuid == "172.16.204.220"
+    assert slice_1.slice_endpoint_ids[1].device_id.device_uuid.uuid == "172.16.61.10"
+    assert slice_1.slice_id.slice_uuid.uuid == "slice1"
+
+
+def test_create_sdp(monkeypatch):
+    global slice_1
+
+    monkeypatch.setattr(context_client, "SelectSlice", select_slice)
+
+    slice_1 = IETFSliceHandler.create_sdp(post_sdp_request, "slice1", context_client)
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_services = candidate_ietf_data["network-slice-services"]["slice-service"]
+    slice_service = slice_services[0]
+    slice_sdps = slice_service["sdps"]["sdp"]
+    assert len(slice_sdps) == 3
+
+
+def test_create_connection_group(monkeypatch):
+    global slice_1
+
+    monkeypatch.setattr(context_client, "SelectSlice", select_slice)
+
+    slice_1 = IETFSliceHandler.create_connection_group(
+        post_connection_group_request, "slice1", context_client
+    )
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_services = candidate_ietf_data["network-slice-services"]["slice-service"]
+    slice_service = slice_services[0]
+    slice_connection_groups = slice_service["connection-groups"]["connection-group"]
+
+    assert slice_connection_groups[0]["id"] == "line1"
+    assert slice_connection_groups[1]["id"] == "line2"
+    assert len(slice_connection_groups) == 2
+
+
+def test_create_match_criteria(monkeypatch):
+    global slice_1
+
+    monkeypatch.setattr(context_client, "SelectSlice", select_slice)
+
+    slice_1 = IETFSliceHandler.create_match_criteria(
+        post_match_criteria_request, "slice1", "1", context_client
+    )
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_services = candidate_ietf_data["network-slice-services"]["slice-service"]
+    slice_service = slice_services[0]
+    slice_sdps = slice_service["sdps"]["sdp"]
+    sdp1_match_criteria = slice_sdps[0]["service-match-criteria"]["match-criterion"]
+
+    slice_1 = IETFSliceHandler.copy_candidate_ietf_slice_data_to_running("slice1", context_client)
+    assert len(sdp1_match_criteria) == 2
+    assert sdp1_match_criteria[0]["target-connection-group-id"] == "line1"
+    assert sdp1_match_criteria[1]["target-connection-group-id"] == "line2"
+    assert slice_1.slice_endpoint_ids[0].device_id.device_uuid.uuid == "172.16.204.220"
+    assert slice_1.slice_endpoint_ids[1].device_id.device_uuid.uuid == "172.16.61.11"
+
+
+def test_delete_sdp(monkeypatch):
+    global slice_1
+
+    monkeypatch.setattr(context_client, "SelectSlice", select_slice)
+
+    slice_1 = IETFSliceHandler.delete_sdp("slice1", "3", context_client)
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_services = candidate_ietf_data["network-slice-services"]["slice-service"]
+    slice_service = slice_services[0]
+    slice_sdps = slice_service["sdps"]["sdp"]
+    assert len(slice_sdps) == 2
+    assert "3" not in (sdp["id"] for sdp in slice_sdps)
+
+
+def test_delete_connection_group(monkeypatch):
+    global slice_1
+
+    monkeypatch.setattr(context_client, "SelectSlice", select_slice)
+    running_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, RUNNING_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_1 = IETFSliceHandler.delete_connection_group(
+        "slice1", "line2", context_client
+    )
+    
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_services = candidate_ietf_data["network-slice-services"]["slice-service"]
+    slice_service = slice_services[0]
+    slice_connection_groups = slice_service["connection-groups"]["connection-group"]
+    assert len(slice_connection_groups) == 1
+    assert slice_connection_groups[0]["id"] == "line1"
+
+
+def test_delete_match_criteria(monkeypatch):
+    global slice_1
+
+    monkeypatch.setattr(context_client, "SelectSlice", select_slice)
+
+    slice_1 = IETFSliceHandler.delete_match_criteria("slice1", "1", 2, context_client)
+    candidate_ietf_data = json.loads(
+        get_custom_config_rule(
+            slice_1.slice_config, CANDIDATE_RESOURCE_KEY
+        ).custom.resource_value
+    )
+    slice_services = candidate_ietf_data["network-slice-services"]["slice-service"]
+    slice_service = slice_services[0]
+    slice_sdps = slice_service["sdps"]["sdp"]
+    sdp1_match_criteria = slice_sdps[0]["service-match-criteria"]["match-criterion"]
+    assert len(sdp1_match_criteria) == 1
+    assert sdp1_match_criteria[0]["target-connection-group-id"] == "line1"
diff --git a/src/pathcomp/frontend/service/PathCompService.py b/src/pathcomp/frontend/service/PathCompService.py
index c19e59e77b9b5f75f66eec07990691a76cdc36b7..6e413c14eb293f3073bfb1d80963dab58ba04308 100644
--- a/src/pathcomp/frontend/service/PathCompService.py
+++ b/src/pathcomp/frontend/service/PathCompService.py
@@ -14,8 +14,9 @@
 
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
-from common.tools.service.GenericGrpcService import GenericGrpcService
+from common.proto.pathcomp_pb2 import DESCRIPTOR as PATHCOMP_DESCRIPTOR
 from common.proto.pathcomp_pb2_grpc import add_PathCompServiceServicer_to_server
+from common.tools.service.GenericGrpcService import GenericGrpcService
 from .PathCompServiceServicerImpl import PathCompServiceServicerImpl
 
 class PathCompService(GenericGrpcService):
@@ -26,3 +27,5 @@ class PathCompService(GenericGrpcService):
 
     def install_servicers(self):
         add_PathCompServiceServicer_to_server(self.pathcomp_servicer, self.server)
+
+        self.add_reflection_service_name(PATHCOMP_DESCRIPTOR, 'PathCompService')
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py
index 80b214b9cfc2b11998e9390f623952b9824c0d86..39109133c36b4a22adf68e814ae2e2e58a756e9b 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ComposeConfigRules.py
@@ -22,6 +22,8 @@ LOGGER = logging.getLogger(__name__)
 
 SETTINGS_RULE_NAME = '/settings'
 STATIC_ROUTING_RULE_NAME = '/static_routing'
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
 
 RE_UUID = re.compile(r'([0-9a-fA-F]{8})\-([0-9a-fA-F]{4})\-([0-9a-fA-F]{4})\-([0-9a-fA-F]{4})\-([0-9a-fA-F]{12})')
 
@@ -97,6 +99,8 @@ def compose_l3nm_config_rules(main_service_config_rules : List, subservice_confi
     CONFIG_RULES = [
         (SETTINGS_RULE_NAME, L3NM_SETTINGS_FIELD_DEFAULTS),
         (STATIC_ROUTING_RULE_NAME, {}),
+        (RUNNING_RESOURCE_KEY, {}),
+        (CANDIDATE_RESOURCE_KEY, {}),
     ]
     for rule_name, defaults in CONFIG_RULES:
         compose_config_rules(main_service_config_rules, subservice_config_rules, rule_name, defaults)
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py b/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py
index dfcd1156b78cebee7da84033cbc9943aaabdb14d..7cd419c6be3896c034abf43a8abe45fccbad1733 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ComputeSubServices.py
@@ -45,24 +45,41 @@
 #         ], [UUID('c2e57966-5d82-4705-a5fe-44cf6487219e')])
 # ]
 
-import logging, queue, uuid
+import logging, queue
+from dataclasses import dataclass, field
 from typing import Dict, List, Optional, Tuple
 from common.DeviceTypes import DeviceTypeEnum
 from common.proto.context_pb2 import Device, ServiceTypeEnum
+from common.tools.context_queries.Slice import get_uuid_from_string
 from .ResourceGroups import IGNORED_DEVICE_TYPES, REMOTEDOMAIN_DEVICE_TYPES, get_resource_classification
 from .ServiceTypes import get_service_type
 
 LOGGER = logging.getLogger(__name__)
 
+@dataclass
+class ConnectionEntry:
+    uuid: str = ''
+    service_type : ServiceTypeEnum = ServiceTypeEnum.SERVICETYPE_UNKNOWN
+    path_hops    : List[Dict] = field(default_factory=list)
+    dependencies : List['ConnectionEntry'] = field(default_factory=list)
+
+    def calculate_subservice_uuid(self, main_service_uuid: str) -> None:
+        if self.uuid:
+            return
+        composed_string = main_service_uuid + '-'.join(
+            f'{path_hop["device"]}/{path_hop["ingress_ep"]}/{path_hop["egress_ep"]}' for path_hop in self.path_hops
+        )
+        self.uuid = get_uuid_from_string(composed_string)
+
 def convert_explicit_path_hops_to_connections(
     path_hops : List[Dict], device_dict : Dict[str, Tuple[Dict, Device]],
     main_service_uuid : str, main_service_type : ServiceTypeEnum
-) -> List[Tuple[str, int, List[str], List[str]]]:
+) -> List[Tuple[str, int, List[Dict], List[str]]]:
 
     LOGGER.debug('path_hops={:s}'.format(str(path_hops)))
 
     connection_stack = queue.LifoQueue()
-    connections : List[Tuple[str, int, List[str], List[str]]] = list()
+    connections : List[ConnectionEntry] = list()
     prv_device_uuid = None
     prv_res_class : Tuple[Optional[int], Optional[DeviceTypeEnum], Optional[str]] = None, None, None
 
@@ -85,82 +102,82 @@ def convert_explicit_path_hops_to_connections(
             LOGGER.debug('  create and terminate underlying connection')
 
             # create underlying connection
-            sub_service_uuid = str(uuid.uuid4())
-            prv_service_type = connection_stack.queue[-1][1]
+            prv_service_type = connection_stack.queue[-1].service_type
             service_type = get_service_type(res_class[1], prv_service_type)
-            connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
+            connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop])
+            connection_stack.put(connection_entry)
 
             # underlying connection ended
-            connection = connection_stack.get()
+            connection: ConnectionEntry = connection_stack.get()
             connections.append(connection)
-            connection_stack.queue[-1][3].append(connection[0])
-            #connection_stack.queue[-1][2].append(path_hop)
+            connection_stack.queue[-1].dependencies.append(connection)
         elif prv_res_class[2] is None and res_class[2] is not None:
             # entering domain of a device controller, create underlying connection
             LOGGER.debug('  entering domain of a device controller, create underlying connection')
-            sub_service_uuid = str(uuid.uuid4())
-            prv_service_type = connection_stack.queue[-1][1]
+            prv_service_type = connection_stack.queue[-1].service_type
             service_type = get_service_type(res_class[1], prv_service_type)
-            connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
+            connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop])
+            connection_stack.put(connection_entry)
         elif prv_res_class[2] is not None and res_class[2] is None:
             # leaving domain of a device controller, terminate underlying connection
             LOGGER.debug('  leaving domain of a device controller, terminate underlying connection')
             connection = connection_stack.get()
             connections.append(connection)
-            connection_stack.queue[-1][3].append(connection[0])
-            connection_stack.queue[-1][2].append(path_hop)
+            connection_stack.queue[-1].dependencies.append(connection)
+            connection_stack.queue[-1].path_hops.append(path_hop)
         elif prv_res_class[2] is not None and res_class[2] is not None:
             if prv_res_class[2] == res_class[2]:
                 # stay in domain of a device controller, connection continues
                 LOGGER.debug('  stay in domain of a device controller, connection continues')
-                connection_stack.queue[-1][2].append(path_hop)
+                connection_stack.queue[-1].path_hops.append(path_hop)
             else:
                 # switching to different device controller, chain connections
                 LOGGER.debug('  switching to different device controller, chain connections')
                 connection = connection_stack.get()
                 connections.append(connection)
-                connection_stack.queue[-1][3].append(connection[0])
+                connection_stack.queue[-1].dependencies.append(connection)
 
-                sub_service_uuid = str(uuid.uuid4())
-                prv_service_type = connection_stack.queue[-1][1]
+                prv_service_type = connection_stack.queue[-1].service_type
                 service_type = get_service_type(res_class[1], prv_service_type)
-                connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
+                connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop])
+                connection_stack.put(connection_entry)
         elif prv_res_class[0] is None:
             # path ingress
             LOGGER.debug('  path ingress')
-            connection_stack.put((main_service_uuid, main_service_type, [path_hop], []))
+            connection_entry = ConnectionEntry(uuid=main_service_uuid, service_type=main_service_type, path_hops=[path_hop])
+            connection_stack.put(connection_entry)
         elif prv_res_class[0] > res_class[0]:
             # create underlying connection
             LOGGER.debug('  create underlying connection')
-            sub_service_uuid = str(uuid.uuid4())
-            prv_service_type = connection_stack.queue[-1][1]
+            prv_service_type = connection_stack.queue[-1].service_type
             service_type = get_service_type(res_class[1], prv_service_type)
-            connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
+            connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop])
+            connection_stack.put(connection_entry)
         elif prv_res_class[0] == res_class[0]:
             # same resource group kind
             LOGGER.debug('  same resource group kind')
             if prv_res_class[1] == res_class[1] and prv_res_class[2] == res_class[2]:
                 # same device type and device controller: connection continues
                 LOGGER.debug('  connection continues')
-                connection_stack.queue[-1][2].append(path_hop)
+                connection_stack.queue[-1].path_hops.append(path_hop)
             else:
                 # different device type or device controller: chain connections
                 LOGGER.debug('  chain connections')
                 connection = connection_stack.get()
                 connections.append(connection)
-                connection_stack.queue[-1][3].append(connection[0])
+                connection_stack.queue[-1].dependencies.append(connection)
 
-                sub_service_uuid = str(uuid.uuid4())
-                prv_service_type = connection_stack.queue[-1][1]
+                prv_service_type = connection_stack.queue[-1].service_type
                 service_type = get_service_type(res_class[1], prv_service_type)
-                connection_stack.put((sub_service_uuid, service_type, [path_hop], []))
+                connection_entry = ConnectionEntry(service_type=service_type, path_hops=[path_hop])
+                connection_stack.put(connection_entry)
         elif prv_res_class[0] < res_class[0]:
             # underlying connection ended
             LOGGER.debug('  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)
+            connection_stack.queue[-1].dependencies.append(connection)
+            connection_stack.queue[-1].path_hops.append(path_hop)
         else:
             raise Exception('Uncontrolled condition')
 
@@ -172,7 +189,9 @@ def convert_explicit_path_hops_to_connections(
     connections.append(connection_stack.get())
     LOGGER.debug('connections={:s}'.format(str(connections)))
     assert connection_stack.empty()
-    return connections
+    for c in connections:
+        c.calculate_subservice_uuid(main_service_uuid)
+    return [(c.uuid, c.service_type, c.path_hops, [cd.uuid for cd in c.dependencies]) for c in connections]
 
 def convert_explicit_path_hops_to_plain_connection(
     path_hops : List[Dict], main_service_uuid : str, main_service_type : ServiceTypeEnum
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py
index 42635bf4ad5cfd1a1a4cb174b73d26c51576af9a..db0c552487363e4bb283832c7e40a4e7623e994c 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ResourceGroups.py
@@ -22,10 +22,15 @@ 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.EMULATED_CLIENT.value                 : 90,
+    DeviceTypeEnum.CLIENT.value                          : 90,
 
     DeviceTypeEnum.TERAFLOWSDN_CONTROLLER.value          : 80,
     DeviceTypeEnum.EMULATED_IP_SDN_CONTROLLER.value      : 80,
     DeviceTypeEnum.IP_SDN_CONTROLLER.value               : 80,
+    DeviceTypeEnum.IETF_SLICE.value                      : 80,
+    DeviceTypeEnum.NCE.value                             : 80,
+
 
     DeviceTypeEnum.EMULATED_PACKET_ROUTER.value          : 70,
     DeviceTypeEnum.PACKET_ROUTER.value                   : 70,
@@ -50,6 +55,8 @@ DEVICE_TYPE_TO_DEEPNESS = {
     DeviceTypeEnum.OPTICAL_TRANSPONDER.value             : 10,
     DeviceTypeEnum.EMULATED_OPTICAL_ROADM.value          : 10,
     DeviceTypeEnum.OPTICAL_ROADM.value                   : 10,
+    DeviceTypeEnum.QKD_NODE.value                        : 10,
+    DeviceTypeEnum.OPEN_ROADM.value                      : 10,
 
     DeviceTypeEnum.EMULATED_OPTICAL_SPLITTER.value       :  0,
     DeviceTypeEnum.NETWORK.value                         :  0, # network out of our control; always delegate
diff --git a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py
index f1676ccfbd923de77f3bedc768a553f99d659041..f5a63e8d8680be631c4da09fc4b1a11a5cfe2415 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/ServiceTypes.py
@@ -22,6 +22,7 @@ NETWORK_DEVICE_TYPES = {
 
 PACKET_DEVICE_TYPES = {
     DeviceTypeEnum.TERAFLOWSDN_CONTROLLER,
+    DeviceTypeEnum.IETF_SLICE, DeviceTypeEnum.NCE,
     DeviceTypeEnum.IP_SDN_CONTROLLER, DeviceTypeEnum.EMULATED_IP_SDN_CONTROLLER,
     DeviceTypeEnum.PACKET_ROUTER, DeviceTypeEnum.EMULATED_PACKET_ROUTER,
     DeviceTypeEnum.PACKET_SWITCH, DeviceTypeEnum.EMULATED_PACKET_SWITCH,
diff --git a/src/service/requirements.in b/src/service/requirements.in
index 3f8d2a35453691420a9469dfffd0a0d2648c6397..d0dd6dcfe13610fc315a50437fb5f3e094b4ee5e 100644
--- a/src/service/requirements.in
+++ b/src/service/requirements.in
@@ -13,6 +13,7 @@
 # limitations under the License.
 
 
+deepdiff==6.7.*
 anytree==2.8.0
 geopy==2.3.0
 netaddr==0.9.0
diff --git a/src/service/service/ServiceService.py b/src/service/service/ServiceService.py
index b99826e5b0f6ab8b228c32f4c7811181c83c7198..e088a99ebcc2e1b8258500df33ed8e319202d41c 100644
--- a/src/service/service/ServiceService.py
+++ b/src/service/service/ServiceService.py
@@ -14,6 +14,7 @@
 
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
+from common.proto.service_pb2 import DESCRIPTOR as SERVICE_DESCRIPTOR
 from common.proto.service_pb2_grpc import add_ServiceServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from .ServiceServiceServicerImpl import ServiceServiceServicerImpl
@@ -27,3 +28,5 @@ class ServiceService(GenericGrpcService):
 
     def install_servicers(self):
         add_ServiceServiceServicer_to_server(self.service_servicer, self.server)
+
+        self.add_reflection_service_name(SERVICE_DESCRIPTOR, 'ServiceService')
diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py
index 59d6a57a92a7a3605906ec491b18126d6534856b..8c4a46d6feab3717d5f54ef056f160022d144295 100644
--- a/src/service/service/service_handler_api/FilterFields.py
+++ b/src/service/service/service_handler_api/FilterFields.py
@@ -43,8 +43,12 @@ DEVICE_DRIVER_VALUES = {
     DeviceDriverEnum.DEVICEDRIVER_GNMI_OPENCONFIG,
     DeviceDriverEnum.DEVICEDRIVER_OPTICAL_TFS,
     DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN,
+    DeviceDriverEnum.DEVICEDRIVER_NCE,
+    DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE,
+    DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN,
     DeviceDriverEnum.DEVICEDRIVER_OC,
     DeviceDriverEnum.DEVICEDRIVER_QKD,
+    DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN,
 }
 
 # 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_handlers/__init__.py b/src/service/service/service_handlers/__init__.py
index dac6656107055656595a14e8b8dabfe8555daad2..d61694bd06cf6472b433b733a3896337a96a9ec2 100644
--- a/src/service/service/service_handlers/__init__.py
+++ b/src/service/service/service_handlers/__init__.py
@@ -16,11 +16,14 @@ from common.proto.context_pb2 import DeviceDriverEnum, ServiceTypeEnum
 from ..service_handler_api.FilterFields import FilterFieldEnum
 from .l2nm_emulated.L2NMEmulatedServiceHandler import L2NMEmulatedServiceHandler
 from .l2nm_ietfl2vpn.L2NM_IETFL2VPN_ServiceHandler import L2NM_IETFL2VPN_ServiceHandler
+from .l3nm_ietfl3vpn.L3NM_IETFL3VPN_ServiceHandler import L3NM_IETFL3VPN_ServiceHandler
 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 .l3nm_ietf_actn.L3NMIetfActnServiceHandler import L3NMIetfActnServiceHandler
+from .l3nm_nce.L3NMNCEServiceHandler import L3NMNCEServiceHandler
+from .l3slice_ietfslice.L3SliceIETFSliceServiceHandler import L3NMSliceIETFSliceServiceHandler
 from .microwave.MicrowaveServiceHandler import MicrowaveServiceHandler
 from .p4.p4_service_handler import P4ServiceHandler
 from .tapi_tapi.TapiServiceHandler import TapiServiceHandler
@@ -67,6 +70,24 @@ SERVICE_HANDLERS = [
             FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_IETF_ACTN,
         }
     ]),
+    (L3NM_IETFL3VPN_ServiceHandler, [
+        {
+            FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_L3NM,
+            FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_IETF_L3VPN,
+        }
+    ]),
+    (L3NMNCEServiceHandler, [
+        {
+            FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_L3NM,
+            FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_NCE,
+        }
+    ]),
+    (L3NMSliceIETFSliceServiceHandler, [
+        {
+            FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_L3NM,
+            FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_IETF_SLICE,
+        }
+    ]),
     (TapiServiceHandler, [
         {
             FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE,
diff --git a/src/service/service/service_handlers/l3nm_emulated/ConfigRules.py b/src/service/service/service_handlers/l3nm_emulated/ConfigRules.py
index 1d6764619e81864e9b048319a087f1a10f17d601..f1b02eab564c6a2eb38f25e4567a2a04ca0156ed 100644
--- a/src/service/service/service_handlers/l3nm_emulated/ConfigRules.py
+++ b/src/service/service/service_handlers/l3nm_emulated/ConfigRules.py
@@ -43,7 +43,7 @@ def setup_config_rules(
     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
-    if_subif_name       = '{:s}.{:d}'.format(endpoint_name, vlan_id)
+    if_subif_name       = '{:s}.{:s}'.format(endpoint_name, str(vlan_id))
 
     json_config_rules = [
         json_config_rule_set(
@@ -57,7 +57,7 @@ def setup_config_rules(
                 'name': endpoint_name, 'description': network_interface_desc, 'mtu': mtu,
         }),
         json_config_rule_set(
-            '/interface[{:s}]/subinterface[{:d}]'.format(endpoint_name, sub_interface_index), {
+            '/interface[{:s}]/subinterface[{:s}]'.format(endpoint_name, str(sub_interface_index)), {
                 'name': endpoint_name, 'index': sub_interface_index,
                 'description': network_subinterface_desc, 'vlan_id': vlan_id,
                 'address_ip': address_ip, 'address_prefix': address_prefix,
@@ -163,7 +163,7 @@ def teardown_config_rules(
     #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
 
-    if_subif_name             = '{:s}.{:d}'.format(endpoint_name, vlan_id)
+    if_subif_name             = '{:s}.{:s}'.format(endpoint_name, str(vlan_id))
     service_short_uuid        = service_uuid.split('-')[-1]
     network_instance_name     = '{:s}-NetInst'.format(service_short_uuid)
     #network_interface_desc    = '{:s}-NetIf'.format(service_uuid)
@@ -175,7 +175,7 @@ def teardown_config_rules(
                 'name': network_instance_name, 'id': if_subif_name,
         }),
         json_config_rule_delete(
-            '/interface[{:s}]/subinterface[{:d}]'.format(endpoint_name, sub_interface_index), {
+            '/interface[{:s}]/subinterface[{:s}]'.format(endpoint_name, str(sub_interface_index)), {
                 'name': endpoint_name, 'index': sub_interface_index,
         }),
         json_config_rule_delete(
diff --git a/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py b/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py
index b315c7f4d44c7f806a68b8466c393c1668d1d3bb..cdc58049d8c22dbd0ed4b338aa5c0f0e61e9842e 100644
--- a/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py
+++ b/src/service/service/service_handlers/l3nm_gnmi_openconfig/StaticRouteGenerator.py
@@ -72,6 +72,15 @@ class StaticRouteGenerator:
             added_connection_hops.add(connection_hop)
         connection_hop_list = filtered_connection_hop_list
 
+        # In some cases connection_hop_list first and last items might be internal endpoints of
+        # devices instead of link endpoints. Filter those endpoints not reaching a new device.
+        if len(connection_hop_list) > 2 and connection_hop_list[0][0] == connection_hop_list[1][0]:
+            # same device on first 2 endpoints
+            connection_hop_list = connection_hop_list[1:]
+        if len(connection_hop_list) > 2 and connection_hop_list[-1][0] == connection_hop_list[-2][0]:
+            # same device on last 2 endpoints
+            connection_hop_list = connection_hop_list[:-1]
+
         num_connection_hops = len(connection_hop_list)
         if num_connection_hops % 2 != 0: raise Exception('Number of connection hops must be even')
         if num_connection_hops < 4: raise Exception('Number of connection hops must be >= 4')
diff --git a/src/service/service/service_handlers/l3nm_ietfl3vpn/ConfigRules.py b/src/service/service/service_handlers/l3nm_ietfl3vpn/ConfigRules.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5638fc104c253be20ef1bbeb6c69a4392095ad2
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_ietfl3vpn/ConfigRules.py
@@ -0,0 +1,316 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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, Tuple, TypedDict
+
+from common.proto.context_pb2 import Link
+from common.tools.object_factory.ConfigRule import (
+    json_config_rule_delete,
+    json_config_rule_set,
+)
+from context.client.ContextClient import ContextClient
+
+
+class LANPrefixesDict(TypedDict):
+    lan: str
+    lan_tag: str
+
+
+SITE_NETWORK_ACCESS_TYPE = "ietf-l3vpn-svc:multipoint"
+
+
+def create_site_dict(
+    site_id: str,
+    site_location: str,
+    device_uuid: str,
+    endpoint_uuid: str,
+    service_uuid: str,
+    role: str,
+    management_type: str,
+    ce_address: str,
+    pe_address: str,
+    ce_pe_network_prefix: int,
+    mtu: int,
+    input_bw: int,
+    output_bw: int,
+    qos_profile_id: str,
+    qos_profile_direction: str,
+    qos_profile_latency: int,
+    qos_profile_bw_guarantee: int,
+    lan_prefixes: List[LANPrefixesDict],
+) -> Dict:
+    """
+    Helper function that creates a dictionary representing a single 'site'
+    entry (including management, locations, devices, routing-protocols, and
+    site-network-accesses).
+    """
+    site_lan_prefixes = [
+        {
+            "lan": lp["lan"],
+            "lan-tag": lp["lan_tag"],
+            "next-hop": ce_address,
+        }
+        for lp in lan_prefixes
+    ]
+
+    return {
+        "site-id": site_id,
+        "management": {"type": management_type},
+        "locations": {"location": [{"location-id": site_location}]},
+        "devices": {
+            "device": [
+                {
+                    "device-id": device_uuid,
+                    "location": site_location,
+                }
+            ]
+        },
+        "routing-protocols": {
+            "routing-protocol": [
+                {
+                    "type": "ietf-l3vpn-svc:static",
+                    "static": {
+                        "cascaded-lan-prefixes": {
+                            "ipv4-lan-prefixes": site_lan_prefixes
+                        }
+                    },
+                }
+            ]
+        },
+        "site-network-accesses": {
+            "site-network-access": [
+                {
+                    "site-network-access-id": endpoint_uuid,
+                    "site-network-access-type": SITE_NETWORK_ACCESS_TYPE,
+                    "device-reference": device_uuid,
+                    "vpn-attachment": {
+                        "vpn-id": service_uuid,
+                        "site-role": role,
+                    },
+                    "ip-connection": {
+                        "ipv4": {
+                            "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                            "addresses": {
+                                "provider-address": pe_address,
+                                "customer-address": ce_address,
+                                "prefix-length": ce_pe_network_prefix,
+                            },
+                        }
+                    },
+                    "service": {
+                        "svc-mtu": mtu,
+                        "svc-input-bandwidth": input_bw,
+                        "svc-output-bandwidth": output_bw,
+                        "qos": {
+                            "qos-profile": {
+                                "classes": {
+                                    "class": [
+                                        {
+                                            "class-id": qos_profile_id,
+                                            "direction": qos_profile_direction,
+                                            "latency": {
+                                                "latency-boundary": qos_profile_latency
+                                            },
+                                            "bandwidth": {
+                                                "guaranteed-bw-percent": qos_profile_bw_guarantee
+                                            },
+                                        }
+                                    ]
+                                }
+                            }
+                        },
+                    },
+                }
+            ]
+        },
+    }
+
+
+def setup_config_rules(
+    service_uuid: str, json_settings: Dict, operation_type: str
+) -> List[Dict]:
+    # --- Extract common or required fields for the source site ---
+    src_device_uuid: str = json_settings["src_device_name"]
+    src_endpoint_uuid: str = json_settings["src_endpoint_name"]
+    src_site_location: str = json_settings["src_site_location"]
+    src_ipv4_lan_prefixes: list[LANPrefixesDict] = json_settings.get(
+        "src_ipv4_lan_prefixes"
+    )
+    src_site_id: str = json_settings.get("src_site_id", f"site_{src_site_location}")
+    src_management_type: str = json_settings.get(
+        "src_management_type", "ietf-l3vpn-svc:provider-managed"
+    )
+    if src_management_type != "ietf-l3vpn-svc:provider-managed":
+        raise Exception("management type %s not supported", src_management_type)
+
+    src_role: str = "ietf-l3vpn-svc:hub-role"
+    src_ce_address: str = json_settings["src_ce_address"]
+    src_pe_address: str = json_settings["src_pe_address"]
+    src_ce_pe_network_prefix: int = json_settings["src_ce_pe_network_prefix"]
+    src_mtu: int = json_settings["src_mtu"]
+    src_input_bw: int = json_settings["src_input_bw"]
+    src_output_bw: int = json_settings["src_output_bw"]
+    src_qos_profile_id = "qos-realtime"
+    src_qos_profile_direction = "ietf-l3vpn-svc:both"
+    src_qos_profile_latency: int = json_settings["src_qos_profile_latency"]
+    src_qos_profile_bw_guarantee: int = json_settings.get(
+        "src_qos_profile_bw_guarantee", 100
+    )
+
+    # --- Extract common or required fields for the destination site ---
+    dst_device_uuid = json_settings["dst_device_name"]
+    dst_endpoint_uuid = json_settings["dst_endpoint_name"]
+    dst_site_location: str = json_settings["dst_site_location"]
+    dst_ipv4_lan_prefixes: list[LANPrefixesDict] = json_settings[
+        "dst_ipv4_lan_prefixes"
+    ]
+    dst_site_id: str = json_settings.get("dst_site_id", f"site_{dst_site_location}")
+    dst_management_type: str = json_settings.get(
+        "dst_management_type", "ietf-l3vpn-svc:provider-managed"
+    )
+    if dst_management_type != "ietf-l3vpn-svc:provider-managed":
+        raise Exception("management type %s not supported", dst_management_type)
+
+    dst_role: str = "ietf-l3vpn-svc:spoke-role"
+    dst_ce_address: str = json_settings["dst_ce_address"]
+    dst_pe_address: str = json_settings["dst_pe_address"]
+    dst_ce_pe_network_prefix: int = json_settings["dst_ce_pe_network_prefix"]
+    dst_mtu: int = json_settings["dst_mtu"]
+    dst_input_bw: int = json_settings["dst_input_bw"]
+    dst_output_bw: int = json_settings["dst_output_bw"]
+    dst_qos_profile_id = "qos-realtime"
+    dst_qos_profile_direction = "ietf-l3vpn-svc:both"
+    dst_qos_profile_latency: int = json_settings["dst_qos_profile_latency"]
+    dst_qos_profile_bw_guarantee: int = json_settings.get(
+        "dst_qos_profile_bw_guarantee", 100
+    )
+
+    # --- Build site dictionaries using the helper function ---
+    src_site_dict = create_site_dict(
+        site_id=src_site_id,
+        site_location=src_site_location,
+        device_uuid=src_device_uuid,
+        endpoint_uuid=src_endpoint_uuid,
+        service_uuid=service_uuid,
+        role=src_role,
+        management_type=src_management_type,
+        ce_address=src_ce_address,
+        pe_address=src_pe_address,
+        ce_pe_network_prefix=src_ce_pe_network_prefix,
+        mtu=src_mtu,
+        input_bw=src_input_bw,
+        output_bw=src_output_bw,
+        qos_profile_id=src_qos_profile_id,
+        qos_profile_direction=src_qos_profile_direction,
+        qos_profile_latency=src_qos_profile_latency,
+        qos_profile_bw_guarantee=src_qos_profile_bw_guarantee,
+        lan_prefixes=src_ipv4_lan_prefixes,
+    )
+
+    dst_site_dict = create_site_dict(
+        site_id=dst_site_id,
+        site_location=dst_site_location,
+        device_uuid=dst_device_uuid,
+        endpoint_uuid=dst_endpoint_uuid,
+        service_uuid=service_uuid,
+        role=dst_role,
+        management_type=dst_management_type,
+        ce_address=dst_ce_address,
+        pe_address=dst_pe_address,
+        ce_pe_network_prefix=dst_ce_pe_network_prefix,
+        mtu=dst_mtu,
+        input_bw=dst_input_bw,
+        output_bw=dst_output_bw,
+        qos_profile_id=dst_qos_profile_id,
+        qos_profile_direction=dst_qos_profile_direction,
+        qos_profile_latency=dst_qos_profile_latency,
+        qos_profile_bw_guarantee=dst_qos_profile_bw_guarantee,
+        lan_prefixes=dst_ipv4_lan_prefixes,
+    )
+
+    # --- Combine both sites into one structure ---
+    sites = {
+        "site": [
+            src_site_dict,
+            dst_site_dict,
+        ]
+    }
+
+    l3_vpn_data_model = {
+        "ietf-l3vpn-svc:l3vpn-svc": {
+            "vpn-services": {"vpn-service": [{"vpn-id": service_uuid}]},
+            "sites": sites,
+        }
+    }
+
+    json_config_rules = [
+        json_config_rule_set(
+            "/service[{:s}]/IETFL3VPN".format(service_uuid),
+            l3_vpn_data_model,
+        ),
+        json_config_rule_set(
+            "/service[{:s}]/IETFL3VPN/operation".format(service_uuid),
+            {"type": operation_type},
+        ),
+    ]
+
+    return json_config_rules
+
+
+def teardown_config_rules(service_uuid: str) -> List[Dict]:
+    json_config_rules = [
+        json_config_rule_delete(
+            "/service[{:s}]/IETFL3VPN".format(service_uuid),
+            {"id": service_uuid},
+        ),
+        json_config_rule_delete(
+            "/service[{:s}]/IETFL3VPN/operation".format(service_uuid),
+            {},
+        ),
+    ]
+    return json_config_rules
+
+
+def get_link_ep_device_names(
+    link: Link, context_client: ContextClient
+) -> Tuple[str, str, str, str]:
+    ep_ids = link.link_endpoint_ids
+    ep_device_id_1 = ep_ids[0].device_id
+    ep_uuid_1 = ep_ids[0].endpoint_uuid.uuid
+    device_obj_1 = context_client.GetDevice(ep_device_id_1)
+    for d_ep in device_obj_1.device_endpoints:
+        if d_ep.endpoint_id.endpoint_uuid.uuid == ep_uuid_1:
+            ep_name_1 = d_ep.name
+            break
+    else:
+        raise Exception("endpoint not found")
+    device_obj_name_1 = device_obj_1.name
+    ep_device_id_2 = ep_ids[1].device_id
+    ep_uuid_2 = ep_ids[1].endpoint_uuid.uuid
+    device_obj_2 = context_client.GetDevice(ep_device_id_2)
+    for d_ep in device_obj_2.device_endpoints:
+        if d_ep.endpoint_id.endpoint_uuid.uuid == ep_uuid_2:
+            ep_name_2 = d_ep.name
+            break
+    else:
+        raise Exception("endpoint not found")
+    device_obj_name_2 = device_obj_2.name
+    return (
+        device_obj_name_1,
+        ep_name_1,
+        device_obj_1,
+        device_obj_name_2,
+        ep_name_2,
+        device_obj_2,
+    )
diff --git a/src/service/service/service_handlers/l3nm_ietfl3vpn/L3NM_IETFL3VPN_ServiceHandler.py b/src/service/service/service_handlers/l3nm_ietfl3vpn/L3NM_IETFL3VPN_ServiceHandler.py
new file mode 100644
index 0000000000000000000000000000000000000000..aa650c8096b9443b85114166ad1d0bc5b6f2fc55
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_ietfl3vpn/L3NM_IETFL3VPN_ServiceHandler.py
@@ -0,0 +1,546 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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
+import logging
+from typing import Any, List, Optional, Tuple, TypedDict, Union
+
+from deepdiff import DeepDiff
+
+from common.DeviceTypes import DeviceTypeEnum
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.proto.context_pb2 import (
+    ConfigRule,
+    Device,
+    DeviceId,
+    Service,
+    ServiceConfig,
+)
+from common.tools.object_factory.Device import json_device_id
+from common.type_checkers.Checkers import chk_type
+from service.service.service_handler_api._ServiceHandler import _ServiceHandler
+from service.service.service_handler_api.SettingsHandler import SettingsHandler
+from service.service.service_handler_api.Tools import (
+    get_device_endpoint_uuids,
+    get_endpoint_matching,
+)
+from service.service.task_scheduler.TaskExecutor import TaskExecutor
+
+from .ConfigRules import setup_config_rules, teardown_config_rules
+
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
+MTU = 1500
+
+LOGGER = logging.getLogger(__name__)
+
+METRICS_POOL = MetricsPool("Service", "Handler", labels={"handler": "l3nm_ietf_l3vpn"})
+
+
+class LANPrefixesDict(TypedDict):
+    lan: str
+    lan_tag: str
+
+
+class Ipv4Info(TypedDict):
+    src_lan: str
+    dst_lan: str
+    src_port: str
+    dst_port: str
+    vlan: str
+
+
+class QoSInfo(TypedDict):
+    src_qos_profile_latency: int
+    src_input_bw: int
+    src_output_bw: int
+    dst_qos_profile_latency: int
+    dst_input_bw: int
+    dst_output_bw: int
+
+
+def get_custom_config_rule(
+    service_config: ServiceConfig, resource_key: str
+) -> Optional[ConfigRule]:
+    """
+    Return the custom ConfigRule from the ServiceConfig matching the given resource_key,
+    or None if not found.
+    """
+    for cr in service_config.config_rules:
+        if (
+            cr.WhichOneof("config_rule") == "custom"
+            and cr.custom.resource_key == resource_key
+        ):
+            return cr
+    return None
+
+
+def load_json_rule_data(service_config: ServiceConfig) -> Tuple[dict, dict]:
+    """
+    Loads the running/candidate JSON data from the service_config for IETF slice data.
+    Raises an exception if either is missing.
+    """
+    running_cr = get_custom_config_rule(service_config, RUNNING_RESOURCE_KEY)
+    candidate_cr = get_custom_config_rule(service_config, CANDIDATE_RESOURCE_KEY)
+
+    if not running_cr or not candidate_cr:
+        raise ValueError("Missing running/candidate IETF slice config rules.")
+
+    running_data = json.loads(running_cr.custom.resource_value)
+    candidate_data = json.loads(candidate_cr.custom.resource_value)
+    return running_data, candidate_data
+
+
+def extract_match_criterion_ipv4_info(match_criterion: dict) -> Ipv4Info:
+    """
+    Extracts IPv4 match criteria data (src/dst IP, ports, VLAN) from a match_criterion dict.
+    """
+    src_lan = dst_lan = src_port = dst_port = vlan = ""
+    for type_value in match_criterion["match-type"]:
+        value = type_value["value"][0]
+        if type_value["type"] == "ietf-network-slice-service:source-ip-prefix":
+            src_lan = value
+        elif type_value["type"] == "ietf-network-slice-service:destination-ip-prefix":
+            dst_lan = value
+        elif type_value["type"] == "ietf-network-slice-service:source-tcp-port":
+            src_port = value
+        elif type_value["type"] == "ietf-network-slice-service:destination-tcp-port":
+            dst_port = value
+        elif type_value["type"] == "ietf-network-slice-service:vlan":
+            vlan = value
+
+    return Ipv4Info(
+        src_lan=src_lan,
+        dst_lan=dst_lan,
+        src_port=src_port,
+        dst_port=dst_port,
+        vlan=vlan,
+    )
+
+
+def extract_qos_info_from_connection_group(
+    src_sdp_id: str, dst_sdp_id: str, connectivity_constructs: list
+) -> QoSInfo:
+    """
+    Given a pair of SDP ids and a list of connectivity constructs, extract QoS info
+    such as latency and bandwidth (for both directions).
+    """
+
+    def _extract_qos_fields(cc: dict) -> Tuple[int, int]:
+        max_delay = 0
+        bandwidth = 0
+        metric_bounds = cc["service-slo-sle-policy"]["slo-policy"]["metric-bound"]
+        for metric_bound in metric_bounds:
+            if (
+                metric_bound["metric-type"]
+                == "ietf-network-slice-service:one-way-delay-maximum"
+                and metric_bound["metric-unit"] == "milliseconds"
+            ):
+                max_delay = int(metric_bound["bound"])
+            elif (
+                metric_bound["metric-type"]
+                == "ietf-network-slice-service:one-way-bandwidth"
+                and metric_bound["metric-unit"] == "Mbps"
+            ):
+                # Convert from Mbps to bps
+                bandwidth = int(metric_bound["bound"]) * 1000000
+        return max_delay, bandwidth
+
+    src_cc = next(
+        cc
+        for cc in connectivity_constructs
+        if cc["p2p-sender-sdp"] == src_sdp_id and cc["p2p-receiver-sdp"] == dst_sdp_id
+    )
+    dst_cc = next(
+        cc
+        for cc in connectivity_constructs
+        if cc["p2p-sender-sdp"] == dst_sdp_id and cc["p2p-receiver-sdp"] == src_sdp_id
+    )
+    src_max_delay, src_bandwidth = _extract_qos_fields(src_cc)
+    dst_max_delay, dst_bandwidth = _extract_qos_fields(dst_cc)
+
+    return QoSInfo(
+        src_qos_profile_latency=src_max_delay,
+        src_input_bw=src_bandwidth,
+        src_output_bw=dst_bandwidth,
+        dst_qos_profile_latency=dst_max_delay,
+        dst_input_bw=dst_bandwidth,
+        dst_output_bw=src_bandwidth,
+    )
+
+
+def get_endpoint_settings(device_obj: Device, endpoint_name: str) -> dict:
+    """
+    Helper to retrieve endpoint settings from a device's config rules given an endpoint name.
+    Raises an exception if not found.
+    """
+    for rule in device_obj.device_config.config_rules:
+        if (
+            rule.WhichOneof("config_rule") == "custom"
+            and rule.custom.resource_key == f"/endpoints/endpoint[{endpoint_name}]"
+        ):
+            return json.loads(rule.custom.resource_value)
+    raise ValueError(f"Endpoint settings not found for endpoint {endpoint_name}")
+
+
+class L3NM_IETFL3VPN_ServiceHandler(_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)
+
+    def __find_IP_transport_edge_endpoints(
+        self, endpoints
+    ) -> Tuple[str, str, str, str, Device]:
+        """
+        Searches for two endpoints whose device controllers are IP_SDN_CONTROLLER.
+        Returns (src_device_uuid, src_endpoint_uuid, dst_device_uuid, dst_endpoint_uuid, controller_device).
+        Raises an exception if not found or if the two IP devices differ.
+        """
+
+        # Find the first IP transport edge endpoint from the head of endpoints
+        for ep in endpoints:
+            device_uuid, endpoint_uuid = get_device_endpoint_uuids(ep)
+            device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(device_uuid))
+            )
+            device_controller = self.__task_executor.get_device_controller(device_obj)
+            if device_controller.device_type == DeviceTypeEnum.IP_SDN_CONTROLLER.value:
+                src_device_uuid, src_endpoint_uuid = device_uuid, endpoint_uuid
+                src_device_controller = device_controller
+                break
+        else:
+            raise Exception("No IP transport edge endpoints found")
+
+        # Find the second IP transport edge endpoint from the tail of endpoints
+        for ep in reversed(endpoints):
+            device_uuid, endpoint_uuid = get_device_endpoint_uuids(ep)
+            device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(device_uuid))
+            )
+            device_controller = self.__task_executor.get_device_controller(device_obj)
+            if device_controller.device_type == DeviceTypeEnum.IP_SDN_CONTROLLER.value:
+                dst_device_uuid, dst_endpoint_uuid = device_uuid, endpoint_uuid
+                dst_device_controller = device_controller
+                break
+        else:
+            raise Exception("No IP transport edge endpoints found")
+
+        if src_device_controller != dst_device_controller:
+            raise Exception("Different Src-Dst devices not supported by now")
+
+        return (
+            src_device_uuid,
+            src_endpoint_uuid,
+            dst_device_uuid,
+            dst_endpoint_uuid,
+            src_device_controller,
+        )
+
+    def __build_resource_value_dict(
+        self,
+        service_id: str,
+        src_device_obj: Device,
+        dst_device_obj: Device,
+        src_endpoint_name: str,
+        dst_endpoint_name: str,
+        qos_info: QoSInfo,
+        src_endpoint_settings: dict,
+        dst_endpoint_settings: dict,
+        src_match_criterion_ipv4_info: Ipv4Info,
+        dst_match_criterion_ipv4_info: Ipv4Info,
+    ) -> dict:
+        """
+        Builds the final resource-value dict to be used when calling setup_config_rules().
+        """
+        # Prepare data for source
+        src_device_name = src_device_obj.name
+        src_ce_ip = src_endpoint_settings["address_ip"]
+        src_ce_prefix = src_endpoint_settings["address_prefix"]
+        src_lan_prefixes = [
+            LANPrefixesDict(
+                lan=src_match_criterion_ipv4_info["dst_lan"],
+                lan_tag=src_match_criterion_ipv4_info["vlan"],
+            )
+        ]
+
+        # Prepare data for destination
+        dst_device_name = dst_device_obj.name
+        dst_ce_ip = dst_endpoint_settings["address_ip"]
+        dst_ce_prefix = dst_endpoint_settings["address_prefix"]
+        dst_lan_prefixes = [
+            LANPrefixesDict(
+                lan=dst_match_criterion_ipv4_info["dst_lan"],
+                lan_tag=dst_match_criterion_ipv4_info["vlan"],
+            )
+        ]
+
+        return {
+            "uuid": service_id,
+            "src_device_name": src_device_name,
+            "src_endpoint_name": src_endpoint_name,
+            "src_site_location": src_endpoint_settings["site_location"],
+            "src_ipv4_lan_prefixes": src_lan_prefixes,
+            "src_ce_address": src_ce_ip,
+            "src_pe_address": src_ce_ip,
+            "src_ce_pe_network_prefix": src_ce_prefix,
+            "src_mtu": MTU,
+            "src_qos_profile_latency": qos_info["src_qos_profile_latency"],
+            "src_input_bw": qos_info["src_input_bw"],
+            "src_output_bw": qos_info["src_output_bw"],
+            "dst_device_name": dst_device_name,
+            "dst_endpoint_name": dst_endpoint_name,
+            "dst_site_location": dst_endpoint_settings["site_location"],
+            "dst_ipv4_lan_prefixes": dst_lan_prefixes,
+            "dst_ce_address": dst_ce_ip,
+            "dst_pe_address": dst_ce_ip,
+            "dst_ce_pe_network_prefix": dst_ce_prefix,
+            "dst_mtu": MTU,
+            "dst_qos_profile_latency": qos_info["dst_qos_profile_latency"],
+            "dst_input_bw": qos_info["dst_input_bw"],
+            "dst_output_bw": qos_info["dst_output_bw"],
+        }
+
+    @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) < 2:
+            return []
+
+        results = []
+        service_config = self.__service.service_config
+
+        try:
+            # Identify IP transport edge endpoints
+            (
+                src_device_uuid,
+                src_endpoint_uuid,
+                dst_device_uuid,
+                dst_endpoint_uuid,
+                controller,
+            ) = self.__find_IP_transport_edge_endpoints(endpoints)
+
+            # Retrieve device objects
+            src_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(src_device_uuid))
+            )
+            src_endpoint_obj = get_endpoint_matching(src_device_obj, src_endpoint_uuid)
+
+            dst_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(dst_device_uuid))
+            )
+            dst_endpoint_obj = get_endpoint_matching(dst_device_obj, dst_endpoint_uuid)
+
+            # Obtain endpoint settings
+            src_endpoint_settings = get_endpoint_settings(
+                src_device_obj, src_endpoint_obj.name
+            )
+            dst_endpoint_settings = get_endpoint_settings(
+                dst_device_obj, dst_endpoint_obj.name
+            )
+
+            # Load running & candidate data, compute diff
+            running_data, candidate_data = load_json_rule_data(service_config)
+            running_candidate_diff = DeepDiff(running_data, candidate_data)
+
+            # Determine service_id and operation_type
+            slice_service = candidate_data["network-slice-services"]["slice-service"][0]
+            service_id = slice_service["id"]
+            if not running_candidate_diff:
+                operation_type = "create"
+            elif "values_changed" in running_candidate_diff:
+                operation_type = "update"
+
+            # Parse relevant connectivity data
+            sdps = slice_service["sdps"]["sdp"]
+            connection_group = slice_service["connection-groups"]["connection-group"][0]
+            connecitivity_constructs = connection_group["connectivity-construct"]
+
+            # The code below assumes a single connectivity construct or
+            # that the relevant one is the first in the list:
+            connecitivity_construct = connecitivity_constructs[0]
+            src_sdp_idx = connecitivity_construct["p2p-sender-sdp"]
+            dst_sdp_idx = connecitivity_construct["p2p-receiver-sdp"]
+
+            # QoS
+            qos_info = extract_qos_info_from_connection_group(
+                src_sdp_idx, dst_sdp_idx, connecitivity_constructs
+            )
+
+            # Retrieve match-criterion info
+            src_sdp = next(sdp for sdp in sdps if sdp["id"] == src_sdp_idx)
+            dst_sdp = next(sdp for sdp in sdps if sdp["id"] == dst_sdp_idx)
+
+            src_match_criterion = src_sdp["service-match-criteria"]["match-criterion"][
+                0
+            ]
+            dst_match_criterion = dst_sdp["service-match-criteria"]["match-criterion"][
+                0
+            ]
+            src_match_criterion_ipv4_info = extract_match_criterion_ipv4_info(
+                src_match_criterion
+            )
+            dst_match_criterion_ipv4_info = extract_match_criterion_ipv4_info(
+                dst_match_criterion
+            )
+
+            # Build resource dict & config rules
+            resource_value_dict = self.__build_resource_value_dict(
+                service_id=service_id,
+                src_device_obj=src_device_obj,
+                dst_device_obj=dst_device_obj,
+                src_endpoint_name=src_endpoint_obj.name,
+                dst_endpoint_name=dst_endpoint_obj.name,
+                qos_info=qos_info,
+                src_endpoint_settings=src_endpoint_settings,
+                dst_endpoint_settings=dst_endpoint_settings,
+                src_match_criterion_ipv4_info=src_match_criterion_ipv4_info,
+                dst_match_criterion_ipv4_info=dst_match_criterion_ipv4_info,
+            )
+            json_config_rules = setup_config_rules(
+                service_id, resource_value_dict, operation_type
+            )
+
+            # Configure device
+            del controller.device_config.config_rules[:]
+            for jcr in json_config_rules:
+                controller.device_config.config_rules.append(ConfigRule(**jcr))
+            self.__task_executor.configure_device(controller)
+        except Exception as e:  # pylint: disable=broad-except
+            LOGGER.exception(
+                "Unable to SetEndpoint for Service({:s})".format(str(service_id))
+            )
+            results.append(e)
+
+        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) < 2:
+            return []
+        service_config = self.__service.service_config
+        ietf_slice_candidate_cr = get_custom_config_rule(
+            service_config, CANDIDATE_RESOURCE_KEY
+        )
+        candidate_resource_value_dict = json.loads(
+            ietf_slice_candidate_cr.custom.resource_value
+        )
+        service_id = candidate_resource_value_dict["network-slice-services"][
+            "slice-service"
+        ][0]["id"]
+        results = []
+        try:
+            src_device_uuid, _ = get_device_endpoint_uuids(endpoints[0])
+            src_device = self.__task_executor.get_device(
+                DeviceId(**json_device_id(src_device_uuid))
+            )
+            src_controller = self.__task_executor.get_device_controller(src_device)
+
+            dst_device_uuid, _ = get_device_endpoint_uuids(endpoints[1])
+            dst_device = self.__task_executor.get_device(
+                DeviceId(**json_device_id(dst_device_uuid))
+            )
+            dst_controller = self.__task_executor.get_device_controller(dst_device)
+            if (
+                src_controller.device_id.device_uuid.uuid
+                != dst_controller.device_id.device_uuid.uuid
+            ):
+                raise Exception("Different Src-Dst devices not supported by now")
+            controller = src_controller
+            json_config_rules = teardown_config_rules(service_id)
+            del controller.device_config.config_rules[:]
+            for jcr in json_config_rules:
+                controller.device_config.config_rules.append(ConfigRule(**jcr))
+            self.__task_executor.configure_device(controller)
+            results.append(True)
+        except Exception as e:  # pylint: disable=broad-except
+            LOGGER.exception(
+                "Unable to DeleteEndpoint for Service({:s})".format(str(service_id))
+            )
+            results.append(e)
+
+        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_ietfl3vpn/__init__.py b/src/service/service/service_handlers/l3nm_ietfl3vpn/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..906dd19f3c948b03263251f60addb49e2fb522dc
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_ietfl3vpn/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI OSG/SDG TeraFlowSDN (TFS) (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_nce/ConfigRules.py b/src/service/service/service_handlers/l3nm_nce/ConfigRules.py
new file mode 100644
index 0000000000000000000000000000000000000000..0544d897606afe950725349bfeb68c365189aa21
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_nce/ConfigRules.py
@@ -0,0 +1,120 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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
+
+from common.tools.object_factory.ConfigRule import (
+    json_config_rule_delete,
+    json_config_rule_set,
+)
+
+
+def setup_config_rules(service_uuid: str, json_settings: Dict) -> List[Dict]:
+    operation_type: str = json_settings["operation_type"]
+    app_flow_id: str = json_settings["app_flow_id"]
+    app_flow_user_id: str = json_settings["app_flow_user_id"]
+    max_latency: int = json_settings["max_latency"]
+    max_jitter: int = json_settings["max_jitter"]
+    max_loss: float = json_settings["max_loss"]
+    upstream_assure_bw: str = json_settings["upstream_assure_bw"]
+    upstream_max_bw: str = json_settings["upstream_max_bw"]
+    downstream_assure_bw: str = json_settings["downstream_assure_bw"]
+    downstream_max_bw: str = json_settings["downstream_max_bw"]
+    src_ip: str = json_settings["src_ip"]
+    src_port: str = json_settings["src_port"]
+    dst_ip: str = json_settings["dst_ip"]
+    dst_port: str = json_settings["dst_port"]
+
+    app_flow_app_name: str = f"App_Flow_{app_flow_id}"
+    app_flow_service_profile: str = f"service_{app_flow_id}"
+    app_id: str = f"app_{app_flow_id}"
+    app_feature_id: str = f"feature_{app_flow_id}"
+    app_flow_name: str = f"App_Flow_{app_flow_id}"
+    app_flow_max_online_users: int = json_settings.get("app_flow_max_online_users", 1)
+    app_flow_stas: str = json_settings.get("stas", "00:3D:E1:18:82:9E")
+    qos_profile_name: str = json_settings.get("app_flow_qos_profile", "AR_VR_Gaming")
+    app_flow_duration: int = json_settings.get("app_flow_duration", 9999)
+    protocol: str = json_settings.get("protocol", "tcp")
+
+    app_flow = {
+        "name": app_flow_name,
+        "user-id": app_flow_user_id,
+        "app-name": app_flow_app_name,
+        "max-online-users": app_flow_max_online_users,
+        "stas": app_flow_stas,
+        "qos-profile": qos_profile_name,
+        "service-profile": app_flow_service_profile,
+        "duration": app_flow_duration,
+    }
+    qos_profile = {
+        "name": qos_profile_name,
+        "max-latency": max_latency,
+        "max-jitter": max_jitter,
+        "max-loss": max_loss,
+        "upstream": {
+            "assure-bandwidth": upstream_assure_bw,
+            "max-bandwidth": upstream_max_bw,
+        },
+        "downstream": {
+            "assure-bandwidth": downstream_assure_bw,
+            "max-bandwidth": downstream_max_bw,
+        },
+    }
+    application = {
+        "name": app_flow_app_name,
+        "app-id": app_id,
+        "app-features": {
+            "app-feature": [
+                {
+                    "id": app_feature_id,
+                    "dest-ip": dst_ip,
+                    "dest-port": dst_port,
+                    "src-ip": src_ip,
+                    "src-port": src_port,
+                    "protocol": protocol,
+                }
+            ]
+        },
+    }
+    app_flow_datamodel = {
+        "huawei-nce-app-flow:app-flows": {
+            "app-flow": [app_flow],
+            "qos-profiles": {"qos-profile": [qos_profile]},
+            "applications": {"application": [application]},
+        }
+    }
+    json_config_rules = [
+        json_config_rule_set(
+            "/service[{:s}]/AppFlow".format(service_uuid), app_flow_datamodel
+        ),
+        json_config_rule_set(
+            "/service[{:s}]/AppFlow/operation".format(service_uuid),
+            {"type": operation_type},
+        ),
+    ]
+    return json_config_rules
+
+
+def teardown_config_rules(service_uuid: str, json_settings: Dict) -> List[Dict]:
+    json_config_rules = [
+        json_config_rule_delete(
+            "/service[{:s}]/AppFlow".format(service_uuid),
+            {},
+        ),
+        json_config_rule_delete(
+            "/service[{:s}]/AppFlow/operation".format(service_uuid),
+            {},
+        ),
+    ]
+    return json_config_rules
diff --git a/src/service/service/service_handlers/l3nm_nce/L3NMNCEServiceHandler.py b/src/service/service/service_handlers/l3nm_nce/L3NMNCEServiceHandler.py
new file mode 100644
index 0000000000000000000000000000000000000000..1317bd0615e4789d7ba76e8c0c6b0923d8f2dec7
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_nce/L3NMNCEServiceHandler.py
@@ -0,0 +1,564 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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
+import logging
+import re
+from typing import Any, List, Optional, Tuple, Union, TypedDict, Dict
+from uuid import uuid4
+
+from deepdiff import DeepDiff
+
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.proto.context_pb2 import ConfigRule, DeviceId, Empty, Service, ServiceConfig
+from common.tools.object_factory.Device import json_device_id
+from common.type_checkers.Checkers import chk_type
+from context.client.ContextClient import ContextClient
+from service.service.service_handler_api._ServiceHandler import _ServiceHandler
+from service.service.service_handler_api.SettingsHandler import SettingsHandler
+from service.service.service_handler_api.Tools import (
+    get_device_endpoint_uuids,
+)
+from service.service.task_scheduler.TaskExecutor import TaskExecutor
+
+from .ConfigRules import setup_config_rules, teardown_config_rules
+
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
+
+LOGGER = logging.getLogger(__name__)
+
+METRICS_POOL = MetricsPool("Service", "Handler", labels={"handler": "l3nm_nce"})
+
+SDP_DIFF_RE = re.compile(
+    r"^root\[\'network-slice-services\'\]\[\'slice-service\'\]\[0\]\[\'sdps\'\]\[\'sdp\'\]\[(\d)\]$"
+)
+CONNECTION_GROUP_DIFF_RE = re.compile(
+    r"^root\[\'network-slice-services\'\]\[\'slice-service\'\]\[0\]\[\'connection-groups\'\]\[\'connection-group\'\]\[(\d)\]$"
+)
+MATCH_CRITERION_DIFF_RE = re.compile(
+    r"^root\[\'network-slice-services\'\]\[\'slice-service\'\]\[0\]\[\'sdps\'\]\[\'sdp\'\]\[(\d)\]\[\'service-match-criteria\'\]\[\'match-criterion\'\]\[(\d)\]$"
+)
+
+
+class Ipv4Info(TypedDict):
+    src_ip: str
+    dst_ip: str
+    src_port: str
+    dst_port: str
+
+
+def get_removed_items(
+    candidate_ietf_slice_dict: dict, running_ietf_slice_dict: dict
+) -> dict:
+    """
+    For the 'iterable_item_removed' scenario, returns dict with removed sdp / connection_group / match_criterion info.
+    Raises an exception if there's inconsistent data or multiple items removed (which is not supported).
+    """
+    removed_items = {
+        "sdp": {"sdp_idx": None, "value": {}},
+        "connection_group": {"connection_group_idx": None, "value": {}},
+        "match_criterion": {
+            "sdp_idx": None,
+            "match_criterion_idx": None,
+            "value": {},
+        },
+    }
+
+    running_slice_services = running_ietf_slice_dict["network-slice-services"][
+        "slice-service"
+    ][0]
+    candidate_slice_services = candidate_ietf_slice_dict["network-slice-services"][
+        "slice-service"
+    ][0]
+
+    running_slice_sdps = [sdp["id"] for sdp in running_slice_services["sdps"]["sdp"]]
+    candidiate_slice_sdps = [
+        sdp["id"] for sdp in candidate_slice_services["sdps"]["sdp"]
+    ]
+    removed_sdps = set(running_slice_sdps) - set(candidiate_slice_sdps)
+
+    if len(removed_sdps) > 1:
+        raise Exception("Multiple SDPs removed - not supported.")
+    removed_sdp_id = removed_sdps.pop()
+
+    removed_items["sdp"]["sdp_idx"] = running_slice_sdps.index(removed_sdp_id)
+    removed_items["sdp"]["value"] = next(
+        sdp
+        for sdp in running_slice_services["sdps"]["sdp"]
+        if sdp["id"] == removed_sdp_id
+    )
+
+    match_criteria = removed_items["sdp"]["value"]["service-match-criteria"][
+        "match-criterion"
+    ]
+    if len(match_criteria) > 1:
+        raise Exception("Multiple match criteria found - not supported")
+    match_criterion = match_criteria[0]
+    connection_grp_id = match_criterion["target-connection-group-id"]
+    connection_groups = running_slice_services["connection-groups"]["connection-group"]
+    connection_group = next(
+        (idx, cg)
+        for idx, cg in enumerate(connection_groups)
+        if cg["id"] == connection_grp_id
+    )
+    removed_items["connection_group"]["connection_group_idx"] = connection_group[0]
+    removed_items["connection_group"]["value"] = connection_group[1]
+
+    for sdp in running_slice_services["sdps"]["sdp"]:
+        if sdp["id"] == removed_sdp_id:
+            continue
+        for mc in sdp["service-match-criteria"]["match-criterion"]:
+            if mc["target-connection-group-id"] == connection_grp_id:
+                removed_items["match_criterion"]["sdp_idx"] = running_slice_sdps.index(
+                    sdp["id"]
+                )
+                removed_items["match_criterion"]["match_criterion_idx"] = sdp[
+                    "service-match-criteria"
+                ]["match-criterion"].index(mc)
+                removed_items["match_criterion"]["value"] = mc
+                break
+
+    if (
+        removed_items["match_criterion"]["sdp_idx"] is None
+        or removed_items["sdp"]["sdp_idx"] is None
+        or removed_items["connection_group"]["connection_group_idx"] is None
+    ):
+        raise Exception("sdp, connection group or match criterion not found")
+
+    return removed_items
+
+
+def get_custom_config_rule(
+    service_config: ServiceConfig, resource_key: str
+) -> Optional[ConfigRule]:
+    """
+    Returns the ConfigRule from service_config matching the provided resource_key
+    if found, otherwise returns None.
+    """
+    for cr in service_config.config_rules:
+        if (
+            cr.WhichOneof("config_rule") == "custom"
+            and cr.custom.resource_key == resource_key
+        ):
+            return cr
+    return None
+
+
+def get_running_candidate_ietf_slice_data_diff(service_config: ServiceConfig) -> Dict:
+    """
+    Loads the JSON from the running/candidate resource ConfigRules and returns
+    their DeepDiff comparison.
+    """
+    running_cr = get_custom_config_rule(service_config, RUNNING_RESOURCE_KEY)
+    candidate_cr = get_custom_config_rule(service_config, CANDIDATE_RESOURCE_KEY)
+
+    running_value_dict = json.loads(running_cr.custom.resource_value)
+    candidate_value_dict = json.loads(candidate_cr.custom.resource_value)
+
+    return DeepDiff(running_value_dict, candidate_value_dict)
+
+
+def extract_qos_info(
+    connection_groups: List, connection_grp_id: str, src_sdp_idx: str, dst_sdp_idx: str
+) -> Dict:
+    """
+    Extract QoS information from connection groups based on the connection group ID.
+    """
+    qos_info = {
+        "upstream": {"max_delay": "0", "bw": "0", "packet_loss": "0"},
+        "downstream": {"max_delay": "0", "bw": "0", "packet_loss": "0"},
+    }
+    connection_group = next(
+        (cg for cg in connection_groups if cg["id"] == connection_grp_id), None
+    )
+
+    if not connection_group:
+        return qos_info
+
+    for cc in connection_group["connectivity-construct"]:
+        if (
+            cc["p2p-sender-sdp"] == src_sdp_idx
+            and cc["p2p-receiver-sdp"] == dst_sdp_idx
+        ):
+            direction = "upstream"
+        elif (
+            cc["p2p-sender-sdp"] == dst_sdp_idx
+            and cc["p2p-receiver-sdp"] == src_sdp_idx
+        ):
+            direction = "downstream"
+        else:
+            raise Exception("invalid sender and receiver sdp ids")
+        for metric_bound in cc["service-slo-sle-policy"]["slo-policy"]["metric-bound"]:
+            if (
+                metric_bound["metric-type"]
+                == "ietf-network-slice-service:one-way-delay-maximum"
+                and metric_bound["metric-unit"] == "milliseconds"
+            ):
+                qos_info[direction]["max_delay"] = metric_bound["bound"]
+            elif (
+                metric_bound["metric-type"]
+                == "ietf-network-slice-service:one-way-bandwidth"
+                and metric_bound["metric-unit"] == "Mbps"
+            ):
+                qos_info[direction]["bw"] = metric_bound["bound"]
+            elif (
+                metric_bound["metric-type"]
+                == "ietf-network-slice-service:two-way-packet-loss"
+                and metric_bound["metric-unit"] == "percentage"
+            ):
+                qos_info[direction]["packet_loss"] = metric_bound["percentile-value"]
+
+    return qos_info
+
+
+def extract_match_criterion_ipv4_info(match_criterion: Dict) -> Ipv4Info:
+    """
+    Extracts IPv4 info from the match criterion dictionary.
+    """
+    src_ip = dst_ip = src_port = dst_port = ""
+
+    for type_value in match_criterion["match-type"]:
+        m_type = type_value["type"]
+        val = type_value["value"][0]
+        if m_type == "ietf-network-slice-service:source-ip-prefix":
+            src_ip = val.split("/")[0]
+        elif m_type == "ietf-network-slice-service:destination-ip-prefix":
+            dst_ip = val.split("/")[0]
+        elif m_type == "ietf-network-slice-service:source-tcp-port":
+            src_port = val
+        elif m_type == "ietf-network-slice-service:destination-tcp-port":
+            dst_port = val
+
+    return Ipv4Info(
+        src_ip=src_ip,
+        dst_ip=dst_ip,
+        src_port=src_port,
+        dst_port=dst_port,
+    )
+
+
+class L3NMNCEServiceHandler(_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)
+
+    @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 []
+
+        results = []
+        try:
+            context_client = ContextClient()
+            service_config = self.__service.service_config
+            settings = self.__settings_handler.get("/settings")
+
+            src_device_uuid, src_endpoint_uuid = get_device_endpoint_uuids(endpoints[0])
+            src_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(src_device_uuid))
+            )
+            controller = self.__task_executor.get_device_controller(src_device_obj)
+
+            list_devices = context_client.ListDevices(Empty())
+            devices = list_devices.devices
+            device_name_map = {d.name: d for d in devices}
+
+            running_candidate_diff = get_running_candidate_ietf_slice_data_diff(
+                service_config
+            )
+            candidate_ietf_slice_cr = get_custom_config_rule(
+                service_config, CANDIDATE_RESOURCE_KEY
+            )
+            candidate_resource_value_dict = json.loads(
+                candidate_ietf_slice_cr.custom.resource_value
+            )
+            running_ietf_slice_cr = get_custom_config_rule(
+                service_config, RUNNING_RESOURCE_KEY
+            )
+            running_resource_value_dict = json.loads(
+                running_ietf_slice_cr.custom.resource_value
+            )
+
+            service_name = running_resource_value_dict["network-slice-services"][
+                "slice-service"
+            ][0]["id"]
+
+            if not running_candidate_diff:  # Slice Creation
+                operation_type = "create"
+
+                slice_service = candidate_resource_value_dict["network-slice-services"][
+                    "slice-service"
+                ][0]
+                sdps = slice_service["sdps"]["sdp"]
+                connection_groups = slice_service["connection-groups"][
+                    "connection-group"
+                ]
+                sdp_ids = [sdp["id"] for sdp in sdps]
+                for sdp in sdps:
+                    node_id = sdp["node-id"]
+                    device_obj = device_name_map[node_id]
+                    device_controller = self.__task_executor.get_device_controller(
+                        device_obj
+                    )
+                    if (
+                        device_controller is None
+                        or controller.name != device_controller.name
+                    ):
+                        continue
+                    src_sdp_idx = sdp_ids.pop(sdp_ids.index(sdp["id"]))
+                    dst_sdp_idx = sdp_ids[0]
+                    match_criteria = sdp["service-match-criteria"]["match-criterion"]
+                    match_criterion = match_criteria[0]
+                    connection_grp_id = match_criterion["target-connection-group-id"]
+                    break
+                else:
+                    raise Exception("connection group id not found")
+            elif "iterable_item_added" in running_candidate_diff:  # new SDP added
+                operation_type = "create"
+
+                slice_service = candidate_resource_value_dict["network-slice-services"][
+                    "slice-service"
+                ][0]
+                sdps = slice_service["sdps"]["sdp"]
+                connection_groups = slice_service["connection-groups"][
+                    "connection-group"
+                ]
+                added_items = {
+                    "sdp": {"sdp_idx": None, "value": {}},
+                    "connection_group": {"connection_group_idx": None, "value": {}},
+                    "match_criterion": {
+                        "sdp_idx": None,
+                        "match_criterion_idx": None,
+                        "value": {},
+                    },
+                }
+                for added_key, added_value in running_candidate_diff[
+                    "iterable_item_added"
+                ].items():
+                    sdp_match = SDP_DIFF_RE.match(added_key)
+                    connection_group_match = CONNECTION_GROUP_DIFF_RE.match(added_key)
+                    match_criterion_match = MATCH_CRITERION_DIFF_RE.match(added_key)
+                    if sdp_match:
+                        added_items["sdp"] = {
+                            "sdp_idx": int(sdp_match.groups()[0]),
+                            "value": added_value,
+                        }
+                    elif connection_group_match:
+                        added_items["connection_group"] = {
+                            "connection_group_idx": int(
+                                connection_group_match.groups()[0]
+                            ),
+                            "value": added_value,
+                        }
+                    elif match_criterion_match:
+                        added_items["match_criterion"] = {
+                            "sdp_idx": int(match_criterion_match.groups()[0]),
+                            "match_criterion_idx": int(
+                                match_criterion_match.groups()[1]
+                            ),
+                            "value": added_value,
+                        }
+                new_sdp = sdps[added_items["sdp"]["sdp_idx"]]
+                src_sdp_idx = new_sdp["id"]
+                dst_sdp_idx = sdps[added_items["match_criterion"]["sdp_idx"]]["id"]
+                connection_grp_id = connection_groups[
+                    added_items["connection_group"]["connection_group_idx"]
+                ]["id"]
+
+                if (
+                    connection_grp_id
+                    != added_items["match_criterion"]["value"][
+                        "target-connection-group-id"
+                    ]
+                ):
+                    raise Exception(
+                        "connection group missmatch in destination sdp and added connection group"
+                    )
+                match_criteria = new_sdp["service-match-criteria"]["match-criterion"]
+                match_criterion = match_criteria[0]
+            elif "iterable_item_removed" in running_candidate_diff:  # new SDP added
+                operation_type = "delete"
+
+                slice_service = running_resource_value_dict["network-slice-services"][
+                    "slice-service"
+                ][0]
+                sdps = slice_service["sdps"]["sdp"]
+                connection_groups = slice_service["connection-groups"][
+                    "connection-group"
+                ]
+                removed_items = get_removed_items(
+                    candidate_resource_value_dict, running_resource_value_dict
+                )
+                removed_sdp = sdps[removed_items["sdp"]["sdp_idx"]]
+                src_sdp_idx = removed_sdp["id"]
+                dst_sdp_idx = sdps[removed_items["match_criterion"]["sdp_idx"]]["id"]
+                connection_grp_id = connection_groups[
+                    removed_items["connection_group"]["connection_group_idx"]
+                ]["id"]
+
+                if (
+                    connection_grp_id
+                    != removed_items["match_criterion"]["value"][
+                        "target-connection-group-id"
+                    ]
+                ):
+                    raise Exception(
+                        "connection group missmatch in destination sdp and added connection group"
+                    )
+                match_criteria = removed_sdp["service-match-criteria"][
+                    "match-criterion"
+                ]
+                match_criterion = match_criteria[0]
+            else:
+                raise Exception(
+                    "transition from candidate to running info not supported"
+                )
+
+            ip_info = extract_match_criterion_ipv4_info(match_criterion)
+
+            qos_info = extract_qos_info(
+                connection_groups, connection_grp_id, src_sdp_idx, dst_sdp_idx
+            )
+
+            resource_value_dict = {
+                "uuid": service_name,
+                "operation_type": operation_type,
+                "app_flow_id": f"{src_sdp_idx}_{dst_sdp_idx}_{service_name}",
+                "app_flow_user_id": str(uuid4()),
+                "max_latency": int(qos_info["upstream"]["max_delay"]),
+                "max_jitter": 10,
+                "max_loss": float(qos_info["upstream"]["packet_loss"]),
+                "upstream_assure_bw": int(qos_info["upstream"]["bw"]) * 1e6,
+                "upstream_max_bw": 2 * int(qos_info["upstream"]["bw"]) * 1e6,
+                "downstream_assure_bw": int(qos_info["downstream"]["bw"]) * 1e6,
+                "downstream_max_bw": 2 * int(qos_info["downstream"]["bw"]) * 1e6,
+                "src_ip": ip_info["src_ip"],
+                "src_port": ip_info["src_port"],
+                "dst_ip": ip_info["dst_ip"],
+                "dst_port": ip_info["dst_port"],
+            }
+            json_config_rules = setup_config_rules(service_name, resource_value_dict)
+
+            del controller.device_config.config_rules[:]
+            for jcr in json_config_rules:
+                controller.device_config.config_rules.append(ConfigRule(**jcr))
+
+            self.__task_executor.configure_device(controller)
+            LOGGER.debug('Configured device "{:s}"'.format(controller.name))
+
+        except Exception as e:  # pylint: disable=broad-except
+            results.append(e)
+
+        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
+        results = []
+        try:
+            src_device_uuid, src_endpoint_uuid = get_device_endpoint_uuids(endpoints[0])
+            src_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(src_device_uuid))
+            )
+            controller = self.__task_executor.get_device_controller(src_device_obj)
+            json_config_rules = teardown_config_rules(service_uuid, {})
+            if len(json_config_rules) > 0:
+                del controller.device_config.config_rules[:]
+                for json_config_rule in json_config_rules:
+                    controller.device_config.config_rules.append(
+                        ConfigRule(**json_config_rule)
+                    )
+                self.__task_executor.configure_device(controller)
+            results.append(True)
+        except Exception as e:  # pylint: disable=broad-except
+            results.append(e)
+        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_nce/__init__.py b/src/service/service/service_handlers/l3nm_nce/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/service/service/service_handlers/l3nm_nce/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/l3slice_ietfslice/ConfigRules.py b/src/service/service/service_handlers/l3slice_ietfslice/ConfigRules.py
new file mode 100644
index 0000000000000000000000000000000000000000..173d4ba10dbf1f6a8aead912a2a1435632f94569
--- /dev/null
+++ b/src/service/service/service_handlers/l3slice_ietfslice/ConfigRules.py
@@ -0,0 +1,301 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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, Tuple
+
+from common.proto.context_pb2 import Link
+from common.tools.object_factory.ConfigRule import (
+    json_config_rule_delete,
+    json_config_rule_set,
+)
+from context.client.ContextClient import ContextClient
+
+
+def build_match_criterion(
+    vlan: str,
+    src_ip: str,
+    src_port: str,
+    dst_ip: str,
+    dst_port: str,
+    target_conn_group_id: str = "line1",
+    index: int = 1,
+) -> Dict:
+    """
+    Build the match-criterion structure used in the 'service-match-criteria'.
+    """
+    return {
+        "index": index,
+        "match-type": [
+            {"type": "ietf-network-slice-service:vlan", "value": [vlan]},
+            {
+                "type": "ietf-network-slice-service:source-ip-prefix",
+                "value": [src_ip],
+            },
+            {
+                "type": "ietf-network-slice-service:source-tcp-port",
+                "value": [src_port],
+            },
+            {
+                "type": "ietf-network-slice-service:destination-ip-prefix",
+                "value": [dst_ip],
+            },
+            {
+                "type": "ietf-network-slice-service:destination-tcp-port",
+                "value": [dst_port],
+            },
+        ],
+        "target-connection-group-id": target_conn_group_id,
+    }
+
+
+def build_sdp(
+    sdp_id: str,
+    node_id: str,
+    mgmt_ip: str,
+    ac_node_id: str,
+    ac_ep_id: str,
+    match_criterion: Dict,
+    attachment_id: str = "0",
+    attachment_description: str = "dsc",
+) -> Dict:
+    """
+    Build the sdp structure used in the 'slice_service' dictionary.
+    """
+    return {
+        "id": sdp_id,
+        "node-id": node_id,
+        "sdp-ip-address": [mgmt_ip],
+        "service-match-criteria": {"match-criterion": [match_criterion]},
+        "attachment-circuits": {
+            "attachment-circuit": [
+                {
+                    "id": attachment_id,
+                    "description": attachment_description,
+                    "ac-node-id": ac_node_id,
+                    "ac-tp-id": ac_ep_id,
+                }
+            ]
+        },
+    }
+
+
+def build_slo_policy_bound(
+    one_way_delay: int, one_way_bandwidth: int, one_way_packet_loss: float
+) -> List[Dict]:
+    """
+    Build the 'metric-bound' portion of the 'slo-policy' dictionary.
+    """
+    return [
+        {
+            "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+            "metric-unit": "milliseconds",
+            "bound": one_way_delay,
+        },
+        {
+            "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+            "metric-unit": "Mbps",
+            "bound": one_way_bandwidth,
+        },
+        {
+            "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+            "metric-unit": "percentage",
+            "percentile-value": one_way_packet_loss,
+        },
+    ]
+
+
+def _get_device_endpoint_name(device_obj, endpoint_uuid: str) -> str:
+    """
+    Given a device object and an endpoint UUID, return the device endpoint name.
+    Raises an exception if not found.
+    """
+    for d_ep in device_obj.device_endpoints:
+        if d_ep.endpoint_id.endpoint_uuid.uuid == endpoint_uuid:
+            return d_ep.name
+    raise Exception("Endpoint not found")
+
+
+def setup_config_rules(service_uuid: str, json_settings: Dict) -> List[Dict]:
+    operation_type: str = json_settings["operation_type"]
+
+    # Source parameters
+    src_node_id: str = json_settings["src_node_id"]
+    src_mgmt_ip_address: str = json_settings["src_mgmt_ip_address"]
+    src_ac_node_id: str = json_settings["src_ac_node_id"]
+    src_ac_ep_id: str = json_settings["src_ac_ep_id"]
+    src_vlan: str = json_settings["src_vlan"]
+    src_source_ip_prefix: str = json_settings["src_source_ip_prefix"]
+    src_source_tcp_port: str = json_settings["src_source_tcp_port"]
+    src_destination_ip_prefix: str = json_settings["src_destination_ip_prefix"]
+    src_destination_tcp_port: str = json_settings["src_destination_tcp_port"]
+    source_one_way_delay: int = int(json_settings["source_one_way_delay"])
+    source_one_way_bandwidth: int = int(json_settings["source_one_way_bandwidth"])
+    source_one_way_packet_loss: float = float(
+        json_settings["source_one_way_packet_loss"]
+    )
+
+    # Destination parameters
+    dst_node_id: str = json_settings["dst_node_id"]
+    dst_mgmt_ip_address: str = json_settings["dst_mgmt_ip_address"]
+    dst_ac_node_id: str = json_settings["dst_ac_node_id"]
+    dst_ac_ep_id: str = json_settings["dst_ac_ep_id"]
+    dst_vlan: str = json_settings["dst_vlan"]
+    dst_source_ip_prefix: str = json_settings["dst_source_ip_prefix"]
+    dst_source_tcp_port: str = json_settings["dst_source_tcp_port"]
+    dst_destination_ip_prefix: str = json_settings["dst_destination_ip_prefix"]
+    dst_destination_tcp_port: str = json_settings["dst_destination_tcp_port"]
+    destination_one_way_delay: int = int(json_settings["destination_one_way_delay"])
+    destination_one_way_bandwidth: int = int(
+        json_settings["destination_one_way_bandwidth"]
+    )
+    destination_one_way_packet_loss: float = float(
+        json_settings["destination_one_way_packet_loss"]
+    )
+
+    # Slice ID
+    slice_id: str = json_settings["slice_id"]
+
+    # build source & destination match criteria
+    src_match_criterion = build_match_criterion(
+        vlan=src_vlan,
+        src_ip=src_source_ip_prefix,
+        src_port=src_source_tcp_port,
+        dst_ip=src_destination_ip_prefix,
+        dst_port=src_destination_tcp_port,
+    )
+    dst_match_criterion = build_match_criterion(
+        vlan=dst_vlan,
+        src_ip=dst_source_ip_prefix,
+        src_port=dst_source_tcp_port,
+        dst_ip=dst_destination_ip_prefix,
+        dst_port=dst_destination_tcp_port,
+    )
+
+    # Build SDPs
+    sdp_src = build_sdp(
+        sdp_id="1",
+        node_id=src_node_id,
+        mgmt_ip=src_mgmt_ip_address,
+        ac_node_id=src_ac_node_id,
+        ac_ep_id=src_ac_ep_id,
+        match_criterion=src_match_criterion,
+    )
+    sdp_dst = build_sdp(
+        sdp_id="2",
+        node_id=dst_node_id,
+        mgmt_ip=dst_mgmt_ip_address,
+        ac_node_id=dst_ac_node_id,
+        ac_ep_id=dst_ac_ep_id,
+        match_criterion=dst_match_criterion,
+    )
+
+    sdps = [sdp_src, sdp_dst]
+
+    # Build connection-groups
+    connection_groups = [
+        {
+            "id": "line1",
+            "connectivity-type": "point-to-point",
+            "connectivity-construct": [
+                {
+                    "id": 1,
+                    "p2p-sender-sdp": "1",
+                    "p2p-receiver-sdp": "2",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": build_slo_policy_bound(
+                                one_way_delay=source_one_way_delay,
+                                one_way_bandwidth=source_one_way_bandwidth,
+                                one_way_packet_loss=source_one_way_packet_loss,
+                            )
+                        }
+                    },
+                },
+                {
+                    "id": 2,
+                    "p2p-sender-sdp": "2",
+                    "p2p-receiver-sdp": "1",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": build_slo_policy_bound(
+                                one_way_delay=destination_one_way_delay,
+                                one_way_bandwidth=destination_one_way_bandwidth,
+                                one_way_packet_loss=destination_one_way_packet_loss,
+                            )
+                        }
+                    },
+                },
+            ],
+        }
+    ]
+
+    slice_service = {
+        "id": slice_id,
+        "description": "dsc",
+        "sdps": {"sdp": sdps},
+        "connection-groups": {"connection-group": connection_groups},
+    }
+    slice_data_model = {"network-slice-services": {"slice-service": [slice_service]}}
+
+    json_config_rules = [
+        json_config_rule_set(
+            "/service[{:s}]/IETFSlice".format(service_uuid),
+            slice_data_model,
+        ),
+        json_config_rule_set(
+            "/service[{:s}]/IETFSlice/operation".format(service_uuid),
+            {"type": operation_type},
+        ),
+    ]
+    return json_config_rules
+
+
+def teardown_config_rules(service_uuid: str, json_settings: Dict) -> List[Dict]:
+    json_config_rules = [
+        json_config_rule_delete(
+            "/service[{:s}]/IETFSlice".format(service_uuid),
+            {},
+        ),
+        json_config_rule_delete(
+            "/service[{:s}]/IETFSlice/operation".format(service_uuid),
+            {},
+        ),
+    ]
+    return json_config_rules
+
+
+def get_link_ep_device_names(
+    link: Link, context_client: ContextClient
+) -> Tuple[str, str, str, str]:
+    ep_ids = link.link_endpoint_ids
+    ep_device_id_1 = ep_ids[0].device_id
+    ep_uuid_1 = ep_ids[0].endpoint_uuid.uuid
+    device_obj_1 = context_client.GetDevice(ep_device_id_1)
+    ep_name_1 = _get_device_endpoint_name(device_obj_1, ep_uuid_1)
+    device_obj_name_1 = device_obj_1.name
+
+    ep_device_id_2 = ep_ids[1].device_id
+    ep_uuid_2 = ep_ids[1].endpoint_uuid.uuid
+    device_obj_2 = context_client.GetDevice(ep_device_id_2)
+    ep_name_2 = _get_device_endpoint_name(device_obj_2, ep_uuid_2)
+    device_obj_name_2 = device_obj_2.name
+
+    return (
+        device_obj_name_1,
+        ep_name_1,
+        device_obj_1,
+        device_obj_name_2,
+        ep_name_2,
+        device_obj_2,
+    )
diff --git a/src/service/service/service_handlers/l3slice_ietfslice/L3SliceIETFSliceServiceHandler.py b/src/service/service/service_handlers/l3slice_ietfslice/L3SliceIETFSliceServiceHandler.py
new file mode 100644
index 0000000000000000000000000000000000000000..0df8b56e3495dcf70dcfd78b8e3ea83bef93dc46
--- /dev/null
+++ b/src/service/service/service_handlers/l3slice_ietfslice/L3SliceIETFSliceServiceHandler.py
@@ -0,0 +1,959 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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
+import logging
+import re
+from typing import Any, Dict, List, Optional, Tuple, TypedDict, Union
+
+from deepdiff import DeepDiff
+from dataclasses import dataclass
+
+from common.method_wrappers.Decorator import MetricsPool, metered_subclass_method
+from common.proto.context_pb2 import ConfigRule, DeviceId, Empty, Service, ServiceConfig
+from common.tools.object_factory.Device import json_device_id
+from common.type_checkers.Checkers import chk_type
+from context.client.ContextClient import ContextClient
+from service.service.service_handler_api._ServiceHandler import _ServiceHandler
+from service.service.service_handler_api.SettingsHandler import SettingsHandler
+from service.service.service_handler_api.Tools import (
+    get_device_endpoint_uuids,
+)
+from service.service.task_scheduler.TaskExecutor import TaskExecutor
+
+from .ConfigRules import (
+    get_link_ep_device_names,
+    setup_config_rules,
+    teardown_config_rules,
+)
+
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
+
+SDP_DIFF_RE = re.compile(
+    r"^root\[\'network-slice-services\'\]\[\'slice-service\'\]\[0\]\[\'sdps\'\]\[\'sdp\'\]\[(\d)\]$"
+)
+CONNECTION_GROUP_DIFF_RE = re.compile(
+    r"^root\[\'network-slice-services\'\]\[\'slice-service\'\]\[0\]\[\'connection-groups\'\]\[\'connection-group\'\]\[(\d)\]$"
+)
+MATCH_CRITERION_DIFF_RE = re.compile(
+    r"^root\[\'network-slice-services\'\]\[\'slice-service\'\]\[0\]\[\'sdps\'\]\[\'sdp\'\]\[(\d)\]\[\'service-match-criteria\'\]\[\'match-criterion\'\]\[(\d)\]$"
+)
+
+RE_GET_ENDPOINT_FROM_INTERFACE = re.compile(r"^\/interface\[([^\]]+)\].*")
+
+LOGGER = logging.getLogger(__name__)
+
+METRICS_POOL = MetricsPool(
+    "Service", "Handler", labels={"handler": "l3slice_ietfslice"}
+)
+
+
+RAISE_IF_DIFFERS = True
+
+
+class Ipv4Info(TypedDict):
+    src_lan: str
+    dst_lan: str
+    src_port: str
+    dst_port: str
+    vlan: str
+
+
+class DeviceEpInfo(TypedDict):
+    ipv4_info: Ipv4Info
+    node_name: str
+    endpoint_name: str
+    one_way_delay: int
+    one_way_bandwidth: int
+    one_way_packet_loss: float
+
+
+@dataclass
+class ConnectivityConstructInfo:
+    bandwidth: int = 0
+    delay: int = 0
+    packet_loss: float = 0.0
+
+
+def get_custom_config_rule(
+    service_config: ServiceConfig, resource_key: str
+) -> Optional[ConfigRule]:
+    """
+    Returns the ConfigRule from service_config matching the provided resource_key
+    if found, otherwise returns None.
+    """
+    for cr in service_config.config_rules:
+        if (
+            cr.WhichOneof("config_rule") == "custom"
+            and cr.custom.resource_key == resource_key
+        ):
+            return cr
+    return None
+
+
+def get_running_candidate_ietf_slice_data_diff(service_config: ServiceConfig) -> Dict:
+    """
+    Loads the JSON from the running/candidate resource ConfigRules and returns
+    their DeepDiff comparison.
+    """
+    running_cr = get_custom_config_rule(service_config, RUNNING_RESOURCE_KEY)
+    candidate_cr = get_custom_config_rule(service_config, CANDIDATE_RESOURCE_KEY)
+    running_value_dict = json.loads(running_cr.custom.resource_value)
+    candidate_value_dict = json.loads(candidate_cr.custom.resource_value)
+    return DeepDiff(running_value_dict, candidate_value_dict)
+
+
+def extract_match_criterion_ipv4_info(match_criterion: Dict) -> Ipv4Info:
+    """
+    Extracts IPv4 info from the match criterion dictionary.
+    """
+    src_lan = dst_lan = src_port = dst_port = vlan = ""
+    for type_value in match_criterion["match-type"]:
+        m_type = type_value["type"]
+        val = type_value["value"][0]
+        if m_type == "ietf-network-slice-service:source-ip-prefix":
+            src_lan = val
+        elif m_type == "ietf-network-slice-service:destination-ip-prefix":
+            dst_lan = val
+        elif m_type == "ietf-network-slice-service:source-tcp-port":
+            src_port = val
+        elif m_type == "ietf-network-slice-service:destination-tcp-port":
+            dst_port = val
+        elif m_type == "ietf-network-slice-service:vlan":
+            vlan = val
+    return Ipv4Info(
+        src_lan=src_lan,
+        dst_lan=dst_lan,
+        src_port=src_port,
+        dst_port=dst_port,
+        vlan=vlan,
+    )
+
+
+def get_removed_items(
+    candidate_ietf_slice_dict: dict, running_ietf_slice_dict: dict
+) -> dict:
+    """
+    For the 'iterable_item_removed' scenario, returns dict with removed sdp / connection_group / match_criterion info.
+    Raises an exception if there's inconsistent data or multiple items removed (which is not supported).
+    """
+    removed_items = {
+        "sdp": {"sdp_idx": None, "value": {}},
+        "connection_group": {"connection_group_idx": None, "value": {}},
+        "match_criterion": {
+            "sdp_idx": None,
+            "match_criterion_idx": None,
+            "value": {},
+        },
+    }
+
+    running_slice_services = running_ietf_slice_dict["network-slice-services"][
+        "slice-service"
+    ][0]
+    candidate_slice_services = candidate_ietf_slice_dict["network-slice-services"][
+        "slice-service"
+    ][0]
+
+    running_slice_sdps = [sdp["id"] for sdp in running_slice_services["sdps"]["sdp"]]
+    candidiate_slice_sdps = [
+        sdp["id"] for sdp in candidate_slice_services["sdps"]["sdp"]
+    ]
+    removed_sdps = set(running_slice_sdps) - set(candidiate_slice_sdps)
+
+    if len(removed_sdps) > 1:
+        raise Exception("Multiple SDPs removed - not supported.")
+    removed_sdp_id = removed_sdps.pop()
+
+    removed_items["sdp"]["sdp_idx"] = running_slice_sdps.index(removed_sdp_id)
+    removed_items["sdp"]["value"] = next(
+        sdp
+        for sdp in running_slice_services["sdps"]["sdp"]
+        if sdp["id"] == removed_sdp_id
+    )
+
+    match_criteria = removed_items["sdp"]["value"]["service-match-criteria"][
+        "match-criterion"
+    ]
+    if len(match_criteria) > 1:
+        raise Exception("Multiple match criteria found - not supported")
+    match_criterion = match_criteria[0]
+    connection_grp_id = match_criterion["target-connection-group-id"]
+    connection_groups = running_slice_services["connection-groups"]["connection-group"]
+    connection_group = next(
+        (idx, cg)
+        for idx, cg in enumerate(connection_groups)
+        if cg["id"] == connection_grp_id
+    )
+    removed_items["connection_group"]["connection_group_idx"] = connection_group[0]
+    removed_items["connection_group"]["value"] = connection_group[1]
+
+    for sdp in running_slice_services["sdps"]["sdp"]:
+        if sdp["id"] == removed_sdp_id:
+            continue
+        for mc in sdp["service-match-criteria"]["match-criterion"]:
+            if mc["target-connection-group-id"] == connection_grp_id:
+                removed_items["match_criterion"]["sdp_idx"] = running_slice_sdps.index(
+                    sdp["id"]
+                )
+                removed_items["match_criterion"]["match_criterion_idx"] = sdp[
+                    "service-match-criteria"
+                ]["match-criterion"].index(mc)
+                removed_items["match_criterion"]["value"] = mc
+                break
+
+    if (
+        removed_items["match_criterion"]["sdp_idx"] is None
+        or removed_items["sdp"]["sdp_idx"] is None
+        or removed_items["connection_group"]["connection_group_idx"] is None
+    ):
+        raise Exception("sdp, connection group or match criterion not found")
+    return removed_items
+
+
+def gather_connectivity_construct_info(
+    candidate_connection_groups: List[Dict],
+) -> Dict[Tuple[str, str], ConnectivityConstructInfo]:
+    """
+    Creates a dict mapping (sender_sdp, receiver_sdp) -> ConnectivityConstructInfo
+    from the given list of candidate connection groups.
+    """
+    cc_info: Dict[Tuple[str, str], ConnectivityConstructInfo] = {}
+    for cg in candidate_connection_groups:
+        for cc in cg["connectivity-construct"]:
+            cc_sender = cc["p2p-sender-sdp"]
+            cc_receiver = cc["p2p-receiver-sdp"]
+            cc_key = (cc_sender, cc_receiver)
+            cc_info[cc_key] = ConnectivityConstructInfo()
+            for metric_bound in cc["service-slo-sle-policy"]["slo-policy"][
+                "metric-bound"
+            ]:
+                if (
+                    metric_bound["metric-type"]
+                    == "ietf-network-slice-service:one-way-delay-maximum"
+                    and metric_bound["metric-unit"] == "milliseconds"
+                ):
+                    cc_info[cc_key].delay = int(metric_bound["bound"])
+                elif (
+                    metric_bound["metric-type"]
+                    == "ietf-network-slice-service:two-way-packet-loss"
+                    and metric_bound["metric-unit"] == "percentage"
+                ):
+                    cc_info[cc_key].packet_loss = float(
+                        metric_bound["percentile-value"]
+                    )
+                elif (
+                    metric_bound["metric-type"]
+                    == "ietf-network-slice-service:one-way-bandwidth"
+                    and metric_bound["metric-unit"] == "Mbps"
+                ):
+                    cc_info[cc_key].bandwidth = int(metric_bound["bound"])
+    return cc_info
+
+
+def extract_source_destination_device_endpoint_info(
+    device_ep_pairs: list, connection_group: Dict, candidate_connection_groups: List
+) -> Tuple[DeviceEpInfo, DeviceEpInfo]:
+    """
+    Given device_ep_pairs, the relevant connection_group data, and all candidate
+    connection groups, figure out the final DeviceEpInfo for source and destination.
+    This includes computing the combined bandwidth, min delay, etc.
+    """
+    connectivity_construct = connection_group["connectivity-construct"][0]
+    sender_sdp = connectivity_construct["p2p-sender-sdp"]
+    receiver_sdp = connectivity_construct["p2p-receiver-sdp"]
+
+    # If the first pair is not the sender, we invert them
+    if sender_sdp == device_ep_pairs[0][4]:
+        ...
+    elif sender_sdp == device_ep_pairs[1][4]:
+        device_ep_pairs = device_ep_pairs[::-1]
+    else:
+        raise Exception("Sender SDP not found in device_ep_pairs")
+
+    # Gather info from candidate connection groups
+    cc_info = gather_connectivity_construct_info(candidate_connection_groups)
+
+    source_delay = int(1e6)
+    source_bandwidth = 0
+    source_packet_loss = 1.0
+    destination_delay = int(1e6)
+    destination_bandwidth = 0
+    destination_packet_loss = 1.0
+
+    if cc_info:
+        common_sdps = set.intersection(*[set(key) for key in cc_info.keys()])
+        if len(cc_info) > 2 and len(common_sdps) != 1:
+            raise Exception(
+                "There should be one common sdp in all connectivity constructs, otherwise, it is not supported"
+            )
+        if len(common_sdps) == 1:
+            common_sdp = common_sdps.pop()
+        elif len(common_sdps) == 2:
+            # Fallback if intersection is 2 => pick sender_sdp
+            common_sdp = sender_sdp
+        else:
+            raise Exception("Invalid number of common sdps")
+
+    for (sender, receiver), metrics in cc_info.items():
+        cc_bandwidth = metrics.bandwidth
+        cc_max_delay = metrics.delay
+        cc_packet_loss = metrics.packet_loss
+        if sender == common_sdp:
+            source_bandwidth += cc_bandwidth
+            if cc_max_delay < source_delay:
+                source_delay = cc_max_delay
+            if cc_packet_loss < source_packet_loss:
+                source_packet_loss = cc_packet_loss
+        else:
+            destination_bandwidth += cc_bandwidth
+            if cc_max_delay < destination_delay:
+                destination_delay = cc_max_delay
+            if cc_packet_loss < destination_packet_loss:
+                destination_packet_loss = cc_packet_loss
+
+    source_device_ep_info = DeviceEpInfo(
+        ipv4_info=device_ep_pairs[0][5],
+        node_name=device_ep_pairs[0][2],
+        endpoint_name=device_ep_pairs[0][3],
+        one_way_delay=source_delay,
+        one_way_bandwidth=source_bandwidth,
+        one_way_packet_loss=source_packet_loss,
+    )
+    destination_device_ep_info = DeviceEpInfo(
+        ipv4_info=device_ep_pairs[1][5],
+        node_name=device_ep_pairs[1][2],
+        endpoint_name=device_ep_pairs[1][3],
+        one_way_delay=destination_delay,
+        one_way_bandwidth=destination_bandwidth,
+        one_way_packet_loss=destination_packet_loss,
+    )
+
+    return source_device_ep_info, destination_device_ep_info
+
+
+def _parse_item_added(diff: Dict) -> dict:
+    """
+    Helper to parse 'iterable_item_added' from the running_candidate_diff
+    and return the relevant items for sdp, connection_group, match_criterion, etc.
+    """
+    added_items = {
+        "sdp": {"sdp_idx": None, "value": {}},
+        "connection_group": {"connection_group_idx": None, "value": {}},
+        "match_criterion": {
+            "sdp_idx": None,
+            "match_criterion_idx": None,
+            "value": {},
+        },
+    }
+    for added_key, added_value in diff["iterable_item_added"].items():
+        sdp_match = SDP_DIFF_RE.match(added_key)
+        connection_group_match = CONNECTION_GROUP_DIFF_RE.match(added_key)
+        match_criterion_match = MATCH_CRITERION_DIFF_RE.match(added_key)
+        if sdp_match:
+            added_items["sdp"] = {
+                "sdp_idx": int(sdp_match.groups()[0]),
+                "value": added_value,
+            }
+        elif connection_group_match:
+            added_items["connection_group"] = {
+                "connection_group_idx": int(connection_group_match.groups()[0]),
+                "value": added_value,
+            }
+        elif match_criterion_match:
+            added_items["match_criterion"] = {
+                "sdp_idx": int(match_criterion_match.groups()[0]),
+                "match_criterion_idx": int(match_criterion_match.groups()[1]),
+                "value": added_value,
+            }
+    return added_items
+
+
+class L3NMSliceIETFSliceServiceHandler(_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)
+
+    @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 []
+
+        results = []
+        try:
+            service_config = self.__service.service_config
+
+            # 1. Identify source and destination devices
+            src_device_uuid, src_endpoint_uuid = get_device_endpoint_uuids(endpoints[0])
+            src_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(src_device_uuid))
+            )
+            src_device_name = src_device_obj.name
+            src_controller = self.__task_executor.get_device_controller(src_device_obj)
+
+            dst_device_uuid, dst_endpoint_uuid = get_device_endpoint_uuids(
+                endpoints[-1]
+            )
+            dst_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(dst_device_uuid))
+            )
+            dst_device_name = dst_device_obj.name
+            dst_controller = self.__task_executor.get_device_controller(dst_device_obj)
+
+            if (
+                src_controller.device_id.device_uuid.uuid
+                != dst_controller.device_id.device_uuid.uuid
+            ):
+                raise Exception("Different Src-Dst devices not supported by now")
+
+            controller = src_controller  # same device controller
+
+            # 2. Determine how the candidate & running resources differ
+            running_candidate_diff = get_running_candidate_ietf_slice_data_diff(
+                service_config
+            )
+            candidate_ietf_slice_cr = get_custom_config_rule(
+                service_config, CANDIDATE_RESOURCE_KEY
+            )
+            candidate_resource_value_dict = json.loads(
+                candidate_ietf_slice_cr.custom.resource_value
+            )
+            running_ietf_slice_cr = get_custom_config_rule(
+                service_config, RUNNING_RESOURCE_KEY
+            )
+            running_resource_value_dict = json.loads(
+                running_ietf_slice_cr.custom.resource_value
+            )
+            slice_name = running_resource_value_dict["network-slice-services"][
+                "slice-service"
+            ][0]["id"]
+
+            # 3. Retrieve the context links for matching endpoints
+            context_client = ContextClient()
+            links = context_client.ListLinks(Empty()).links
+
+            device_ep_pairs = []
+            sdp_ids = []
+            target_connection_group_id = None
+            operation_type = "update"  # default fallback
+
+            # 4. Handle creation vs additions vs removals
+            if not running_candidate_diff:  # Slice Creation
+                # 4a. New Slice Creation
+                operation_type = "create"
+
+                candidate_slice_service = candidate_resource_value_dict[
+                    "network-slice-services"
+                ]["slice-service"][0]
+                full_connection_groups = candidate_slice_service["connection-groups"][
+                    "connection-group"
+                ]
+                sdps = candidate_slice_service["sdps"]["sdp"]
+                sdp_ids = [sdp["node-id"] for sdp in sdps]
+
+                # figure out which device is connected to which link
+                edge_device_names = [src_device_name, dst_device_name]
+                for sdp in sdps:
+                    node_id = sdp["node-id"]
+                    for link in links:
+                        info = get_link_ep_device_names(link, context_client)
+                        dev1, ep1, _, dev2, ep2, _ = info
+                        if dev1 == node_id and dev2 in edge_device_names:
+                            edge_device_names.remove(dev2)
+                            match_criteria = sdp["service-match-criteria"][
+                                "match-criterion"
+                            ]
+                            if len(match_criteria) != 1:
+                                raise Exception(
+                                    "Only one match criteria allowed for initial slice creation"
+                                )
+                            match_criterion = match_criteria[0]
+                            ipv4_info = extract_match_criterion_ipv4_info(
+                                match_criterion
+                            )
+                            device_ep_pairs.append(
+                                (
+                                    node_id,
+                                    ep1,
+                                    dev2,
+                                    ep2,
+                                    sdp["id"],
+                                    ipv4_info,
+                                )
+                            )
+                            target_connection_group_id = match_criterion[
+                                "target-connection-group-id"
+                            ]
+                            sdp_ids.remove(node_id)
+                            break
+
+                # find the second link
+                if not edge_device_names:
+                    raise Exception("Edge device names exhausted unexpectedly.")
+
+                # second link logic
+                for link in links:
+                    info = get_link_ep_device_names(link, context_client)
+                    dev1, ep1, device_obj_1, dev2, ep2, device_obj_2 = info
+                    if (
+                        dev1 == edge_device_names[0]
+                        and device_obj_2.controller_id != device_obj_1.controller_id
+                    ):
+                        for sdp in sdps:
+                            if sdp["node-id"] != sdp_ids[0]:
+                                continue
+                            match_criteria = sdp["service-match-criteria"][
+                                "match-criterion"
+                            ]
+                            if len(match_criteria) != 1:
+                                raise Exception(
+                                    "Only one match criteria allowed for initial slice creation"
+                                )
+                            match_criterion = match_criteria[0]
+                            ipv4_info = extract_match_criterion_ipv4_info(
+                                match_criterion
+                            )
+                            device_ep_pairs.append(
+                                (
+                                    dev2,
+                                    ep2,
+                                    dev1,
+                                    ep1,
+                                    sdp["id"],
+                                    ipv4_info,
+                                )
+                            )
+                            break
+                        else:
+                            raise Exception("No matching sdp found for second link.")
+                        break
+                else:
+                    raise Exception("sdp between the domains not found")
+
+            elif "iterable_item_added" in running_candidate_diff:  # new SDP added
+                # 4b. A new SDP was added
+                operation_type = "update"
+
+                candidate_slice_service = candidate_resource_value_dict[
+                    "network-slice-services"
+                ]["slice-service"][0]
+                sdps = candidate_slice_service["sdps"]["sdp"]
+                full_connection_groups = candidate_slice_service["connection-groups"][
+                    "connection-group"
+                ]
+                added_items = _parse_item_added(running_candidate_diff)
+
+                new_sdp = sdps[added_items["sdp"]["sdp_idx"]]
+                src_sdp_name = new_sdp["node-id"]
+                dst_sdp_idx = sdps[added_items["match_criterion"]["sdp_idx"]]["id"]
+                dst_sdp_name = sdps[added_items["match_criterion"]["sdp_idx"]][
+                    "node-id"
+                ]
+                for link in links:
+                    info = get_link_ep_device_names(link, context_client)
+                    dev1, ep1, device_obj_1, dev2, ep2, device_obj_2 = info
+                    if (
+                        dev1 == src_sdp_name
+                        and device_obj_2.controller_id != device_obj_1.controller_id
+                    ):
+                        for sdp in sdps:
+                            if sdp["node-id"] != src_sdp_name:
+                                continue
+                            match_criteria = sdp["service-match-criteria"][
+                                "match-criterion"
+                            ]
+                            if len(match_criteria) != 1:
+                                raise Exception(
+                                    "Only one match criteria allowed for initial slice creation"
+                                )
+                            match_criterion = match_criteria[0]
+                            ipv4_info = extract_match_criterion_ipv4_info(
+                                match_criterion
+                            )
+                            device_ep_pairs.append(
+                                (
+                                    dev2,
+                                    ep2,
+                                    dev1,
+                                    ep1,
+                                    sdp["id"],
+                                    ipv4_info,
+                                )
+                            )
+                            target_connection_group_id = match_criterion[
+                                "target-connection-group-id"
+                            ]
+                        break
+                else:
+                    raise Exception("sdp between the domains not found")
+                for link in links:
+                    info = get_link_ep_device_names(link, context_client)
+                    dev1, ep1, device_obj_1, dev2, ep2, device_obj_2 = info
+                    if (
+                        dev1 == dst_sdp_name
+                        and device_obj_2.controller_id != device_obj_1.controller_id
+                    ):
+                        for sdp in sdps:
+                            if sdp["node-id"] != dst_sdp_name:
+                                continue
+                            match_criteria = sdp["service-match-criteria"][
+                                "match-criterion"
+                            ]
+                            vlan_id = set()
+                            for match in match_criteria:
+                                for type_value in match["match-type"]:
+                                    if (
+                                        type_value["type"]
+                                        == "ietf-network-slice-service:vlan"
+                                    ):
+                                        vlan_id.add(type_value["value"][0])
+                            if len(vlan_id) != 1:
+                                raise Exception(
+                                    "one vlan id found in SDP match criteria"
+                                )
+                            match_criterion = match_criteria[
+                                added_items["match_criterion"]["match_criterion_idx"]
+                            ]
+                            ipv4_info = extract_match_criterion_ipv4_info(
+                                match_criterion
+                            )
+                            device_ep_pairs.append(
+                                (
+                                    dev2,
+                                    ep2,
+                                    dev1,
+                                    ep1,
+                                    sdp["id"],
+                                    ipv4_info,
+                                )
+                            )
+                        break
+                else:
+                    raise Exception("sdp between the domains not found")
+            elif "iterable_item_removed" in running_candidate_diff:  # an SDP removed
+                # 4c. An existing SDP was removed
+                operation_type = "update"
+
+                slice_services = running_resource_value_dict["network-slice-services"][
+                    "slice-service"
+                ]
+                candidate_slice_services = candidate_resource_value_dict[
+                    "network-slice-services"
+                ]["slice-service"]
+                candidate_slice_service = candidate_slice_services[0]
+                slice_service = slice_services[0]
+                full_connection_groups = slice_service["connection-groups"][
+                    "connection-group"
+                ]
+                sdps = slice_service["sdps"]["sdp"]
+                removed_items = get_removed_items(
+                    candidate_resource_value_dict, running_resource_value_dict
+                )
+                new_sdp = sdps[removed_items["sdp"]["sdp_idx"]]
+                src_sdp_name = new_sdp["node-id"]
+                dst_sdp_idx = sdps[removed_items["match_criterion"]["sdp_idx"]]["id"]
+                dst_sdp_name = sdps[removed_items["match_criterion"]["sdp_idx"]][
+                    "node-id"
+                ]
+                for link in links:
+                    (
+                        device_obj_name_1,
+                        ep_name_1,
+                        device_obj_1,
+                        device_obj_name_2,
+                        ep_name_2,
+                        device_obj_2,
+                    ) = get_link_ep_device_names(link, context_client)
+                    if (
+                        device_obj_name_1 == src_sdp_name
+                        and device_obj_2.controller_id != device_obj_1.controller_id
+                    ):
+                        for sdp in sdps:
+                            if sdp["node-id"] != src_sdp_name:
+                                continue
+                            match_criteria = sdp["service-match-criteria"][
+                                "match-criterion"
+                            ]
+                            if len(match_criteria) != 1:
+                                raise Exception(
+                                    "Only one match criteria allowed for new SDP addition"
+                                )
+                            match_criterion = match_criteria[0]
+                            ipv4_info = extract_match_criterion_ipv4_info(
+                                match_criterion
+                            )
+                            device_ep_pairs.append(
+                                (
+                                    device_obj_name_2,
+                                    ep_name_2,
+                                    device_obj_name_1,
+                                    ep_name_1,
+                                    sdp["id"],
+                                    ipv4_info,
+                                )
+                            )
+                            target_connection_group_id = match_criterion[
+                                "target-connection-group-id"
+                            ]
+                        break
+                else:
+                    raise Exception("sdp between the domains not found")
+                for link in links:
+                    (
+                        device_obj_name_1,
+                        ep_name_1,
+                        device_obj_1,
+                        device_obj_name_2,
+                        ep_name_2,
+                        device_obj_2,
+                    ) = get_link_ep_device_names(link, context_client)
+                    if (
+                        device_obj_name_1 == dst_sdp_name
+                        and device_obj_2.controller_id != device_obj_1.controller_id
+                    ):
+                        for sdp in sdps:
+                            if sdp["node-id"] != dst_sdp_name:
+                                continue
+                            match_criteria = sdp["service-match-criteria"][
+                                "match-criterion"
+                            ]
+                            vlan_id = set()
+                            for match in match_criteria:
+                                for type_value in match["match-type"]:
+                                    if (
+                                        type_value["type"]
+                                        == "ietf-network-slice-service:vlan"
+                                    ):
+                                        vlan_id.add(type_value["value"][0])
+                            if len(vlan_id) != 1:
+                                raise Exception(
+                                    "one vlan id found in SDP match criteria"
+                                )
+                            match_criterion = match_criteria[
+                                removed_items["match_criterion"]["match_criterion_idx"]
+                            ]
+                            ipv4_info = extract_match_criterion_ipv4_info(
+                                match_criterion
+                            )
+                            device_ep_pairs.append(
+                                (
+                                    device_obj_name_2,
+                                    ep_name_2,
+                                    device_obj_name_1,
+                                    ep_name_1,
+                                    sdp["id"],
+                                    ipv4_info,
+                                )
+                            )
+                        break
+                else:
+                    raise Exception("sdp between the domains not found")
+            else:
+                raise Exception(
+                    "transition from candidate to running info not supported"
+                )
+
+            candidate_connection_groups = candidate_slice_service["connection-groups"][
+                "connection-group"
+            ]
+
+            if (
+                len(
+                    candidate_resource_value_dict["network-slice-services"][
+                        "slice-service"
+                    ][0]["connection-groups"]["connection-group"]
+                )
+                == 0
+            ):
+                # 5. If connection_groups is now empty => operation = delete
+                operation_type = "delete"
+
+            # 6. Retrieve actual target connection_group from the full connection groups
+            if not target_connection_group_id:
+                raise Exception("No target_connection_group_id found.")
+            target_connection_group = next(
+                cg
+                for cg in full_connection_groups
+                if cg["id"] == target_connection_group_id
+            )
+
+            # 7. Build source/destination device info
+            source_device_ep_info, destination_device_ep_info = (
+                extract_source_destination_device_endpoint_info(
+                    device_ep_pairs,
+                    target_connection_group,
+                    candidate_connection_groups,
+                )
+            )
+            resource_value_dict = {
+                "uuid": slice_name,
+                "operation_type": operation_type,
+                "src_node_id": source_device_ep_info["node_name"],
+                "src_mgmt_ip_address": source_device_ep_info["node_name"],
+                "src_ac_node_id": source_device_ep_info["node_name"],
+                "src_ac_ep_id": source_device_ep_info["endpoint_name"],
+                "src_vlan": source_device_ep_info["ipv4_info"]["vlan"],
+                "src_source_ip_prefix": source_device_ep_info["ipv4_info"]["src_lan"],
+                "src_source_tcp_port": source_device_ep_info["ipv4_info"]["src_port"],
+                "src_destination_ip_prefix": source_device_ep_info["ipv4_info"][
+                    "dst_lan"
+                ],
+                "src_destination_tcp_port": source_device_ep_info["ipv4_info"][
+                    "dst_port"
+                ],
+                "source_one_way_delay": source_device_ep_info["one_way_delay"],
+                "source_one_way_bandwidth": source_device_ep_info["one_way_bandwidth"],
+                "source_one_way_packet_loss": source_device_ep_info[
+                    "one_way_packet_loss"
+                ],
+                "dst_node_id": destination_device_ep_info["node_name"],
+                "dst_mgmt_ip_address": destination_device_ep_info["node_name"],
+                "dst_ac_node_id": destination_device_ep_info["node_name"],
+                "dst_ac_ep_id": destination_device_ep_info["endpoint_name"],
+                "dst_vlan": destination_device_ep_info["ipv4_info"]["vlan"],
+                "dst_source_ip_prefix": destination_device_ep_info["ipv4_info"][
+                    "src_lan"
+                ],
+                "dst_source_tcp_port": destination_device_ep_info["ipv4_info"][
+                    "src_port"
+                ],
+                "dst_destination_ip_prefix": destination_device_ep_info["ipv4_info"][
+                    "dst_lan"
+                ],
+                "dst_destination_tcp_port": destination_device_ep_info["ipv4_info"][
+                    "dst_port"
+                ],
+                "destination_one_way_delay": destination_device_ep_info[
+                    "one_way_delay"
+                ],
+                "destination_one_way_bandwidth": destination_device_ep_info[
+                    "one_way_bandwidth"
+                ],
+                "destination_one_way_packet_loss": destination_device_ep_info[
+                    "one_way_packet_loss"
+                ],
+                "slice_id": slice_name,
+            }
+
+            # 9. Create config rules and configure device
+            json_config_rules = setup_config_rules(slice_name, resource_value_dict)
+            del controller.device_config.config_rules[:]
+            for jcr in json_config_rules:
+                controller.device_config.config_rules.append(ConfigRule(**jcr))
+
+            self.__task_executor.configure_device(controller)
+        except Exception as e:  # pylint: disable=broad-except
+            raise e
+            results.append(e)
+        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
+        results = []
+        try:
+            src_device_uuid, src_endpoint_uuid = get_device_endpoint_uuids(endpoints[0])
+            src_device_obj = self.__task_executor.get_device(
+                DeviceId(**json_device_id(src_device_uuid))
+            )
+            controller = self.__task_executor.get_device_controller(src_device_obj)
+            json_config_rules = teardown_config_rules(service_uuid, {})
+            if len(json_config_rules) > 0:
+                del controller.device_config.config_rules[:]
+                for json_config_rule in json_config_rules:
+                    controller.device_config.config_rules.append(
+                        ConfigRule(**json_config_rule)
+                    )
+                self.__task_executor.configure_device(controller)
+            results.append(True)
+        except Exception as e:  # pylint: disable=broad-except
+            results.append(e)
+        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/l3slice_ietfslice/__init__.py b/src/service/service/service_handlers/l3slice_ietfslice/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/service/service/service_handlers/l3slice_ietfslice/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/task_scheduler/TaskExecutor.py b/src/service/service/task_scheduler/TaskExecutor.py
index df0ebe31dfad5e09af21f8b27fdf1307e04afd1e..cd5d26670cfdd18f702e2570d346566dbdf08638 100644
--- a/src/service/service/task_scheduler/TaskExecutor.py
+++ b/src/service/service/task_scheduler/TaskExecutor.py
@@ -295,8 +295,12 @@ class TaskExecutor:
                 devices.setdefault(device_type, dict())[device_uuid] = device
             else:
                 if not exclude_managed_by_controller:
-                    device_type = DeviceTypeEnum._value2member_map_[device.device_type]
-                    devices.setdefault(device_type, dict())[device_uuid] = device
+                    controller_device_type_enum = DeviceTypeEnum._value2member_map_[controller.device_type]
+                    if controller_device_type_enum == DeviceTypeEnum.IETF_SLICE:
+                        devices.setdefault(controller_device_type_enum, dict())[device_uuid] = device
+                    else:
+                        device_type = DeviceTypeEnum._value2member_map_[device.device_type]
+                        devices.setdefault(device_type, dict())[device_uuid] = device
                 device_type = DeviceTypeEnum._value2member_map_[controller.device_type]
                 devices.setdefault(device_type, dict())[controller.device_id.device_uuid.uuid] = controller
         return devices
@@ -335,7 +339,7 @@ class TaskExecutor:
         self, connection : Connection, service : Service, **service_handler_settings
     ) -> Dict[DeviceTypeEnum, Tuple['_ServiceHandler', Dict[str, Device]]]:
         connection_device_types : Dict[DeviceTypeEnum, Dict[str, Device]] = self.get_devices_from_connection(
-            connection, exclude_managed_by_controller=True
+            connection, exclude_managed_by_controller=False
         )
         service_handlers : Dict[DeviceTypeEnum, Tuple['_ServiceHandler', Dict[str, Device]]] = dict()
         for device_type, connection_devices in connection_device_types.items():
diff --git a/src/slice/service/SliceService.py b/src/slice/service/SliceService.py
index dc2584f82d0704080f16e83aa958ba0db6f08fe2..ac4e809762c1ffb6097506f34d519056f2bd3426 100644
--- a/src/slice/service/SliceService.py
+++ b/src/slice/service/SliceService.py
@@ -14,9 +14,10 @@
 
 from common.Constants import ServiceNameEnum
 from common.Settings import get_service_port_grpc
+from common.proto.slice_pb2 import DESCRIPTOR as SLICE_DESCRIPTOR
 from common.proto.slice_pb2_grpc import add_SliceServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
-from slice.service.SliceServiceServicerImpl import SliceServiceServicerImpl
+from .SliceServiceServicerImpl import SliceServiceServicerImpl
 
 class SliceService(GenericGrpcService):
     def __init__(self, cls_name: str = __name__) -> None:
@@ -26,3 +27,5 @@ class SliceService(GenericGrpcService):
 
     def install_servicers(self):
         add_SliceServiceServicer_to_server(self.slice_servicer, self.server)
+
+        self.add_reflection_service_name(SLICE_DESCRIPTOR, 'SliceService')
diff --git a/src/slice/service/SliceServiceServicerImpl.py b/src/slice/service/SliceServiceServicerImpl.py
index 007d012ed432a6d4ab589f6dfe28648a9a6d2a85..68bd0aef153d2b784605abfe03b891b6990d23d5 100644
--- a/src/slice/service/SliceServiceServicerImpl.py
+++ b/src/slice/service/SliceServiceServicerImpl.py
@@ -19,7 +19,7 @@ from common.proto.context_pb2 import (
 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_inter_domain #, is_multi_domain
-from common.tools.context_queries.Slice import get_slice_by_id
+from common.tools.context_queries.Slice import get_slice_by_defualt_id, get_slice_by_id
 from common.tools.grpc.ConfigRules import copy_config_rules
 from common.tools.grpc.Constraints import copy_constraints
 from common.tools.grpc.EndPointIds import copy_endpoint_ids
@@ -45,6 +45,8 @@ class SliceServiceServicerImpl(SliceServiceServicer):
         # being modified.
         context_client = ContextClient()
         slice_ro : Optional[Slice] = get_slice_by_id(context_client, request.slice_id, rw_copy=False)
+        if not slice_ro:
+            slice_ro : Optional[Slice] = get_slice_by_defualt_id(context_client, request.slice_id, rw_copy=False)
 
         slice_rw = Slice()
         slice_rw.CopyFrom(request if slice_ro is None else slice_ro)
@@ -52,9 +54,9 @@ class SliceServiceServicerImpl(SliceServiceServicer):
         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
 
-        copy_endpoint_ids(request.slice_endpoint_ids,        slice_rw.slice_endpoint_ids       ) # pylint: disable=no-member
-        copy_constraints (request.slice_constraints,         slice_rw.slice_constraints        ) # pylint: disable=no-member
-        copy_config_rules(request.slice_config.config_rules, slice_rw.slice_config.config_rules) # pylint: disable=no-member
+        copy_endpoint_ids(request.slice_endpoint_ids,        slice_rw.slice_endpoint_ids       )        # pylint: disable=no-member
+        copy_constraints (request.slice_constraints,         slice_rw.slice_constraints        )        # pylint: disable=no-member
+        copy_config_rules(request.slice_config.config_rules, slice_rw.slice_config.config_rules, False) # pylint: disable=no-member
 
         slice_id_with_uuids = context_client.SetSlice(slice_rw)
 
@@ -112,7 +114,7 @@ class SliceServiceServicerImpl(SliceServiceServicer):
         # pylint: disable=no-member
         copy_endpoint_ids(request.slice_endpoint_ids, service_request.service_endpoint_ids)
         copy_constraints(request.slice_constraints, service_request.service_constraints)
-        copy_config_rules(request.slice_config.config_rules, service_request.service_config.config_rules)
+        copy_config_rules(request.slice_config.config_rules, service_request.service_config.config_rules, False)
 
         service_request.service_type = ServiceTypeEnum.SERVICETYPE_UNKNOWN
         for config_rule in request.slice_config.config_rules:
diff --git a/src/telemetry/backend/Dockerfile b/src/telemetry/backend/Dockerfile
index 4bc5605d59bdb2e2b24cf580ce8e2a6978caa2e8..07459986d7efbcc1e0997239e327760093384a2e 100644
--- a/src/telemetry/backend/Dockerfile
+++ b/src/telemetry/backend/Dockerfile
@@ -62,6 +62,16 @@ RUN python3 -m pip install -r requirements.txt
 
 # Add component files into working directory
 WORKDIR /var/teraflow
+COPY src/context/__init__.py context/__init__.py
+COPY src/context/client/. context/client/
+COPY src/device/__init__.py device/__init__.py
+COPY src/device/client/. device/client/
+COPY src/kpi_manager/client/. kpi_manager/client/
+COPY src/kpi_manager/__init__.py kpi_manager/__init__.py
+COPY src/service/__init__.py service/__init__.py
+COPY src/service/client/. service/client/
+COPY src/slice/__init__.py slice/__init__.py
+COPY src/slice/client/. slice/client/
 COPY src/telemetry/__init__.py telemetry/__init__.py
 COPY src/telemetry/backend/. telemetry/backend/
 
diff --git a/src/telemetry/backend/collector_api/_Collector.py b/src/telemetry/backend/collector_api/_Collector.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4bd7f17f254873cb5fc6d3302d257e7f1e35f12
--- /dev/null
+++ b/src/telemetry/backend/collector_api/_Collector.py
@@ -0,0 +1,230 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 queue
+from typing import Any, Iterator, List, Optional, Tuple, Union
+
+# Special resource names to request to the collector to retrieve the specified
+# configuration/structural resources.
+# These resource names should be used with GetConfig() method.
+RESOURCE_ENDPOINTS = '__endpoints__'
+RESOURCE_INTERFACES = '__interfaces__'
+RESOURCE_NETWORK_INSTANCES = '__network_instances__'
+RESOURCE_ROUTING_POLICIES = '__routing_policies__'
+RESOURCE_SERVICES = '__services__'
+RESOURCE_ACL = '__acl__'
+RESOURCE_INVENTORY = '__inventory__'
+
+
+class _Collector:
+    def __init__(self, name : str, address: str, port: int, **settings) -> None:
+        """ Initialize Collector.
+            Parameters:
+                address : str
+                    The address of the device
+                port : int
+                    The port of the device
+                **settings
+                    Extra settings required by the collector.
+        """
+        self._name = name
+        self._address = address
+        self._port = port
+        self._settings = settings
+
+    @property
+    def name(self): return self._name
+
+    @property
+    def address(self): return self._address
+
+    @property
+    def port(self): return self._port
+
+    @property
+    def settings(self): return self._settings
+
+    def Connect(self) -> bool:
+        """ Connect to the Device.
+            Returns:
+                succeeded : bool
+                    Boolean variable indicating if connection succeeded.
+        """
+        raise NotImplementedError()
+
+    def Disconnect(self) -> bool:
+        """ Disconnect from the Device.
+            Returns:
+                succeeded : bool
+                    Boolean variable indicating if disconnection succeeded.
+        """
+        raise NotImplementedError()
+
+    # def GetInitialConfig(self) -> List[Tuple[str, Any]]:
+    #     """ Retrieve initial configuration of entire device.
+    #         Returns:
+    #             values : List[Tuple[str, Any]]
+    #                 List of tuples (resource key, resource value) for
+    #                 resource keys.
+    #     """
+    #     raise NotImplementedError()
+
+    # def GetConfig(self, resource_keys: List[str] = []) -> \
+    #         List[Tuple[str, Union[Any, None, Exception]]]:
+    #     """ Retrieve running configuration of entire device or
+    #     selected resource keys.
+    #         Parameters:
+    #             resource_keys : List[str]
+    #                 List of keys pointing to the resources to be retrieved.
+    #         Returns:
+    #             values : List[Tuple[str, Union[Any, None, Exception]]]
+    #                 List of tuples (resource key, resource value) for
+    #                 resource keys requested. If a resource is found,
+    #                 the appropriate value type must be retrieved.
+    #                 If a resource is not found, None must be retrieved as
+    #                 value for that resource. In case of Exception,
+    #                 the Exception must be retrieved as value.
+    #     """
+    #     raise NotImplementedError()
+
+    # def SetConfig(self, resources: List[Tuple[str, Any]]) -> \
+    #         List[Union[bool, Exception]]:
+    #     """ Create/Update configuration for a list of resources.
+    #         Parameters:
+    #             resources : List[Tuple[str, Any]]
+    #                 List of tuples, each containing a resource_key pointing the
+    #                 resource to be modified, and a resource_value containing
+    #                 the new value to be set.
+    #         Returns:
+    #             results : List[Union[bool, Exception]]
+    #                 List of results for resource key changes requested.
+    #                 Return values must be in the same order as the
+    #                 resource keys requested. If a resource is properly set,
+    #                 True must be retrieved; otherwise, the Exception that is
+    #                 raised during the processing must be retrieved.
+    #     """
+    #     raise NotImplementedError()
+
+    # def DeleteConfig(self, resources: List[Tuple[str, Any]]) -> \
+    #         List[Union[bool, Exception]]:
+    #     """ Delete configuration for a list of resources.
+    #         Parameters:
+    #             resources : List[Tuple[str, Any]]
+    #                 List of tuples, each containing a resource_key pointing the
+    #                 resource to be modified, and a resource_value containing
+    #                 possible additionally required values to locate
+    #                 the value to be removed.
+    #         Returns:
+    #             results : List[Union[bool, Exception]]
+    #                 List of results for resource key deletions requested.
+    #                 Return values must be in the same order as the resource keys
+    #                 requested. If a resource is properly deleted, True must be
+    #                 retrieved; otherwise, the Exception that is raised during
+    #                 the processing must be retrieved.
+    #     """
+    #     raise NotImplementedError()
+
+    def SubscribeState(self, subscriptions: List[Tuple[str, dict, float, float]]) -> \
+                bool:
+        """ Subscribe to state information of the entire device or selected resources. 
+            Subscriptions are incremental, and the collector should keep track of requested resources.
+                    List of tuples, each containing:
+                        - resource_id (str): Identifier pointing to the resource to be subscribed.
+                        - resource_dict (dict): Dictionary containing resource name, KPI to be subscribed, and type.
+                        - sampling_duration (float): Duration (in seconds) for how long monitoring should last.
+                        - sampling_interval (float): Desired monitoring interval (in seconds) for the specified resource.
+                    List of results for the requested resource key subscriptions. 
+                    The return values are in the same order as the requested resource keys.
+                    - True if a resource is successfully subscribed.
+                    - Exception if an error occurs during the subscription process.
+            List[Union[bool, Exception]]:
+        """ 
+        raise NotImplementedError()
+
+    def UnsubscribeState(self, resource_key: str) \
+            -> bool:
+        """ Unsubscribe from state information of entire device
+        or selected resources. Subscriptions are incremental.
+            Collector should keep track of requested resources.
+            Parameters:
+                subscriptions : List[str]
+                    List of tuples, each containing a resource_key pointing the
+                    resource to be subscribed, a sampling_duration, and a
+                    sampling_interval (both in seconds with float
+                    representation) defining, respectively, for how long
+                    monitoring should last, and the desired monitoring interval
+                    for the resource specified.
+            Returns:
+                results : List[Union[bool, Exception]]
+                    List of results for resource key un-subscriptions requested.
+                    Return values must be in the same order as the resource keys
+                    requested. If a resource is properly unsubscribed,
+                    True must be retrieved; otherwise, the Exception that is
+                    raised during the processing must be retrieved.
+        """
+        raise NotImplementedError()
+
+    def GetState(
+        self, duration : int, blocking=False, terminate: Optional[queue.Queue] = None
+    ) -> Iterator[Tuple[float, str, Any]]:
+        """ Retrieve last collected values for subscribed resources.
+        Operates as a generator, so this method should be called once and will
+        block until values are available. When values are available,
+        it should yield each of them and block again until new values are
+        available. When the collector is destroyed, GetState() can return instead
+        of yield to terminate the loop.
+        Terminate enables to request interruption of the generation.
+            Examples:
+                # keep looping waiting for extra samples (generator loop)
+                terminate = threading.Event()
+                i = 0
+                for timestamp,resource_key,resource_value in my_collector.GetState(blocking=True, terminate=terminate):
+                    process(timestamp, resource_key, resource_value)
+                    i += 1
+                    if i == 10: terminate.set()
+
+                # just retrieve accumulated samples
+                samples = my_collector.GetState(blocking=False, terminate=terminate)
+                # or (as classical loop)
+                i = 0
+                for timestamp,resource_key,resource_value in my_collector.GetState(blocking=False, terminate=terminate):
+                    process(timestamp, resource_key, resource_value)
+                    i += 1
+                    if i == 10: terminate.set()
+            Parameters:
+                blocking : bool
+                    Select the collector behaviour. In both cases, the collector will
+                    first retrieve the samples accumulated and available in the
+                    internal queue. Then, if blocking, the collector does not
+                    terminate the loop and waits for additional samples to come,
+                    thus behaving as a generator. If non-blocking, the collector
+                    terminates the loop and returns. Non-blocking behaviour can
+                    be used for periodically polling the collector, while blocking
+                    can be used when a separate thread is in charge of
+                    collecting the samples produced by the collector.
+                terminate : threading.Event
+                    Signals the interruption of the GetState method as soon as
+                    possible.
+            Returns:
+                results : Iterator[Tuple[float, str, Any]]
+                    Sequences of state sample. Each State sample contains a
+                    float Unix-like timestamps of the samples in seconds with up
+                    to microsecond resolution, the resource_key of the sample,
+                    and its resource_value.
+                    Only resources with an active subscription must be
+                    retrieved. Interval and duration of the sampling process are
+                    specified when creating the subscription using method
+                    SubscribeState(). Order of values yielded is arbitrary.
+        """
+        raise NotImplementedError()
diff --git a/src/telemetry/backend/collector_api/__init__.py b/src/telemetry/backend/collector_api/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2
--- /dev/null
+++ b/src/telemetry/backend/collector_api/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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/telemetry/backend/collectors/__init__.py b/src/telemetry/backend/collectors/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2
--- /dev/null
+++ b/src/telemetry/backend/collectors/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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/telemetry/backend/collectors/emulated/EmulatedCollector.py b/src/telemetry/backend/collectors/emulated/EmulatedCollector.py
new file mode 100644
index 0000000000000000000000000000000000000000..48102a943f54eead9b0119b2839faaa123e1cb51
--- /dev/null
+++ b/src/telemetry/backend/collectors/emulated/EmulatedCollector.py
@@ -0,0 +1,146 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 pytz
+import queue
+import logging
+from anytree import Node, Resolver
+from apscheduler.schedulers.background import BackgroundScheduler
+from apscheduler.jobstores.memory import MemoryJobStore
+from apscheduler.executors.pool import ThreadPoolExecutor
+from datetime import datetime, timedelta
+from typing import Any, Iterator, List, Tuple, Union, Optional
+from telemetry.backend.collector_api._Collector import _Collector
+from .EmulatedHelper import EmulatedCollectorHelper
+from .SyntheticMetricsGenerator import SyntheticMetricsGenerator
+
+
+class EmulatedCollector(_Collector):
+    """
+    EmulatedCollector is a class that simulates a network collector for testing purposes.
+    It provides functionalities to manage configurations, state subscriptions, and synthetic data generation.
+    """
+    def __init__(self, address: str, port: int, **settings):
+        super().__init__('emulated_collector', address, port, **settings)
+        self._out_samples    = queue.Queue()                # Queue to hold synthetic state samples
+        self._synthetic_data = SyntheticMetricsGenerator(metric_queue=self._out_samples)  # Placeholder for synthetic data generator
+        self._scheduler      = BackgroundScheduler(daemon=True)
+        self._scheduler.configure(
+            jobstores = {'default': MemoryJobStore()},
+            executors = {'default': ThreadPoolExecutor(max_workers=1)},
+            timezone  = pytz.utc
+        )
+        # self._scheduler.add_listener(self._listener_job_added_to_subscription_tree,     EVENT_JOB_ADDED)
+        # self._scheduler.add_listener(self._listener_job_removed_from_subscription_tree, EVENT_JOB_REMOVED)
+        self._helper_methods = EmulatedCollectorHelper()
+
+        self.logger    = logging.getLogger(__name__)
+        self.connected = False          # To track connection state
+        self.logger.info("EmulatedCollector initialized")
+
+    def Connect(self) -> bool:
+        self.logger.info(f"Connecting to {self.address}:{self.port}")
+        self.connected = True
+        self._scheduler.start()
+        self.logger.info(f"Successfully connected to {self.address}:{self.port}")
+        return True
+
+    def Disconnect(self) -> bool:
+        self.logger.info(f"Disconnecting from {self.address}:{self.port}")
+        if not self.connected:
+            self.logger.warning("Collector is not connected. Nothing to disconnect.")
+            return False
+        self._scheduler.shutdown()
+        self.connected = False
+        self.logger.info(f"Successfully disconnected from {self.address}:{self.port}")
+        return True
+
+    def _require_connection(self):
+        if not self.connected:
+            raise RuntimeError("Collector is not connected. Please connect before performing operations.")
+
+    def SubscribeState(self, subscriptions: List[Tuple[str, dict, float, float]]) -> bool:
+        self._require_connection()
+        try:
+            job_id, endpoint, duration, interval = subscriptions
+        except:
+            self.logger.exception(f"Invalid subscription format: {subscriptions}")
+            return False
+        if endpoint:
+            self.logger.info(f"Subscribing to {endpoint} with duration {duration}s and interval {interval}s")
+            try:
+                sample_type_ids = endpoint['sample_types']   # type: ignore
+                resource_name   = endpoint['name']           # type: ignore
+                # Add the job to the scheduler
+                self._scheduler.add_job(
+                    self._generate_sample,
+                    'interval',
+                    seconds=interval,
+                    args=[resource_name, sample_type_ids],
+                    id=f"{job_id}",
+                    replace_existing=True,
+                    end_date=datetime.now(pytz.utc) + timedelta(seconds=duration)
+                )
+                self.logger.info(f"Job added to scheduler for resource key {resource_name} with duration {duration}s and interval {interval}s")
+                return True
+            except:
+                self.logger.exception(f"Failed to verify resource key or add job:")
+                return False
+        else:
+            self.logger.warning(f"No sample types found for {endpoint}. Skipping subscription.")
+            return False
+
+    def UnsubscribeState(self, resource_key: str) -> bool:
+        self._require_connection()
+        try: 
+            # Check if job exists
+            job_ids = [job.id for job in self._scheduler.get_jobs() if resource_key in job.id]
+            if not job_ids:
+                self.logger.warning(f"No active jobs found for {resource_key}. It might have already terminated.")
+                return False
+            for job_id in job_ids:
+                self._scheduler.remove_job(job_id)
+            self.logger.info(f"Unsubscribed from {resource_key} with job IDs: {job_ids}")
+            return True
+        except:
+            self.logger.exception(f"Failed to unsubscribe from {resource_key}")
+            return False
+
+    def GetState(self, duration : int, blocking: bool = False, terminate: Optional[queue.Queue] = None) -> Iterator[Tuple[float, str, Any]]:
+        self._require_connection()
+        start_time = datetime.now(pytz.utc)
+        while True:
+            try:
+                if terminate and not terminate.empty():
+                    self.logger.info("Termination signal received, stopping GetState")
+                    break
+
+                elapsed_time = (datetime.now(pytz.utc) - start_time).total_seconds()
+                if elapsed_time >= duration:
+                    self.logger.info("Duration expired, stopping GetState")
+                    break
+
+                sample = self._out_samples.get(block=blocking, timeout=1 if blocking else 0.1)
+                self.logger.info(f"Retrieved state sample: {sample}")
+                yield sample
+            except queue.Empty:
+                if not blocking:
+                    self.logger.info("No more samples in queue, exiting GetState")
+                    return None
+
+    def _generate_sample(self, resource_key: str, sample_type_ids : List[int]):
+        # Simulate generating a sample for the resource key
+        self.logger.debug(f"Executing _generate_sample for resource: {resource_key}")
+        sample = self._synthetic_data.generate_synthetic_data_point(resource_key, sample_type_ids)
+        self._out_samples.put(sample)
diff --git a/src/telemetry/backend/collectors/emulated/EmulatedHelper.py b/src/telemetry/backend/collectors/emulated/EmulatedHelper.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebfb7d49fdb7ceafa00986e763e56dd59e445609
--- /dev/null
+++ b/src/telemetry/backend/collectors/emulated/EmulatedHelper.py
@@ -0,0 +1,166 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 anytree import Node
+import json
+from typing import Any, List
+
+
+class EmulatedCollectorHelper:
+    """
+    Helper class for the emulated collector.
+    """
+    def __init__(self):
+        pass
+
+    def validate_resource_key(self, key: str) -> str:
+        """
+        Splits the input string into two parts: 
+        - The first part is '_connect/settings/endpoints/'.
+        - The second part is the remaining string after the first part, with '/' replaced by '_'.
+        
+        Args:
+            key (str): The input string to process.
+            
+        Returns:
+            str: A single string with the processed result.
+        """
+        prefix = '_connect/settings/endpoints/'
+        if not key.startswith(prefix):
+            raise ValueError(f"The input path '{key}' does not start with the expected prefix: {prefix}")
+        second_part = key[len(prefix):]
+        second_part_processed = second_part.replace('/', '_')
+        validated_key = prefix + second_part_processed
+        return validated_key
+
+#--------------------------------------------------------------------------------------
+# ------- Below function is kept for debugging purposes (test-cases) only -------------
+#--------------------------------------------------------------------------------------
+
+#  This below methods can be commented but are called by the SetConfig method in EmulatedCollector.py
+
+    def _find_or_create_node(self, name: str, parent: Node) -> Node:
+        """
+        Finds or creates a node with the given name under the specified parent.
+
+        Args:
+            name (str): The name of the node to find or create.
+            parent (Node): The parent node.
+
+        Returns:
+            Node: The found or created node.
+        """
+        node = next((child for child in parent.children if child.name == name), None)
+        if not node:
+            node = Node(name, parent=parent)
+        return node
+
+
+    def _create_or_update_node(self, name: str, parent: Node, value: Any):
+        """
+        Creates or updates a node with the given name and value under the specified parent.
+
+        Args:
+            name (str): The name of the node.
+            parent (Node): The parent node.
+            value (Any): The value to set on the node.
+        """
+        node = next((child for child in parent.children if child.name == name), None)
+        if node:
+            node.value = json.dumps(value)
+        else:
+            Node(name, parent=parent, value=json.dumps(value))
+
+
+    def _parse_resource_key(self, resource_key: str) -> List[str]:
+        """
+        Parses the resource key into parts, correctly handling brackets.
+
+        Args:
+            resource_key (str): The resource key to parse.
+
+        Returns:
+            List[str]: A list of parts from the resource key.
+        """
+        resource_path = []
+        current_part = ""
+        in_brackets = False
+
+        if not resource_key.startswith('/interface'):
+            for char in resource_key.strip('/'):
+                if char == '[':
+                    in_brackets = True
+                    current_part += char
+                elif char == ']':
+                    in_brackets = False
+                    current_part += char
+                elif char == '/' and not in_brackets:
+                    resource_path.append(current_part)
+                    current_part = ""
+                else:
+                    current_part += char
+            if current_part:
+                resource_path.append(current_part)
+            return resource_path
+        else:
+            resource_path = resource_key.strip('/').split('/', 1)
+            if resource_path[1] == 'settings':
+                return resource_path
+            else:
+                resource_path = [resource_key.strip('/').split('[')[0].strip('/'), resource_key.strip('/').split('[')[1].split(']')[0].replace('/', '_')]
+                return resource_path
+
+
+#-----------------------------------
+# ------- EXTRA Methods ------------
+#-----------------------------------
+
+    # def _generate_subtree(self, node: Node) -> dict:
+    #     """
+    #     Generates a subtree of the configuration tree starting from the specified node.
+
+    #     Args:
+    #         node (Node): The node from which to generate the subtree.
+
+    #     Returns:
+    #         dict: The subtree as a dictionary.
+    #     """
+    #     subtree = {}
+    #     for child in node.children:
+    #         if child.children:
+    #             subtree[child.name] = self._generate_subtree(child)
+    #         else:
+    #             value = getattr(child, "value", None)
+    #             subtree[child.name] = json.loads(value) if value else None
+    #     return subtree
+
+
+    # def _find_or_raise_node(self, name: str, parent: Node) -> Node:
+    #     """
+    #     Finds a node with the given name under the specified parent or raises an exception if not found.
+
+    #     Args:
+    #         name (str): The name of the node to find.
+    #         parent (Node): The parent node.
+
+    #     Returns:
+    #         Node: The found node.
+
+    #     Raises:
+    #         ValueError: If the node is not found.
+    #     """
+    #     node = next((child for child in parent.children if child.name == name), None)
+    #     if not node:
+    #         raise ValueError(f"Node '{name}' not found under parent '{parent.name}'.")
+    #     return node
diff --git a/src/telemetry/backend/collectors/emulated/SyntheticMetricsGenerator.py b/src/telemetry/backend/collectors/emulated/SyntheticMetricsGenerator.py
new file mode 100644
index 0000000000000000000000000000000000000000..77d99843247c342a76d8dd7187a151fca83ae955
--- /dev/null
+++ b/src/telemetry/backend/collectors/emulated/SyntheticMetricsGenerator.py
@@ -0,0 +1,129 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 numpy as np
+import random
+import logging
+import queue
+import time
+
+LOGGER = logging.getLogger(__name__)
+
+class SyntheticMetricsGenerator():
+    """
+    This collector class generates synthetic network metrics based on the current network state.
+    The metrics include packet_in, packet_out, bytes_in, bytes_out, packet_loss (percentage), packet_drop_count, byte_drop_count, and latency.
+    The network state can be 'good', 'moderate', or 'poor', and it affects the generated metrics accordingly.
+    """
+    def __init__(self, metric_queue=None, network_state="good"):
+        LOGGER.info("Initiaitng Emulator")
+        super().__init__()
+        self.metric_queue        = metric_queue if metric_queue is not None else queue.Queue()
+        self.network_state       = network_state
+        self.running             = True
+        self.set_initial_parameter_values()  # update this method to set the initial values for the parameters
+
+    def set_initial_parameter_values(self):
+        self.bytes_per_pkt       = random.uniform(65, 150)
+        self.states              = ["good", "moderate", "poor"]
+        self.state_probabilities = {
+            "good"    : [0.9, 0.1, 0.0],
+            "moderate": [0.2, 0.7, 0.1],
+            "poor"    : [0.0, 0.3, 0.7]
+        }
+        if self.network_state   == "good":
+            self.packet_in = random.uniform(700, 900)
+        elif self.network_state == "moderate":
+            self.packet_in = random.uniform(300, 700)
+        else:
+            self.packet_in = random.uniform(100, 300)
+
+    def generate_synthetic_data_point(self, resource_key, sample_type_ids):
+        """
+        Generates a synthetic data point based on the current network state.
+
+        Parameters:
+        resource_key (str): The key associated with the resource for which the data point is generated.
+
+        Returns:
+        tuple: A tuple containing the timestamp, resource key, and a dictionary of generated metrics.
+        """
+        if self.network_state   == "good":
+            packet_loss  = random.uniform(0.01, 0.1)  
+            random_noise = random.uniform(1,10)
+            latency      = random.uniform(5, 25)
+        elif self.network_state == "moderate":
+            packet_loss  = random.uniform(0.1, 1)
+            random_noise = random.uniform(10, 40)
+            latency      = random.uniform(25, 100)
+        elif self.network_state == "poor":
+            packet_loss  = random.uniform(1, 3)
+            random_noise = random.uniform(40, 100)
+            latency      = random.uniform(100, 300)
+        else:
+            raise ValueError("Invalid network state. Must be 'good', 'moderate', or 'poor'.")
+
+        period            = 60 * 60 * random.uniform(10, 100)
+        amplitude         = random.uniform(50, 100) 
+        sin_wave          = amplitude  * np.sin(2 * np.pi   * 100 / period) + self.packet_in
+        packet_in         = sin_wave   + ((sin_wave/100)    * random_noise)
+        packet_out        = packet_in  - ((packet_in / 100) * packet_loss)
+        bytes_in          = packet_in  * self.bytes_per_pkt
+        bytes_out         = packet_out * self.bytes_per_pkt
+        packet_drop_count = packet_in  * (packet_loss / 100)
+        byte_drop_count   = packet_drop_count * self.bytes_per_pkt
+
+        state_prob = self.state_probabilities[self.network_state]
+        self.network_state = random.choices(self.states, state_prob)[0]
+        print (self.network_state)
+
+        generated_samples = {
+            "packet_in" : int(packet_in),   "packet_out" : int(packet_out),    "bytes_in"          : float(bytes_in),
+            "bytes_out" : float(bytes_out), "packet_loss": float(packet_loss), "packet_drop_count" : int(packet_drop_count),
+            "latency"   : float(latency),   "byte_drop_count": float(byte_drop_count)
+        }
+        requested_metrics = self.metric_id_mapper(sample_type_ids, generated_samples)
+        # generated_samples = {metric: generated_samples[metric] for metric in requested_metrics}
+
+        return (time.time(), resource_key, requested_metrics)
+
+    def metric_id_mapper(self, sample_type_ids, metric_dict):   # TODO: Add a dynamic mappper from kpi_sample_type ID to name...
+        """
+        Maps the sample type IDs to the corresponding metric names.
+
+        Parameters:
+        sample_type_ids (list): A list of sample type IDs.
+
+        Returns:
+        list: A list of metric names.
+        """
+        metric_names = []
+        for sample_type_id in sample_type_ids:
+            if sample_type_id == 102:
+                metric_names.append(metric_dict["packet_in"])
+            elif sample_type_id == 101:
+                metric_names.append(metric_dict["packet_out"])
+            elif sample_type_id == 103:
+                metric_names.append(metric_dict["packet_drop_count"])
+            elif sample_type_id == 202:
+                metric_names.append(metric_dict["bytes_in"])
+            elif sample_type_id == 201:
+                metric_names.append(metric_dict["bytes_out"])
+            elif sample_type_id == 203:
+                metric_names.append(metric_dict["byte_drop_count"])
+            elif sample_type_id == 701:
+                metric_names.append(metric_dict["latency"])
+            else:
+                raise ValueError(f"Invalid sample type ID: {sample_type_id}")
+        return metric_names
diff --git a/src/telemetry/backend/collectors/emulated/__init__.py b/src/telemetry/backend/collectors/emulated/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2
--- /dev/null
+++ b/src/telemetry/backend/collectors/emulated/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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/telemetry/backend/requirements.in b/src/telemetry/backend/requirements.in
index effd1752af0d1a2d00312ff4935676c24964c784..2843bdbf68defcc1a972b49bfa12a8107b696aaa 100644
--- a/src/telemetry/backend/requirements.in
+++ b/src/telemetry/backend/requirements.in
@@ -12,4 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+anytree==2.8.0
 confluent-kafka==2.3.*
+numpy==2.0.1
+APScheduler==3.10.1
diff --git a/src/telemetry/backend/service/TelemetryBackendService.py b/src/telemetry/backend/service/TelemetryBackendService.py
index fe5792a023a926d41a71b0dc7614d7e2b093507b..3aeee8238d3fa47d511f1b520d44bf0712fe10e7 100755
--- a/src/telemetry/backend/service/TelemetryBackendService.py
+++ b/src/telemetry/backend/service/TelemetryBackendService.py
@@ -14,28 +14,32 @@
 
 import json
 import time
-import random
 import logging
 import threading
-from typing   import Any, Dict
-from datetime import datetime, timezone
-# from common.proto.context_pb2 import Empty
-from confluent_kafka import Producer as KafkaProducer
-from confluent_kafka import Consumer as KafkaConsumer
-from confluent_kafka import KafkaError
+from typing           import Any, Dict, Tuple
+from datetime         import datetime, timezone
+from confluent_kafka  import Producer as KafkaProducer
+from confluent_kafka  import Consumer as KafkaConsumer
+from confluent_kafka  import KafkaError
 from common.Constants import ServiceNameEnum
-from common.Settings import get_service_port_grpc
-from common.tools.kafka.Variables import KafkaConfig, KafkaTopic
-from common.method_wrappers.Decorator import MetricsPool
+from common.Settings  import get_service_port_grpc
+from common.method_wrappers.Decorator        import MetricsPool
+from common.tools.kafka.Variables            import KafkaConfig, KafkaTopic
 from common.tools.service.GenericGrpcService import GenericGrpcService
+from common.tools.context_queries.Device     import get_device
+from common.proto.kpi_manager_pb2            import KpiId
 
-LOGGER             = logging.getLogger(__name__)
-METRICS_POOL       = MetricsPool('TelemetryBackend', 'backendService')
+from kpi_manager.client.KpiManagerClient     import KpiManagerClient
+from context.client.ContextClient            import ContextClient
+from telemetry.backend.collectors.emulated.EmulatedCollector import EmulatedCollector
+
+LOGGER       = logging.getLogger(__name__)
+METRICS_POOL = MetricsPool('TelemetryBackend', 'backendService')
 
 class TelemetryBackendService(GenericGrpcService):
     """
     Class listens for request on Kafka topic, fetches requested metrics from device.
-    Produces metrics on both RESPONSE and VALUE kafka topics.
+    Produces metrics on both TELEMETRY_RESPONSE and VALUE kafka topics.
     """
     def __init__(self, cls_name : str = __name__) -> None:
         LOGGER.info('Init TelemetryBackendService')
@@ -45,7 +49,10 @@ class TelemetryBackendService(GenericGrpcService):
         self.kafka_consumer = KafkaConsumer({'bootstrap.servers' : KafkaConfig.get_kafka_address(),
                                             'group.id'           : 'backend',
                                             'auto.offset.reset'  : 'latest'})
-        self.running_threads = {}
+        self.collector          = None
+        self.context_client     = ContextClient()
+        self.kpi_manager_client = KpiManagerClient()
+        self.active_jobs = {}
 
     def install_servicers(self):
         threading.Thread(target=self.RequestListener).start()
@@ -57,93 +64,97 @@ class TelemetryBackendService(GenericGrpcService):
         LOGGER.info('Telemetry backend request listener is running ...')
         # print      ('Telemetry backend request listener is running ...')
         consumer = self.kafka_consumer
-        consumer.subscribe([KafkaTopic.REQUEST.value])
+        consumer.subscribe([KafkaTopic.TELEMETRY_REQUEST.value])
         while True:
-            receive_msg = consumer.poll(2.0)
+            receive_msg = consumer.poll(1.0)
             if receive_msg is None:
                 continue
             elif receive_msg.error():
                 if receive_msg.error().code() == KafkaError._PARTITION_EOF:
                     continue
+                elif receive_msg.error().code() == KafkaError.UNKNOWN_TOPIC_OR_PART:
+                    LOGGER.warning(f"Subscribed topic {receive_msg.topic()} does not exist or topic does not have any messages.")
+                    continue
                 else:
-                    # print("Consumer error: {}".format(receive_msg.error()))
+                    LOGGER.error("Consumer error: {}".format(receive_msg.error()))
                     break
             try: 
-                collector = json.loads(receive_msg.value().decode('utf-8'))
+                collector = json.loads(
+                    receive_msg.value().decode('utf-8')
+                )
                 collector_id = receive_msg.key().decode('utf-8')
                 LOGGER.debug('Recevied Collector: {:} - {:}'.format(collector_id, collector))
-                # print('Recevied Collector: {:} - {:}'.format(collector_id, collector))
 
-                if collector['duration'] == -1 and collector['interval'] == -1:
-                    self.TerminateCollectorBackend(collector_id)
+                duration = collector.get('duration', 0)
+                if duration == -1 and collector['interval'] == -1:
+                    self.TerminateCollector(collector_id)
                 else:
-                    self.RunInitiateCollectorBackend(collector_id, collector)
+                    LOGGER.info("Received Collector ID: {:} - Scheduling...".format(collector_id))
+                    if collector_id not in self.active_jobs:
+                        stop_event = threading.Event()
+                        self.active_jobs[collector_id] = stop_event
+                        threading.Thread(target = self.CollectorHandler, 
+                                    args=(
+                                        collector_id, 
+                                        collector['kpi_id'],
+                                        duration, 
+                                        collector['interval'],
+                                        stop_event
+                                    )).start()
+                        # Stop the Collector after the given duration
+                        if duration > 0:
+                            def stop_after_duration(completion_time, stop_event):
+                                time.sleep(completion_time)
+                                if not stop_event.is_set():
+                                    LOGGER.warning(f"Execution duration ({completion_time}) completed of Collector: {collector_id}")
+                                    self.TerminateCollector(collector_id)
+                                
+                            duration_thread = threading.Thread(
+                                target=stop_after_duration, daemon=True, name=f"stop_after_duration_{collector_id}",
+                                args=(duration, stop_event) 
+                                )
+                            duration_thread.start()
+                    else:
+                        LOGGER.warning("Collector ID: {:} - Already scheduled or running".format(collector_id))
             except Exception as e:
-                LOGGER.warning("Unable to consumer message from topic: {:}. ERROR: {:}".format(KafkaTopic.REQUEST.value, e))
-                # print         ("Unable to consumer message from topic: {:}. ERROR: {:}".format(KafkaTopic.REQUEST.value, e))
-
-    def TerminateCollectorBackend(self, collector_id):
-        if collector_id in self.running_threads:
-            thread, stop_event = self.running_threads[collector_id]
-            stop_event.set()
-            thread.join()
-            # print ("Terminating backend (by StopCollector): Collector Id: ", collector_id)
-            del self.running_threads[collector_id]
-            self.GenerateCollectorTerminationSignal(collector_id, "-1", -1)          # Termination confirmation to frontend.
-        else:
-            # print ('Backend collector {:} not found'.format(collector_id))
-            LOGGER.warning('Backend collector {:} not found'.format(collector_id))
-
-    def RunInitiateCollectorBackend(self, collector_id: str, collector: str):
-        stop_event = threading.Event()
-        thread = threading.Thread(target=self.InitiateCollectorBackend, 
-                                  args=(collector_id, collector, stop_event))
-        self.running_threads[collector_id] = (thread, stop_event)
-        thread.start()
+                LOGGER.warning("Unable to consumer message from topic: {:}. ERROR: {:}".format(KafkaTopic.TELEMETRY_REQUEST.value, e))
 
-    def InitiateCollectorBackend(self, collector_id, collector, stop_event):
+    def CollectorHandler(self, collector_id, kpi_id, duration, interval, stop_event):
         """
-        Method receives collector request and initiates collecter backend.
+        Method to handle collector request.
         """
-        # print("Initiating backend for collector: ", collector_id)
-        LOGGER.info("Initiating backend for collector: {:s}".format(str(collector_id)))
-        start_time = time.time()
-        while not stop_event.is_set():
-            if int(collector['duration']) != -1 and time.time() - start_time >= collector['duration']:            # condition to terminate backend
-                print("Execuation duration completed: Terminating backend: Collector Id: ", collector_id, " - ", time.time() - start_time)
-                self.GenerateCollectorTerminationSignal(collector_id, "-1", -1)       # Termination confirmation to frontend.
-                break
-            self.ExtractKpiValue(collector_id, collector['kpi_id'])
-            time.sleep(collector['interval'])
-
-    def GenerateCollectorTerminationSignal(self, collector_id: str, kpi_id: str, measured_kpi_value: Any):
-        """
-        Method to write kpi Termination signat on RESPONSE Kafka topic
-        """
-        producer = self.kafka_producer
-        kpi_value : Dict = {
-            "kpi_id"    : kpi_id,
-            "kpi_value" : measured_kpi_value,
-        }
-        producer.produce(
-            KafkaTopic.RESPONSE.value, # TODO: to  the topic ...
-            key      = collector_id,
-            value    = json.dumps(kpi_value),
-            callback = self.delivery_callback
-        )
-        producer.flush()
+        device_type, end_points = self.get_endpoint_detail(kpi_id)
 
-    def ExtractKpiValue(self, collector_id: str, kpi_id: str):
-        """
-        Method to extract kpi value.
-        """
-        measured_kpi_value = random.randint(1,100)                      # TODO: To be extracted from a device
-        # print ("Measured Kpi value: {:}".format(measured_kpi_value))
-        self.GenerateCollectorResponse(collector_id, kpi_id , measured_kpi_value)
+        if end_points is None:
+            LOGGER.warning("KPI ID: {:} - Endpoints not found. Skipping...".format(kpi_id))
+            return
+
+        if device_type and "emu" in device_type:
+            LOGGER.info("KPI ID: {:} - Device Type: {:} - Endpoints: {:}".format(kpi_id, device_type, end_points))
+            subscription = [collector_id, end_points, duration, interval]
+            self.EmulatedCollectorHandler(subscription, duration, collector_id, kpi_id, stop_event)
+        else:
+            LOGGER.warning("KPI ID: {:} - Device Type: {:} - Not Supported".format(kpi_id, device_type))
+
+    def EmulatedCollectorHandler(self, subscription, duration, collector_id, kpi_id, stop_event):
+            # EmulatedCollector
+            
+            self.collector = EmulatedCollector(address="127.0.0.1", port=8000)
+            self.collector.Connect()
+            if not self.collector.SubscribeState(subscription):
+                LOGGER.warning("KPI ID: {:} - Subscription failed. Skipping...".format(kpi_id))
+            else:
+                while not stop_event.is_set():
+                    samples = list(self.collector.GetState(duration=duration, blocking=True))
+                    LOGGER.info("KPI: {:} - Value: {:}".format(kpi_id, samples))
+                    self.GenerateKpiValue(collector_id, kpi_id, samples)
+                    time.sleep(1)
+            self.collector.Disconnect()
+            # self.TerminateCollector(collector_id)       # No need to terminate, automatically terminated after duration.
 
-    def GenerateCollectorResponse(self, collector_id: str, kpi_id: str, measured_kpi_value: Any):
+    def GenerateKpiValue(self, collector_id: str, kpi_id: str, measured_kpi_value: Any):
         """
-        Method to write kpi value on RESPONSE Kafka topic
+        Method to write kpi value on VALUE Kafka topic
         """
         producer = self.kafka_producer
         kpi_value : Dict = {
@@ -152,22 +163,69 @@ class TelemetryBackendService(GenericGrpcService):
             "kpi_value" : measured_kpi_value
         }
         producer.produce(
-            KafkaTopic.VALUE.value, # TODO: to  the topic ...
+            KafkaTopic.VALUE.value,
             key      = collector_id,
             value    = json.dumps(kpi_value),
             callback = self.delivery_callback
         )
         producer.flush()
 
-    def delivery_callback(self, err, msg):
+    def TerminateCollector(self, job_id):
+        LOGGER.debug("Terminating collector backend...")
+        try:
+            if job_id not in self.active_jobs:  # not job_ids:
+                # self.logger.warning(f"Active jobs: {self.active_jobs}") 
+                self.logger.warning(f"No active jobs found for {job_id}. It might have already terminated.")
+            else:
+                LOGGER.info(f"Terminating job: {job_id}")
+                stop_event = self.active_jobs.pop(job_id, None)
+                if stop_event:
+                    stop_event.set()
+                    LOGGER.info(f"Job {job_id} terminated.")
+                    if self.collector.UnsubscribeState(job_id):
+                        LOGGER.info(f"Unsubscribed from collector: {job_id}")
+                    else:
+                        LOGGER.warning(f"Failed to unsubscribe from collector: {job_id}")
+                else:
+                    LOGGER.warning(f"Job {job_id} not found in active jobs.")
+        except:
+            LOGGER.exception("Error terminating job: {:}".format(job_id))
+
+    def get_endpoint_detail(self, kpi_id: str):
         """
-        Callback function to handle message delivery status.
-        Args: err (KafkaError): Kafka error object.
-              msg (Message): Kafka message object.
+        Method to get device_type and endpoint detail based on device_uuid.
         """
-        if err:
-            LOGGER.error('Message delivery failed: {:}'.format(err))
-            # print(f'Message delivery failed: {err}')
-        #else:
-        #    LOGGER.debug('Message delivered to topic {:}'.format(msg.topic()))
-        #    # print(f'Message delivered to topic {msg.topic()}')
+        kpi_id_obj = KpiId()
+        kpi_id_obj.kpi_id.uuid = kpi_id
+        kpi_descriptor = self.kpi_manager_client.GetKpiDescriptor(kpi_id_obj)
+        if not kpi_descriptor:
+            LOGGER.warning(f"KPI ID: {kpi_id} - Descriptor not found. Skipping...")
+            return (None, None)
+
+        device_id   = kpi_descriptor.device_id.device_uuid.uuid
+        endpoint_id = kpi_descriptor.endpoint_id.endpoint_uuid.uuid
+        device = get_device( context_client       = self.context_client,
+                             device_uuid          = device_id,
+                             include_config_rules = False,
+                             include_components   = False,
+                             )
+        if device:
+            for endpoint in device.device_endpoints:
+                if endpoint.endpoint_id.endpoint_uuid.uuid == endpoint_id:
+                    endpoint_dict         = {}
+                    kpi_sample_types      = []
+                    endpoint_dict["uuid"] = endpoint.endpoint_id.endpoint_uuid.uuid
+                    endpoint_dict["name"] = endpoint.name
+                    endpoint_dict["type"] = endpoint.endpoint_type
+                    for sample_type in endpoint.kpi_sample_types:
+                        kpi_sample_types.append(sample_type)
+                    endpoint_dict["sample_types"] = kpi_sample_types
+
+                    return (device.device_type, endpoint_dict)
+                
+        LOGGER.warning(f"Device ID: {device_id} - Endpoint ID: {endpoint_id} - Not Found")
+        return (None, None)
+
+    def delivery_callback(self, err, msg):
+        if err: 
+            LOGGER.error('Message delivery failed: {:s}'.format(str(err)))
diff --git a/src/telemetry/backend/service/__main__.py b/src/telemetry/backend/service/__main__.py
index 61ff397214fa21ff2d767c2eda4b3a7ee1f796b5..6e77d5d6cc7e31792d737bca04fb1af0e7baa2bb 100644
--- a/src/telemetry/backend/service/__main__.py
+++ b/src/telemetry/backend/service/__main__.py
@@ -16,6 +16,7 @@ import logging, signal, sys, threading
 from prometheus_client import start_http_server
 from common.Settings import get_log_level, get_metrics_port
 from .TelemetryBackendService import TelemetryBackendService
+from common.tools.kafka.Variables import KafkaTopic
 
 terminate = threading.Event()
 LOGGER = None
@@ -34,6 +35,8 @@ def main():
     signal.signal(signal.SIGINT,  signal_handler)
     signal.signal(signal.SIGTERM, signal_handler)
 
+    KafkaTopic.create_all_topics()
+
     LOGGER.info('Starting...')
 
     # Start metrics server
diff --git a/src/telemetry/backend/tests/Fixtures.py b/src/telemetry/backend/tests/Fixtures.py
new file mode 100644
index 0000000000000000000000000000000000000000..59f1b761ca40caf2013471c7f6fdbaa781759a0a
--- /dev/null
+++ b/src/telemetry/backend/tests/Fixtures.py
@@ -0,0 +1,58 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 pytest
+import logging
+
+from context.client.ContextClient        import ContextClient
+from device.client.DeviceClient          import DeviceClient
+from service.client.ServiceClient        import ServiceClient
+from kpi_manager.client.KpiManagerClient import KpiManagerClient
+
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+
+@pytest.fixture(scope='session')
+def context_client():
+    _client = ContextClient(host="10.152.183.234")
+    _client.connect()
+    LOGGER.info('Yielding Connected ContextClient...')
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def device_client():
+    _client = DeviceClient(host="10.152.183.95")
+    _client.connect()
+    LOGGER.info('Yielding Connected DeviceClient...')
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def service_client():
+    _client = ServiceClient(host="10.152.183.47")
+    _client.connect()
+    LOGGER.info('Yielding Connected DeviceClient...')
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def kpi_manager_client():
+    _client = KpiManagerClient(host="10.152.183.118")
+    LOGGER.info('Yielding Connected KpiManagerClient...')
+    yield _client
+    _client.close()
+    LOGGER.info('Closed KpiManagerClient...')
diff --git a/src/telemetry/backend/tests/add_devices.py b/src/telemetry/backend/tests/add_devices.py
new file mode 100644
index 0000000000000000000000000000000000000000..9fe02a953ec8a789ea5faa2aa49f3829b33aa721
--- /dev/null
+++ b/src/telemetry/backend/tests/add_devices.py
@@ -0,0 +1,78 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, time
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty
+from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario
+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 context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from .Fixtures import context_client, device_client # pylint: disable=unused-import
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DESCRIPTOR_FILE  = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'topology.json')
+ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))
+
+def load_topology(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client  : DeviceClient,   # pylint: disable=redefined-outer-name
+) -> None:
+    LOGGER.info('Loading Topology...')
+    validate_empty_scenario(context_client)
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESCRIPTOR_FILE, context_client=context_client, device_client=device_client)
+    LOGGER.info('Descriptor Loader Created')
+    results = descriptor_loader.process()
+    # LOGGER.info('Descriptor Load Results: {:s}'.format(str(results)))
+    check_descriptor_load_results(results, descriptor_loader)
+    # descriptor_loader.validate()
+
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    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
+
+    disabled_devices = list()
+    response = None
+    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
+        disabled_devices = list()
+        for device in response.devices:
+            if device.device_operational_status == DEVICE_OP_STATUS_ENABLED:
+                num_devices_enabled += 1
+            else:
+                disabled_devices.append(grpc_message_to_json(device))
+        LOGGER.info('Num Devices enabled: {:d}/{:d}'.format(num_devices_enabled, num_devices))
+        num_retry += 1
+    if num_devices_enabled != num_devices:
+        LOGGER.info('Disabled Devices: {:s}'.format(str(disabled_devices)))
+    LOGGER.info('Devices: {:s}'.format(grpc_message_to_json_string(response)))
+    assert num_devices_enabled == num_devices
diff --git a/src/telemetry/backend/tests/messages.py b/src/telemetry/backend/tests/messages.py
index 0dc5506ab42d67d67a88cf8976409472213fe098..0d31cd15f2038c3065d679e34b1b772d37aaaf45 100644
--- a/src/telemetry/backend/tests/messages.py
+++ b/src/telemetry/backend/tests/messages.py
@@ -12,4 +12,37 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import uuid
+import random
+from common.proto import telemetry_frontend_pb2
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.proto.kpi_manager_pb2 import KpiDescriptor, KpiId
 
+def create_collector_request():
+    _create_collector_request                                = telemetry_frontend_pb2.Collector()
+    _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) 
+    # _create_collector_request.collector_id.collector_id.uuid = "efef4d95-1cf1-43c4-9742-95c283dddddd"
+    _create_collector_request.kpi_id.kpi_id.uuid             = str(uuid.uuid4())
+    # _create_collector_request.kpi_id.kpi_id.uuid             = "6e22f180-ba28-4641-b190-2287bf448888"
+    _create_collector_request.duration_s                     = float(random.randint(30, 50))
+    # _create_collector_request.duration_s                     = -1
+    _create_collector_request.interval_s                     = float(random.randint(2, 4)) 
+    return _create_collector_request
+
+def _create_kpi_descriptor(device_id : str = ""):
+    _create_kpi_request                                    = KpiDescriptor()
+    _create_kpi_request.kpi_id.kpi_id.uuid                 = str(uuid.uuid4())
+    _create_kpi_request.kpi_description                    = "Test Description"
+    _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
+    _create_kpi_request.device_id.device_uuid.uuid         = device_id
+    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV3'
+    _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC3' 
+    _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = '36571df2-bac1-5909-a27d-5f42491d2ff0' 
+    _create_kpi_request.connection_id.connection_uuid.uuid = 'CON2' 
+    _create_kpi_request.link_id.link_uuid.uuid             = 'LNK2' 
+    return _create_kpi_request
+
+def _create_kpi_id(kpi_id : str = "fc046641-0c9a-4750-b4d9-9f98401714e2"):
+    _create_kpi_id_request = KpiId()
+    _create_kpi_id_request.kpi_id.uuid = kpi_id
+    return _create_kpi_id_request
diff --git a/src/telemetry/backend/tests/messages_emulated.py b/src/telemetry/backend/tests/messages_emulated.py
new file mode 100644
index 0000000000000000000000000000000000000000..e081fb3febc163d40742d3e690cc0e2b3d4b7d61
--- /dev/null
+++ b/src/telemetry/backend/tests/messages_emulated.py
@@ -0,0 +1,61 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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
+# Configure logging to ensure logs appear on the console
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+
+def create_test_configuration():
+    return {
+            "config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": 8080}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
+                    "endpoints": [
+                        {"uuid": "eth0",   "type": "ethernet", "sample_types": [101, 102]},
+                        {"uuid": "eth1",   "type": "ethernet", "sample_types": []},
+                        {"uuid": "13/1/2", "type": "copper",   "sample_types": [101, 102, 201, 202]}
+                    ]
+                }}},
+                {"action": 1, "custom": {"resource_key": "/interface[eth0]/settings", "resource_value": {
+                    "name": "eth0", "enabled": True
+                }}},
+                {"action": 1, "custom": {"resource_key": "/interface[eth1]/settings", "resource_value": {
+                    "name": "eth1", "enabled": False
+                }}},
+                {"action": 1, "custom": {"resource_key": "/interface[13/1/2]/settings", "resource_value": {
+                    "name": "13/1/2", "enabled": True
+                }}}
+            ]
+        }
+
+def create_specific_config_keys():
+    keys_to_return = ["_connect/settings/endpoints/eth1", "/interface/[13/1/2]/settings", "_connect/address"]
+    return keys_to_return
+
+def create_config_for_delete():
+    keys_to_delete = ["_connect/settings/endpoints/eth0", "/interface/[eth1]", "_connect/port"]
+    return keys_to_delete
+
+def create_test_subscriptions():
+    return [("_connect/settings/endpoints/eth1",   10, 2),
+            ("_connect/settings/endpoints/13/1/2", 15, 3),
+            ("_connect/settings/endpoints/eth0",   8,  2)]
+
+def create_unscubscribe_subscriptions():
+    return [("_connect/settings/endpoints/eth1",   10, 2),
+            ("_connect/settings/endpoints/13/1/2", 15, 3),
+            ("_connect/settings/endpoints/eth0",   8,  2)]
diff --git a/src/telemetry/backend/tests/test_backend.py b/src/telemetry/backend/tests/test_backend.py
index 5307cd9fe51f3bb15f5dd4915bfc601318db9551..1329aa969a4fed5baa887dd12d120f41eb56c2fa 100644
--- a/src/telemetry/backend/tests/test_backend.py
+++ b/src/telemetry/backend/tests/test_backend.py
@@ -12,26 +12,170 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import pytest
 import logging
-import threading
-from common.tools.kafka.Variables import KafkaTopic
+import time
 from telemetry.backend.service.TelemetryBackendService import TelemetryBackendService
-
+from .messages import create_collector_request, _create_kpi_descriptor, _create_kpi_id
+from .Fixtures import context_client, device_client, service_client, kpi_manager_client
+from .add_devices import load_topology
+from common.tools.context_queries.Topology import get_topology
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.tools.context_queries.Device import get_device, add_device_to_topology
+# from common.tools.context_queries.EndPoint import get_endpoint_names
+from .EndPoint import get_endpoint_names        # modofied version of get_endpoint_names
+from common.proto.context_pb2 import EndPointId, DeviceId, TopologyId, ContextId , Empty
+from common.proto.kpi_manager_pb2 import KpiId
 
 LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
 
 
 ###########################
 # Tests Implementation of Telemetry Backend
 ###########################
 
-# --- "test_validate_kafka_topics" should be run before the functionality tests ---
-def test_validate_kafka_topics():
-    LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ")
-    response = KafkaTopic.create_all_topics()
-    assert isinstance(response, bool)
+@pytest.fixture(autouse=True)
+def log_all_methods(request):
+    '''
+    This fixture logs messages before and after each test function runs, indicating the start and end of the test.
+    The autouse=True parameter ensures that this logging happens automatically for all tests in the module.
+    '''
+    LOGGER.info(f" >>>>> Starting test: {request.node.name} ")
+    yield
+    LOGGER.info(f" <<<<< Finished test: {request.node.name} ")
+
+# # ----- Add Topology -----
+# def test_add_to_topology(context_client, device_client, service_client):
+#     load_topology(context_client, device_client)
+
+# # ----- Add Device to Topology ------
+# def test_add_device_to_topology(context_client):
+#     context_id = ContextId()
+#     context_id.context_uuid.uuid = "43813baf-195e-5da6-af20-b3d0922e71a7"
+#     topology_uuid = "c76135e3-24a8-5e92-9bed-c3c9139359c8"
+#     device_uuid   = "69a3a3f0-5237-5f9e-bc96-d450d0c6c03a"
+#     response      = add_device_to_topology( context_client = context_client, 
+#                                             context_id     = context_id, 
+#                                             topology_uuid  = topology_uuid,
+#                                             device_uuid    = device_uuid
+#                                           )
+#     LOGGER.info(f"Device added to topology: {response}")
+#     assert response is True
+
+# # ----- Get Topology -----
+# def test_get_topology(context_client, device_client):
+#     response = get_topology(context_client = context_client, topology_uuid = "test1", context_uuid = "test1")
+#     LOGGER.info(f"Topology: {response}")
+#     assert response is not None
+
+# def test_set_kpi_descriptor_and_get_device_id(kpi_manager_client):
+#     kpi_descriptor = _create_kpi_descriptor("1290fb71-bf15-5528-8b69-2d2fabe1fa18")
+#     kpi_id         = kpi_manager_client.SetKpiDescriptor(kpi_descriptor)
+#     LOGGER.info(f"KPI Descriptor set: {kpi_id}")
+#     assert kpi_id is not None
+
+#     response = kpi_manager_client.GetKpiDescriptor(kpi_id)
+#     # response = kpi_manager_client.GetKpiDescriptor(_create_kpi_id())
+
+#     assert response is not None
+#     LOGGER.info(f"KPI Descriptor: {response}")
+#     LOGGER.info(f"Device Id:   {response.device_id.device_uuid.uuid}")
+#     LOGGER.info(f"Endpoint Id: {response.endpoint_id.endpoint_uuid.uuid}")
+
+# # ----- Get endpoint detail using device ID -----
+# def test_get_device_details(context_client):
+#     response = get_device(context_client = context_client, device_uuid = "1290fb71-bf15-5528-8b69-2d2fabe1fa18", include_config_rules = False, include_components = False)
+#     if response:
+#         LOGGER.info(f"Device type: {response.device_type}")
+#         for endpoint in response.device_endpoints:
+#             if endpoint.endpoint_id.endpoint_uuid.uuid == '36571df2-bac1-5909-a27d-5f42491d2ff0':
+#                 endpoint_dict    = {}
+#                 kpi_sample_types = []
+#                 # LOGGER.info(f"Endpoint: {endpoint}")
+#                 # LOGGER.info(f"Enpoint_uuid: {endpoint.endpoint_id.endpoint_uuid.uuid}")
+#                 endpoint_dict["uuid"] = endpoint.endpoint_id.endpoint_uuid.uuid
+#                 # LOGGER.info(f"Enpoint_name: {endpoint.name}")
+#                 endpoint_dict["name"] = endpoint.name
+#                 # LOGGER.info(f"Enpoint_type: {endpoint.endpoint_type}")
+#                 endpoint_dict["type"] = endpoint.endpoint_type
+#                 for sample_type in endpoint.kpi_sample_types:
+#                     # LOGGER.info(f"Enpoint_sample_types: {sample_type}")
+#                     kpi_sample_types.append(sample_type)
+#                 endpoint_dict["sample_types"] = kpi_sample_types
+#                 LOGGER.info(f"Extracted endpoint dict: {endpoint_dict}")
+#             else:
+#                 LOGGER.info(f"Endpoint not matched")
+#     LOGGER.info(f"Device Type: {type(response)}")
+#     assert response is not None
+
+# # ----- List Conetxts -----
+# def test_list_contextIds(context_client):
+#     empty = Empty()
+#     response = context_client.ListContexts(empty)
+#     LOGGER.info(f"Contexts: {response}")
+#     assert response
+
+# # ----- List Devices -----
+# def test_list_devices(context_client):
+#     empty = Empty()
+#     response = context_client.ListDeviceIds(empty)
+#     LOGGER.info(f"Devices: {response}")
+#     assert response
+
+# ----- Get Endpoints ----- TODO: get_endpoint_names method doesn't return KPI samples types
+# def test_get_endpoints(context_client):
+#     device_id = DeviceId()
+#     device_id.device_uuid.uuid = "1290fb71-bf15-5528-8b69-2d2fabe1fa18"
+#     endpoint_id = EndPointId()
+#     endpoint_id.endpoint_uuid.uuid = "43b817fa-246f-5e0a-a2e3-2aad0b3e16ca"
+#     endpoint_id.device_id.CopyFrom(device_id)
+#     response = get_endpoint_names(context_client = context_client, endpoint_ids = [endpoint_id])
+#     LOGGER.info(f"Endpoints: {response}")
+#     assert response is not None
+
+# # ----- List Topologies -----
+# def test_list_topologies(context_client):
+#     context_id = ContextId()
+#     context_id.context_uuid.uuid = "e7d46baa-d38d-5b72-a082-f344274b63ef"
+#     respone = context_client.ListTopologies(context_id)
+#     LOGGER.info(f"Topologies: {respone}")
+
+# # ----- Remove Topology -----
+# def test_remove_topology(context_client):
+#     context_id = ContextId()
+#     context_id.context_uuid.uuid = "e7d46baa-d38d-5b72-a082-f344274b63ef"
+#     topology_id = TopologyId()
+#     topology_id.topology_uuid.uuid = "9ef0118c-4bca-5e81-808b-dc8f60e2cda4"
+#     topology_id.context_id.CopyFrom(context_id)
+
+#     response = context_client.RemoveTopology(topology_id)
+#     LOGGER.info(f"Topology removed: {response}")
+
+# # ----- Remove context -----
+# def test_remove_context(context_client):
+#     context_id = ContextId()
+#     context_id.context_uuid.uuid = "e7d46baa-d38d-5b72-a082-f344274b63ef"
+#     response = context_client.RemoveContext(context_id)
+#     LOGGER.info(f"Context removed: {response}")
+
+@pytest.fixture
+def telemetryBackend_service():
+    LOGGER.info('Initializing TelemetryBackendService...')
+
+    _service = TelemetryBackendService()
+    _service.start()
+
+    LOGGER.info('Yielding TelemetryBackendService...')
+    yield _service
+
+    LOGGER.info('Terminating TelemetryBackendService...')
+    _service.stop()
+    LOGGER.info('Terminated TelemetryBackendService...')
+
+
+def test_InitiateCollectorBackend(telemetryBackend_service):
+    LOGGER.info(" Backend Initiated Successfully. Waiting for timer to finish ...")
+    time.sleep(30)
+    LOGGER.info(" Backend Timer Finished Successfully. ")
 
-# def test_RunRequestListener():
-#     LOGGER.info('test_RunRequestListener')
-#     TelemetryBackendServiceObj = TelemetryBackendService()
-#     threading.Thread(target=TelemetryBackendServiceObj.RequestListener).start()
\ No newline at end of file
diff --git a/src/telemetry/backend/tests/test_emulated.py b/src/telemetry/backend/tests/test_emulated.py
new file mode 100644
index 0000000000000000000000000000000000000000..feb5b1f7f92de4016f3bcb8eff8e17b843bf0c3e
--- /dev/null
+++ b/src/telemetry/backend/tests/test_emulated.py
@@ -0,0 +1,108 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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
+import time
+import pytest
+from telemetry.backend.collectors.emulated.EmulatedCollector import EmulatedCollector
+from telemetry.backend.tests.messages_emulated import (
+    create_test_configuration,
+    create_specific_config_keys,
+    create_config_for_delete,
+    create_test_subscriptions,
+)
+
+logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
+logger = logging.getLogger(__name__)
+
+@pytest.fixture
+def setup_collector():
+    """Sets up an EmulatedCollector instance for testing."""
+    yield EmulatedCollector(address="127.0.0.1", port=8080)
+
+@pytest.fixture
+def connected_configured_collector(setup_collector):
+    collector = setup_collector # EmulatedCollector(address="127.0.0.1", port=8080)
+    collector.Connect()
+    collector.SetConfig(create_test_configuration())
+    yield collector
+    collector.Disconnect()
+
+def test_connect(setup_collector):
+    logger.info(">>> test_connect <<<")
+    collector = setup_collector
+    assert collector.Connect() is True
+    assert collector.connected is True
+
+def test_disconnect(setup_collector):
+    logger.info(">>> test_disconnect <<<")
+    collector = setup_collector
+    collector.Connect()
+    assert collector.Disconnect() is True
+    assert collector.connected is False
+
+# def test_set_config(setup_collector):
+#     logger.info(">>> test_set_config <<<")
+#     collector = setup_collector
+#     collector.Connect()
+
+#     config = create_test_configuration()
+
+#     results = collector.SetConfig(config)
+#     assert all(result is True for result in results)
+
+# def test_get_config(connected_configured_collector):
+#     logger.info(">>> test_get_config <<<")
+#     resource_keys = create_specific_config_keys() 
+#     results = connected_configured_collector.GetConfig(resource_keys)
+
+#     for key, value in results:
+#         assert key in create_specific_config_keys()
+#         assert value is not None
+
+# def test_delete_config(connected_configured_collector):
+#     logger.info(">>> test_delete_config <<<")
+#     resource_keys = create_config_for_delete() 
+
+#     results = connected_configured_collector.DeleteConfig(resource_keys)
+#     assert all(result is True for result in results)
+
+def test_subscribe_state(connected_configured_collector):
+    logger.info(">>> test_subscribe_state <<<")
+    subscriptions = create_test_subscriptions() 
+
+    results = connected_configured_collector.SubscribeState(subscriptions)
+    # logger.info(f"Subscribed result: {results}.")
+    assert results ==  [False, True, True] # all(result is True for result in results)
+
+def test_unsubscribe_state(connected_configured_collector):
+    logger.info(">>> test_unsubscribe_state <<<")
+    subscriptions = create_test_subscriptions()
+
+    connected_configured_collector.SubscribeState(subscriptions)
+    results = connected_configured_collector.UnsubscribeState(subscriptions)
+    assert results ==  [False, True, True] # all(result is True for result in results)
+
+def test_get_state(connected_configured_collector):
+    logger.info(">>> test_get_state <<<")
+    subscriptions = create_test_subscriptions()
+
+    connected_configured_collector.SubscribeState(subscriptions)
+    logger.info(f"Subscribed to state: {subscriptions}. waiting for 12 seconds ...")
+    time.sleep(12)
+
+    state_iterator = connected_configured_collector.GetState(blocking=False)
+    states = list(state_iterator)
+
+    assert len(states) > 0
diff --git a/src/telemetry/backend/tests/topology.json b/src/telemetry/backend/tests/topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..6416130b924441e959fcdb7001b7c1b51df172d8
--- /dev/null
+++ b/src/telemetry/backend/tests/topology.json
@@ -0,0 +1,148 @@
+{
+    "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": "DE1"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 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": [
+                    {"sample_types": [101, 102], "type": "copper/internal", "uuid": "1/1"},
+                    {"sample_types": [103, 102], "type": "copper/internal", "uuid": "1/2"},
+                    {"sample_types": [201, 202], "type": "copper/internal", "uuid": "2/1"},
+                    {"sample_types": [202, 203], "type": "copper/internal", "uuid": "2/2"},
+                    {"sample_types": [201, 203], "type": "copper/internal", "uuid": "2/3"},
+                    {"sample_types": [101, 103], "type": "copper/internal", "uuid": "2/4"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "DE2"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 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": [
+                    {"sample_types": [101, 103], "type": "copper/internal", "uuid": "1/1"},
+                    {"sample_types": [103, 101], "type": "copper/internal", "uuid": "1/2"},
+                    {"sample_types": [202, 201], "type": "copper/internal", "uuid": "2/1"},
+                    {"sample_types": [203, 201], "type": "copper/internal", "uuid": "2/2"},
+                    {"sample_types": [203, 202], "type": "copper/internal", "uuid": "2/3"},
+                    {"sample_types": [102     ], "type": "copper/internal", "uuid": "2/4"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "DE3"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 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": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1/1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1/2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/3"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/4"}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "DE4"}}, "device_type": "emu-packet-router", "device_drivers": [0],
+            "device_endpoints": [], "device_operational_status": 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": [
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1/1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "1/2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/1"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/2"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/3"},
+                    {"sample_types": [], "type": "copper/internal", "uuid": "2/4"}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+
+        {
+            "link_id": {"link_uuid": {"uuid": "DE1/2/2==DE2/2/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE1"}}, "endpoint_uuid": {"uuid": "2/2"}},
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE1/2/3==DE3/2/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE1"}}, "endpoint_uuid": {"uuid": "2/3"}},
+                {"device_id": {"device_uuid": {"uuid": "DE3"}}, "endpoint_uuid": {"uuid": "2/1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE1/2/4==DE4/2/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE1"}}, "endpoint_uuid": {"uuid": "2/4"}},
+                {"device_id": {"device_uuid": {"uuid": "DE4"}}, "endpoint_uuid": {"uuid": "2/1"}}
+            ]
+        },
+
+        {
+            "link_id": {"link_uuid": {"uuid": "DE2/2/1==DE1/2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DE1"}}, "endpoint_uuid": {"uuid": "2/2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE2/2/3==DE3/2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/3"}},
+                {"device_id": {"device_uuid": {"uuid": "DE3"}}, "endpoint_uuid": {"uuid": "2/2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE2/2/4==DE4/2/2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/4"}},
+                {"device_id": {"device_uuid": {"uuid": "DE4"}}, "endpoint_uuid": {"uuid": "2/2"}}
+            ]
+        },
+
+        {
+            "link_id": {"link_uuid": {"uuid": "DE3/2/1==DE1/2/3"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE3"}}, "endpoint_uuid": {"uuid": "2/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DE1"}}, "endpoint_uuid": {"uuid": "2/3"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE3/2/2==DE2/2/3"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE3"}}, "endpoint_uuid": {"uuid": "2/2"}},
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/3"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE4/2/2==DE2/2/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE4"}}, "endpoint_uuid": {"uuid": "2/2"}},
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/4"}}
+            ]
+        },
+
+        {
+            "link_id": {"link_uuid": {"uuid": "DE4/2/1==DE1/2/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE4"}}, "endpoint_uuid": {"uuid": "2/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DE1"}}, "endpoint_uuid": {"uuid": "2/4"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE4/2/2==DE2/2/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE4"}}, "endpoint_uuid": {"uuid": "2/2"}},
+                {"device_id": {"device_uuid": {"uuid": "DE2"}}, "endpoint_uuid": {"uuid": "2/4"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "DE4/2/3==DE3/2/4"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "DE4"}}, "endpoint_uuid": {"uuid": "2/3"}},
+                {"device_id": {"device_uuid": {"uuid": "DE3"}}, "endpoint_uuid": {"uuid": "2/4"}}
+            ]
+        }
+    ]
+}
diff --git a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py
index ce55f80510b3ff678ead1be82bda9101cc8e7e17..955036495f670dc8d126a0682917dfc90acba185 100644
--- a/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py
+++ b/src/telemetry/frontend/service/TelemetryFrontendServiceServicerImpl.py
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 import json
-import threading
 from typing import Any, Dict
 import grpc
 import logging
@@ -29,7 +28,6 @@ from telemetry.database.Telemetry_DB import TelemetryDB
 
 from confluent_kafka import Consumer as KafkaConsumer
 from confluent_kafka import Producer as KafkaProducer
-from confluent_kafka import KafkaError
 
 
 LOGGER            = logging.getLogger(__name__)
@@ -49,7 +47,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
    
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def StartCollector(self, 
-                       request : Collector, grpc_context: grpc.ServicerContext # type: ignore
+                       request : Collector, context: grpc.ServicerContext # type: ignore
                       ) -> CollectorId: # type: ignore
         LOGGER.info ("gRPC message: {:}".format(request))
         response = CollectorId()
@@ -74,7 +72,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
             "interval": collector_obj.interval_s
         }
         self.kafka_producer.produce(
-            KafkaTopic.REQUEST.value,
+            KafkaTopic.TELEMETRY_REQUEST.value,
             key      = collector_uuid,
             value    = json.dumps(collector_to_generate),
             callback = self.delivery_callback
@@ -86,7 +84,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def StopCollector(self, 
-                      request : CollectorId, grpc_context: grpc.ServicerContext # type: ignore
+                      request : CollectorId, context: grpc.ServicerContext # type: ignore
                      ) -> Empty:  # type: ignore
         LOGGER.info ("gRPC message: {:}".format(request))
         try:
@@ -110,7 +108,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
             "interval": -1
         }
         self.kafka_producer.produce(
-            KafkaTopic.REQUEST.value,
+            KafkaTopic.TELEMETRY_REQUEST.value,
             key      = collector_uuid,
             value    = json.dumps(collector_to_stop),
             callback = self.delivery_callback
@@ -125,7 +123,7 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SelectCollectors(self, 
-                         request : CollectorFilter, contextgrpc_context: grpc.ServicerContext # type: ignore
+                         request : CollectorFilter, context: grpc.ServicerContext # type: ignore
                         ) -> CollectorList:  # type: ignore
         LOGGER.info("gRPC message: {:}".format(request))
         response = CollectorList()
@@ -145,58 +143,6 @@ class TelemetryFrontendServiceServicerImpl(TelemetryFrontendServiceServicer):
 
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def delivery_callback(self, err, msg):
-        """
-        Callback function to handle message delivery status.
-        Args:
-            err (KafkaError): Kafka error object.
-            msg (Message): Kafka message object.
-        """
         if err:
             LOGGER.debug('Message delivery failed: {:}'.format(err))
-            # print('Message delivery failed: {:}'.format(err))
-        # else:
-        #     LOGGER.debug('Message delivered to topic {:}'.format(msg.topic()))
-        #     print('Message delivered to topic {:}'.format(msg.topic()))
-
-    # ---------- Independent Method ---------------
-    # Listener method is independent of any method (same lifetime as service)
-    # continously listens for responses
-    def install_servicers(self):
-        threading.Thread(target=self.ResponseListener).start()
-
-    def ResponseListener(self):
-        """
-        listener for response on Kafka topic.
-        """
-        self.kafka_consumer.subscribe([KafkaTopic.RESPONSE.value])
-        while True:
-            receive_msg = self.kafka_consumer.poll(2.0)
-            if receive_msg is None:
-                continue
-            elif receive_msg.error():
-                if receive_msg.error().code() == KafkaError._PARTITION_EOF:
-                    continue
-                else:
-                    # print("Consumer error: {:}".format(receive_msg.error()))
-                    LOGGER.error("Consumer error: {:}".format(receive_msg.error()))
-                    break
-            try:
-                collector_id = receive_msg.key().decode('utf-8')
-                if collector_id in ACTIVE_COLLECTORS:
-                    kpi_value = json.loads(receive_msg.value().decode('utf-8'))
-                    self.process_response(collector_id, kpi_value['kpi_id'], kpi_value['kpi_value'])
-                else:
-                    # print(f"collector id does not match.\nRespone ID: '{collector_id}' --- Active IDs: '{ACTIVE_COLLECTORS}' ")
-                    LOGGER.info("collector id does not match.\nRespone ID: {:} --- Active IDs: {:}".format(collector_id, ACTIVE_COLLECTORS))
-            except Exception as e:
-                # print(f"Error extarcting msg key or value: {str(e)}")
-                LOGGER.info("Error extarcting msg key or value: {:}".format(e))
-                continue
-
-    def process_response(self, collector_id: str, kpi_id: str, kpi_value: Any):
-        if kpi_id == "-1" and kpi_value == -1:
-            # print ("Backend termination confirmation for collector id: ", collector_id)
-            LOGGER.info("Backend termination confirmation for collector id: ", collector_id)
-        else:
-            LOGGER.info("Backend termination confirmation for collector id: ", collector_id)
-            # print ("KPI Value: Collector Id:", collector_id, ", Kpi Id:", kpi_id, ", Value:", kpi_value)
+
diff --git a/src/telemetry/frontend/service/__main__.py b/src/telemetry/frontend/service/__main__.py
index e1b9dba4e97fe30b962a1deb9050c67671cbe976..874b34b8c7ae7800b323d427e9347798b22cf7bc 100644
--- a/src/telemetry/frontend/service/__main__.py
+++ b/src/telemetry/frontend/service/__main__.py
@@ -18,6 +18,8 @@ from common.Settings import get_log_level, get_metrics_port
 from .TelemetryFrontendService import TelemetryFrontendService
 from telemetry.database.TelemetryModel import Collector as Model
 from common.tools.database.GenericDatabase import Database
+from common.tools.kafka.Variables import KafkaTopic
+
 
 terminate = threading.Event()
 LOGGER = None
@@ -43,6 +45,8 @@ def main():
     kpiDBobj.create_database()
     kpiDBobj.create_tables()
     
+    KafkaTopic.create_all_topics()
+
     # Start metrics server
     metrics_port = get_metrics_port()
     start_http_server(metrics_port)
diff --git a/src/telemetry/frontend/tests/Messages.py b/src/telemetry/frontend/tests/Messages.py
index 177bcc0b7e3829d2cdfd54c404618af9ebe43161..d766f68fac4fdf978543cc94a151fbca81d9b0de 100644
--- a/src/telemetry/frontend/tests/Messages.py
+++ b/src/telemetry/frontend/tests/Messages.py
@@ -30,16 +30,17 @@ def create_collector_request():
     # _create_collector_request.collector_id.collector_id.uuid = str(uuid.uuid4()) 
     _create_collector_request.collector_id.collector_id.uuid = "efef4d95-1cf1-43c4-9742-95c283dddddd"
     # _create_collector_request.kpi_id.kpi_id.uuid             = str(uuid.uuid4())
-    _create_collector_request.kpi_id.kpi_id.uuid             = "6e22f180-ba28-4641-b190-2287bf448888"
+    # _create_collector_request.kpi_id.kpi_id.uuid             = "6e22f180-ba28-4641-b190-2287bf448888"
+    _create_collector_request.kpi_id.kpi_id.uuid             = "8c5ca114-cdc7-4081-b128-b667fd159832"
     # _create_collector_request.duration_s                     = float(random.randint(8, 16))
-    _create_collector_request.duration_s                     = -1
-    _create_collector_request.interval_s                     = float(random.randint(3, 5))
+    _create_collector_request.duration_s                     = float(random.randint(40, 60))
+    _create_collector_request.interval_s                     = float(random.randint(5, 7))
     return _create_collector_request
 
 def create_collector_filter():
     _create_collector_filter = telemetry_frontend_pb2.CollectorFilter()
     kpi_id_obj               = KpiId()
     # kpi_id_obj.kpi_id.uuid   = str(uuid.uuid4())
-    kpi_id_obj.kpi_id.uuid   = "a7237fa3-caf4-479d-84b6-4d9f9738fb7f"
+    kpi_id_obj.kpi_id.uuid   = "8c5ca114-cdc7-4081-b128-b667fd159832"
     _create_collector_filter.kpi_id.append(kpi_id_obj)
     return _create_collector_filter
diff --git a/src/telemetry/frontend/tests/test_frontend.py b/src/telemetry/frontend/tests/test_frontend.py
index 067925a285f6e6d69b89b518e6a96c1ed495b7e0..767a1f73f2ebd73f88c71ac44e8ce87efb37bebd 100644
--- a/src/telemetry/frontend/tests/test_frontend.py
+++ b/src/telemetry/frontend/tests/test_frontend.py
@@ -15,6 +15,7 @@
 import os
 import pytest
 import logging
+import time
 
 from common.Constants import ServiceNameEnum
 from common.proto.telemetry_frontend_pb2 import CollectorId, CollectorList
@@ -42,6 +43,16 @@ os.environ[get_env_var_name(ServiceNameEnum.TELEMETRY, ENVVAR_SUFIX_SERVICE_PORT
 
 LOGGER = logging.getLogger(__name__)
 
+@pytest.fixture(autouse=True)
+def log_all_methods(request):
+    '''
+    This fixture logs messages before and after each test function runs, indicating the start and end of the test.
+    The autouse=True parameter ensures that this logging happens automatically for all tests in the module.
+    '''
+    LOGGER.info(f" >>>>> Starting test: {request.node.name} ")
+    yield
+    LOGGER.info(f" <<<<< Finished test: {request.node.name} ")
+
 @pytest.fixture(scope='session')
 def telemetryFrontend_service():
     LOGGER.info('Initializing TelemetryFrontendService...')
@@ -79,36 +90,24 @@ def telemetryFrontend_client(
 # Tests Implementation of Telemetry Frontend
 ###########################
 
-# ------- Re-structuring Test ---------
-# --- "test_validate_kafka_topics" should be run before the functionality tests ---
-def test_validate_kafka_topics():
-    LOGGER.debug(" >>> test_validate_kafka_topics: START <<< ")
-    response = KafkaTopic.create_all_topics()
-    assert isinstance(response, bool)
-
 # ----- core funtionality test -----
 def test_StartCollector(telemetryFrontend_client):
-    LOGGER.info(' >>> test_StartCollector START: <<< ')
+    # LOGGER.info(' >>> test_StartCollector START: <<< ')
     response = telemetryFrontend_client.StartCollector(create_collector_request())
     LOGGER.debug(str(response))
     assert isinstance(response, CollectorId)
 
-def test_StopCollector(telemetryFrontend_client):
-    LOGGER.info(' >>> test_StopCollector START: <<< ')
-    response = telemetryFrontend_client.StopCollector(create_collector_id())
-    LOGGER.debug(str(response))
-    assert isinstance(response, Empty)
-
 def test_SelectCollectors(telemetryFrontend_client):
     LOGGER.info(' >>> test_SelectCollectors START: <<< ')
     response = telemetryFrontend_client.SelectCollectors(create_collector_filter())
     LOGGER.debug(str(response))
     assert isinstance(response, CollectorList)
 
-# # ----- Non-gRPC method tests ----- 
-# def test_RunResponseListener():
-#     LOGGER.info(' >>> test_RunResponseListener START: <<< ')
-#     TelemetryFrontendServiceObj = TelemetryFrontendServiceServicerImpl()
-#     response = TelemetryFrontendServiceObj.RunResponseListener()     # becasue Method "run_kafka_listener" is not define in frontend.proto
-#     LOGGER.debug(str(response))
-#     assert isinstance(response, bool)
+def test_StopCollector(telemetryFrontend_client):
+    # LOGGER.info(' >>> test_StopCollector START: <<< ')
+    # LOGGER.info("Waiting before termination...")
+    # time.sleep(30)
+    response = telemetryFrontend_client.StopCollector(create_collector_id())
+    LOGGER.debug(str(response))
+    assert isinstance(response, Empty)
+
diff --git a/src/tests/.gitlab-ci.yml b/src/tests/.gitlab-ci.yml
index fdc86805ba4824f64844a9b4bc78c3e27b606945..b49d40c1142522ab0fb3fa1936395f2aadc80baf 100644
--- a/src/tests/.gitlab-ci.yml
+++ b/src/tests/.gitlab-ci.yml
@@ -21,4 +21,6 @@ include:
   #- local: '/src/tests/ofc23/.gitlab-ci.yml'
   - local: '/src/tests/ofc24/.gitlab-ci.yml'
   - local: '/src/tests/eucnc24/.gitlab-ci.yml'
+  - local: '/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml'
+  - local: '/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml'
   #- local: '/src/tests/ecoc24/.gitlab-ci.yml'
diff --git a/src/tests/eucnc24/.gitlab-ci.yml b/src/tests/eucnc24/.gitlab-ci.yml
index 8c5e9f20ba2e891cd39c89beee200b22088b6438..1ae05f27469220711344728429c135858e3a345e 100644
--- a/src/tests/eucnc24/.gitlab-ci.yml
+++ b/src/tests/eucnc24/.gitlab-ci.yml
@@ -46,7 +46,7 @@ end2end_test eucnc24:
   before_script:
     - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
     - docker rm -f ${TEST_NAME} || true
-    - sudo containerlab destroy --all --cleanup || true
+    - containerlab destroy --all --cleanup || true
 
   script:
     # Download Docker image to run the test
@@ -63,13 +63,18 @@ end2end_test eucnc24:
     - cp -R src/tests/${TEST_NAME}/clab/* /tmp/clab/${TEST_NAME}
     - tree -la /tmp/clab/${TEST_NAME}
     - cd /tmp/clab/${TEST_NAME}
-    - sudo containerlab deploy --reconfigure --topo eucnc24.clab.yml
+    - containerlab deploy --reconfigure --topo eucnc24.clab.yml
     - cd $RUNNER_PATH
 
     # Wait for initialization of Device NOSes
     - sleep 3
     - docker ps -a
 
+    # Dump configuration of the routers (before any configuration)
+    - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+
     # Configure TeraFlowSDN deployment
     # Uncomment if DEBUG log level is needed for the components
     #- yq -i '((select(.kind=="Deployment").spec.template.spec.containers.[] | select(.name=="server").env.[]) | select(.name=="LOG_LEVEL").value) |= "DEBUG"' manifests/contextservice.yaml
@@ -126,12 +131,30 @@ end2end_test eucnc24:
       --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
       $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-create.sh
 
+    # Dump configuration of the routers (after configure TFS service)
+    - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+
     # Run end-to-end test: test connectivity with ping
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.10'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.1'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.1'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.10'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.3.10'
+    - export TEST1_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json)
+    - echo $TEST1_10
+    - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST1_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json)
+    - echo $TEST1_1
+    - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST2_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json)
+    - echo $TEST2_1
+    - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST2_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json)
+    - echo $TEST2_10
+    - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST3_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json)
+    - echo $TEST3_1
+    - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss'
+    - export TEST3_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json)
+    - echo $TEST3_10
+    - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss'
 
     # Run end-to-end test: deconfigure service TFS
     - >
@@ -140,6 +163,11 @@ end2end_test eucnc24:
       --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
       $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-tfs-remove.sh
 
+    # Dump configuration of the routers (after deconfigure TFS service)
+    - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+
     # Run end-to-end test: configure service IETF
     - >
       docker run -t --rm --name ${TEST_NAME} --network=host 
@@ -147,12 +175,30 @@ end2end_test eucnc24:
       --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
       $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-create.sh
 
+    # Dump configuration of the routers (after configure IETF service)
+    - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+
     # Run end-to-end test: test connectivity with ping
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.10'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.1.1'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.1'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.2.10'
-    - sudo containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 192.168.3.10'
+    - export TEST1_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.10' --format json)
+    - echo $TEST1_10
+    - echo $TEST1_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST1_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.1.1' --format json)
+    - echo $TEST1_1
+    - echo $TEST1_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST2_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.1' --format json)
+    - echo $TEST2_1
+    - echo $TEST2_1 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST2_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.2.10' --format json)
+    - echo $TEST2_10
+    - echo $TEST2_10 | grep -E '3 packets transmitted, 3 received, 0\% packet loss'
+    - export TEST3_1=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.1' --format json)
+    - echo $TEST3_1
+    - echo $TEST3_1 | grep -E '3 packets transmitted, 0 received, 100\% packet loss'
+    - export TEST3_10=$(containerlab exec --name eucnc24 --label clab-node-name=dc1 --cmd 'ping -n -c3 172.16.3.10' --format json)
+    - echo $TEST3_10
+    - echo $TEST3_10 | grep -E '3 packets transmitted, 0 received, 100\% packet loss'
 
     # Run end-to-end test: deconfigure service IETF
     - >
@@ -161,6 +207,11 @@ end2end_test eucnc24:
       --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
       $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-service-ietf-remove.sh
 
+    # Dump configuration of the routers (after deconfigure IETF service)
+    - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+
     # Run end-to-end test: cleanup scenario
     - >
       docker run -t --rm --name ${TEST_NAME} --network=host 
@@ -169,6 +220,11 @@ end2end_test eucnc24:
       $CI_REGISTRY_IMAGE/${TEST_NAME}:latest /var/teraflow/run-cleanup.sh
 
   after_script:
+    # Dump configuration of the routers (on after_script)
+    - containerlab exec --name eucnc24 --label clab-node-name=r1 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r2 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+    - containerlab exec --name eucnc24 --label clab-node-name=r3 --cmd "Cli --command \"enable"$'\n'$"show running-config\""
+
     # Dump TeraFlowSDN component logs
     - source src/tests/${TEST_NAME}/deploy_specs.sh
     - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server
@@ -183,7 +239,7 @@ end2end_test eucnc24:
     - RUNNER_PATH=`pwd`
     #- cd $PWD/src/tests/${TEST_NAME}
     - cd /tmp/clab/${TEST_NAME}
-    - sudo containerlab destroy --topo eucnc24.clab.yml --cleanup || true
+    - containerlab destroy --topo eucnc24.clab.yml --cleanup || true
     - sudo rm -rf clab-eucnc24/ .eucnc24.clab.yml.bak || true
     - cd $RUNNER_PATH
     - kubectl delete namespaces tfs || true
diff --git a/src/tests/eucnc24/README.md b/src/tests/eucnc24/README.md
index f8c2f9d49793b8e0751ea4ea09bf893e7ceae0b6..3cc7974568028faa2bfbad70942ff2cc82bbafa0 100644
--- a/src/tests/eucnc24/README.md
+++ b/src/tests/eucnc24/README.md
@@ -8,7 +8,7 @@
 ## TeraFlowSDN Deployment
 ```bash
 cd ~/tfs-ctrl
-source dataplane-in-a-box/deploy_specs.sh
+source ~/tfs-ctrl/src/tests/eucnc24/deploy_specs.sh
 ./deploy/all.sh
 ```
 
@@ -16,67 +16,55 @@ source dataplane-in-a-box/deploy_specs.sh
 
 ## Download and install ContainerLab
 ```bash
-sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.48.6
+sudo bash -c "$(curl -sL https://get.containerlab.dev)" -- -v 0.59.0
 ```
 
 ## Download Arista cEOS image and create Docker image
 ```bash
-cd ~/tfs-ctrl/dataplane-in-a-box
-docker import arista/cEOS64-lab-4.31.2F.tar ceos:4.31.2F
+cd ~/tfs-ctrl/src/tests/eucnc24/
+docker import arista/cEOS64-lab-4.32.2F.tar ceos:4.32.2F
 ```
 
 ## Deploy scenario
 ```bash
-cd ~/tfs-ctrl/dataplane-in-a-box
-sudo containerlab deploy --topo arista.clab.yml
+cd ~/tfs-ctrl/src/tests/eucnc24/
+sudo containerlab deploy --topo eucnc24.clab.yml
 ```
 
 ## Inspect scenario
 ```bash
-cd ~/tfs-ctrl/dataplane-in-a-box
-sudo containerlab inspect --topo arista.clab.yml
+cd ~/tfs-ctrl/src/tests/eucnc24/
+sudo containerlab inspect --topo eucnc24.clab.yml
 ```
 
 ## Destroy scenario
 ```bash
-cd ~/tfs-ctrl/dataplane-in-a-box
-sudo containerlab destroy --topo arista.clab.yml
-sudo rm -rf clab-arista/ .arista.clab.yml.bak
+cd ~/tfs-ctrl/src/tests/eucnc24/
+sudo containerlab destroy --topo eucnc24.clab.yml
+sudo rm -rf clab-eucnc24/ .eucnc24.clab.yml.bak
 ```
 
-## Access cEOS Bash
+## Access cEOS Bash/CLI
 ```bash
-docker exec -it clab-arista-r1 bash
-```
-
-## Access cEOS CLI
-```bash
-docker exec -it clab-arista-r1 Cli
-docker exec -it clab-arista-r2 Cli
+docker exec -it clab-eucnc24-r1 bash
+docker exec -it clab-eucnc24-r2 bash
+docker exec -it clab-eucnc24-r3 bash
+docker exec -it clab-eucnc24-r1 Cli
+docker exec -it clab-eucnc24-r2 Cli
+docker exec -it clab-eucnc24-r3 Cli
 ```
 
 ## Configure ContainerLab clients
 ```bash
-docker exec -it clab-arista-client1 bash
-    ip address add 192.168.1.10/24 dev eth1
-    ip route add 192.168.2.0/24 via 192.168.1.1
-    ip route add 192.168.3.0/24 via 192.168.1.1
-    ping 192.168.2.10
-    ping 192.168.3.10
-
-docker exec -it clab-arista-client2 bash
-    ip address add 192.168.2.10/24 dev eth1
-    ip route add 192.168.1.0/24 via 192.168.2.1
-    ip route add 192.168.3.0/24 via 192.168.2.1
-    ping 192.168.1.10
-    ping 192.168.3.10
-
-docker exec -it clab-arista-client3 bash
-    ip address add 192.168.3.10/24 dev eth1
-    ip route add 192.168.2.0/24 via 192.168.3.1
-    ip route add 192.168.3.0/24 via 192.168.3.1
-    ping 192.168.2.10
-    ping 192.168.3.10
+docker exec -it clab-eucnc24-dc1 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.10
+
+docker exec -it clab-eucnc24-dc2 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.10
 ```
 
 ## Install gNMIc
@@ -86,38 +74,38 @@ sudo bash -c "$(curl -sL https://get-gnmic.kmrd.dev)"
 
 ## gNMI Capabilities request
 ```bash
-gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure capabilities
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure capabilities
 ```
 
 ## gNMI Get request
 ```bash
-gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path / > wan1.json
-gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /interfaces/interface > wan1-ifaces.json
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path / > r1.json
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /interfaces/interface > r1-ifaces.json
 ```
 
 ## gNMI Set request
 ```bash
-#gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --update-path /system/config/hostname --update-value srl11
-#gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /system/config/hostname
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --update-path /system/config/hostname --update-value srl11
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path /system/config/hostname
 ```
 
 ## Subscribe request
 ```bash
-gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf subscribe --path /interfaces/interface[name=Management0]/state/
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf subscribe --path /interfaces/interface[name=Management0]/state/
 
 # In another terminal, you can generate traffic opening SSH connection
-ssh admin@clab-arista-wan1
+ssh admin@clab-eucnc24-r1
 ```
 
 # Check configurations done:
 ```bash
-gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/network-instances' > wan1-nis.json
-gnmic --address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/interfaces' > wan1-ifs.json
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/network-instances' > r1-nis.json
+gnmic --address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf get --path '/interfaces' > r1-ifs.json
 ```
 
 # Delete elements:
 ```bash
---address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/network-instances/network-instance[name=b19229e8]'
---address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]'
---address clab-arista-wan1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]'
+--address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/network-instances/network-instance[name=b19229e8]'
+--address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/1]/subinterfaces/subinterface[index=0]'
+--address clab-eucnc24-r1 --port 6030 --username admin --password admin --insecure --encoding json_ietf set --delete '/interfaces/interface[name=ethernet-1/2]/subinterfaces/subinterface[index=0]'
 ```
diff --git a/src/tests/eucnc24/clab/eucnc24.clab.yml b/src/tests/eucnc24/clab/eucnc24.clab.yml
index 807a1847c2c2f7580a699aada2d21c0d2577942d..aaf971e360b4770913b9aade3c21b348d700fa86 100644
--- a/src/tests/eucnc24/clab/eucnc24.clab.yml
+++ b/src/tests/eucnc24/clab/eucnc24.clab.yml
@@ -26,10 +26,11 @@ topology:
       kind: arista_ceos
       #image: ceos:4.30.4M
       #image: ceos:4.31.2F
-      #image: ceos:4.31.5M
+      #image: ceos:4.31.5M # tested, works
       #image: ceos:4.32.0F
-      image: ceos:4.32.2F
+      image: ceos:4.32.2F # tested, works
       #image: ceos:4.32.2.1F
+      #image: ceos:4.33.1F # does not work, libyang.util.LibyangError: failed to parse data tree: No module named "openconfig-platform-healthz" in the context.
     linux:
       kind: linux
       image: ghcr.io/hellt/network-multitool:latest
@@ -38,30 +39,33 @@ topology:
     r1:
       kind: arista_ceos
       mgmt-ipv4: 172.20.20.101
+      startup-config: r1-startup.cfg
 
     r2:
       kind: arista_ceos
       mgmt-ipv4: 172.20.20.102
+      startup-config: r2-startup.cfg
 
     r3:
       kind: arista_ceos
       mgmt-ipv4: 172.20.20.103
+      startup-config: r3-startup.cfg
 
     dc1:
       kind: linux
-      mgmt-ipv4: 172.20.20.211
+      mgmt-ipv4: 172.20.20.201
       exec:
         - ip link set address 00:c1:ab:00:01:01 dev eth1
-        - ip address add 192.168.1.10/24 dev eth1
-        - ip route add 192.168.2.0/24 via 192.168.1.1
+        - ip address add 172.16.1.10/24 dev eth1
+        - ip route add 172.16.2.0/24 via 172.16.1.1
 
     dc2:
       kind: linux
-      mgmt-ipv4: 172.20.20.221
+      mgmt-ipv4: 172.20.20.202
       exec:
         - ip link set address 00:c1:ab:00:02:01 dev eth1
-        - ip address add 192.168.2.10/24 dev eth1
-        - ip route add 192.168.1.0/24 via 192.168.2.1
+        - ip address add 172.16.2.10/24 dev eth1
+        - ip route add 172.16.1.0/24 via 172.16.2.1
 
   links:
     - endpoints: ["r1:eth2", "r2:eth1"]
diff --git a/src/tests/eucnc24/clab/r1-startup.cfg b/src/tests/eucnc24/clab/r1-startup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..b7feebe067b9c77572d63b719a588a4a2aa44cb9
--- /dev/null
+++ b/src/tests/eucnc24/clab/r1-startup.cfg
@@ -0,0 +1,48 @@
+! device: r1 (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build))
+!
+no aaa root
+!
+username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70
+!
+management api http-commands
+   no shutdown
+!
+no service interface inactive port-id allocation disabled
+!
+transceiver qsfp default-mode 4x10G
+!
+service routing protocols model multi-agent
+!
+hostname r1
+!
+spanning-tree mode mstp
+!
+system l1
+   unsupported speed action error
+   unsupported error-correction action error
+!
+management api gnmi
+   transport grpc default
+!
+management api netconf
+   transport ssh default
+!
+interface Ethernet2
+!
+interface Ethernet10
+!
+interface Management0
+   ip address 172.20.20.101/24
+!
+ip routing
+!
+ip route 0.0.0.0/0 172.20.20.1
+!
+router multicast
+   ipv4
+      software-forwarding kernel
+   !
+   ipv6
+      software-forwarding kernel
+!
+end
diff --git a/src/tests/eucnc24/clab/r2-startup.cfg b/src/tests/eucnc24/clab/r2-startup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..e1ab661a0ab455ab22f025ec6b2f96cf42a9f2dd
--- /dev/null
+++ b/src/tests/eucnc24/clab/r2-startup.cfg
@@ -0,0 +1,48 @@
+! device: r2 (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build))
+!
+no aaa root
+!
+username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70
+!
+management api http-commands
+   no shutdown
+!
+no service interface inactive port-id allocation disabled
+!
+transceiver qsfp default-mode 4x10G
+!
+service routing protocols model multi-agent
+!
+hostname r2
+!
+spanning-tree mode mstp
+!
+system l1
+   unsupported speed action error
+   unsupported error-correction action error
+!
+management api gnmi
+   transport grpc default
+!
+management api netconf
+   transport ssh default
+!
+interface Ethernet1
+!
+interface Ethernet3
+!
+interface Management0
+   ip address 172.20.20.102/24
+!
+ip routing
+!
+ip route 0.0.0.0/0 172.20.20.1
+!
+router multicast
+   ipv4
+      software-forwarding kernel
+   !
+   ipv6
+      software-forwarding kernel
+!
+end
diff --git a/src/tests/eucnc24/clab/r3-startup.cfg b/src/tests/eucnc24/clab/r3-startup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..63c0625931e5a4645c8ae8741a2b5bd5fe8a28d6
--- /dev/null
+++ b/src/tests/eucnc24/clab/r3-startup.cfg
@@ -0,0 +1,48 @@
+! device: r3 (cEOSLab, EOS-4.32.2F-38195967.4322F (engineering build))
+!
+no aaa root
+!
+username admin privilege 15 role network-admin secret sha512 $6$OmfaAwJRg/r44r5U$9Fca1O1G6Bgsd4NKwSyvdRJcHHk71jHAR3apDWAgSTN/t/j1iroEhz5J36HjWjOF/jEVC/R8Wa60VmbX6.cr70
+!
+management api http-commands
+   no shutdown
+!
+no service interface inactive port-id allocation disabled
+!
+transceiver qsfp default-mode 4x10G
+!
+service routing protocols model multi-agent
+!
+hostname r3
+!
+spanning-tree mode mstp
+!
+system l1
+   unsupported speed action error
+   unsupported error-correction action error
+!
+management api gnmi
+   transport grpc default
+!
+management api netconf
+   transport ssh default
+!
+interface Ethernet2
+!
+interface Ethernet10
+!
+interface Management0
+   ip address 172.20.20.103/24
+!
+ip routing
+!
+ip route 0.0.0.0/0 172.20.20.1
+!
+router multicast
+   ipv4
+      software-forwarding kernel
+   !
+   ipv6
+      software-forwarding kernel
+!
+end
diff --git a/src/tests/eucnc24/data/ietf-l3vpn-service.json b/src/tests/eucnc24/data/ietf-l3vpn-service.json
index a6297b28f0fea94dcc8a457ad2b45d38e77aa4ea..a0f28ee063c97aaabdd3fdda679e8ebbcd8089dc 100644
--- a/src/tests/eucnc24/data/ietf-l3vpn-service.json
+++ b/src/tests/eucnc24/data/ietf-l3vpn-service.json
@@ -11,7 +11,7 @@
                     "site-network-accesses": {
                         "site-network-access": [
                             {
-                                "site-network-access-id": "int",
+                                "site-network-access-id": "eth1",
                                 "site-network-access-type": "ietf-l3vpn-svc:multipoint",
                                 "device-reference": "dc1",
                                 "vpn-attachment": {"vpn-id": "ietf-l3vpn-svc", "site-role": "ietf-l3vpn-svc:spoke-role"},
@@ -19,8 +19,8 @@
                                     "ipv4": {
                                         "address-allocation-type": "ietf-l3vpn-svc:static-address",
                                         "addresses": {
-                                            "provider-address": "192.168.1.1",
-                                            "customer-address": "192.168.1.10",
+                                            "provider-address": "172.16.1.1",
+                                            "customer-address": "172.16.1.10",
                                             "prefix-length": 24
                                         }
                                     }
@@ -48,7 +48,7 @@
                     "site-network-accesses": {
                         "site-network-access": [
                             {
-                                "site-network-access-id": "int",
+                                "site-network-access-id": "eth1",
                                 "site-network-access-type": "ietf-l3vpn-svc:multipoint",
                                 "device-reference": "dc2",
                                 "vpn-attachment": {"vpn-id": "ietf-l3vpn-svc", "site-role": "ietf-l3vpn-svc:hub-role"},
@@ -56,8 +56,8 @@
                                     "ipv4": {
                                         "address-allocation-type": "ietf-l3vpn-svc:static-address",
                                         "addresses": {
-                                            "provider-address": "192.168.2.1",
-                                            "customer-address": "192.168.2.10",
+                                            "provider-address": "172.16.2.1",
+                                            "customer-address": "172.16.2.10",
                                             "prefix-length": 24
                                         }
                                     }
diff --git a/src/tests/eucnc24/data/tfs-service.json b/src/tests/eucnc24/data/tfs-service.json
index 397fc84789111932da047acd22c7bc787888657f..e4bb7c2d255d2f119cd5c9646d01450ac4bffd9c 100644
--- a/src/tests/eucnc24/data/tfs-service.json
+++ b/src/tests/eucnc24/data/tfs-service.json
@@ -14,11 +14,11 @@
             "service_config": {"config_rules": [
                 {"action": "CONFIGACTION_SET", "custom": {
                     "resource_key": "/device[dc1]/endpoint[eth1]/settings",
-                    "resource_value": {"address_ip": "192.168.1.10", "address_prefix": 24, "index": 0}
+                    "resource_value": {"address_ip": "172.16.1.10", "address_prefix": 24, "index": 0}
                 }},
                 {"action": "CONFIGACTION_SET", "custom": {
                     "resource_key": "/device[dc2]/endpoint[eth1]/settings",
-                    "resource_value": {"address_ip": "192.168.2.10", "address_prefix": 24, "index": 0}
+                    "resource_value": {"address_ip": "172.16.2.10", "address_prefix": 24, "index": 0}
                 }}
             ]}
         }
diff --git a/src/tests/ofc25-camara-agg-net-controller/.gitignore b/src/tests/ofc25-camara-agg-net-controller/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..24a4b233365e23a9462f4b64e8b60fef6a62bee4
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/.gitignore
@@ -0,0 +1,5 @@
+clab-*/
+images/
+*.clab.yml.bak
+*.tar
+*.tar.gz
diff --git a/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml b/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f69c37b38a5a4414c2d75f816ed12035cbb0d53c
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/.gitlab-ci.yml
@@ -0,0 +1,90 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 and Execute end-2-end test
+end2end_test ofc25_camara_agg_net:
+  variables:
+    TEST_NAME: 'ofc25-camara-agg-net-controller'
+    IP_NAME: 'ip'
+    IP_PORT: '9092'
+  stage: end2end_test
+  # Disable to force running it after all other tasks
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+    - HOST_IP=$(kubectl get nodes -o json | jq -r '.items[].status.addresses[] | select(.type=="InternalIP") | .address')
+    - sed -i "s/IP_NET_IP/${HOST_IP}/g" src/tests/${TEST_NAME}/data/agg-net-descriptor.json
+    - sed -i "s/IP_NET_PORT/${IP_PORT}/g" src/tests/${TEST_NAME}/data/agg-net-descriptor.json
+    - docker buildx build -t "${TEST_NAME}:latest" -f ./src/tests/${TEST_NAME}/Dockerfile .
+    - docker buildx build -t "${IP_NAME}:latest" -f ./src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile ./src/tests/tools/mock_ietf_l3vpn_sdn_ctrl
+    - docker rm -f ${TEST_NAME} || true
+    - docker rm -f ${IP_NAME} || true
+    - docker run -d --name ${IP_NAME} -p ${IP_PORT}:8443 ${IP_NAME}:latest
+
+  script:
+    # Check MicroK8s is ready
+    - microk8s status --wait-ready
+    - kubectl get pods --all-namespaces
+
+    - source src/tests/${TEST_NAME}/deploy_specs.sh
+
+    # Deploy TeraFlowSDN
+    - ./deploy/crdb.sh
+    - ./deploy/nats.sh
+    - ./deploy/qdb.sh
+    - ./deploy/kafka.sh
+    - ./deploy/tfs.sh
+    - ./deploy/show.sh
+
+    - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server
+
+    # Run end-to-end test: onboard scenario
+    - >
+      docker run -t --rm --name ${TEST_NAME} --network=host
+      --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh"
+      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
+      ${TEST_NAME}:latest /var/teraflow/run-onboarding.sh
+
+    # Run end-to-end test: configure service TFS
+    - >
+      docker run -t --rm --name ${TEST_NAME} --network=host
+      --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh"
+      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
+      ${TEST_NAME}:latest /var/teraflow/run-agg-net-ietf-slice-operations.sh
+
+  after_script:
+    - kubectl --namespace tfs logs deployment/contextservice -c server
+    - kubectl --namespace tfs logs deployment/deviceservice -c server
+    - kubectl --namespace tfs logs deployment/pathcompservice -c frontend
+    - kubectl --namespace tfs logs deployment/serviceservice -c server
+    - kubectl --namespace tfs logs deployment/sliceservice -c server
+    - kubectl --namespace tfs logs deployment/nbiservice -c server
+    - docker logs ${IP_NAME}
+
+    # Destroy Scenario
+    - kubectl delete namespaces tfs || true
+
+    - docker rm -f ${TEST_NAME} || true
+    - docker rm -f ${IP_NAME} || true
+
+    # Clean old docker images
+    - docker images --filter="dangling=true" --quiet | xargs -r docker rmi
+
+  #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"'
+  artifacts:
+      when: always
+      reports:
+        junit: ./src/tests/${TEST_NAME}/report_*.xml
diff --git a/src/tests/ofc25-camara-agg-net-controller/Dockerfile b/src/tests/ofc25-camara-agg-net-controller/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..36ab9d366bd186f4ac0ade9f9dcea21f0a2a46e8
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/Dockerfile
@@ -0,0 +1,84 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 python:3.9-slim
+
+# Install dependencies
+RUN apt-get --yes --quiet --quiet update && \
+    apt-get --yes --quiet --quiet install wget g++ git && \
+    rm -rf /var/lib/apt/lists/*
+
+# Set Python to show logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# Get generic Python packages
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install --upgrade setuptools wheel
+RUN python3 -m pip install --upgrade pip-tools
+
+# Get common Python packages
+# Note: this step enables sharing the previous Docker build steps among all the Python components
+WORKDIR /var/teraflow
+COPY common_requirements.in common_requirements.in
+RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in
+RUN python3 -m pip install -r common_requirements.txt
+
+# Add common files into working directory
+WORKDIR /var/teraflow/common
+COPY src/common/. ./
+RUN rm -rf proto
+
+# Create proto sub-folder, copy .proto files, and generate Python code
+RUN mkdir -p /var/teraflow/common/proto
+WORKDIR /var/teraflow/common/proto
+RUN touch __init__.py
+COPY proto/*.proto ./
+RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto
+RUN rm *.proto
+RUN find . -type f -exec sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' {} \;
+
+# Create component sub-folders, get specific Python packages
+RUN mkdir -p /var/teraflow/tests/ofc25-camara-agg-net-controller
+WORKDIR /var/teraflow/tests/ofc25-camara-agg-net-controller
+COPY src/tests/ofc25-camara-agg-net-controller/requirements.in requirements.in
+RUN pip-compile --quiet --output-file=requirements.txt requirements.in
+RUN python3 -m pip install -r requirements.txt
+
+# Add component files into working directory
+WORKDIR /var/teraflow
+COPY src/__init__.py ./__init__.py
+COPY src/common/*.py ./common/
+COPY src/common/tests/. ./common/tests/
+COPY src/common/tools/. ./common/tools/
+COPY src/context/__init__.py context/__init__.py
+COPY src/context/client/. context/client/
+COPY src/device/__init__.py device/__init__.py
+COPY src/device/client/. device/client/
+COPY src/monitoring/__init__.py monitoring/__init__.py
+COPY src/monitoring/client/. monitoring/client/
+COPY src/service/__init__.py service/__init__.py
+COPY src/service/client/. service/client/
+COPY src/slice/__init__.py slice/__init__.py
+COPY src/slice/client/. slice/client/
+COPY src/tests/*.py ./tests/
+COPY src/tests/ofc25-camara-agg-net-controller/__init__.py ./tests/ofc25-camara-agg-net-controller/__init__.py
+COPY src/tests/ofc25-camara-agg-net-controller/data/. ./tests/ofc25-camara-agg-net-controller/data/
+COPY src/tests/ofc25-camara-agg-net-controller/tests/. ./tests/ofc25-camara-agg-net-controller/tests/
+COPY src/tests/ofc25-camara-agg-net-controller/scripts/. ./
+
+RUN apt-get --yes --quiet --quiet update && \
+    apt-get --yes --quiet --quiet install tree && \
+    rm -rf /var/lib/apt/lists/*
+
+RUN tree -la /var/teraflow
diff --git a/src/tests/ofc25-camara-agg-net-controller/__init__.py b/src/tests/ofc25-camara-agg-net-controller/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/ofc25-camara-agg-net-controller/data/agg-net-descriptor.json b/src/tests/ofc25-camara-agg-net-controller/data/agg-net-descriptor.json
new file mode 100644
index 0000000000000000000000000000000000000000..5e0e612ddb4206974bb7b8b9d37f62365ade0dfa
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/agg-net-descriptor.json
@@ -0,0 +1,858 @@
+{
+    "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": "ip-net-controller"
+                }
+            },
+            "name": "ip-net-controller",
+            "device_type": "ip-sdn-controller",
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "device_config": {
+                "config_rules": [
+                    {
+                        "action": 1,
+                        "custom": {
+                            "resource_key": "_connect/address",
+                            "resource_value": "IP_NET_IP"
+                        }
+                    },
+                    {
+                        "action": 1,
+                        "custom": {
+                            "resource_key": "_connect/port",
+                            "resource_value": "IP_NET_PORT"
+                        }
+                    },
+                    {
+                        "action": 1,
+                        "custom": {
+                            "resource_key": "_connect/settings",
+                            "resource_value": {
+                                "endpoints": [
+                                    {
+                                        "uuid": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    }
+                                ],
+                                "scheme": "http",
+                                "username": "admin",
+                                "password": "admin",
+                                "base_url": "/restconf/v2/data",
+                                "timeout": 120,
+                                "verify": false
+                            }
+                        }
+                    }
+                ]
+            },
+            "device_endpoints": []
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.182.25"
+                }
+            },
+            "name": "172.16.182.25",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "200",
+                                        "name": "200",
+                                        "type": "optical",
+                                        "address_ip": "128.32.33.254",
+                                        "address_prefix": "24",
+                                        "site_location": "access"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.31"
+                }
+            },
+            "name": "172.16.185.31",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.33"
+                }
+            },
+            "name": "172.16.185.33",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.185.32"
+                }
+            },
+            "name": "172.16.185.32",
+            "device_type": "emu-packet-router",
+            "controller_id": {
+                "device_uuid": {
+                    "uuid": "ip-net-controller"
+                }
+            },
+            "device_operational_status": 1,
+            "device_drivers": [
+                13
+            ],
+            "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": "mgmt",
+                                        "name": "mgmt",
+                                        "type": "mgmt"
+                                    },
+                                    {
+                                        "uuid": "200",
+                                        "name": "200",
+                                        "type": "optical",
+                                        "address_ip": "172.10.33.254",
+                                        "address_prefix": "24",
+                                        "site_location": "cloud"
+                                    },
+                                    {
+                                        "uuid": "500",
+                                        "name": "500",
+                                        "type": "optical"
+                                    },
+                                    {
+                                        "uuid": "501",
+                                        "name": "501",
+                                        "type": "optical"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "172.16.204.220"
+                }
+            },
+            "device_type": "emu-datacenter",
+            "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": [],
+                                        "type": "optical",
+                                        "uuid": "500"
+                                    },
+                                    {
+                                        "sample_types": [],
+                                        "type": "optical",
+                                        "uuid": "200"
+                                    },
+                                    {
+                                        "sample_types": [],
+                                        "type": "optical",
+                                        "uuid": "201"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        }
+    ],
+    "links": [
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.182.25/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.182.25/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.185.31/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.185.31/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.185.33/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.185.33/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "ip-net-controller/mgmt==172.16.185.32/mgmt"
+                }
+            },
+            "name": "ip-net-controller/mgmt==172.16.185.32/mgmt",
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "ip-net-controller"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "mgmt"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.182.25-500"
+                }
+            },
+            "name": "172.16.182.25-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.33-500"
+                }
+            },
+            "name": "172.16.185.33-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.182.25-501"
+                }
+            },
+            "name": "172.16.182.25-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.31-501"
+                }
+            },
+            "name": "172.16.185.31-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.182.25"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.31-500"
+                }
+            },
+            "name": "172.16.185.31-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-500"
+                }
+            },
+            "name": "172.16.185.32-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.31"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.33-501"
+                }
+            },
+            "name": "172.16.185.33-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-501"
+                }
+            },
+            "name": "172.16.185.32-501",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.33"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "501"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.185.32-200"
+                }
+            },
+            "name": "172.16.185.32-200",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "200"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.204.220"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "172.16.204.220-500"
+                }
+            },
+            "name": "172.16.204.220-500",
+            "attributes": {
+                "total_capacity_gbps": 10,
+                "used_capacity_gbps": 0
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.204.220"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "500"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "172.16.185.32"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "200"
+                    }
+                }
+            ]
+        }
+    ]
+}
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice1_post_ietf_network_slice.json b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice1_post_ietf_network_slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..ac1f09dd838d60ab42c64e134203f398179874e7
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice1_post_ietf_network_slice.json
@@ -0,0 +1,190 @@
+{
+  "network-slice-services": {
+    "slice-service": [
+      {
+        "connection-groups": {
+          "connection-group": [
+            {
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "p2p-receiver-sdp": "2",
+                  "p2p-sender-sdp": "1",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": 10,
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": 5000,
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": 0.001
+                        }
+                      ]
+                    }
+                  }
+                },
+                {
+                  "id": 2,
+                  "p2p-receiver-sdp": "1",
+                  "p2p-sender-sdp": "2",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": 20,
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": 1000,
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": 0.001
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "connectivity-type": "point-to-point",
+              "id": "line1"
+            }
+          ]
+        },
+        "description": "dsc",
+        "id": "slice1",
+        "sdps": {
+          "sdp": [
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.185.32",
+                    "ac-tp-id": "200",
+                    "description": "dsc",
+                    "id": "0"
+                  }
+                ]
+              },
+              "id": "1",
+              "node-id": "172.16.185.32",
+              "sdp-ip-address": [
+                "172.16.185.32"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "101"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.1.101.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  }
+                ]
+              }
+            },
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.182.25",
+                    "ac-tp-id": "200",
+                    "description": "dsc",
+                    "id": "0"
+                  }
+                ]
+              },
+              "id": "2",
+              "node-id": "172.16.182.25",
+              "sdp-ip-address": [
+                "172.16.182.25"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "21"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.1.101.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      }
+    ]
+  }
+}
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice1_put_ietf_network_slice.json b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice1_put_ietf_network_slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..690a84d915620667121cd6893e430576c592322a
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice1_put_ietf_network_slice.json
@@ -0,0 +1,58 @@
+{
+      "connectivity-construct": [
+        {
+          "id": 1,
+          "p2p-receiver-sdp": "2",
+          "p2p-sender-sdp": "1",
+          "service-slo-sle-policy": {
+            "slo-policy": {
+              "metric-bound": [
+                {
+                  "bound": 10,
+                  "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                  "metric-unit": "milliseconds"
+                },
+                {
+                  "bound": 5000,
+                  "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                  "metric-unit": "Mbps"
+                },
+                {
+                  "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                  "metric-unit": "percentage",
+                  "percentile-value": 0.001
+                }
+              ]
+            }
+          }
+        },
+        {
+          "id": 2,
+          "p2p-receiver-sdp": "1",
+          "p2p-sender-sdp": "2",
+          "service-slo-sle-policy": {
+            "slo-policy": {
+              "metric-bound": [
+                {
+                  "bound": 20,
+                  "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                  "metric-unit": "milliseconds"
+                },
+                {
+                  "bound": 1000,
+                  "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                  "metric-unit": "Mbps"
+                },
+                {
+                  "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                  "metric-unit": "percentage",
+                  "percentile-value": 0.001
+                }
+              ]
+            }
+          }
+        }
+      ],
+      "connectivity-type": "point-to-point",
+      "id": "line1"
+    }
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice2_post_ietf_network_slice.json b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice2_post_ietf_network_slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..079239a8bef20c67aaac4a7707a1041650c9bdf9
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice2_post_ietf_network_slice.json
@@ -0,0 +1,190 @@
+{
+  "network-slice-services": {
+    "slice-service": [
+      {
+        "connection-groups": {
+          "connection-group": [
+            {
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "p2p-receiver-sdp": "2",
+                  "p2p-sender-sdp": "1",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": 10,
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": 5000,
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": 0.001
+                        }
+                      ]
+                    }
+                  }
+                },
+                {
+                  "id": 2,
+                  "p2p-receiver-sdp": "1",
+                  "p2p-sender-sdp": "2",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": 20,
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": 1000,
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": 0.001
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "connectivity-type": "point-to-point",
+              "id": "line1"
+            }
+          ]
+        },
+        "description": "dsc",
+        "id": "slice2",
+        "sdps": {
+          "sdp": [
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.185.32",
+                    "ac-tp-id": "200",
+                    "description": "dsc",
+                    "id": "0"
+                  }
+                ]
+              },
+              "id": "1",
+              "node-id": "172.16.185.32",
+              "sdp-ip-address": [
+                "172.16.185.32"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "201"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.1.201.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  }
+                ]
+              }
+            },
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.182.25",
+                    "ac-tp-id": "200",
+                    "description": "dsc",
+                    "id": "0"
+                  }
+                ]
+              },
+              "id": "2",
+              "node-id": "172.16.182.25",
+              "sdp-ip-address": [
+                "172.16.182.25"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "31"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.1.201.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      }
+    ]
+  }
+}
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice2_put_ietf_network_slice.json b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice2_put_ietf_network_slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..948276a5a79048cf2980c60c57f697b491d19f44
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/pc1_slice2_put_ietf_network_slice.json
@@ -0,0 +1,58 @@
+{
+  "connectivity-construct": [
+    {
+      "id": 1,
+      "p2p-receiver-sdp": "2",
+      "p2p-sender-sdp": "1",
+      "service-slo-sle-policy": {
+        "slo-policy": {
+          "metric-bound": [
+            {
+              "bound": 10,
+              "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+              "metric-unit": "milliseconds"
+            },
+            {
+              "bound": 5000,
+              "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+              "metric-unit": "Mbps"
+            },
+            {
+              "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+              "metric-unit": "percentage",
+              "percentile-value": 0.001
+            }
+          ]
+        }
+      }
+    },
+    {
+      "id": 2,
+      "p2p-receiver-sdp": "1",
+      "p2p-sender-sdp": "2",
+      "service-slo-sle-policy": {
+        "slo-policy": {
+          "metric-bound": [
+            {
+              "bound": 20,
+              "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+              "metric-unit": "milliseconds"
+            },
+            {
+              "bound": 1000,
+              "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+              "metric-unit": "Mbps"
+            },
+            {
+              "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+              "metric-unit": "percentage",
+              "percentile-value": 0.001
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "connectivity-type": "point-to-point",
+  "id": "line1"
+}
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/pc2_slice1_put_ietf_network_slice.json b/src/tests/ofc25-camara-agg-net-controller/data/pc2_slice1_put_ietf_network_slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..66e386c483ca1989519ec9ae5c4eef468c41f4bf
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/pc2_slice1_put_ietf_network_slice.json
@@ -0,0 +1,58 @@
+{
+  "connectivity-construct": [
+    {
+      "id": 1,
+      "p2p-receiver-sdp": "2",
+      "p2p-sender-sdp": "1",
+      "service-slo-sle-policy": {
+        "slo-policy": {
+          "metric-bound": [
+            {
+              "bound": 10,
+              "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+              "metric-unit": "milliseconds"
+            },
+            {
+              "bound": 10000,
+              "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+              "metric-unit": "Mbps"
+            },
+            {
+              "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+              "metric-unit": "percentage",
+              "percentile-value": 0.001
+            }
+          ]
+        }
+      }
+    },
+    {
+      "id": 2,
+      "p2p-receiver-sdp": "1",
+      "p2p-sender-sdp": "2",
+      "service-slo-sle-policy": {
+        "slo-policy": {
+          "metric-bound": [
+            {
+              "bound": 20,
+              "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+              "metric-unit": "milliseconds"
+            },
+            {
+              "bound": 2000,
+              "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+              "metric-unit": "Mbps"
+            },
+            {
+              "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+              "metric-unit": "percentage",
+              "percentile-value": 0.001
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "connectivity-type": "point-to-point",
+  "id": "line1"
+}
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/pc2_slice2_put_ietf_network_slice.json b/src/tests/ofc25-camara-agg-net-controller/data/pc2_slice2_put_ietf_network_slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..66e386c483ca1989519ec9ae5c4eef468c41f4bf
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/pc2_slice2_put_ietf_network_slice.json
@@ -0,0 +1,58 @@
+{
+  "connectivity-construct": [
+    {
+      "id": 1,
+      "p2p-receiver-sdp": "2",
+      "p2p-sender-sdp": "1",
+      "service-slo-sle-policy": {
+        "slo-policy": {
+          "metric-bound": [
+            {
+              "bound": 10,
+              "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+              "metric-unit": "milliseconds"
+            },
+            {
+              "bound": 10000,
+              "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+              "metric-unit": "Mbps"
+            },
+            {
+              "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+              "metric-unit": "percentage",
+              "percentile-value": 0.001
+            }
+          ]
+        }
+      }
+    },
+    {
+      "id": 2,
+      "p2p-receiver-sdp": "1",
+      "p2p-sender-sdp": "2",
+      "service-slo-sle-policy": {
+        "slo-policy": {
+          "metric-bound": [
+            {
+              "bound": 20,
+              "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+              "metric-unit": "milliseconds"
+            },
+            {
+              "bound": 2000,
+              "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+              "metric-unit": "Mbps"
+            },
+            {
+              "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+              "metric-unit": "percentage",
+              "percentile-value": 0.001
+            }
+          ]
+        }
+      }
+    }
+  ],
+  "connectivity-type": "point-to-point",
+  "id": "line1"
+}
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/target-l3vpn-slice1-stages.json b/src/tests/ofc25-camara-agg-net-controller/data/target-l3vpn-slice1-stages.json
new file mode 100644
index 0000000000000000000000000000000000000000..5e75b0ff71eee30c3e73e58e92a5830981a2ef96
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/target-l3vpn-slice1-stages.json
@@ -0,0 +1,557 @@
+[
+  {
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.185.32",
+                  "location": "cloud"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "cloud"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.16.104.221/24",
+                          "lan-tag": "101",
+                          "next-hop": "172.10.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_cloud",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.185.32",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "172.10.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "172.10.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 5000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 1000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "slice1"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.182.25",
+                  "location": "access"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "access"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.1.101.22/24",
+                          "lan-tag": "21",
+                          "next-hop": "128.32.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_access",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.182.25",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "128.32.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "128.32.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 1000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 5000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "slice1"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "slice1"
+          }
+        ]
+      }
+    }
+  },
+  {
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.185.32",
+                  "location": "cloud"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "cloud"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.16.104.221/24",
+                          "lan-tag": "101",
+                          "next-hop": "172.10.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_cloud",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.185.32",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "172.10.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "172.10.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 10000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 2000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "slice1"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.182.25",
+                  "location": "access"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "access"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.1.101.22/24",
+                          "lan-tag": "21",
+                          "next-hop": "128.32.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_access",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.182.25",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "128.32.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "128.32.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 2000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 10000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "slice1"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "slice1"
+          }
+        ]
+      }
+    }
+  },
+  {
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.185.32",
+                  "location": "cloud"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "cloud"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.16.104.221/24",
+                          "lan-tag": "101",
+                          "next-hop": "172.10.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_cloud",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.185.32",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "172.10.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "172.10.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 5000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 1000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "slice1"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.182.25",
+                  "location": "access"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "access"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.1.101.22/24",
+                          "lan-tag": "21",
+                          "next-hop": "128.32.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_access",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.182.25",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "128.32.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "128.32.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 1000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 5000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "slice1"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "slice1"
+          }
+        ]
+      }
+    }
+  }
+]
diff --git a/src/tests/ofc25-camara-agg-net-controller/data/target-l3vpn-slice2-stages.json b/src/tests/ofc25-camara-agg-net-controller/data/target-l3vpn-slice2-stages.json
new file mode 100644
index 0000000000000000000000000000000000000000..216287af816b4b8656c9bd386eb6f622c0afe987
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/data/target-l3vpn-slice2-stages.json
@@ -0,0 +1,557 @@
+[
+  {
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.185.32",
+                  "location": "cloud"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "cloud"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.16.104.221/24",
+                          "lan-tag": "201",
+                          "next-hop": "172.10.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_cloud",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.185.32",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "172.10.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "172.10.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 5000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 1000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "slice2"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.182.25",
+                  "location": "access"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "access"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.1.201.22/24",
+                          "lan-tag": "31",
+                          "next-hop": "128.32.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_access",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.182.25",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "128.32.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "128.32.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 1000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 5000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "slice2"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "slice2"
+          }
+        ]
+      }
+    }
+  },
+  {
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.185.32",
+                  "location": "cloud"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "cloud"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.16.104.221/24",
+                          "lan-tag": "201",
+                          "next-hop": "172.10.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_cloud",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.185.32",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "172.10.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "172.10.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 10000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 2000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "slice2"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.182.25",
+                  "location": "access"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "access"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.1.201.22/24",
+                          "lan-tag": "31",
+                          "next-hop": "128.32.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_access",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.182.25",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "128.32.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "128.32.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 2000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 10000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "slice2"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "slice2"
+          }
+        ]
+      }
+    }
+  },
+  {
+    "ietf-l3vpn-svc:l3vpn-svc": {
+      "sites": {
+        "site": [
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.185.32",
+                  "location": "cloud"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "cloud"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.16.104.221/24",
+                          "lan-tag": "201",
+                          "next-hop": "172.10.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_cloud",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.185.32",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "172.10.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "172.10.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 10
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 5000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 1000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:hub-role",
+                    "vpn-id": "slice2"
+                  }
+                }
+              ]
+            }
+          },
+          {
+            "devices": {
+              "device": [
+                {
+                  "device-id": "172.16.182.25",
+                  "location": "access"
+                }
+              ]
+            },
+            "locations": {
+              "location": [
+                {
+                  "location-id": "access"
+                }
+              ]
+            },
+            "management": {
+              "type": "ietf-l3vpn-svc:provider-managed"
+            },
+            "routing-protocols": {
+              "routing-protocol": [
+                {
+                  "static": {
+                    "cascaded-lan-prefixes": {
+                      "ipv4-lan-prefixes": [
+                        {
+                          "lan": "172.1.201.22/24",
+                          "lan-tag": "31",
+                          "next-hop": "128.32.33.254"
+                        }
+                      ]
+                    }
+                  },
+                  "type": "ietf-l3vpn-svc:static"
+                }
+              ]
+            },
+            "site-id": "site_access",
+            "site-network-accesses": {
+              "site-network-access": [
+                {
+                  "device-reference": "172.16.182.25",
+                  "ip-connection": {
+                    "ipv4": {
+                      "address-allocation-type": "ietf-l3vpn-svc:static-address",
+                      "addresses": {
+                        "customer-address": "128.32.33.254",
+                        "prefix-length": "24",
+                        "provider-address": "128.32.33.254"
+                      }
+                    }
+                  },
+                  "service": {
+                    "qos": {
+                      "qos-profile": {
+                        "classes": {
+                          "class": [
+                            {
+                              "bandwidth": {
+                                "guaranteed-bw-percent": 100
+                              },
+                              "class-id": "qos-realtime",
+                              "direction": "ietf-l3vpn-svc:both",
+                              "latency": {
+                                "latency-boundary": 20
+                              }
+                            }
+                          ]
+                        }
+                      }
+                    },
+                    "svc-input-bandwidth": 1000000000,
+                    "svc-mtu": 1500,
+                    "svc-output-bandwidth": 5000000000
+                  },
+                  "site-network-access-id": "200",
+                  "site-network-access-type": "ietf-l3vpn-svc:multipoint",
+                  "vpn-attachment": {
+                    "site-role": "ietf-l3vpn-svc:spoke-role",
+                    "vpn-id": "slice2"
+                  }
+                }
+              ]
+            }
+          }
+        ]
+      },
+      "vpn-services": {
+        "vpn-service": [
+          {
+            "vpn-id": "slice2"
+          }
+        ]
+      }
+    }
+  }
+]
diff --git a/src/tests/ofc25-camara-agg-net-controller/deploy_specs.sh b/src/tests/ofc25-camara-agg-net-controller/deploy_specs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9ae83e7b126aa2913cd3c30887292b4626dd5855
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/deploy_specs.sh
@@ -0,0 +1,208 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 nbi webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice nbi"
+
+# Uncomment to activate Monitoring (old)
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Monitoring Framework (new)
+#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics automation"
+
+# Uncomment to activate QoS Profiles
+#export TFS_COMPONENTS="${TFS_COMPONENTS} qos_profile"
+
+# Uncomment to activate BGP-LS Speaker
+#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker"
+
+# Uncomment to activate Optical Controller
+#   To manage optical connections, "service" requires "opticalcontroller" to be deployed
+#   before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the
+#   "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it.
+#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then
+#    BEFORE="${TFS_COMPONENTS% service*}"
+#    AFTER="${TFS_COMPONENTS#* service}"
+#    export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}"
+#fi
+
+# Uncomment to activate ZTP
+#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp"
+
+# Uncomment to activate Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} 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"
+
+# Uncomment to activate Forecaster
+#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster"
+
+# Uncomment to activate E2E Orchestrator
+#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator"
+
+# Uncomment to activate DLT and Interdomain
+#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt"
+#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then
+#    export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk"
+#    export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem"
+#    export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt"
+#fi
+
+# Uncomment to activate QKD App
+#   To manage QKD Apps, "service" requires "qkd_app" to be deployed
+#   before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the
+#   "qkd_app" only if "service" is already in TFS_COMPONENTS, and re-export it.
+#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then
+#    BEFORE="${TFS_COMPONENTS% service*}"
+#    AFTER="${TFS_COMPONENTS#* service}"
+#    export TFS_COMPONENTS="${BEFORE} qkd_app service ${AFTER}"
+#fi
+
+
+# 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 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"
+
+# Set NATS installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/nats.sh for additional details
+export NATS_DEPLOY_MODE="single"
+
+# 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"
+
+
+# ----- Apache Kafka -----------------------------------------------------------
+
+# Set the namespace where Apache Kafka will be deployed.
+export KFK_NAMESPACE="kafka"
+
+# Set the port Apache Kafka server will be exposed to.
+export KFK_SERVER_PORT="9092"
+
+# Set the flag to YES for redeploying of Apache Kafka
+export KFK_REDEPLOY=""
diff --git a/src/tests/ofc25-camara-agg-net-controller/redeploy-tfs.sh b/src/tests/ofc25-camara-agg-net-controller/redeploy-tfs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7f4e0c0f4048348b4b220508d60088e69a3219fb
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/redeploy-tfs.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source ~/tfs-ctrl/src/tests/ofc25-camara-agg-net-controller/deploy_specs.sh
+./deploy/all.sh
diff --git a/src/tests/ofc25-camara-agg-net-controller/requirements.in b/src/tests/ofc25-camara-agg-net-controller/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..1bdaec9997da4b83fa89c1bf0d00d4c3a73558a4
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/requirements.in
@@ -0,0 +1,30 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+deepdiff==6.7.*
+requests==2.27.*
+
+coverage==6.3
+grpcio==1.47.*
+grpcio-health-checking==1.47.*
+grpcio-reflection==1.47.*
+grpcio-tools==1.47.*
+grpclib==0.4.4
+prettytable==3.5.0
+prometheus-client==0.13.0
+protobuf==3.20.*
+pytest==6.2.5
+pytest-benchmark==3.4.1
+python-dateutil==2.8.2
+pytest-depends==1.0.1
diff --git a/src/tests/ofc25-camara-agg-net-controller/scripts/run-agg-net-ietf-slice-operations.sh b/src/tests/ofc25-camara-agg-net-controller/scripts/run-agg-net-ietf-slice-operations.sh
new file mode 100755
index 0000000000000000000000000000000000000000..001380ea2fcb88f8546bfd2345fab9431c5e1d03
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/scripts/run-agg-net-ietf-slice-operations.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source /var/teraflow/tfs_runtime_env_vars.sh
+export PYTHONPATH=/var/teraflow
+pytest --verbose --log-level=INFO \
+    --junitxml=/opt/results/report_e2e_ietf_l3vpn_operations.xml \
+    /var/teraflow/tests/ofc25-camara-agg-net-controller/tests/test_agg_net_ietf_slice_operations.py
diff --git a/src/tests/ofc25-camara-agg-net-controller/scripts/run-onboarding.sh b/src/tests/ofc25-camara-agg-net-controller/scripts/run-onboarding.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f62294a934ac4aed1140143d2ffbfe02568a6405
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/scripts/run-onboarding.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source /var/teraflow/tfs_runtime_env_vars.sh
+export PYTHONPATH=/var/teraflow
+pytest --verbose --log-level=INFO \
+    --junitxml=/opt/results/report_onboarding.xml \
+    /var/teraflow/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py
diff --git a/src/tests/ofc25-camara-agg-net-controller/tests/Fixtures.py b/src/tests/ofc25-camara-agg-net-controller/tests/Fixtures.py
new file mode 100644
index 0000000000000000000000000000000000000000..15978851faae668339fa4eed6db8ab7e1be2eb5e
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/tests/Fixtures.py
@@ -0,0 +1,43 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 pytest
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from monitoring.client.MonitoringClient import MonitoringClient
+from service.client.ServiceClient import ServiceClient
+
+@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 monitoring_client():
+    _client = MonitoringClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def service_client():
+    _client = ServiceClient()
+    yield _client
+    _client.close()
diff --git a/src/tests/ofc25-camara-agg-net-controller/tests/Tools.py b/src/tests/ofc25-camara-agg-net-controller/tests/Tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd2add49edd23f4c169b5fdc3c5123b2b31daa8d
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/tests/Tools.py
@@ -0,0 +1,109 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, logging, requests
+from typing import Any, Dict, List, Optional, Set, Union
+from common.Constants import ServiceNameEnum
+from common.Settings import get_service_host, get_service_port_http
+
+NBI_ADDRESS  = get_service_host(ServiceNameEnum.NBI)
+NBI_PORT     = get_service_port_http(ServiceNameEnum.NBI)
+NBI_USERNAME = 'admin'
+NBI_PASSWORD = 'admin'
+NBI_BASE_URL = ''
+
+class RestRequestMethod(enum.Enum):
+    GET    = 'get'
+    POST   = 'post'
+    PUT    = 'put'
+    PATCH  = 'patch'
+    DELETE = 'delete'
+
+EXPECTED_STATUS_CODES : Set[int] = {
+    requests.codes['OK'        ],
+    requests.codes['CREATED'   ],
+    requests.codes['ACCEPTED'  ],
+    requests.codes['NO_CONTENT'],
+}
+
+def do_rest_request(
+    method : RestRequestMethod, url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    request_url = 'http://{:s}:{:s}@{:s}:{:d}{:s}{:s}'.format(
+        NBI_USERNAME, NBI_PASSWORD, NBI_ADDRESS, NBI_PORT, str(NBI_BASE_URL), url
+    )
+
+    if logger is not None:
+        msg = 'Request: {:s} {:s}'.format(str(method.value).upper(), str(request_url))
+        if body is not None: msg += ' body={:s}'.format(str(body))
+        logger.warning(msg)
+    reply = requests.request(method.value, request_url, headers={'Content-Type': 'application/json'}, timeout=timeout, json=body, allow_redirects=allow_redirects)
+    if logger is not None:
+        logger.warning('Reply: {:s}'.format(str(reply.text)))
+    assert reply.status_code in expected_status_codes, 'Reply failed with status code {:d}'.format(reply.status_code)
+
+    if reply.content and len(reply.content) > 0: return reply.json()
+    return None
+
+def do_rest_get_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.GET, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_post_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.POST, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_put_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.PUT, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_patch_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.PATCH, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_delete_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.DELETE, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
diff --git a/src/tests/ofc25-camara-agg-net-controller/tests/__init__.py b/src/tests/ofc25-camara-agg-net-controller/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/tests/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/ofc25-camara-agg-net-controller/tests/test_agg_net_ietf_slice_operations.py b/src/tests/ofc25-camara-agg-net-controller/tests/test_agg_net_ietf_slice_operations.py
new file mode 100644
index 0000000000000000000000000000000000000000..d15a8bbb6d3e9007da24985c6d452e80f9b7db5a
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/tests/test_agg_net_ietf_slice_operations.py
@@ -0,0 +1,206 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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, os
+import requests
+from deepdiff import DeepDiff
+
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+HEADERS = {"Content-Type": "application/json"}
+
+TARGET_L3VPN_SLICE1_STAGES = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-l3vpn-slice1-stages.json",
+)
+
+TARGET_L3VPN_SLICE2_STAGES = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-l3vpn-slice2-stages.json",
+)
+
+OP1_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "pc1_slice1_post_ietf_network_slice.json",
+)
+
+OP2_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "pc2_slice1_put_ietf_network_slice.json",
+)
+
+OP3_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "pc1_slice2_post_ietf_network_slice.json",
+)
+
+OP4_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "pc2_slice2_put_ietf_network_slice.json",
+)
+
+OP6_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "pc1_slice1_put_ietf_network_slice.json",
+)
+
+OP8_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "pc1_slice2_put_ietf_network_slice.json",
+)
+
+NBI_ADDRESS = "localhost"
+NBI_PORT = "80"
+NBI_USERNAME = "admin"
+NBI_PASSWORD = "admin"
+
+IP_ADDRESS = "localhost"
+IP_PORT = 9092
+
+BASE_IETF_SLICE_URL = f"http://{NBI_ADDRESS}:{NBI_PORT}/restconf/data/ietf-network-slice-service:network-slice-services"
+IP_L3VPN_URL = f"http://{IP_ADDRESS}:{IP_PORT}/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services"
+
+# pylint: disable=redefined-outer-name, unused-argument
+def test_ietf_slice_creation_removal():
+    # Issue service creation request
+    with open(OP1_IETF_SLICE, "r", encoding="UTF-8") as f:
+        op1_ietf_slice = json.load(f)
+    with open(OP2_IETF_SLICE, "r", encoding="UTF-8") as f:
+        op2_ietf_slice = json.load(f)
+    with open(OP3_IETF_SLICE, "r", encoding="UTF-8") as f:
+        op3_ietf_slice = json.load(f)
+    with open(OP4_IETF_SLICE, "r", encoding="UTF-8") as f:
+        op4_ietf_slice = json.load(f)
+    with open(OP6_IETF_SLICE, "r", encoding="UTF-8") as f:
+        op6_ietf_slice = json.load(f)
+    with open(OP8_IETF_SLICE, "r", encoding="UTF-8") as f:
+        op8_ietf_slice = json.load(f)
+    with open(TARGET_L3VPN_SLICE1_STAGES, "r", encoding="UTF-8") as f:
+        target_l3vpn_slice1_stages = json.load(f)
+    with open(TARGET_L3VPN_SLICE2_STAGES, "r", encoding="UTF-8") as f:
+        target_l3vpn_slice2_stages = json.load(f)
+
+    # op 1
+    URL = BASE_IETF_SLICE_URL
+    requests.post(URL, headers=HEADERS, json=op1_ietf_slice)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice1"
+    diff = DeepDiff(target_l3vpn_slice1_stages[0], l3vpns[slice_name])
+    assert not diff
+
+    # op 2
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/connection-groups/connection-group=line1"
+    requests.put(URL, headers=HEADERS, json=op2_ietf_slice)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice1"
+    diff = DeepDiff(target_l3vpn_slice1_stages[1], l3vpns[slice_name])
+    assert not diff
+
+    # op 3
+    URL = BASE_IETF_SLICE_URL
+    requests.post(URL, headers=HEADERS, json=op3_ietf_slice)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice2"
+    diff = DeepDiff(target_l3vpn_slice2_stages[0], l3vpns[slice_name])
+    assert not diff
+
+    # op 4
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/connection-groups/connection-group=line1"
+    requests.put(URL, headers=HEADERS, json=op4_ietf_slice)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice2"
+    diff = DeepDiff(target_l3vpn_slice2_stages[1], l3vpns[slice_name])
+    assert not diff
+
+    # op 5
+
+
+    # op 6
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/connection-groups/connection-group=line1"
+    requests.put(URL, headers=HEADERS, json=op6_ietf_slice)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice1"
+    diff = DeepDiff(target_l3vpn_slice1_stages[2], l3vpns[slice_name])
+    assert not diff
+
+    # op 7
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1"
+    requests.delete(URL)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice1"
+    assert slice_name not in l3vpns
+
+    # op 8
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/connection-groups/connection-group=line1"
+    requests.put(URL, headers=HEADERS, json=op8_ietf_slice)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice2"
+    diff = DeepDiff(target_l3vpn_slice2_stages[2], l3vpns[slice_name])
+    assert not diff
+
+    # op 9
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2"
+    requests.delete(URL)
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    slice_name = "slice2"
+    assert slice_name not in l3vpns
+
+    # op 10
+
+    URL = IP_L3VPN_URL
+    l3vpns = requests.get(URL).json()
+
+    assert not l3vpns
diff --git a/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py b/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py
new file mode 100644
index 0000000000000000000000000000000000000000..7173ddacc6e6a06aad9cba099a2cb26bab56f7a9
--- /dev/null
+++ b/src/tests/ofc25-camara-agg-net-controller/tests/test_onboarding.py
@@ -0,0 +1,67 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, time
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty
+from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario
+from common.tools.object_factory.Context import json_context_id
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from .Fixtures import context_client, device_client # pylint: disable=unused-import
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'agg-net-descriptor.json')
+ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))
+
+def test_scenario_onboarding(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient,   # pylint: disable=redefined-outer-name
+) -> None:
+    validate_empty_scenario(context_client)
+
+    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()
+
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    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
diff --git a/src/tests/ofc25-camara-e2e-controller/.gitignore b/src/tests/ofc25-camara-e2e-controller/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..24a4b233365e23a9462f4b64e8b60fef6a62bee4
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/.gitignore
@@ -0,0 +1,5 @@
+clab-*/
+images/
+*.clab.yml.bak
+*.tar
+*.tar.gz
diff --git a/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml b/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c78468180ee8fdf855c0dd096031d49bd53ceec3
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/.gitlab-ci.yml
@@ -0,0 +1,101 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 and Execute end-2-end test
+end2end_test ofc25_camara_e2e:
+  variables:
+    TEST_NAME: 'ofc25-camara-e2e-controller'
+    NCE_NAME: 'nce'
+    AGG_NET_NAME: 'agg_net'
+    NCE_PORT: '9090'
+    AGG_NET_PORT: '9091'
+  stage: end2end_test
+  # Disable to force running it after all other tasks
+  before_script:
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+    - HOST_IP=$(kubectl get nodes -o json | jq -r '.items[].status.addresses[] | select(.type=="InternalIP") | .address')
+    - sed -i "s/AGG_NET_IP/${HOST_IP}/g" src/tests/${TEST_NAME}/data/camara-e2e-topology.json
+    - sed -i "s/NCE_IP/${HOST_IP}/g" src/tests/${TEST_NAME}/data/camara-e2e-topology.json
+    - sed -i "s/AGG_NET_PORT/${AGG_NET_PORT}/g" src/tests/${TEST_NAME}/data/camara-e2e-topology.json
+    - sed -i "s/NCE_PORT/${NCE_PORT}/g" src/tests/${TEST_NAME}/data/camara-e2e-topology.json
+    - docker buildx build -t "${TEST_NAME}:latest" -f ./src/tests/${TEST_NAME}/Dockerfile .
+    - docker buildx build -t "${NCE_NAME}:latest" -f ./src/tests/tools/mock_nce_ctrl/Dockerfile ./src/tests/tools/mock_nce_ctrl
+    - docker buildx build -t "${AGG_NET_NAME}:latest" -f ./src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile ./src/tests/tools/mock_ietf_network_slice_sdn_ctrl
+    - docker rm -f ${TEST_NAME} || true
+    - docker rm -f ${AGG_NET_NAME} || true
+    - docker rm -f ${NCE_NAME} || true
+    - docker run -d --name ${NCE_NAME} -p ${NCE_PORT}:8443 ${NCE_NAME}:latest
+    - docker run -d --name ${AGG_NET_NAME} -p ${AGG_NET_PORT}:8443 ${AGG_NET_NAME}:latest
+
+  script:
+    # Check MicroK8s is ready
+    - microk8s status --wait-ready
+    - kubectl get pods --all-namespaces
+
+    - source src/tests/${TEST_NAME}/deploy_specs.sh
+
+    # Deploy TeraFlowSDN
+    - ./deploy/crdb.sh
+    - ./deploy/nats.sh
+    - ./deploy/qdb.sh
+    - ./deploy/kafka.sh
+    - ./deploy/tfs.sh
+    - ./deploy/show.sh
+
+    - kubectl --namespace $TFS_K8S_NAMESPACE logs deployment/contextservice -c server
+
+    # Run end-to-end test: onboard scenario
+    - >
+      docker run -t --rm --name ${TEST_NAME} --network=host
+      --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh"
+      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
+      ${TEST_NAME}:latest /var/teraflow/run-onboarding.sh
+
+    # Run end-to-end test: configure service TFS
+    - >
+      docker run -t --rm --name ${TEST_NAME} --network=host
+      --volume "$PWD/tfs_runtime_env_vars.sh:/var/teraflow/tfs_runtime_env_vars.sh"
+      --volume "$PWD/src/tests/${TEST_NAME}:/opt/results"
+      ${TEST_NAME}:latest /var/teraflow/run-e2e-ietf-slice-operations.sh
+
+  after_script:
+    - kubectl --namespace tfs logs deployment/contextservice -c server
+    - kubectl --namespace tfs logs deployment/deviceservice -c server
+    - kubectl --namespace tfs logs deployment/pathcompservice -c frontend
+    - kubectl --namespace tfs logs deployment/serviceservice -c server
+    - kubectl --namespace tfs logs deployment/sliceservice -c server
+    - kubectl --namespace tfs logs deployment/nbiservice -c server
+
+    - docker logs ${NCE_NAME}
+
+    - docker logs ${AGG_NET_NAME}
+
+    # Destroy Scenario
+    - kubectl delete namespaces tfs || true
+
+    - docker rm -f ${TEST_NAME} || true
+    - docker rm -f ${AGG_NET_NAME} || true
+    - docker rm -f ${NCE_NAME} || true
+
+    # Clean old docker images
+    - docker images --filter="dangling=true" --quiet | xargs -r docker rmi
+
+  #coverage: '/TOTAL\s+\d+\s+\d+\s+(\d+%)/'
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "develop" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH)'
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "develop"'
+  artifacts:
+      when: always
+      reports:
+        junit: ./src/tests/${TEST_NAME}/report_*.xml
diff --git a/src/tests/ofc25-camara-e2e-controller/Dockerfile b/src/tests/ofc25-camara-e2e-controller/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..79b709c13dc352bb853bbe626183e72d37a074f0
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/Dockerfile
@@ -0,0 +1,84 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 python:3.9-slim
+
+# Install dependencies
+RUN apt-get --yes --quiet --quiet update && \
+    apt-get --yes --quiet --quiet install wget g++ git && \
+    rm -rf /var/lib/apt/lists/*
+
+# Set Python to show logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# Get generic Python packages
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install --upgrade setuptools wheel
+RUN python3 -m pip install --upgrade pip-tools
+
+# Get common Python packages
+# Note: this step enables sharing the previous Docker build steps among all the Python components
+WORKDIR /var/teraflow
+COPY common_requirements.in common_requirements.in
+RUN pip-compile --quiet --output-file=common_requirements.txt common_requirements.in
+RUN python3 -m pip install -r common_requirements.txt
+
+# Add common files into working directory
+WORKDIR /var/teraflow/common
+COPY src/common/. ./
+RUN rm -rf proto
+
+# Create proto sub-folder, copy .proto files, and generate Python code
+RUN mkdir -p /var/teraflow/common/proto
+WORKDIR /var/teraflow/common/proto
+RUN touch __init__.py
+COPY proto/*.proto ./
+RUN python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. *.proto
+RUN rm *.proto
+RUN find . -type f -exec sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' {} \;
+
+# Create component sub-folders, get specific Python packages
+RUN mkdir -p /var/teraflow/tests/ofc25-camara-e2e-controller
+WORKDIR /var/teraflow/tests/ofc25-camara-e2e-controller
+COPY src/tests/ofc25-camara-e2e-controller/requirements.in requirements.in
+RUN pip-compile --quiet --output-file=requirements.txt requirements.in
+RUN python3 -m pip install -r requirements.txt
+
+# Add component files into working directory
+WORKDIR /var/teraflow
+COPY src/__init__.py ./__init__.py
+COPY src/common/*.py ./common/
+COPY src/common/tests/. ./common/tests/
+COPY src/common/tools/. ./common/tools/
+COPY src/context/__init__.py context/__init__.py
+COPY src/context/client/. context/client/
+COPY src/device/__init__.py device/__init__.py
+COPY src/device/client/. device/client/
+COPY src/monitoring/__init__.py monitoring/__init__.py
+COPY src/monitoring/client/. monitoring/client/
+COPY src/service/__init__.py service/__init__.py
+COPY src/service/client/. service/client/
+COPY src/slice/__init__.py slice/__init__.py
+COPY src/slice/client/. slice/client/
+COPY src/tests/*.py ./tests/
+COPY src/tests/ofc25-camara-e2e-controller/__init__.py ./tests/ofc25-camara-e2e-controller/__init__.py
+COPY src/tests/ofc25-camara-e2e-controller/data/. ./tests/ofc25-camara-e2e-controller/data/
+COPY src/tests/ofc25-camara-e2e-controller/tests/. ./tests/ofc25-camara-e2e-controller/tests/
+COPY src/tests/ofc25-camara-e2e-controller/scripts/. ./
+
+RUN apt-get --yes --quiet --quiet update && \
+    apt-get --yes --quiet --quiet install tree && \
+    rm -rf /var/lib/apt/lists/*
+
+RUN tree -la /var/teraflow
diff --git a/src/tests/ofc25-camara-e2e-controller/__init__.py b/src/tests/ofc25-camara-e2e-controller/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/ofc25-camara-e2e-controller/data/camara-e2e-topology.json b/src/tests/ofc25-camara-e2e-controller/data/camara-e2e-topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..b2a8617e2c3e211a3e0ef1facb05b40788aa82cf
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/camara-e2e-topology.json
@@ -0,0 +1,1725 @@
+{
+  "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": "ip-transport-controller"
+        }
+      },
+      "name": "ip-transport-controller",
+      "device_type": "ietf-slice",
+      "device_operational_status": 1,
+      "device_drivers": [
+        14
+      ],
+      "device_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/address",
+              "resource_value": "AGG_NET_IP"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/port",
+              "resource_value": "AGG_NET_PORT"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/settings",
+              "resource_value": {
+                "endpoints": [
+                  {
+                    "uuid": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  }
+                ],
+                "scheme": "http",
+                "username": "admin",
+                "password": "admin",
+                "base_url": "/restconf/v2/data",
+                "timeout": 120,
+                "verify": false
+              }
+            }
+          }
+        ]
+      },
+      "device_endpoints": []
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "agg-net-controller"
+        }
+      },
+      "name": "agg-net-controller",
+      "device_type": "ietf-slice",
+      "device_operational_status": 1,
+      "device_drivers": [
+        14
+      ],
+      "device_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/address",
+              "resource_value": "AGG_NET_IP"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/port",
+              "resource_value": "AGG_NET_PORT"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/settings",
+              "resource_value": {
+                "endpoints": [
+                  {
+                    "uuid": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  }
+                ],
+                "scheme": "http",
+                "username": "admin",
+                "password": "admin",
+                "base_url": "/restconf/v2/data",
+                "timeout": 120,
+                "verify": false
+              }
+            }
+          }
+        ]
+      },
+      "device_endpoints": []
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "name": "nce-controller",
+      "device_type": "nce",
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "device_config": {
+        "config_rules": [
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/address",
+              "resource_value": "NCE_IP"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/port",
+              "resource_value": "NCE_PORT"
+            }
+          },
+          {
+            "action": 1,
+            "custom": {
+              "resource_key": "_connect/settings",
+              "resource_value": {
+                "endpoints": [
+                  {
+                    "uuid": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  }
+                ],
+                "scheme": "http",
+                "username": "admin",
+                "password": "admin",
+                "base_url": "/restconf/v2/data",
+                "timeout": 120,
+                "verify": false
+              }
+            }
+          }
+        ]
+      },
+      "device_endpoints": []
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.182.25"
+        }
+      },
+      "name": "172.16.182.25",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "128.32.33.254",
+                    "address_prefix": "24",
+                    "site_location": "access",
+                    "mtu": "1500"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.185.31"
+        }
+      },
+      "name": "172.16.185.31",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.185.33"
+        }
+      },
+      "name": "172.16.185.33",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.185.32"
+        }
+      },
+      "name": "172.16.185.32",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "ip-transport-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        0,
+        14
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "ce-ip": "172.10.33.2",
+                    "address_ip": "172.10.33.254",
+                    "address_prefix": "24",
+                    "site_location": "cloud",
+                    "mtu": "1500"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical"
+                  },
+                  {
+                    "uuid": "501",
+                    "name": "501",
+                    "type": "optical"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.58.10"
+        }
+      },
+      "name": "172.16.58.10",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "201",
+                    "name": "201",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical",
+                    "address_ip": "128.32.33.2",
+                    "address_prefix": "24"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.61.10"
+        }
+      },
+      "name": "172.16.61.10",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical",
+                    "address_ip": "128.32.33.2",
+                    "address_prefix": "24"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.61.11"
+        }
+      },
+      "name": "172.16.61.11",
+      "device_type": "emu-packet-router",
+      "controller_id": {
+        "device_uuid": {
+          "uuid": "nce-controller"
+        }
+      },
+      "device_operational_status": 1,
+      "device_drivers": [
+        15
+      ],
+      "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": "mgmt",
+                    "name": "mgmt",
+                    "type": "mgmt"
+                  },
+                  {
+                    "uuid": "200",
+                    "name": "200",
+                    "type": "optical",
+                    "address_ip": "0.0.0.0",
+                    "address_prefix": "24"
+                  },
+                  {
+                    "uuid": "500",
+                    "name": "500",
+                    "type": "optical",
+                    "address_ip": "128.32.33.2",
+                    "address_prefix": "24"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.104.221"
+        }
+      },
+      "device_type": "emu-datacenter",
+      "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": [],
+                    "type": "copper",
+                    "uuid": "eth0"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.104.222"
+        }
+      },
+      "device_type": "emu-datacenter",
+      "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": [],
+                    "type": "copper",
+                    "uuid": "eth0"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    },
+    {
+      "device_id": {
+        "device_uuid": {
+          "uuid": "172.16.204.220"
+        }
+      },
+      "device_type": "emu-datacenter",
+      "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": [],
+                    "type": "optical",
+                    "uuid": "500"
+                  },
+                  {
+                    "sample_types": [],
+                    "type": "optical",
+                    "uuid": "200"
+                  },
+                  {
+                    "sample_types": [],
+                    "type": "optical",
+                    "uuid": "201"
+                  }
+                ]
+              }
+            }
+          }
+        ]
+      }
+    }
+  ],
+  "links": [
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "agg-net-controller/mgmt==ip-transport-controller/mgmt"
+        }
+      },
+      "name": "agg-net-controller/mgmt==ip-transport-controller/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "agg-net-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "nce-controller/mgmt==172.16.61.11/mgmt"
+        }
+      },
+      "name": "nce-controller/mgmt==172.16.61.11/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "nce-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "nce-controller/mgmt==172.16.61.10/mgmt"
+        }
+      },
+      "name": "nce-controller/mgmt==172.16.61.10/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "nce-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "nce-controller/mgmt==172.16.58.10/mgmt"
+        }
+      },
+      "name": "nce-controller/mgmt==172.16.58.10/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "nce-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.185.33/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.185.33/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.185.31/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.185.31/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.185.32/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.185.32/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "ip-transport-controller/mgmt==172.16.182.25/mgmt"
+        }
+      },
+      "name": "ip-transport-controller/mgmt==172.16.182.25/mgmt",
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "ip-transport-controller"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "mgmt"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.182.25-500"
+        }
+      },
+      "name": "172.16.182.25-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.33-500"
+        }
+      },
+      "name": "172.16.185.33-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.182.25-501"
+        }
+      },
+      "name": "172.16.182.25-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.31-501"
+        }
+      },
+      "name": "172.16.185.31-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.31-500"
+        }
+      },
+      "name": "172.16.185.31-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.32-500"
+        }
+      },
+      "name": "172.16.185.32-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.31"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.33-501"
+        }
+      },
+      "name": "172.16.185.33-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.32-501"
+        }
+      },
+      "name": "172.16.185.32-501",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.33"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "501"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.185.32-200"
+        }
+      },
+      "name": "172.16.185.32-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.204.220"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.204.220-500"
+        }
+      },
+      "name": "172.16.204.220-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.204.220"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.185.32"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.182.25-200"
+        }
+      },
+      "name": "172.16.182.25-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.58.10-500"
+        }
+      },
+      "name": "172.16.58.10-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.182.25"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.58.10-200"
+        }
+      },
+      "name": "172.16.58.10-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.10-500"
+        }
+      },
+      "name": "172.16.61.10-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.58.10-201"
+        }
+      },
+      "name": "172.16.58.10-201",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "201"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.11-500"
+        }
+      },
+      "name": "172.16.61.11-500",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "500"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.58.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "201"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.10-200"
+        }
+      },
+      "name": "172.16.61.10-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.221"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.104.221-eth0"
+        }
+      },
+      "name": "172.16.104.221-eth0",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.221"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.10"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.61.11-200"
+        }
+      },
+      "name": "172.16.61.11-200",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.222"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        }
+      ]
+    },
+    {
+      "link_id": {
+        "link_uuid": {
+          "uuid": "172.16.104.222-eth0"
+        }
+      },
+      "name": "172.16.104.222-eth0",
+      "attributes": {
+        "total_capacity_gbps": 10,
+        "used_capacity_gbps": 0
+      },
+      "link_endpoint_ids": [
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.104.222"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "eth0"
+          }
+        },
+        {
+          "device_id": {
+            "device_uuid": {
+              "uuid": "172.16.61.11"
+            }
+          },
+          "endpoint_uuid": {
+            "uuid": "200"
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_connection_group_to_network_slice1.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_connection_group_to_network_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..d39a837bd8c3719463e8ecfd3fbfc2d25111afef
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_connection_group_to_network_slice1.json
@@ -0,0 +1,62 @@
+{
+    "connection-group": [
+        {
+            "id": "line2",
+            "connectivity-type": "point-to-point",
+            "connectivity-construct": [
+                {
+                    "id": 1,
+                    "p2p-sender-sdp": "1",
+                    "p2p-receiver-sdp": "3",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "10"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "5000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "id": 2,
+                    "p2p-sender-sdp": "3",
+                    "p2p-receiver-sdp": "1",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "20"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "1000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_connection_group_to_network_slice2.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_connection_group_to_network_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..d39a837bd8c3719463e8ecfd3fbfc2d25111afef
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_connection_group_to_network_slice2.json
@@ -0,0 +1,62 @@
+{
+    "connection-group": [
+        {
+            "id": "line2",
+            "connectivity-type": "point-to-point",
+            "connectivity-construct": [
+                {
+                    "id": 1,
+                    "p2p-sender-sdp": "1",
+                    "p2p-receiver-sdp": "3",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "10"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "5000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "id": 2,
+                    "p2p-sender-sdp": "3",
+                    "p2p-receiver-sdp": "1",
+                    "service-slo-sle-policy": {
+                        "slo-policy": {
+                            "metric-bound": [
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                    "metric-unit": "milliseconds",
+                                    "bound": "20"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                    "metric-unit": "Mbps",
+                                    "bound": "1000"
+                                },
+                                {
+                                    "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                    "metric-unit": "percentage",
+                                    "percentile-value": "0.001"
+                                }
+                            ]
+                        }
+                    }
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_match_criteria_to_sdp1_in_slice1.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_match_criteria_to_sdp1_in_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..16a36d45b86230b27eafa45a612b95c248a7b3ac
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_match_criteria_to_sdp1_in_slice1.json
@@ -0,0 +1,40 @@
+{
+    "match-criterion": [
+        {
+            "index": 2,
+            "match-type": [
+                {
+                    "type": "ietf-network-slice-service:vlan",
+                    "value": [
+                        "101"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-ip-prefix",
+                    "value": [
+                        "172.1.101.22/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-tcp-port",
+                    "value": [
+                        "10200"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-ip-prefix",
+                    "value": [
+                        "172.16.104.222/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-tcp-port",
+                    "value": [
+                        "10500"
+                    ]
+                }
+            ],
+            "target-connection-group-id": "line2"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_match_criteria_to_sdp1_in_slice2.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_match_criteria_to_sdp1_in_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..8ceefdc2f2471af225143e5a1def2d7ba71e2ab1
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_match_criteria_to_sdp1_in_slice2.json
@@ -0,0 +1,40 @@
+{
+    "match-criterion": [
+        {
+            "index": 2,
+            "match-type": [
+                {
+                    "type": "ietf-network-slice-service:vlan",
+                    "value": [
+                        "201"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-ip-prefix",
+                    "value": [
+                        "172.1.201.22/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:source-tcp-port",
+                    "value": [
+                        "10200"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-ip-prefix",
+                    "value": [
+                        "172.16.104.222/24"
+                    ]
+                },
+                {
+                    "type": "ietf-network-slice-service:destination-tcp-port",
+                    "value": [
+                        "10500"
+                    ]
+                }
+            ],
+            "target-connection-group-id": "line2"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_network_slice1.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_network_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..e6e0ee90a25ff12f73c8f8896f9c2c74ab6b4019
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_network_slice1.json
@@ -0,0 +1,188 @@
+{
+    "slice-service": [
+        {
+            "id": "slice1",
+            "description": "network slice 1, connect to VM1",
+            "sdps": {
+                "sdp": [
+                    {
+                        "id": "1",
+                        "node-id": "172.16.204.220",
+                        "sdp-ip-address": [
+                            "172.16.204.220"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "101"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.1.101.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC POP to VM1",
+                                    "description": "AC VM1 connected to POP",
+                                    "ac-node-id": "172.16.204.220",
+                                    "ac-tp-id": "200"
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "id": "2",
+                        "node-id": "172.16.61.10",
+                        "sdp-ip-address": [
+                            "172.16.61.10"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "21"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.1.101.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC ONT",
+                                    "description": "AC connected to PC1",
+                                    "ac-node-id": "172.16.61.10",
+                                    "ac-tp-id": "200"
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "connection-groups": {
+                "connection-group": [
+                    {
+                        "id": "line1",
+                        "connectivity-type": "point-to-point",
+                        "connectivity-construct": [
+                            {
+                                "id": 1,
+                                "p2p-sender-sdp": "1",
+                                "p2p-receiver-sdp": "2",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "10"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "5000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            },
+                            {
+                                "id": 2,
+                                "p2p-sender-sdp": "2",
+                                "p2p-receiver-sdp": "1",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "20"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "1000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_network_slice2.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_network_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..97e6ade27449be0a3816085aa31b707ffbb6f813
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_network_slice2.json
@@ -0,0 +1,189 @@
+{
+    "slice-service": [
+        {
+            "id": "slice2",
+            "description": "network slice 2, connect to VM2",
+            "sdps": {
+                "sdp": [
+                    {
+                        "id": "1",
+                        "node-id": "172.16.204.220",
+                        "sdp-ip-address": [
+                            "172.16.204.220"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "201"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.1.201.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC POP to VM2",
+                                    "description": "AC VM2 connected to POP",
+                                    "ac-node-id": "172.16.204.220",
+                                    "ac-tp-id": "201"
+                                }
+                            ]
+                        }
+                    },
+                    {
+                        "id": "2",
+                        "node-id": "172.16.61.10",
+                        "sdp-ip-address": [
+                            "172.16.61.10"
+                        ],
+                        "service-match-criteria": {
+                            "match-criterion": [
+                                {
+                                    "index": 1,
+                                    "match-type": [
+                                        {
+                                            "type": "ietf-network-slice-service:vlan",
+                                            "value": [
+                                                "31"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-ip-prefix",
+                                            "value": [
+                                                "172.16.104.221/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:source-tcp-port",
+                                            "value": [
+                                                "10500"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-ip-prefix",
+                                            "value": [
+                                                "172.1.201.22/24"
+                                            ]
+                                        },
+                                        {
+                                            "type": "ietf-network-slice-service:destination-tcp-port",
+                                            "value": [
+                                                "10200"
+                                            ]
+                                        }
+                                    ],
+                                    "target-connection-group-id": "line1"
+                                }
+                            ]
+                        },
+                        "attachment-circuits": {
+                            "attachment-circuit": [
+                                {
+                                    "id": "AC ONT",
+                                    "description": "AC connected to PC",
+                                    "ac-node-id": "172.16.61.10",
+                                    "ac-tp-id": "200",
+                                    "ac-ipv4-address": "172.16.61.10"
+                                }
+                            ]
+                        }
+                    }
+                ]
+            },
+            "connection-groups": {
+                "connection-group": [
+                    {
+                        "id": "line1",
+                        "connectivity-type": "point-to-point",
+                        "connectivity-construct": [
+                            {
+                                "id": 1,
+                                "p2p-sender-sdp": "1",
+                                "p2p-receiver-sdp": "2",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "10"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "5000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            },
+                            {
+                                "id": 2,
+                                "p2p-sender-sdp": "2",
+                                "p2p-receiver-sdp": "1",
+                                "service-slo-sle-policy": {
+                                    "slo-policy": {
+                                        "metric-bound": [
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                                                "metric-unit": "milliseconds",
+                                                "bound": "20"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                                                "metric-unit": "Mbps",
+                                                "bound": "1000"
+                                            },
+                                            {
+                                                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                                                "metric-unit": "percentage",
+                                                "percentile-value": "0.001"
+                                            }
+                                        ]
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
+        }
+    ]
+}
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_sdp_to_network_slice1.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_sdp_to_network_slice1.json
new file mode 100644
index 0000000000000000000000000000000000000000..bd3895fc4ae5a9a0b2059be3f6b31a05451abd22
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_sdp_to_network_slice1.json
@@ -0,0 +1,61 @@
+{
+    "sdp": [
+        {
+            "id": "3",
+            "node-id": "172.16.61.11",
+            "sdp-ip-address": [
+                "172.16.61.11"
+            ],
+            "service-match-criteria": {
+                "match-criterion": [
+                    {
+                        "index": 1,
+                        "match-type": [
+                            {
+                                "type": "ietf-network-slice-service:vlan",
+                                "value": [
+                                    "21"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-ip-prefix",
+                                "value": [
+                                    "172.16.104.222/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-tcp-port",
+                                "value": [
+                                    "10500"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-ip-prefix",
+                                "value": [
+                                    "172.1.101.22/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-tcp-port",
+                                "value": [
+                                    "10200"
+                                ]
+                            }
+                        ],
+                        "target-connection-group-id": "line2"
+                    }
+                ]
+            },
+            "attachment-circuits": {
+                "attachment-circuit": [
+                    {
+                        "id": "AC ONT",
+                        "description": "AC connected to PC2",
+                        "ac-node-id": "172.16.61.11",
+                        "ac-tp-id": "200"
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/slice/post_sdp_to_network_slice2.json b/src/tests/ofc25-camara-e2e-controller/data/slice/post_sdp_to_network_slice2.json
new file mode 100644
index 0000000000000000000000000000000000000000..0b147125bd7eb3efc84c87bebab919639782f760
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/slice/post_sdp_to_network_slice2.json
@@ -0,0 +1,62 @@
+{
+    "sdp": [
+        {
+            "id": "3",
+            "node-id": "172.16.61.11",
+            "sdp-ip-address": [
+                "172.16.61.11"
+            ],
+            "service-match-criteria": {
+                "match-criterion": [
+                    {
+                        "index": 1,
+                        "match-type": [
+                            {
+                                "type": "ietf-network-slice-service:vlan",
+                                "value": [
+                                    "31"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-ip-prefix",
+                                "value": [
+                                    "172.16.104.222/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:source-tcp-port",
+                                "value": [
+                                    "10500"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-ip-prefix",
+                                "value": [
+                                    "172.1.201.22/24"
+                                ]
+                            },
+                            {
+                                "type": "ietf-network-slice-service:destination-tcp-port",
+                                "value": [
+                                    "10200"
+                                ]
+                            }
+                        ],
+                        "target-connection-group-id": "line2"
+                    }
+                ]
+            },
+            "attachment-circuits": {
+                "attachment-circuit": [
+                    {
+                        "id": "AC ONT",
+                        "description": "AC connected to PC2",
+                        "ac-node-id": "172.16.61.11",
+                        "ac-tp-id": "200",
+                        "ac-ipv4-address": "172.16.61.11"
+                    }
+                ]
+            }
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/ofc25-camara-e2e-controller/data/target-full-ietf-slice.json b/src/tests/ofc25-camara-e2e-controller/data/target-full-ietf-slice.json
new file mode 100644
index 0000000000000000000000000000000000000000..c99876ad9e00e2f94ce44d17b2376f61282e60d7
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/target-full-ietf-slice.json
@@ -0,0 +1,678 @@
+{
+  "network-slice-services": {
+    "slice-service": [
+      {
+        "connection-groups": {
+          "connection-group": [
+            {
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "p2p-receiver-sdp": "2",
+                  "p2p-sender-sdp": "1",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "10",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "5000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                },
+                {
+                  "id": 2,
+                  "p2p-receiver-sdp": "1",
+                  "p2p-sender-sdp": "2",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "20",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "1000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "connectivity-type": "point-to-point",
+              "id": "line1"
+            },
+            {
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "p2p-receiver-sdp": "3",
+                  "p2p-sender-sdp": "1",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "10",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "5000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                },
+                {
+                  "id": 2,
+                  "p2p-receiver-sdp": "1",
+                  "p2p-sender-sdp": "3",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "20",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "1000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "connectivity-type": "point-to-point",
+              "id": "line2"
+            }
+          ]
+        },
+        "description": "network slice 2, connect to VM2",
+        "id": "slice2",
+        "sdps": {
+          "sdp": [
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.204.220",
+                    "ac-tp-id": "201",
+                    "description": "AC VM2 connected to POP",
+                    "id": "AC POP to VM2"
+                  }
+                ]
+              },
+              "id": "1",
+              "node-id": "172.16.204.220",
+              "sdp-ip-address": [
+                "172.16.204.220"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "201"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.1.201.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  },
+                  {
+                    "index": 2,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "201"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.1.201.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.16.104.222/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line2"
+                  }
+                ]
+              }
+            },
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-ipv4-address": "172.16.61.10",
+                    "ac-node-id": "172.16.61.10",
+                    "ac-tp-id": "200",
+                    "description": "AC connected to PC",
+                    "id": "AC ONT"
+                  }
+                ]
+              },
+              "id": "2",
+              "node-id": "172.16.61.10",
+              "sdp-ip-address": [
+                "172.16.61.10"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "31"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.1.201.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  }
+                ]
+              }
+            },
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-ipv4-address": "172.16.61.11",
+                    "ac-node-id": "172.16.61.11",
+                    "ac-tp-id": "200",
+                    "description": "AC connected to PC2",
+                    "id": "AC ONT"
+                  }
+                ]
+              },
+              "id": "3",
+              "node-id": "172.16.61.11",
+              "sdp-ip-address": [
+                "172.16.61.11"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "31"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.16.104.222/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.1.201.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line2"
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      },
+      {
+        "connection-groups": {
+          "connection-group": [
+            {
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "p2p-receiver-sdp": "2",
+                  "p2p-sender-sdp": "1",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "10",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "5000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                },
+                {
+                  "id": 2,
+                  "p2p-receiver-sdp": "1",
+                  "p2p-sender-sdp": "2",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "20",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "1000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "connectivity-type": "point-to-point",
+              "id": "line1"
+            },
+            {
+              "connectivity-construct": [
+                {
+                  "id": 1,
+                  "p2p-receiver-sdp": "3",
+                  "p2p-sender-sdp": "1",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "10",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "5000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                },
+                {
+                  "id": 2,
+                  "p2p-receiver-sdp": "1",
+                  "p2p-sender-sdp": "3",
+                  "service-slo-sle-policy": {
+                    "slo-policy": {
+                      "metric-bound": [
+                        {
+                          "bound": "20",
+                          "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                          "metric-unit": "milliseconds"
+                        },
+                        {
+                          "bound": "1000",
+                          "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                          "metric-unit": "Mbps"
+                        },
+                        {
+                          "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                          "metric-unit": "percentage",
+                          "percentile-value": "0.001"
+                        }
+                      ]
+                    }
+                  }
+                }
+              ],
+              "connectivity-type": "point-to-point",
+              "id": "line2"
+            }
+          ]
+        },
+        "description": "network slice 1, connect to VM1",
+        "id": "slice1",
+        "sdps": {
+          "sdp": [
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.204.220",
+                    "ac-tp-id": "200",
+                    "description": "AC VM1 connected to POP",
+                    "id": "AC POP to VM1"
+                  }
+                ]
+              },
+              "id": "1",
+              "node-id": "172.16.204.220",
+              "sdp-ip-address": [
+                "172.16.204.220"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "101"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.1.101.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  },
+                  {
+                    "index": 2,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "101"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.1.101.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.16.104.222/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line2"
+                  }
+                ]
+              }
+            },
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.61.10",
+                    "ac-tp-id": "200",
+                    "description": "AC connected to PC1",
+                    "id": "AC ONT"
+                  }
+                ]
+              },
+              "id": "2",
+              "node-id": "172.16.61.10",
+              "sdp-ip-address": [
+                "172.16.61.10"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "21"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.16.104.221/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.1.101.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line1"
+                  }
+                ]
+              }
+            },
+            {
+              "attachment-circuits": {
+                "attachment-circuit": [
+                  {
+                    "ac-node-id": "172.16.61.11",
+                    "ac-tp-id": "200",
+                    "description": "AC connected to PC2",
+                    "id": "AC ONT"
+                  }
+                ]
+              },
+              "id": "3",
+              "node-id": "172.16.61.11",
+              "sdp-ip-address": [
+                "172.16.61.11"
+              ],
+              "service-match-criteria": {
+                "match-criterion": [
+                  {
+                    "index": 1,
+                    "match-type": [
+                      {
+                        "type": "ietf-network-slice-service:vlan",
+                        "value": [
+                          "21"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-ip-prefix",
+                        "value": [
+                          "172.16.104.222/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:source-tcp-port",
+                        "value": [
+                          "10500"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-ip-prefix",
+                        "value": [
+                          "172.1.101.22/24"
+                        ]
+                      },
+                      {
+                        "type": "ietf-network-slice-service:destination-tcp-port",
+                        "value": [
+                          "10200"
+                        ]
+                      }
+                    ],
+                    "target-connection-group-id": "line2"
+                  }
+                ]
+              }
+            }
+          ]
+        }
+      }
+    ]
+  }
+}
diff --git a/src/tests/ofc25-camara-e2e-controller/data/target-ietf-slice-posted-slices.json b/src/tests/ofc25-camara-e2e-controller/data/target-ietf-slice-posted-slices.json
new file mode 100644
index 0000000000000000000000000000000000000000..004d3cafff0decf4cbe550f555e99b2229702b07
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/target-ietf-slice-posted-slices.json
@@ -0,0 +1,382 @@
+[
+  {
+    "network-slice-services": {
+      "slice-service": [
+        {
+          "connection-groups": {
+            "connection-group": [
+              {
+                "connectivity-construct": [
+                  {
+                    "id": 1,
+                    "p2p-receiver-sdp": "2",
+                    "p2p-sender-sdp": "1",
+                    "service-slo-sle-policy": {
+                      "slo-policy": {
+                        "metric-bound": [
+                          {
+                            "bound": 10,
+                            "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                            "metric-unit": "milliseconds"
+                          },
+                          {
+                            "bound": 5000,
+                            "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                            "metric-unit": "Mbps"
+                          },
+                          {
+                            "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                            "metric-unit": "percentage",
+                            "percentile-value": 0.001
+                          }
+                        ]
+                      }
+                    }
+                  },
+                  {
+                    "id": 2,
+                    "p2p-receiver-sdp": "1",
+                    "p2p-sender-sdp": "2",
+                    "service-slo-sle-policy": {
+                      "slo-policy": {
+                        "metric-bound": [
+                          {
+                            "bound": 20,
+                            "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                            "metric-unit": "milliseconds"
+                          },
+                          {
+                            "bound": 1000,
+                            "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                            "metric-unit": "Mbps"
+                          },
+                          {
+                            "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                            "metric-unit": "percentage",
+                            "percentile-value": 0.001
+                          }
+                        ]
+                      }
+                    }
+                  }
+                ],
+                "connectivity-type": "point-to-point",
+                "id": "line1"
+              }
+            ]
+          },
+          "description": "dsc",
+          "id": "slice1",
+          "sdps": {
+            "sdp": [
+              {
+                "attachment-circuits": {
+                  "attachment-circuit": [
+                    {
+                      "ac-node-id": "172.16.185.32",
+                      "ac-tp-id": "200",
+                      "description": "dsc",
+                      "id": "0"
+                    }
+                  ]
+                },
+                "id": "1",
+                "node-id": "172.16.185.32",
+                "sdp-ip-address": [
+                  "172.16.185.32"
+                ],
+                "service-match-criteria": {
+                  "match-criterion": [
+                    {
+                      "index": 1,
+                      "match-type": [
+                        {
+                          "type": "ietf-network-slice-service:vlan",
+                          "value": [
+                            "101"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-ip-prefix",
+                          "value": [
+                            "172.1.101.22/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-tcp-port",
+                          "value": [
+                            "10200"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-ip-prefix",
+                          "value": [
+                            "172.16.104.221/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-tcp-port",
+                          "value": [
+                            "10500"
+                          ]
+                        }
+                      ],
+                      "target-connection-group-id": "line1"
+                    }
+                  ]
+                }
+              },
+              {
+                "attachment-circuits": {
+                  "attachment-circuit": [
+                    {
+                      "ac-node-id": "172.16.182.25",
+                      "ac-tp-id": "200",
+                      "description": "dsc",
+                      "id": "0"
+                    }
+                  ]
+                },
+                "id": "2",
+                "node-id": "172.16.182.25",
+                "sdp-ip-address": [
+                  "172.16.182.25"
+                ],
+                "service-match-criteria": {
+                  "match-criterion": [
+                    {
+                      "index": 1,
+                      "match-type": [
+                        {
+                          "type": "ietf-network-slice-service:vlan",
+                          "value": [
+                            "21"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-ip-prefix",
+                          "value": [
+                            "172.16.104.221/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-tcp-port",
+                          "value": [
+                            "10500"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-ip-prefix",
+                          "value": [
+                            "172.1.101.22/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-tcp-port",
+                          "value": [
+                            "10200"
+                          ]
+                        }
+                      ],
+                      "target-connection-group-id": "line1"
+                    }
+                  ]
+                }
+              }
+            ]
+          }
+        }
+      ]
+    }
+  },
+  {
+    "network-slice-services": {
+      "slice-service": [
+        {
+          "connection-groups": {
+            "connection-group": [
+              {
+                "connectivity-construct": [
+                  {
+                    "id": 1,
+                    "p2p-receiver-sdp": "2",
+                    "p2p-sender-sdp": "1",
+                    "service-slo-sle-policy": {
+                      "slo-policy": {
+                        "metric-bound": [
+                          {
+                            "bound": 10,
+                            "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                            "metric-unit": "milliseconds"
+                          },
+                          {
+                            "bound": 5000,
+                            "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                            "metric-unit": "Mbps"
+                          },
+                          {
+                            "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                            "metric-unit": "percentage",
+                            "percentile-value": 0.001
+                          }
+                        ]
+                      }
+                    }
+                  },
+                  {
+                    "id": 2,
+                    "p2p-receiver-sdp": "1",
+                    "p2p-sender-sdp": "2",
+                    "service-slo-sle-policy": {
+                      "slo-policy": {
+                        "metric-bound": [
+                          {
+                            "bound": 20,
+                            "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                            "metric-unit": "milliseconds"
+                          },
+                          {
+                            "bound": 1000,
+                            "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                            "metric-unit": "Mbps"
+                          },
+                          {
+                            "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                            "metric-unit": "percentage",
+                            "percentile-value": 0.001
+                          }
+                        ]
+                      }
+                    }
+                  }
+                ],
+                "connectivity-type": "point-to-point",
+                "id": "line1"
+              }
+            ]
+          },
+          "description": "dsc",
+          "id": "slice2",
+          "sdps": {
+            "sdp": [
+              {
+                "attachment-circuits": {
+                  "attachment-circuit": [
+                    {
+                      "ac-node-id": "172.16.185.32",
+                      "ac-tp-id": "200",
+                      "description": "dsc",
+                      "id": "0"
+                    }
+                  ]
+                },
+                "id": "1",
+                "node-id": "172.16.185.32",
+                "sdp-ip-address": [
+                  "172.16.185.32"
+                ],
+                "service-match-criteria": {
+                  "match-criterion": [
+                    {
+                      "index": 1,
+                      "match-type": [
+                        {
+                          "type": "ietf-network-slice-service:vlan",
+                          "value": [
+                            "201"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-ip-prefix",
+                          "value": [
+                            "172.1.201.22/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-tcp-port",
+                          "value": [
+                            "10200"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-ip-prefix",
+                          "value": [
+                            "172.16.104.221/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-tcp-port",
+                          "value": [
+                            "10500"
+                          ]
+                        }
+                      ],
+                      "target-connection-group-id": "line1"
+                    }
+                  ]
+                }
+              },
+              {
+                "attachment-circuits": {
+                  "attachment-circuit": [
+                    {
+                      "ac-node-id": "172.16.182.25",
+                      "ac-tp-id": "200",
+                      "description": "dsc",
+                      "id": "0"
+                    }
+                  ]
+                },
+                "id": "2",
+                "node-id": "172.16.182.25",
+                "sdp-ip-address": [
+                  "172.16.182.25"
+                ],
+                "service-match-criteria": {
+                  "match-criterion": [
+                    {
+                      "index": 1,
+                      "match-type": [
+                        {
+                          "type": "ietf-network-slice-service:vlan",
+                          "value": [
+                            "31"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-ip-prefix",
+                          "value": [
+                            "172.16.104.221/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:source-tcp-port",
+                          "value": [
+                            "10500"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-ip-prefix",
+                          "value": [
+                            "172.1.201.22/24"
+                          ]
+                        },
+                        {
+                          "type": "ietf-network-slice-service:destination-tcp-port",
+                          "value": [
+                            "10200"
+                          ]
+                        }
+                      ],
+                      "target-connection-group-id": "line1"
+                    }
+                  ]
+                }
+              }
+            ]
+          }
+        }
+      ]
+    }
+  }
+]
diff --git a/src/tests/ofc25-camara-e2e-controller/data/target-ietf-slice-put-connection-groups.json b/src/tests/ofc25-camara-e2e-controller/data/target-ietf-slice-put-connection-groups.json
new file mode 100644
index 0000000000000000000000000000000000000000..7526ebd8b92a2eab7f30d94a035ba63f0a503c2d
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/target-ietf-slice-put-connection-groups.json
@@ -0,0 +1,234 @@
+[
+  {
+    "connectivity-construct": [
+      {
+        "id": 1,
+        "p2p-receiver-sdp": "2",
+        "p2p-sender-sdp": "1",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 10,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 10000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      },
+      {
+        "id": 2,
+        "p2p-receiver-sdp": "1",
+        "p2p-sender-sdp": "2",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 20,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 2000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      }
+    ],
+    "connectivity-type": "point-to-point",
+    "id": "line1"
+  },
+  {
+    "connectivity-construct": [
+      {
+        "id": 1,
+        "p2p-receiver-sdp": "2",
+        "p2p-sender-sdp": "1",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 10,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 10000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      },
+      {
+        "id": 2,
+        "p2p-receiver-sdp": "1",
+        "p2p-sender-sdp": "2",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 20,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 2000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      }
+    ],
+    "connectivity-type": "point-to-point",
+    "id": "line1"
+  },
+  {
+    "connectivity-construct": [
+      {
+        "id": 1,
+        "p2p-receiver-sdp": "2",
+        "p2p-sender-sdp": "1",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 10,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 5000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      },
+      {
+        "id": 2,
+        "p2p-receiver-sdp": "1",
+        "p2p-sender-sdp": "2",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 20,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 1000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      }
+    ],
+    "connectivity-type": "point-to-point",
+    "id": "line1"
+  },
+  {
+    "connectivity-construct": [
+      {
+        "id": 1,
+        "p2p-receiver-sdp": "2",
+        "p2p-sender-sdp": "1",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 10,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 5000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      },
+      {
+        "id": 2,
+        "p2p-receiver-sdp": "1",
+        "p2p-sender-sdp": "2",
+        "service-slo-sle-policy": {
+          "slo-policy": {
+            "metric-bound": [
+              {
+                "bound": 20,
+                "metric-type": "ietf-network-slice-service:one-way-delay-maximum",
+                "metric-unit": "milliseconds"
+              },
+              {
+                "bound": 1000,
+                "metric-type": "ietf-network-slice-service:one-way-bandwidth",
+                "metric-unit": "Mbps"
+              },
+              {
+                "metric-type": "ietf-network-slice-service:two-way-packet-loss",
+                "metric-unit": "percentage",
+                "percentile-value": 0.001
+              }
+            ]
+          }
+        }
+      }
+    ],
+    "connectivity-type": "point-to-point",
+    "id": "line1"
+  }
+]
diff --git a/src/tests/ofc25-camara-e2e-controller/data/target-nce-app-flows.json b/src/tests/ofc25-camara-e2e-controller/data/target-nce-app-flows.json
new file mode 100644
index 0000000000000000000000000000000000000000..66f7ed2543f7f5472e50ccda9755dd965bc73452
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/target-nce-app-flows.json
@@ -0,0 +1,58 @@
+{
+  "App_Flow_2_1_slice1": {
+    "app-flow": [
+      {
+        "app-name": "App_Flow_2_1_slice1",
+        "duration": 9999,
+        "max-online-users": 1,
+        "name": "App_Flow_2_1_slice1",
+        "qos-profile": "AR_VR_Gaming",
+        "service-profile": "service_2_1_slice1",
+        "stas": "00:3D:E1:18:82:9E",
+        "user-id": "a8b5b840-1548-46c9-892e-5c18f9ec8d99"
+      }
+    ]
+  },
+  "App_Flow_3_1_slice1": {
+    "app-flow": [
+      {
+        "app-name": "App_Flow_3_1_slice1",
+        "duration": 9999,
+        "max-online-users": 1,
+        "name": "App_Flow_3_1_slice1",
+        "qos-profile": "AR_VR_Gaming",
+        "service-profile": "service_3_1_slice1",
+        "stas": "00:3D:E1:18:82:9E",
+        "user-id": "28a1c47b-0179-4ab8-85da-632e6f946491"
+      }
+    ]
+  },
+  "App_Flow_2_1_slice2": {
+    "app-flow": [
+      {
+        "app-name": "App_Flow_2_1_slice2",
+        "duration": 9999,
+        "max-online-users": 1,
+        "name": "App_Flow_2_1_slice2",
+        "qos-profile": "AR_VR_Gaming",
+        "service-profile": "service_2_1_slice2",
+        "stas": "00:3D:E1:18:82:9E",
+        "user-id": "9df7b98a-d5c0-43d4-bd0e-8d81ee4485f0"
+      }
+    ]
+  },
+  "App_Flow_3_1_slice2": {
+    "app-flow": [
+      {
+        "app-name": "App_Flow_3_1_slice2",
+        "duration": 9999,
+        "max-online-users": 1,
+        "name": "App_Flow_3_1_slice2",
+        "qos-profile": "AR_VR_Gaming",
+        "service-profile": "service_3_1_slice2",
+        "stas": "00:3D:E1:18:82:9E",
+        "user-id": "79b2becb-8500-42cc-b6be-c27c2ea60b22"
+      }
+    ]
+  }
+}
diff --git a/src/tests/ofc25-camara-e2e-controller/data/target-nce-apps.json b/src/tests/ofc25-camara-e2e-controller/data/target-nce-apps.json
new file mode 100644
index 0000000000000000000000000000000000000000..11a25897910cbbfd7fb666ddd86babc1972e7052
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/data/target-nce-apps.json
@@ -0,0 +1,82 @@
+{
+  "App_Flow_2_1_slice1": {
+    "application": [
+      {
+        "app-features": {
+          "app-feature": [
+            {
+              "dest-ip": "172.1.101.22",
+              "dest-port": "10200",
+              "id": "feature_2_1_slice1",
+              "protocol": "tcp",
+              "src-ip": "172.16.104.221",
+              "src-port": "10500"
+            }
+          ]
+        },
+        "app-id": "app_2_1_slice1",
+        "name": "App_Flow_2_1_slice1"
+      }
+    ]
+  },
+  "App_Flow_3_1_slice1": {
+    "application": [
+      {
+        "app-features": {
+          "app-feature": [
+            {
+              "dest-ip": "172.1.101.22",
+              "dest-port": "10200",
+              "id": "feature_3_1_slice1",
+              "protocol": "tcp",
+              "src-ip": "172.16.104.222",
+              "src-port": "10500"
+            }
+          ]
+        },
+        "app-id": "app_3_1_slice1",
+        "name": "App_Flow_3_1_slice1"
+      }
+    ]
+  },
+  "App_Flow_2_1_slice2": {
+    "application": [
+      {
+        "app-features": {
+          "app-feature": [
+            {
+              "dest-ip": "172.1.201.22",
+              "dest-port": "10200",
+              "id": "feature_2_1_slice2",
+              "protocol": "tcp",
+              "src-ip": "172.16.104.221",
+              "src-port": "10500"
+            }
+          ]
+        },
+        "app-id": "app_2_1_slice2",
+        "name": "App_Flow_2_1_slice2"
+      }
+    ]
+  },
+  "App_Flow_3_1_slice2": {
+    "application": [
+      {
+        "app-features": {
+          "app-feature": [
+            {
+              "dest-ip": "172.1.201.22",
+              "dest-port": "10200",
+              "id": "feature_3_1_slice2",
+              "protocol": "tcp",
+              "src-ip": "172.16.104.222",
+              "src-port": "10500"
+            }
+          ]
+        },
+        "app-id": "app_3_1_slice2",
+        "name": "App_Flow_3_1_slice2"
+      }
+    ]
+  }
+}
diff --git a/src/tests/ofc25-camara-e2e-controller/deploy_specs.sh b/src/tests/ofc25-camara-e2e-controller/deploy_specs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9ae83e7b126aa2913cd3c30887292b4626dd5855
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/deploy_specs.sh
@@ -0,0 +1,208 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 nbi webui load_generator"
+export TFS_COMPONENTS="context device pathcomp service slice nbi"
+
+# Uncomment to activate Monitoring (old)
+#export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
+
+# Uncomment to activate Monitoring Framework (new)
+#export TFS_COMPONENTS="${TFS_COMPONENTS} kpi_manager kpi_value_writer kpi_value_api telemetry analytics automation"
+
+# Uncomment to activate QoS Profiles
+#export TFS_COMPONENTS="${TFS_COMPONENTS} qos_profile"
+
+# Uncomment to activate BGP-LS Speaker
+#export TFS_COMPONENTS="${TFS_COMPONENTS} bgpls_speaker"
+
+# Uncomment to activate Optical Controller
+#   To manage optical connections, "service" requires "opticalcontroller" to be deployed
+#   before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the
+#   "opticalcontroller" only if "service" is already in TFS_COMPONENTS, and re-export it.
+#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then
+#    BEFORE="${TFS_COMPONENTS% service*}"
+#    AFTER="${TFS_COMPONENTS#* service}"
+#    export TFS_COMPONENTS="${BEFORE} opticalcontroller service ${AFTER}"
+#fi
+
+# Uncomment to activate ZTP
+#export TFS_COMPONENTS="${TFS_COMPONENTS} ztp"
+
+# Uncomment to activate Policy Manager
+#export TFS_COMPONENTS="${TFS_COMPONENTS} 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"
+
+# Uncomment to activate Forecaster
+#export TFS_COMPONENTS="${TFS_COMPONENTS} forecaster"
+
+# Uncomment to activate E2E Orchestrator
+#export TFS_COMPONENTS="${TFS_COMPONENTS} e2e_orchestrator"
+
+# Uncomment to activate DLT and Interdomain
+#export TFS_COMPONENTS="${TFS_COMPONENTS} interdomain dlt"
+#if [[ "$TFS_COMPONENTS" == *"dlt"* ]]; then
+#    export KEY_DIRECTORY_PATH="src/dlt/gateway/keys/priv_sk"
+#    export CERT_DIRECTORY_PATH="src/dlt/gateway/keys/cert.pem"
+#    export TLS_CERT_PATH="src/dlt/gateway/keys/ca.crt"
+#fi
+
+# Uncomment to activate QKD App
+#   To manage QKD Apps, "service" requires "qkd_app" to be deployed
+#   before "service", thus we "hack" the TFS_COMPONENTS environment variable prepending the
+#   "qkd_app" only if "service" is already in TFS_COMPONENTS, and re-export it.
+#if [[ "$TFS_COMPONENTS" == *"service"* ]]; then
+#    BEFORE="${TFS_COMPONENTS% service*}"
+#    AFTER="${TFS_COMPONENTS#* service}"
+#    export TFS_COMPONENTS="${BEFORE} qkd_app service ${AFTER}"
+#fi
+
+
+# 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 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"
+
+# Set NATS installation mode to 'single'. This option is convenient for development and testing.
+# See ./deploy/all.sh or ./deploy/nats.sh for additional details
+export NATS_DEPLOY_MODE="single"
+
+# 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"
+
+
+# ----- Apache Kafka -----------------------------------------------------------
+
+# Set the namespace where Apache Kafka will be deployed.
+export KFK_NAMESPACE="kafka"
+
+# Set the port Apache Kafka server will be exposed to.
+export KFK_SERVER_PORT="9092"
+
+# Set the flag to YES for redeploying of Apache Kafka
+export KFK_REDEPLOY=""
diff --git a/src/tests/ofc25-camara-e2e-controller/redeploy-tfs.sh b/src/tests/ofc25-camara-e2e-controller/redeploy-tfs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d030596d707c5f49c14bc0f43a654bda3159b688
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/redeploy-tfs.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source ~/tfs-ctrl/src/tests/ofc25-camara-e2e-controller/deploy_specs.sh
+./deploy/all.sh
diff --git a/src/tests/ofc25-camara-e2e-controller/requirements.in b/src/tests/ofc25-camara-e2e-controller/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..1bdaec9997da4b83fa89c1bf0d00d4c3a73558a4
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/requirements.in
@@ -0,0 +1,30 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+deepdiff==6.7.*
+requests==2.27.*
+
+coverage==6.3
+grpcio==1.47.*
+grpcio-health-checking==1.47.*
+grpcio-reflection==1.47.*
+grpcio-tools==1.47.*
+grpclib==0.4.4
+prettytable==3.5.0
+prometheus-client==0.13.0
+protobuf==3.20.*
+pytest==6.2.5
+pytest-benchmark==3.4.1
+python-dateutil==2.8.2
+pytest-depends==1.0.1
diff --git a/src/tests/ofc25-camara-e2e-controller/scripts/run-e2e-ietf-slice-operations.sh b/src/tests/ofc25-camara-e2e-controller/scripts/run-e2e-ietf-slice-operations.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6c41a85db2d5363971531c814283edbf3ebc0d62
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/scripts/run-e2e-ietf-slice-operations.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source /var/teraflow/tfs_runtime_env_vars.sh
+export PYTHONPATH=/var/teraflow
+pytest --verbose --log-level=INFO \
+    --junitxml=/opt/results/report_e2e_ietf_slice_operations.xml \
+    /var/teraflow/tests/ofc25-camara-e2e-controller/tests/test_e2e_ietf_slice_operations.py
diff --git a/src/tests/ofc25-camara-e2e-controller/scripts/run-onboarding.sh b/src/tests/ofc25-camara-e2e-controller/scripts/run-onboarding.sh
new file mode 100755
index 0000000000000000000000000000000000000000..397d98d4b4db7952b2b879dcd1977c1a43cc30a2
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/scripts/run-onboarding.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source /var/teraflow/tfs_runtime_env_vars.sh
+export PYTHONPATH=/var/teraflow
+pytest --verbose --log-level=INFO \
+    --junitxml=/opt/results/report_onboarding.xml \
+    /var/teraflow/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py
diff --git a/src/tests/ofc25-camara-e2e-controller/tests/Fixtures.py b/src/tests/ofc25-camara-e2e-controller/tests/Fixtures.py
new file mode 100644
index 0000000000000000000000000000000000000000..15978851faae668339fa4eed6db8ab7e1be2eb5e
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/tests/Fixtures.py
@@ -0,0 +1,43 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 pytest
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from monitoring.client.MonitoringClient import MonitoringClient
+from service.client.ServiceClient import ServiceClient
+
+@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 monitoring_client():
+    _client = MonitoringClient()
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def service_client():
+    _client = ServiceClient()
+    yield _client
+    _client.close()
diff --git a/src/tests/ofc25-camara-e2e-controller/tests/Tools.py b/src/tests/ofc25-camara-e2e-controller/tests/Tools.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd2add49edd23f4c169b5fdc3c5123b2b31daa8d
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/tests/Tools.py
@@ -0,0 +1,109 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, logging, requests
+from typing import Any, Dict, List, Optional, Set, Union
+from common.Constants import ServiceNameEnum
+from common.Settings import get_service_host, get_service_port_http
+
+NBI_ADDRESS  = get_service_host(ServiceNameEnum.NBI)
+NBI_PORT     = get_service_port_http(ServiceNameEnum.NBI)
+NBI_USERNAME = 'admin'
+NBI_PASSWORD = 'admin'
+NBI_BASE_URL = ''
+
+class RestRequestMethod(enum.Enum):
+    GET    = 'get'
+    POST   = 'post'
+    PUT    = 'put'
+    PATCH  = 'patch'
+    DELETE = 'delete'
+
+EXPECTED_STATUS_CODES : Set[int] = {
+    requests.codes['OK'        ],
+    requests.codes['CREATED'   ],
+    requests.codes['ACCEPTED'  ],
+    requests.codes['NO_CONTENT'],
+}
+
+def do_rest_request(
+    method : RestRequestMethod, url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    request_url = 'http://{:s}:{:s}@{:s}:{:d}{:s}{:s}'.format(
+        NBI_USERNAME, NBI_PASSWORD, NBI_ADDRESS, NBI_PORT, str(NBI_BASE_URL), url
+    )
+
+    if logger is not None:
+        msg = 'Request: {:s} {:s}'.format(str(method.value).upper(), str(request_url))
+        if body is not None: msg += ' body={:s}'.format(str(body))
+        logger.warning(msg)
+    reply = requests.request(method.value, request_url, headers={'Content-Type': 'application/json'}, timeout=timeout, json=body, allow_redirects=allow_redirects)
+    if logger is not None:
+        logger.warning('Reply: {:s}'.format(str(reply.text)))
+    assert reply.status_code in expected_status_codes, 'Reply failed with status code {:d}'.format(reply.status_code)
+
+    if reply.content and len(reply.content) > 0: return reply.json()
+    return None
+
+def do_rest_get_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.GET, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_post_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.POST, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_put_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.PUT, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_patch_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.PATCH, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
+
+def do_rest_delete_request(
+    url : str, body : Optional[Any] = None, timeout : int = 10,
+    allow_redirects : bool = True, expected_status_codes : Set[int] = EXPECTED_STATUS_CODES,
+    logger : Optional[logging.Logger] = None
+) -> Optional[Union[Dict, List]]:
+    return do_rest_request(
+        RestRequestMethod.DELETE, url, body=body, timeout=timeout, allow_redirects=allow_redirects,
+        expected_status_codes=expected_status_codes, logger=logger
+    )
diff --git a/src/tests/ofc25-camara-e2e-controller/tests/__init__.py b/src/tests/ofc25-camara-e2e-controller/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/tests/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/ofc25-camara-e2e-controller/tests/test_e2e_ietf_slice_operations.py b/src/tests/ofc25-camara-e2e-controller/tests/test_e2e_ietf_slice_operations.py
new file mode 100644
index 0000000000000000000000000000000000000000..cb991edbf1f3cc0768d006ef58725e621ac83de9
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/tests/test_e2e_ietf_slice_operations.py
@@ -0,0 +1,478 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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, os
+import requests
+from deepdiff import DeepDiff
+
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+HEADERS = {"Content-Type": "application/json"}
+
+POST_NETWORK_SLICE1 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_network_slice1.json",
+)
+POST_NETWORK_SLICE2 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_network_slice2.json",
+)
+POST_CONNECTION_GROUP_TO_NETWORK_SLICE1 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_connection_group_to_network_slice1.json",
+)
+POST_CONNECTION_GROUP_TO_NETWORK_SLICE2 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_connection_group_to_network_slice2.json",
+)
+POST_MATCH_CRITERIA_TO_SDP1_IN_SLICE1 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_match_criteria_to_sdp1_in_slice1.json",
+)
+POST_MATCH_CRITERIA_TO_SDP1_IN_SLICE2 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_match_criteria_to_sdp1_in_slice2.json",
+)
+POST_SDP_TO_NETWORK_SLICE1 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_sdp_to_network_slice1.json",
+)
+POST_SDP_TO_NETWORK_SLICE2 = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "post_sdp_to_network_slice2.json",
+)
+TARGET_NCE_APP_FLOWS = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-nce-app-flows.json",
+)
+TARGET_NCE_APPS = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-nce-apps.json",
+)
+TARGET_FULL_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "slice",
+    "target-full-ietf-slice.json",
+)
+TARGET_FULL_IETF_SLICE = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-full-ietf-slice.json",
+)
+TARGET_IETF_SLICE_POSTED_SLICES = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-ietf-slice-posted-slices.json",
+)
+TARGET_IETF_SLICE_PUT_CONNECTION_GROUPS = os.path.join(
+    os.path.dirname(os.path.abspath(__file__)),
+    "..",
+    "data",
+    "target-ietf-slice-put-connection-groups.json",
+)
+
+NBI_ADDRESS = "localhost"
+NBI_PORT = "80"
+NBI_USERNAME = "admin"
+NBI_PASSWORD = "admin"
+
+NCE_ADDRESS = "localhost"
+NCE_PORT = 9090
+
+AGG_TFS_ADDRESS = "localhost"
+AGG_TFS_PORT = 9091
+
+BASE_IETF_SLICE_URL = f"http://{NBI_ADDRESS}:{NBI_PORT}/restconf/data/ietf-network-slice-service:network-slice-services"
+NCE_APP_DATA_URL = f"http://{NCE_ADDRESS}:{NCE_PORT}/restconf/v1/data/app-flows/apps"
+NCE_APP_FLOW_DATA_URL = f"http://{NCE_ADDRESS}:{NCE_PORT}/restconf/v1/data/app-flows"
+AGG_TFS_IETF_SLICE_URL = f"http://{AGG_TFS_ADDRESS}:{AGG_TFS_PORT}/restconf/data/ietf-network-slice-service:network-slice-services"
+
+
+# pylint: disable=redefined-outer-name, unused-argument
+def test_ietf_slice_creation_removal():
+    # Issue service creation request
+    with open(POST_NETWORK_SLICE1, "r", encoding="UTF-8") as f:
+        post_network_slice1 = json.load(f)
+    with open(POST_NETWORK_SLICE2, "r", encoding="UTF-8") as f:
+        post_network_slice2 = json.load(f)
+    with open(POST_CONNECTION_GROUP_TO_NETWORK_SLICE1, "r", encoding="UTF-8") as f:
+        post_connection_group_to_network_slice1 = json.load(f)
+    with open(POST_CONNECTION_GROUP_TO_NETWORK_SLICE2, "r", encoding="UTF-8") as f:
+        post_connection_group_to_network_slice2 = json.load(f)
+    with open(POST_MATCH_CRITERIA_TO_SDP1_IN_SLICE1, "r", encoding="UTF-8") as f:
+        post_match_criteria_to_sdp1_in_slice1 = json.load(f)
+    with open(POST_MATCH_CRITERIA_TO_SDP1_IN_SLICE2, "r", encoding="UTF-8") as f:
+        post_match_criteria_to_sdp1_in_slice2 = json.load(f)
+    with open(POST_SDP_TO_NETWORK_SLICE1, "r", encoding="UTF-8") as f:
+        post_sdp_to_network_slice1 = json.load(f)
+    with open(POST_SDP_TO_NETWORK_SLICE2, "r", encoding="UTF-8") as f:
+        post_sdp_to_network_slice2 = json.load(f)
+    with open(TARGET_NCE_APPS, "r", encoding="UTF-8") as f:
+        target_nce_apps = json.load(f)
+    with open(TARGET_NCE_APP_FLOWS, "r", encoding="UTF-8") as f:
+        target_nce_app_flows = json.load(f)
+    with open(TARGET_FULL_IETF_SLICE, "r", encoding="UTF-8") as f:
+        target_full_ietf_slice = json.load(f)
+    with open(TARGET_IETF_SLICE_POSTED_SLICES, "r", encoding="UTF-8") as f:
+        target_ietf_slice_posted_slices = json.load(f)
+    with open(TARGET_IETF_SLICE_PUT_CONNECTION_GROUPS, "r", encoding="UTF-8") as f:
+        target_ietf_slice_put_connection_groups = json.load(f)
+
+    # op 1
+    URL = BASE_IETF_SLICE_URL
+    requests.post(URL, headers=HEADERS, json=post_network_slice1)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    app_name = "App_Flow_2_1_slice1"
+    apps_diff = DeepDiff(apps_response[app_name], target_nce_apps[app_name])
+    app_flows_diff = DeepDiff(
+        app_flows_response[app_name],
+        target_nce_app_flows[app_name],
+        exclude_regex_paths=r"root\['app-flow'\]\[\d+\]\['user-id'\]",
+    )
+    assert not apps_diff
+    assert not app_flows_diff
+    assert len(apps_response) == 1 and len(app_flows_response) == 1
+
+    assert len(ietf_slice_connection_groups) == 0
+    assert len(ietf_slice_services) == 1
+    slice_diff = DeepDiff(
+        ietf_slice_services["slice1"], target_ietf_slice_posted_slices[0]
+    )
+    assert not slice_diff
+
+    # op 2
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/sdps"
+    requests.post(URL, headers=HEADERS, json=post_sdp_to_network_slice1)
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/connection-groups"
+    requests.post(URL, headers=HEADERS, json=post_connection_group_to_network_slice1)
+    URL = (
+        BASE_IETF_SLICE_URL + "/slice-service=slice1/sdps/sdp=1/service-match-criteria"
+    )
+    requests.post(URL, headers=HEADERS, json=post_match_criteria_to_sdp1_in_slice1)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    app_name = "App_Flow_3_1_slice1"
+    apps_diff = DeepDiff(apps_response[app_name], target_nce_apps[app_name])
+    app_flows_diff = DeepDiff(
+        app_flows_response[app_name],
+        target_nce_app_flows[app_name],
+        exclude_regex_paths=r"root\['app-flow'\]\[\d+\]\['user-id'\]",
+    )
+    assert not apps_diff
+    assert not app_flows_diff
+    assert len(apps_response) == 2 and len(app_flows_response) == 2
+
+    assert len(ietf_slice_connection_groups) == 1
+    assert len(ietf_slice_services) == 1
+    connection_group_diff = DeepDiff(
+        ietf_slice_connection_groups[0], target_ietf_slice_put_connection_groups[0]
+    )
+    assert not connection_group_diff
+
+    # op 3
+    URL = BASE_IETF_SLICE_URL
+    requests.post(URL, headers=HEADERS, json=post_network_slice2)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    app_name = "App_Flow_2_1_slice2"
+    apps_diff = DeepDiff(apps_response[app_name], target_nce_apps[app_name])
+    app_flows_diff = DeepDiff(
+        app_flows_response[app_name],
+        target_nce_app_flows[app_name],
+        exclude_regex_paths=r"root\['app-flow'\]\[\d+\]\['user-id'\]",
+    )
+    assert not apps_diff
+    assert not app_flows_diff
+    assert len(apps_response) == 3 and len(app_flows_response) == 3
+
+    assert len(ietf_slice_connection_groups) == 1
+    assert len(ietf_slice_services) == 2
+    slice_diff = DeepDiff(
+        ietf_slice_services["slice2"], target_ietf_slice_posted_slices[1]
+    )
+    assert not slice_diff
+
+    # op 4
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/sdps"
+    requests.post(URL, headers=HEADERS, json=post_sdp_to_network_slice2)
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/connection-groups"
+    requests.post(URL, headers=HEADERS, json=post_connection_group_to_network_slice2)
+    URL = (
+        BASE_IETF_SLICE_URL + "/slice-service=slice2/sdps/sdp=1/service-match-criteria"
+    )
+    requests.post(URL, headers=HEADERS, json=post_match_criteria_to_sdp1_in_slice2)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    app_name = "App_Flow_3_1_slice2"
+    apps_diff = DeepDiff(apps_response[app_name], target_nce_apps[app_name])
+    app_flows_diff = DeepDiff(
+        app_flows_response[app_name],
+        target_nce_app_flows[app_name],
+        exclude_regex_paths=r"root\['app-flow'\]\[\d+\]\['user-id'\]",
+    )
+    assert not apps_diff
+    assert not app_flows_diff
+    assert len(apps_response) == 4 and len(app_flows_response) == 4
+
+    assert len(ietf_slice_connection_groups) == 2
+    assert len(ietf_slice_services) == 2
+    connection_group_diff = DeepDiff(
+        ietf_slice_connection_groups[1], target_ietf_slice_put_connection_groups[1]
+    )
+    assert not connection_group_diff
+
+    # op 5
+    ietf_slices_full_retrieved = requests.get(BASE_IETF_SLICE_URL).json()
+    ietf_slice_data = DeepDiff(ietf_slices_full_retrieved, target_full_ietf_slice)
+    assert not ietf_slice_data
+
+    # op 6
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/sdps/sdp=2"
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice1/sdps/sdp=1/service-match-criteria/match-criterion=1"
+    )
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice1/connection-groups/connection-group=line1"
+    )
+    requests.delete(URL)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    app_name = "App_Flow_2_1_slice1"
+    assert app_name not in apps_response
+    assert app_name not in app_flows_response
+    assert len(apps_response) == 3 and len(app_flows_response) == 3
+
+    assert len(ietf_slice_connection_groups) == 3
+    assert len(ietf_slice_services) == 2
+    connection_group_diff = DeepDiff(
+        ietf_slice_connection_groups[2], target_ietf_slice_put_connection_groups[2]
+    )
+    assert not connection_group_diff
+
+    # op 7
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/sdps/sdp=3"
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice1/sdps/sdp=1/service-match-criteria/match-criterion=2"
+    )
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice1/connection-groups/connection-group=line2"
+    )
+    requests.delete(URL)
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1/sdps/sdp=1"
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    requests.delete(URL)
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice1"
+    requests.delete(URL)
+
+    app_name = "App_Flow_3_1_slice1"
+    assert app_name not in apps_response
+    assert app_name not in app_flows_response
+    assert len(apps_response) == 2 and len(app_flows_response) == 2
+
+    assert len(ietf_slice_connection_groups) == 3
+    assert len(ietf_slice_services) == 1
+    assert "slice1" not in ietf_slice_services
+
+    # op 8
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/sdps/sdp=2"
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice2/sdps/sdp=1/service-match-criteria/match-criterion=1"
+    )
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice2/connection-groups/connection-group=line1"
+    )
+    requests.delete(URL)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    app_name = "App_Flow_2_1_slice2"
+    assert app_name not in apps_response
+    assert app_name not in app_flows_response
+    assert len(apps_response) == 1 and len(app_flows_response) == 1
+
+    assert len(ietf_slice_connection_groups) == 4
+    assert len(ietf_slice_services) == 1
+    connection_group_diff = DeepDiff(
+        ietf_slice_connection_groups[3], target_ietf_slice_put_connection_groups[3]
+    )
+    assert not connection_group_diff
+
+    # op 9
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/sdps/sdp=3"
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice2/sdps/sdp=1/service-match-criteria/match-criterion=2"
+    )
+    requests.delete(URL)
+    URL = (
+        BASE_IETF_SLICE_URL
+        + "/slice-service=slice2/connection-groups/connection-group=line2"
+    )
+    requests.delete(URL)
+
+    URL = NCE_APP_DATA_URL
+    apps_response = requests.get(URL).json()
+    URL = NCE_APP_FLOW_DATA_URL
+    app_flows_response = requests.get(URL).json()
+    URL = AGG_TFS_IETF_SLICE_URL
+    ietf_slice_services = requests.get(URL).json()
+    URL = (
+        AGG_TFS_IETF_SLICE_URL
+        + "/slice-service=dummy/connection-groups/connection-group=dummy"
+    )
+    ietf_slice_connection_groups = requests.get(URL).json()
+
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2/sdps/sdp=1"
+    requests.delete(URL)
+    URL = BASE_IETF_SLICE_URL + "/slice-service=slice2"
+    requests.delete(URL)
+
+    app_name = "App_Flow_3_1_slice2"
+    assert app_name not in apps_response
+    assert app_name not in app_flows_response
+    assert len(apps_response) == 0 and len(app_flows_response) == 0
+
+    assert len(ietf_slice_connection_groups) == 4
+    assert len(ietf_slice_services) == 0
+
+    # op 10
+    ietf_slices_full_retrieved = requests.get(BASE_IETF_SLICE_URL).json()
+    empty_ietf_slices = {"network-slice-services": {"slice-service": []}}
+    ietf_slice_data = DeepDiff(ietf_slices_full_retrieved, empty_ietf_slices)
+    assert not ietf_slice_data
diff --git a/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py b/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py
new file mode 100644
index 0000000000000000000000000000000000000000..05e031da7b3ab88a8ee3f3c80fdddb92d9f26913
--- /dev/null
+++ b/src/tests/ofc25-camara-e2e-controller/tests/test_onboarding.py
@@ -0,0 +1,67 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, time
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty
+from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario
+from common.tools.object_factory.Context import json_context_id
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from .Fixtures import context_client, device_client # pylint: disable=unused-import
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DESCRIPTOR_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'data', 'camara-e2e-topology.json')
+ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME))
+
+def test_scenario_onboarding(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient,   # pylint: disable=redefined-outer-name
+) -> None:
+    validate_empty_scenario(context_client)
+
+    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()
+
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    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
diff --git a/src/tests/p4-fwd-l1/tests/Objects.py b/src/tests/p4-fwd-l1/tests/Objects.py
index ba260e936805e57fb8f07761b1e5fc79cffbaf8f..83d1e23b438693f3dbe6b657d0332a4f0a9d1680 100644
--- a/src/tests/p4-fwd-l1/tests/Objects.py
+++ b/src/tests/p4-fwd-l1/tests/Objects.py
@@ -13,18 +13,12 @@
 # limitations under the License.
 
 import os
-from typing import Dict, List, Tuple
 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_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
-    json_device_connect_rules, json_device_id, json_device_p4_disabled,
-    json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled)
-from common.tools.object_factory.Service import (
-    get_service_uuid, json_service_l3nm_planned,json_service_p4_planned)
-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
+    json_device_connect_rules, json_device_id, json_device_p4_disabled)
+from common.tools.object_factory.Service import get_service_uuid, json_service_p4_planned
+from common.tools.object_factory.EndPoint import json_endpoint_ids, json_endpoints
 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
diff --git a/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py b/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py
index fe622c908b44ed28a5c91ca8b35b8524511de388..341799c0224794bd32e0a81a02c593bd1173eca1 100644
--- a/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py
+++ b/src/tests/p4-fwd-l1/tests/test_functional_bootstrap.py
@@ -14,14 +14,9 @@
 
 import copy, logging, pytest
 from common.Settings import get_setting
-from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events
 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.Link import json_link_id
-from common.tools.object_factory.Topology import json_topology_id
 from context.client.ContextClient import ContextClient
-from context.client.EventsCollector import EventsCollector
-from common.proto.context_pb2 import ConfigActionEnum, Context, ContextId, Device, Empty, Link, Topology, DeviceOperationalStatusEnum
+from common.proto.context_pb2 import Context, ContextId, Device, Empty, Link, Topology, DeviceOperationalStatusEnum
 from device.client.DeviceClient import DeviceClient
 from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES
 
diff --git a/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py b/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py
index 67934ff8a78f79252ef4b6994c3b628a8275c503..0b44f794d7201f49034c536c8988798ac9b44bc7 100644
--- a/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py
+++ b/src/tests/p4-fwd-l1/tests/test_functional_cleanup.py
@@ -12,18 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import copy, logging, pytest
+import logging, pytest
 from common.Settings import get_setting
-from common.tests.EventTools import EVENT_REMOVE, check_events
 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.Link import json_link_id
-from common.tools.object_factory.Topology import json_topology_id
 from context.client.ContextClient import ContextClient
-from context.client.EventsCollector import EventsCollector
-from common.proto.context_pb2 import ConfigActionEnum, ContextId, Device, DeviceId, Empty, Link, LinkId, TopologyId, DeviceOperationalStatusEnum
+from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId
 from device.client.DeviceClient import DeviceClient
-from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES
+from .Objects import CONTEXTS, DEVICES, LINKS, TOPOLOGIES
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
diff --git a/src/tests/p4-fwd-l1/tests/test_functional_create_service.py b/src/tests/p4-fwd-l1/tests/test_functional_create_service.py
index 9f82da129e159f02d40ee57b890409b0a5685b75..ee714c4774e417a9afb84554d4dc99fe57d96863 100644
--- a/src/tests/p4-fwd-l1/tests/test_functional_create_service.py
+++ b/src/tests/p4-fwd-l1/tests/test_functional_create_service.py
@@ -14,24 +14,16 @@
 
 import copy, logging, pytest
 from common.Settings import get_setting
-from common.tests.EventTools import EVENT_CREATE, EVENT_UPDATE, check_events
-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.Service import json_service_id
-from common.tools.object_factory.Link import json_link_id
-from common.tools.object_factory.Topology import json_topology_id
 from context.client.ContextClient import ContextClient
-from context.client.EventsCollector import EventsCollector
-from common.proto.context_pb2 import Context, ContextId, Device, Empty, Link, Topology, Service, ServiceId
+from common.proto.context_pb2 import Service
 from device.client.DeviceClient import DeviceClient
 from service.client.ServiceClient import ServiceClient
-from tests.p4.tests.Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES, SERVICES
-from common.proto.context_pb2 import ConfigActionEnum, Device, DeviceId,\
-    DeviceOperationalStatusEnum
+from tests.p4.tests.Objects import SERVICES
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
 
+
 @pytest.fixture(scope='session')
 def context_client():
     _client = ContextClient(get_setting('CONTEXTSERVICE_SERVICE_HOST'), get_setting('CONTEXTSERVICE_SERVICE_PORT_GRPC'))
diff --git a/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py b/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py
index 98b6a01c1be2a00003b3be267839a4513967d4f7..439a88efd3f72dbd1389d9d47494fa891ff2b2d2 100644
--- a/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py
+++ b/src/tests/p4-fwd-l1/tests/test_functional_delete_service.py
@@ -14,18 +14,12 @@
 
 import copy, logging, pytest
 from common.Settings import get_setting
-from common.tests.EventTools import EVENT_REMOVE, check_events
-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.Service import json_service_id
-from common.tools.object_factory.Link import json_link_id
-from common.tools.object_factory.Topology import json_topology_id
 from context.client.ContextClient import ContextClient
-from context.client.EventsCollector import EventsCollector
-from common.proto.context_pb2 import ConfigActionEnum, ContextId, Device, DeviceId, Empty, LinkId, TopologyId, Service, ServiceId, DeviceOperationalStatusEnum
+from common.proto.context_pb2 import ServiceId
 from device.client.DeviceClient import DeviceClient
 from service.client.ServiceClient import ServiceClient
-from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES, SERVICES
+from .Objects import CONTEXT_ID, SERVICES
 
 LOGGER = logging.getLogger(__name__)
 LOGGER.setLevel(logging.DEBUG)
diff --git a/src/tests/p4-int-routing-acl/README.md b/src/tests/p4-int-routing-acl/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..fa935e1b2eae2decb0e852ebd72b752c3d67ca28
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/README.md
@@ -0,0 +1,129 @@
+# Tests for P4 routing, ACL, and In-Band Network Telemetry functions
+
+This directory contains the necessary scripts and configurations to run tests atop a Stratum-based P4 whitebox that performs a set of network functions, including routing, access control list (ACL), and In-Band Network Telemetry (INT).
+
+## Prerequisites
+
+You need Python3, which should already be installed while preparing for a TFS build.
+Additionally, `pytest` is also mandatory as it is used by our tests below.
+Aliasing python with python3 will also help bridging issues between older and newer python versions.
+
+```shell
+alias python='python3'
+pip3 install pytest
+pip3 install grpclib protobuf
+pip3 install grpcio-tools
+```
+
+The versions used for this test are:
+- `protobuf` 3.20.3
+- `grpclib` 0.4.4
+- `grpcio` 1.47.5
+- `grpcio-tools` 1.47.5
+
+After the installation of `grpclib`, protoc-gen-grpclib_python binary is in /home/$USER/.local/bin/
+First we copy it to /usr/local/bin/:
+
+```shell
+  sudo cp /home/$USER/.local/bin/protoc-gen-grpclib_python /usr/local/bin/
+```
+
+Then, we include this path to the PYTHONPATH:
+```shell
+export PYTHONPATH="${PYTHONPATH}:/usr/local/bin/protoc-gen-grpclib_python"
+```
+
+
+You need to build and deploy a software-based Stratum switch, before being able to use TFS to control it.
+To do so, follow the instructions in the `./topology` folder.
+
+## Steps to setup and run a TFS program atop Stratum
+
+To conduct this test, follow the steps below.
+
+### TFS re-deploy
+
+```shell
+cd ~/tfs-ctrl/
+source my_deploy.sh && source tfs_runtime_env_vars.sh
+./deploy/all.sh
+```
+
+### Path setup
+
+Ensure that `PATH` variable contains the parent project directory, e.g., "home/$USER/tfs-ctrl".
+
+Ensure that `PYTHONPATH` variable contains the source code directory of TFS, e.g., "home/$USER/tfs-ctrl/src"
+
+## Topology setup
+
+In the `./topology/` directory there are scripts that allow to build Stratum on a target machine (e.g., a VM) and then deploy a P4 switch atop this machine.
+This test assumes a Stratum P4 switch with 2 network interfaces used as a data plane (routing traffic from one to another) as well as another network interface used to send telemetry information to an external telemetry collector.
+
+## P4 artifacts
+
+In the `./p4src/` directory there are compiled P4 artifacts of the pipeline that will be pushed to the P4 switch, along with the P4-runtime definitions.
+The `./setup.sh` script copies from this directory. If you need to change the P4 program, make sure to put the compiled artifacts there.
+
+## Tests
+
+The following tests are implemented.
+For each of these tests, an auxiliary bash script allows to run it with less typing.
+
+|                 Test                 |              Bash Runner           |                Purpose             |
+| ------------------------------------ | ---------------------------------- | ---------------------------------- |
+| -                                    | setup.sh                           | Copy P4 artifacts into the SBI pod |
+| test_functional_bootstrap.py         | run_test_01_bootstrap.sh           | Connect TFS to the P4 switch       |
+| test_functional_rules_provision.py   | run_test_02_rules_provision.sh     | Install rules on the P4 switch     |
+| test_functional_rules_deprovision.py | run_test_03_rules_deprovision.sh   | Uninstall rules from the P4 switch |
+| test_functional_cleanup.py           | run_test_04_cleanup.sh             | Disconnect TFS from the P4 switch  |
+
+Each of the tests above is described in detail below.
+
+### Step 1: Copy the necessary P4 artifacts into the TFS SBI service pod
+
+The setup script copies the necessary artifacts to the SBI service pod.
+It should be run just once, after a fresh install of TFS.
+If you `deploy/all.sh` again, you need to repeat this step.
+
+```shell
+cd ~/tfs-ctrl/
+source my_deploy.sh && source tfs_runtime_env_vars.sh
+bash src/tests/p4-int-routing-acl/setup.sh
+```
+
+### Step 2: Bootstrap topology
+
+The bootstrap script registers the context, topology, links, and devices to TFS.
+
+```shell
+cd ~/tfs-ctrl/
+bash src/tests/p4-int-routing-acl/run_test_01_bootstrap.sh
+```
+
+### Step 3: Provision rules via the SBI API
+
+Implement routing, ACL, and INT functions by installing P4 rules to the Stratum switch via the TFS SBI API.
+
+```shell
+cd ~/tfs-ctrl/
+bash src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh
+```
+
+### Step 4: Deprovision rules via the SBI API
+
+Deprovision the routing, ACL, and INT network functions by removing the previously installed P4 rules (via the TFS SBI API) from the Stratum switch.
+
+```shell
+cd ~/tfs-ctrl/
+bash src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.sh
+```
+
+### Step 4: Deprovision topology
+
+Delete all the objects (context, topology, links, devices) from TFS:
+
+```shell
+cd ~/tfs-ctrl/
+bash src/tests/p4-int-routing-acl/run_test_04_cleanup.sh
+```
diff --git a/src/tests/p4-int-routing-acl/__init__.py b/src/tests/p4-int-routing-acl/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..023830645e0fcb60e3f8583674a954810af222f2
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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/tests/p4-int-routing-acl/descriptors/rules-insert-acl.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-acl.json
new file mode 100644
index 0000000000000000000000000000000000000000..97a548983f29c7af8c1da21fda5ab09b45a940aa
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-acl.json
@@ -0,0 +1,39 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.acl.acl[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.acl.acl",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "1"
+									},
+									{
+										"match-field": "l4_dport",
+										"match-value": "8080"
+									}
+								],
+								"action-name": "FabricIngress.acl.drop",
+								"action-params": [],
+								"priority": 1
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b1.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b1.json
new file mode 100644
index 0000000000000000000000000000000000000000..3fc9a71732aef424b85c9b91b255083b3e1badbb
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b1.json
@@ -0,0 +1,136 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.int_watchlist.watchlist",
+								"match-fields": [
+									{
+										"match-field": "ipv4_valid",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricIngress.int_watchlist.mark_to_report",
+								"action-params": [],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "510"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "3"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[1]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "510"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "510"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "2"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.int_watchlist.watchlist",
+								"match-fields": [
+									{
+										"match-field": "ipv4_valid",
+										"match-value": "1"
+									},
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "10.10.10.41&&&0xFFFFFFFF"
+									}
+								],
+								"action-name": "FabricIngress.int_watchlist.no_report_collector",
+								"action-params": [],
+								"priority": 10
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b2.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b2.json
new file mode 100644
index 0000000000000000000000000000000000000000..e6b5a8ea8590586b2aeee46eb9b736b1e27ba35e
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b2.json
@@ -0,0 +1,269 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[1]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "4"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "0"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "4"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_drop_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[2]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "4"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_drop_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[3]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_local_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[4]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "5"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "0"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "4"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_drop_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[5]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_local_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[6]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_local_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b3.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b3.json
new file mode 100644
index 0000000000000000000000000000000000000000..f8d2c71830d3ef55ea8ffd97e3557fc9d8cc6315
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-int-b3.json
@@ -0,0 +1,212 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "3"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "1"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "3"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "0"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[2]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.bridging[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.bridging",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eth_dst",
+										"match-value": "fa:16:3e:fb:cf:96"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_bridging",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "3"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricIngress.next.output_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "3"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.routing_v4",
+								"match-fields": [
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "10.10.10.41/32"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_routing_v4",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "3"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricIngress.next.routing_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "3"
+									},
+									{
+										"action-param": "smac",
+										"action-value": "fa:16:3e:93:8c:c0"
+									},
+									{
+										"action-param": "dmac",
+										"action-value": "fa:16:3e:fb:cf:96"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/clone_sessions/clone_session[1]",
+							"resource_value": {
+								"session-id": 506,
+								"replicas": [
+									{
+										"egress-port": 510,
+										"instance": 0
+									}
+								]
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-corp.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-corp.json
new file mode 100644
index 0000000000000000000000000000000000000000..0fe8b5036f8446f65e8fca85ddeea97cd6ed8cd0
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-corp.json
@@ -0,0 +1,197 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[4]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "2"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "1"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[4]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "2"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "0"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[4]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.bridging[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.bridging",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eth_dst",
+										"match-value": "fa:16:3e:e2:af:28"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_bridging",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "2"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[5]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricIngress.next.output_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "2"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.routing_v4",
+								"match-fields": [
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "172.16.10.9/32"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_routing_v4",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "2"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[6]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricIngress.next.routing_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "2"
+									},
+									{
+										"action-param": "smac",
+										"action-value": "fa:16:3e:9b:cb:a1"
+									},
+									{
+										"action-param": "dmac",
+										"action-value": "fa:16:3e:e2:af:28"
+									}
+								]
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-edge.json b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-edge.json
new file mode 100644
index 0000000000000000000000000000000000000000..c48d9d31e2b36dd1710ab53d51280759e82cca1c
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-insert-routing-edge.json
@@ -0,0 +1,197 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "1"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "1"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "1"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "0"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[3]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.bridging[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.bridging",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eth_dst",
+										"match-value": "fa:16:3e:58:92:ba"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_bridging",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "1"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricIngress.next.output_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.routing_v4",
+								"match-fields": [
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "10.158.72.25/32"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_routing_v4",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_SET",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[4]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricIngress.next.routing_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "1"
+									},
+									{
+										"action-param": "smac",
+										"action-value": "fa:16:3e:e2:af:28"
+									},
+									{
+										"action-param": "dmac",
+										"action-value": "fa:16:3e:58:92:ba"
+									}
+								]
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
diff --git a/src/tests/p4-int-routing-acl/descriptors/rules-remove.json b/src/tests/p4-int-routing-acl/descriptors/rules-remove.json
new file mode 100644
index 0000000000000000000000000000000000000000..68132e9e6ec09435cfcbaae16a9c2287e9c649b5
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/rules-remove.json
@@ -0,0 +1,965 @@
+{
+	"devices": [
+		{
+			"device_id": {
+				"device_uuid": {
+					"uuid": "p4-sw1"
+				}
+			},
+			"name": "p4-sw1",
+			"device_operational_status": "DEVICEOPERATIONALSTATUS_ENABLED",
+			"device_config": {
+				"config_rules": [
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.int_watchlist.watchlist",
+								"match-fields": [
+									{
+										"match-field": "ipv4_valid",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricIngress.int_watchlist.mark_to_report",
+								"action-params": [],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "510"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "3"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[1]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "510"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "510"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "2"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[1]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "4"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "0"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "4"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_drop_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[2]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "4"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_drop_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[3]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_local_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[4]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "5"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "0"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "4"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_drop_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[5]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_local_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.int_egress.report[6]",
+							"resource_value": {
+								"table-name": "FabricEgress.int_egress.report",
+								"match-fields": [
+									{
+										"match-field": "bmd_type",
+										"match-value": "2"
+									},
+									{
+										"match-field": "mirror_type",
+										"match-value": "1"
+									},
+									{
+										"match-field": "int_report_type",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricEgress.int_egress.do_local_report_encap",
+								"action-params": [
+									{
+										"action-param": "src_ip",
+										"action-value": "10.10.10.120"
+									},
+									{
+										"action-param": "mon_ip",
+										"action-value": "10.10.10.41"
+									},
+									{
+										"action-param": "mon_port",
+										"action-value": "32766"
+									},
+									{
+										"action-param": "switch_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.int_watchlist.watchlist[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.int_watchlist.watchlist",
+								"match-fields": [
+									{
+										"match-field": "ipv4_valid",
+										"match-value": "1"
+									},
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "10.10.10.41&&&0xFFFFFFFF"
+									}
+								],
+								"action-name": "FabricIngress.int_watchlist.no_report_collector",
+								"action-params": [],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "3"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "1"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "3"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "0"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[2]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.bridging[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.bridging",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eth_dst",
+										"match-value": "fa:16:3e:fb:cf:96"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_bridging",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "3"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricIngress.next.output_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "3"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.routing_v4",
+								"match-fields": [
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "10.10.10.41/32"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_routing_v4",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "3"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "3"
+									}
+								],
+								"action-name": "FabricIngress.next.routing_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "3"
+									},
+									{
+										"action-param": "smac",
+										"action-value": "fa:16:3e:93:8c:c0"
+									},
+									{
+										"action-param": "dmac",
+										"action-value": "fa:16:3e:fb:cf:96"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/clone_sessions/clone_session[1]",
+							"resource_value": {
+								"session-id": 506,
+								"replicas": [
+									{
+										"egress-port": 510,
+										"instance": 0
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "1"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "1"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "1"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "0"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[3]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.bridging[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.bridging",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eth_dst",
+										"match-value": "fa:16:3e:58:92:ba"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_bridging",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "1"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricIngress.next.output_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[2]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.routing_v4",
+								"match-fields": [
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "10.158.72.25/32"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_routing_v4",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "1"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[4]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "1"
+									}
+								],
+								"action-name": "FabricIngress.next.routing_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "1"
+									},
+									{
+										"action-param": "smac",
+										"action-value": "fa:16:3e:e2:af:28"
+									},
+									{
+										"action-param": "dmac",
+										"action-value": "fa:16:3e:58:92:ba"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.ingress_port_vlan[4]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.ingress_port_vlan",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "2"
+									},
+									{
+										"match-field": "vlan_is_valid",
+										"match-value": "0"
+									}
+								],
+								"action-name": "FabricIngress.filtering.permit_with_internal_vlan",
+								"action-params": [
+									{
+										"action-param": "vlan_id",
+										"action-value": "4094"
+									},
+									{
+										"action-param": "port_type",
+										"action-value": "1"
+									}
+								],
+								"priority": 10
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.filtering.fwd_classifier[4]",
+							"resource_value": {
+								"table-name": "FabricIngress.filtering.fwd_classifier",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "2"
+									},
+									{
+										"match-field": "ip_eth_type",
+										"match-value": "0x0800"
+									}
+								],
+								"action-name": "FabricIngress.filtering.set_forwarding_type",
+								"action-params": [
+									{
+										"action-param": "fwd_type",
+										"action-value": "0"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricEgress.egress_next.egress_vlan[4]",
+							"resource_value": {
+								"table-name": "FabricEgress.egress_next.egress_vlan",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eg_port",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricEgress.egress_next.pop_vlan",
+								"action-params": []
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.bridging[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.bridging",
+								"match-fields": [
+									{
+										"match-field": "vlan_id",
+										"match-value": "4094"
+									},
+									{
+										"match-field": "eth_dst",
+										"match-value": "fa:16:3e:e2:af:28"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_bridging",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "2"
+									}
+								],
+								"priority": 1
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[5]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricIngress.next.output_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "2"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.forwarding.routing_v4[3]",
+							"resource_value": {
+								"table-name": "FabricIngress.forwarding.routing_v4",
+								"match-fields": [
+									{
+										"match-field": "ipv4_dst",
+										"match-value": "172.16.10.9/32"
+									}
+								],
+								"action-name": "FabricIngress.forwarding.set_next_id_routing_v4",
+								"action-params": [
+									{
+										"action-param": "next_id",
+										"action-value": "2"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.next.simple[6]",
+							"resource_value": {
+								"table-name": "FabricIngress.next.simple",
+								"match-fields": [
+									{
+										"match-field": "next_id",
+										"match-value": "2"
+									}
+								],
+								"action-name": "FabricIngress.next.routing_simple",
+								"action-params": [
+									{
+										"action-param": "port_num",
+										"action-value": "2"
+									},
+									{
+										"action-param": "smac",
+										"action-value": "fa:16:3e:9b:cb:a1"
+									},
+									{
+										"action-param": "dmac",
+										"action-value": "fa:16:3e:e2:af:28"
+									}
+								]
+							}
+						}
+					},
+					{
+						"action": "CONFIGACTION_DELETE",
+						"custom": {
+							"resource_key": "/tables/table/FabricIngress.acl.acl[1]",
+							"resource_value": {
+								"table-name": "FabricIngress.acl.acl",
+								"match-fields": [
+									{
+										"match-field": "ig_port",
+										"match-value": "1"
+									},
+									{
+										"match-field": "l4_dport",
+										"match-value": "8080"
+									}
+								],
+								"action-name": "FabricIngress.acl.drop",
+								"action-params": [],
+								"priority": 1
+							}
+						}
+					}
+				]
+			}
+		}
+	]
+}
\ No newline at end of file
diff --git a/src/tests/p4-int-routing-acl/descriptors/topology.json b/src/tests/p4-int-routing-acl/descriptors/topology.json
new file mode 100644
index 0000000000000000000000000000000000000000..3b1f6e410cc5a2adc1c99b6208523fd9a9971fe7
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/descriptors/topology.json
@@ -0,0 +1,288 @@
+{
+    "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": "edge-net"
+                }
+            },
+            "device_type": "network",
+            "device_drivers": [
+                "DEVICEDRIVER_UNDEFINED"
+            ],
+            "device_config": {
+                "config_rules": [
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/address",
+                            "resource_value": "127.0.0.1"
+                        }
+                    },
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/port",
+                            "resource_value": "0"
+                        }
+                    },
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/settings",
+                            "resource_value": {
+                                "endpoints": [
+                                    {
+                                        "uuid": "eth1",
+                                        "type": "copper"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "corporate-net"
+                }
+            },
+            "device_type": "network",
+            "device_drivers": [
+                "DEVICEDRIVER_UNDEFINED"
+            ],
+            "device_config": {
+                "config_rules": [
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/address",
+                            "resource_value": "127.0.0.1"
+                        }
+                    },
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/port",
+                            "resource_value": "0"
+                        }
+                    },
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/settings",
+                            "resource_value": {
+                                "endpoints": [
+                                    {
+                                        "uuid": "eth1",
+                                        "type": "copper"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        {
+            "device_id": {
+                "device_uuid": {
+                    "uuid": "p4-sw1"
+                }
+            },
+            "device_type": "p4-switch",
+            "device_drivers": [
+                "DEVICEDRIVER_P4"
+            ],
+            "device_operational_status": "DEVICEOPERATIONALSTATUS_DISABLED",
+            "name": "p4-sw1",
+            "device_config": {
+                "config_rules": [
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/address",
+                            "resource_value": "10.10.10.120"
+                        }
+                    },
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/port",
+                            "resource_value": "50001"
+                        }
+                    },
+                    {
+                        "action": "CONFIGACTION_SET",
+                        "custom": {
+                            "resource_key": "_connect/settings",
+                            "resource_value": {
+                                "id": 1,
+                                "name": "p4-sw1",
+                                "vendor": "Open Networking Foundation",
+                                "hw_ver": "BMv2 simple_switch",
+                                "sw_ver": "Stratum",
+                                "p4bin": "/root/p4/bmv2.json",
+                                "p4info": "/root/p4/p4info.txt",
+                                "timeout": 60,
+                                "endpoints": [
+                                    {
+                                        "uuid": "1",
+                                        "type": "port"
+                                    },
+                                    {
+                                        "uuid": "2",
+                                        "type": "port"
+                                    }
+                                ]
+                            }
+                        }
+                    }
+                ]
+            }
+        }
+    ],
+    "links": [
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "p4-sw1/1==edge-net/eth1"
+                }
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "p4-sw1"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "1"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "edge-net"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "eth1"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "edge-net/eth1==p4-sw1/1"
+                }
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "edge-net"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "eth1"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "p4-sw1"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "1"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "p4-sw1/2==corporate-net/eth1"
+                }
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "p4-sw1"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "2"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "corporate-net"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "eth1"
+                    }
+                }
+            ]
+        },
+        {
+            "link_id": {
+                "link_uuid": {
+                    "uuid": "corporate-net/eth1==p4-sw1/2"
+                }
+            },
+            "link_endpoint_ids": [
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "corporate-net"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "eth1"
+                    }
+                },
+                {
+                    "device_id": {
+                        "device_uuid": {
+                            "uuid": "p4-sw1"
+                        }
+                    },
+                    "endpoint_uuid": {
+                        "uuid": "2"
+                    }
+                }
+            ]
+        }
+    ]
+}
diff --git a/src/tests/p4-int-routing-acl/p4src/README.md b/src/tests/p4-int-routing-acl/p4src/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..07e34066fbc19fb3f1778a64c65723513b8081df
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/p4src/README.md
@@ -0,0 +1,24 @@
+# P4 Sources
+
+We employ the P4 sources from the [fabric-tna](https://github.com/stratum/fabric-tna/tree/main) project.
+
+To compile a relevant P4 target binary and P4 info file, do:
+
+```shell
+git clone https://github.com/stratum/fabric-tna.git
+
+cd ./fabric-tna
+
+make fabric-int-v1model
+```
+
+At this point, a relevant `build.sh` script is being run and a P4 program is being compiled.
+
+After a successful compilation, some artifacts (p4info.txt, bmv2.json) will be generated and placed into `build` sub-folder.
+
+```shell
+ls build/fabric-int/bmv2 
+_pp.p4     bmv2.json  p4info.txt
+```
+
+These artefacts are now moved into this repository.
diff --git a/src/tests/p4-int-routing-acl/p4src/_pp.p4 b/src/tests/p4-int-routing-acl/p4src/_pp.p4
new file mode 100644
index 0000000000000000000000000000000000000000..1b2b718a1e96f807e1da6139ababf9e71a881cd0
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/p4src/_pp.p4
@@ -0,0 +1,2037 @@
+error {
+    PacketRejectedByParser
+}
+#include <core.p4>
+#define V1MODEL_VERSION 20180101
+#include <v1model.p4>
+
+typedef bit<9> PortId_t;
+typedef bit<16> MulticastGroupId_t;
+typedef bit<5> QueueId_t;
+typedef bit<10> MirrorId_t;
+typedef bit<16> ReplicationId_t;
+enum bit<2> MeterColor_t {
+    GREEN = 0,
+    YELLOW = 1,
+    RED = 2
+}
+
+typedef bit<1> BOOL;
+typedef bit<8> FieldListIndex_t;
+const PortId_t BMV2_DROP_PORT = 511;
+const PortId_t FAKE_V1MODEL_RECIRC_PORT = 510;
+const FieldListIndex_t PRESERVE_INT_MD = 241;
+const FieldListIndex_t PRESERVE_INGRESS_PORT = 231;
+const FieldListIndex_t NO_PRESERVATION = 0;
+typedef bit<3> fwd_type_t;
+typedef bit<32> next_id_t;
+typedef bit<20> mpls_label_t;
+typedef bit<48> mac_addr_t;
+typedef bit<12> vlan_id_t;
+typedef bit<32> ipv4_addr_t;
+typedef bit<16> l4_port_t;
+typedef bit<32> flow_hash_t;
+typedef bit<4> slice_id_t;
+typedef bit<2> tc_t;
+typedef bit<(4 + 2)> slice_tc_t;
+type bit<9> FabricPortId_t;
+const bit<8> DEFAULT_APP_ID = 0;
+const slice_id_t DEFAULT_SLICE_ID = 0;
+const tc_t DEFAULT_TC = 0;
+const QueueId_t QUEUE_ID_BEST_EFFORT = 0;
+typedef bit<32> teid_t;
+typedef bit<12> upf_ctr_idx_t;
+typedef bit<8> tun_peer_id_t;
+typedef bit<32> ue_session_id_t;
+typedef bit<15> session_meter_idx_t;
+typedef bit<15> app_meter_idx_t;
+const session_meter_idx_t DEFAULT_SESSION_METER_IDX = 0;
+const app_meter_idx_t DEFAULT_APP_METER_IDX = 0;
+enum bit<2> EncapPresence {
+    NONE = 0x0,
+    GTPU_ONLY = 0x1,
+    GTPU_WITH_PSC = 0x2,
+    VXLAN = 0x3
+}
+
+const bit<16> GTPU_UDP_PORT = 2152;
+const bit<3> GTP_V1 = 3w1;
+const bit<8> GTPU_GPDU = 0xff;
+const bit<1> GTP_PROTOCOL_TYPE_GTP = 1w1;
+const bit<8> GTPU_NEXT_EXT_NONE = 0x0;
+const bit<8> GTPU_NEXT_EXT_PSC = 0x85;
+const bit<4> GTPU_EXT_PSC_TYPE_DL = 4w0;
+const bit<4> GTPU_EXT_PSC_TYPE_UL = 4w1;
+const bit<8> GTPU_EXT_PSC_LEN = 8w1;
+enum bit<2> PortType_t {
+    UNKNOWN = 0x0,
+    EDGE = 0x1,
+    INFRA = 0x2,
+    INTERNAL = 0x3
+}
+
+const bit<16> ETHERTYPE_QINQ = 0x88a8;
+const bit<16> ETHERTYPE_QINQ_NON_STD = 0x9100;
+const bit<16> ETHERTYPE_VLAN = 0x8100;
+const bit<16> ETHERTYPE_MPLS = 0x8847;
+const bit<16> ETHERTYPE_MPLS_MULTICAST = 0x8848;
+const bit<16> ETHERTYPE_IPV4 = 0x800;
+const bit<16> ETHERTYPE_IPV6 = 0x86dd;
+const bit<16> ETHERTYPE_ARP = 0x806;
+const bit<16> ETHERTYPE_PPPOED = 0x8863;
+const bit<16> ETHERTYPE_PPPOES = 0x8864;
+const bit<16> ETHERTYPE_PACKET_OUT = 0xbf01;
+const bit<16> ETHERTYPE_CPU_LOOPBACK_INGRESS = 0xbf02;
+const bit<16> ETHERTYPE_CPU_LOOPBACK_EGRESS = 0xbf03;
+const bit<16> ETHERTYPE_INT_WIP_IPV4 = 0xbf04;
+const bit<16> ETHERTYPE_INT_WIP_MPLS = 0xbf05;
+const bit<16> PPPOE_PROTOCOL_IP4 = 0x21;
+const bit<16> PPPOE_PROTOCOL_IP6 = 0x57;
+const bit<16> PPPOE_PROTOCOL_MPLS = 0x281;
+const bit<8> PROTO_ICMP = 1;
+const bit<8> PROTO_TCP = 6;
+const bit<8> PROTO_UDP = 17;
+const bit<8> PROTO_ICMPV6 = 58;
+const bit<4> IPV4_MIN_IHL = 5;
+const fwd_type_t FWD_BRIDGING = 0;
+const fwd_type_t FWD_MPLS = 1;
+const fwd_type_t FWD_IPV4_UNICAST = 2;
+const fwd_type_t FWD_IPV4_MULTICAST = 3;
+const fwd_type_t FWD_IPV6_UNICAST = 4;
+const fwd_type_t FWD_IPV6_MULTICAST = 5;
+const fwd_type_t FWD_UNKNOWN = 7;
+const vlan_id_t DEFAULT_VLAN_ID = 12w4094;
+const bit<8> DEFAULT_MPLS_TTL = 64;
+const bit<8> DEFAULT_IPV4_TTL = 64;
+const bit<16> VXLAN_UDP_PORT = 4789;
+const bit<7> RECIRC_PORT_NUMBER = 7w68;
+action nop() {
+    NoAction();
+}
+enum bit<8> BridgedMdType_t {
+    INVALID = 0,
+    INGRESS_TO_EGRESS = 1,
+    EGRESS_MIRROR = 2,
+    INGRESS_MIRROR = 3,
+    INT_INGRESS_DROP = 4,
+    DEFLECTED = 5
+}
+
+enum bit<3> FabricMirrorType_t {
+    INVALID = 0,
+    INT_REPORT = 1,
+    PACKET_IN = 2
+}
+
+const MirrorId_t PACKET_IN_MIRROR_SESSION_ID = 0x1ff;
+enum bit<2> CpuLoopbackMode_t {
+    DISABLED = 0,
+    DIRECT = 1,
+    INGRESS = 2
+}
+
+const bit<4> NPROTO_ETHERNET = 0;
+const bit<4> NPROTO_TELEMETRY_DROP_HEADER = 1;
+const bit<4> NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER = 2;
+const bit<16> REPORT_FIXED_HEADER_BYTES = 12;
+const bit<16> DROP_REPORT_HEADER_BYTES = 12;
+const bit<16> LOCAL_REPORT_HEADER_BYTES = 16;
+const bit<8> INT_MIRROR_SESSION_BASE = 0x80;
+const bit<10> V1MODEL_INT_MIRROR_SESSION = 0x1fa;
+typedef bit<16> flow_report_filter_index_t;
+typedef bit<16> drop_report_filter_index_t;
+typedef bit<12> queue_report_filter_index_t;
+typedef bit<16> queue_report_quota_t;
+typedef bit<3> IntReportType_t;
+const IntReportType_t INT_REPORT_TYPE_NO_REPORT = 0;
+const IntReportType_t INT_REPORT_TYPE_DROP = 4;
+const IntReportType_t INT_REPORT_TYPE_QUEUE = 2;
+const IntReportType_t INT_REPORT_TYPE_FLOW = 1;
+typedef bit<8> IntWipType_t;
+const IntWipType_t INT_IS_NOT_WIP = 0;
+const IntWipType_t INT_IS_WIP = 1;
+const IntWipType_t INT_IS_WIP_WITH_MPLS = 2;
+const bit<16> INT_WIP_ADJUST_IP_BYTES = 14 - 1 ^ 0xffff;
+const bit<16> INT_WIP_ADJUST_UDP_BYTES = INT_WIP_ADJUST_IP_BYTES - 20;
+const bit<16> INT_WIP_ADJUST_IP_MPLS_BYTES = INT_WIP_ADJUST_IP_BYTES - 4;
+const bit<16> INT_WIP_ADJUST_UDP_MPLS_BYTES = INT_WIP_ADJUST_UDP_BYTES - 4;
+enum bit<8> IntDropReason_t {
+    DROP_REASON_UNKNOWN = 0,
+    DROP_REASON_IP_TTL_ZERO = 26,
+    DROP_REASON_ROUTING_V4_MISS = 29,
+    DROP_REASON_ROUTING_V6_MISS = 29,
+    DROP_REASON_PORT_VLAN_MAPPING_MISS = 55,
+    DROP_REASON_TRAFFIC_MANAGER = 71,
+    DROP_REASON_ACL_DENY = 80,
+    DROP_REASON_BRIDGING_MISS = 89,
+    DROP_REASON_NEXT_ID_MISS = 128,
+    DROP_REASON_MPLS_MISS = 129,
+    DROP_REASON_EGRESS_NEXT_MISS = 130,
+    DROP_REASON_MPLS_TTL_ZERO = 131,
+    DROP_REASON_UPF_DL_SESSION_MISS = 132,
+    DROP_REASON_UPF_DL_SESSION_DROP = 133,
+    DROP_REASON_UPF_UL_SESSION_MISS = 134,
+    DROP_REASON_UPF_UL_SESSION_DROP = 135,
+    DROP_REASON_UPF_DL_SESSION_DROP_BUFF = 136,
+    DROP_REASON_UPF_DL_TERMINATION_MISS = 137,
+    DROP_REASON_UPF_DL_TERMINATION_DROP = 138,
+    DROP_REASON_UPF_UL_TERMINATION_MISS = 139,
+    DROP_REASON_UPF_UL_TERMINATION_DROP = 140,
+    DROP_REASON_UPF_UPLINK_RECIRC_DENY = 150,
+    DROP_REASON_INGRESS_QOS_METER = 160,
+    DROP_REASON_ROUTING_V4_DROP = 170,
+    DROP_REASON_ROUTING_V6_DROP = 171
+}
+
+@controller_header("packet_in") header packet_in_header_t {
+    FabricPortId_t ingress_port;
+    bit<7>         _pad0;
+}
+
+@controller_header("packet_out") header packet_out_header_t {
+    @padding 
+    bit<7>            pad0;
+    FabricPortId_t    egress_port;
+    @padding 
+    bit<3>            pad1;
+    QueueId_t         queue_id;
+    @padding 
+    bit<5>            pad2;
+    CpuLoopbackMode_t cpu_loopback_mode;
+    bit<1>            do_forwarding;
+    @padding 
+    bit<16>           pad3;
+    @padding 
+    bit<48>           pad4;
+    bit<16>           ether_type;
+}
+
+header ethernet_t {
+    mac_addr_t dst_addr;
+    mac_addr_t src_addr;
+}
+
+header eth_type_t {
+    bit<16> value;
+}
+
+header vlan_tag_t {
+    bit<16>   eth_type;
+    bit<3>    pri;
+    bit<1>    cfi;
+    vlan_id_t vlan_id;
+}
+
+header mpls_t {
+    mpls_label_t label;
+    bit<3>       tc;
+    bit<1>       bos;
+    bit<8>       ttl;
+}
+
+header pppoe_t {
+    bit<4>  version;
+    bit<4>  type_id;
+    bit<8>  code;
+    bit<16> session_id;
+    bit<16> length;
+    bit<16> protocol;
+}
+
+header ipv4_t {
+    bit<4>  version;
+    bit<4>  ihl;
+    bit<6>  dscp;
+    bit<2>  ecn;
+    bit<16> total_len;
+    bit<16> identification;
+    bit<3>  flags;
+    bit<13> frag_offset;
+    bit<8>  ttl;
+    bit<8>  protocol;
+    bit<16> hdr_checksum;
+    bit<32> src_addr;
+    bit<32> dst_addr;
+}
+
+header ipv6_t {
+    bit<4>   version;
+    bit<8>   traffic_class;
+    bit<20>  flow_label;
+    bit<16>  payload_len;
+    bit<8>   next_hdr;
+    bit<8>   hop_limit;
+    bit<128> src_addr;
+    bit<128> dst_addr;
+}
+
+header tcp_t {
+    bit<16> sport;
+    bit<16> dport;
+}
+
+header udp_t {
+    bit<16> sport;
+    bit<16> dport;
+    bit<16> len;
+    bit<16> checksum;
+}
+
+header icmp_t {
+    bit<8> icmp_type;
+    bit<8> icmp_code;
+}
+
+header vxlan_t {
+    bit<8>  flags;
+    bit<24> reserved;
+    bit<24> vni;
+    bit<8>  reserved_2;
+}
+
+header gtpu_t {
+    bit<3>  version;
+    bit<1>  pt;
+    bit<1>  spare;
+    bit<1>  ex_flag;
+    bit<1>  seq_flag;
+    bit<1>  npdu_flag;
+    bit<8>  msgtype;
+    bit<16> msglen;
+    teid_t  teid;
+}
+
+header gtpu_options_t {
+    bit<16> seq_num;
+    bit<8>  n_pdu_num;
+    bit<8>  next_ext;
+}
+
+header gtpu_ext_psc_t {
+    bit<8> len;
+    bit<4> type;
+    bit<4> spare0;
+    bit<1> ppp;
+    bit<1> rqi;
+    bit<6> qfi;
+    bit<8> next_ext;
+}
+
+@flexible struct upf_bridged_metadata_t {
+    tun_peer_id_t tun_peer_id;
+    upf_ctr_idx_t upf_ctr_id;
+    bit<6>        qfi;
+    bool          needs_gtpu_encap;
+    bool          skip_upf;
+    bool          skip_egress_upf_ctr;
+    teid_t        teid;
+    bit<4>        _pad;
+}
+
+@pa_no_overlay("egress" , "hdr.report_fixed_header.rsvd") header report_fixed_header_t {
+    bit<4>  ver;
+    bit<4>  nproto;
+    bit<3>  dqf;
+    bit<15> rsvd;
+    bit<6>  hw_id;
+    bit<32> seq_no;
+    bit<32> ig_tstamp;
+}
+
+@pa_container_size("egress" , "hdr.common_report_header.queue_id" , 8) @pa_container_size("egress" , "hdr.common_report_header.ig_port" , 16) @pa_container_size("egress" , "hdr.common_report_header.eg_port" , 16) @pa_no_overlay("egress" , "hdr.common_report_header.queue_id") @pa_no_overlay("egress" , "hdr.common_report_header.eg_port") header common_report_header_t {
+    bit<32> switch_id;
+    bit<7>  pad1;
+    bit<9>  ig_port;
+    bit<7>  pad2;
+    bit<9>  eg_port;
+    bit<3>  pad3;
+    bit<5>  queue_id;
+}
+
+header drop_report_header_t {
+    bit<8>  drop_reason;
+    @padding 
+    bit<16> pad;
+}
+
+header local_report_header_t {
+    bit<5>  pad1;
+    bit<19> queue_occupancy;
+    bit<32> eg_tstamp;
+}
+
+@pa_no_overlay("egress" , "fabric_md.int_report_md.bmd_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.mirror_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_port") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_id") @pa_no_overlay("egress" , "fabric_md.int_report_md.queue_occupancy") @pa_no_overlay("egress" , "fabric_md.int_report_md.ig_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.eg_tstamp") @pa_no_overlay("egress" , "fabric_md.int_report_md.drop_reason") @pa_no_overlay("egress" , "fabric_md.int_report_md.ip_eth_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.report_type") @pa_no_overlay("egress" , "fabric_md.int_report_md.flow_hash") @pa_no_overlay("egress" , "fabric_md.int_report_md.encap_presence") header int_report_metadata_t {
+    BridgedMdType_t    bmd_type;
+    @padding 
+    bit<5>             _pad0;
+    FabricMirrorType_t mirror_type;
+    @padding 
+    bit<7>             _pad1;
+    bit<9>             ig_port;
+    @padding 
+    bit<7>             _pad2;
+    bit<9>             eg_port;
+    @padding 
+    bit<3>             _pad3;
+    bit<5>             queue_id;
+    @padding 
+    bit<5>             _pad4;
+    bit<19>            queue_occupancy;
+    bit<32>            ig_tstamp;
+    bit<32>            eg_tstamp;
+    bit<8>             drop_reason;
+    bit<16>            ip_eth_type;
+    @padding 
+    bit<6>             _pad5;
+    EncapPresence      encap_presence;
+    bit<3>             report_type;
+    @padding 
+    bit<5>             _pad6;
+    flow_hash_t        flow_hash;
+}
+
+@flexible struct int_bridged_metadata_t {
+    bit<3>          report_type;
+    MirrorId_t      mirror_session_id;
+    IntDropReason_t drop_reason;
+    QueueId_t       queue_id;
+    PortId_t        egress_port;
+    IntWipType_t    wip_type;
+}
+
+struct int_metadata_t {
+    bit<32> hop_latency;
+    bit<48> timestamp;
+    bool    vlan_stripped;
+    bool    queue_report;
+}
+
+@flexible struct bridged_metadata_base_t {
+    flow_hash_t   inner_hash;
+    mpls_label_t  mpls_label;
+    PortId_t      ig_port;
+    bool          is_multicast;
+    fwd_type_t    fwd_type;
+    vlan_id_t     vlan_id;
+    EncapPresence encap_presence;
+    bit<8>        mpls_ttl;
+    bit<48>       ig_tstamp;
+    bit<16>       ip_eth_type;
+    bit<10>       stats_flow_id;
+    slice_tc_t    slice_tc;
+}
+
+header bridged_metadata_t {
+    BridgedMdType_t         bmd_type;
+    bridged_metadata_base_t base;
+    int_bridged_metadata_t  int_bmd;
+    bit<1>                  _pad0;
+    bit<5>                  _pad2;
+}
+
+struct lookup_metadata_t {
+    mac_addr_t eth_dst;
+    mac_addr_t eth_src;
+    bit<16>    eth_type;
+    vlan_id_t  vlan_id;
+    bool       is_ipv4;
+    bit<32>    ipv4_src;
+    bit<32>    ipv4_dst;
+    bit<8>     ip_proto;
+    l4_port_t  l4_sport;
+    l4_port_t  l4_dport;
+    bit<8>     icmp_type;
+    bit<8>     icmp_code;
+}
+
+struct common_mirror_metadata_t {
+    MirrorId_t      mirror_session_id;
+    BridgedMdType_t bmd_type;
+}
+
+@pa_auto_init_metadata struct fabric_ingress_metadata_t {
+    bridged_metadata_t       bridged;
+    flow_hash_t              ecmp_hash;
+    lookup_metadata_t        lkp;
+    bit<32>                  routing_ipv4_dst;
+    bool                     skip_forwarding;
+    bool                     skip_next;
+    next_id_t                next_id;
+    bool                     egress_port_set;
+    bool                     punt_to_cpu;
+    bool                     ipv4_checksum_err;
+    bool                     inner_ipv4_checksum_err;
+    slice_id_t               slice_id;
+    tc_t                     tc;
+    bool                     tc_unknown;
+    bool                     is_upf_hit;
+    slice_id_t               upf_slice_id;
+    tc_t                     upf_tc;
+    MeterColor_t             upf_meter_color;
+    PortType_t               ig_port_type;
+    common_mirror_metadata_t mirror;
+}
+
+header common_egress_metadata_t {
+    BridgedMdType_t    bmd_type;
+    @padding 
+    bit<5>             _pad;
+    FabricMirrorType_t mirror_type;
+}
+
+header packet_in_mirror_metadata_t {
+    BridgedMdType_t    bmd_type;
+    @padding 
+    bit<5>             _pad0;
+    FabricMirrorType_t mirror_type;
+    @padding 
+    bit<7>             _pad1;
+    PortId_t           ingress_port;
+}
+
+@pa_auto_init_metadata struct fabric_egress_metadata_t {
+    bridged_metadata_t    bridged;
+    PortId_t              cpu_port;
+    int_report_metadata_t int_report_md;
+    int_metadata_t        int_md;
+    bit<16>               int_ipv4_len;
+    bool                  is_int_recirc;
+    bit<16>               pkt_length;
+}
+
+header fake_ethernet_t {
+    @padding 
+    bit<48> _pad0;
+    @padding 
+    bit<48> _pad1;
+    bit<16> ether_type;
+}
+
+struct ingress_headers_t {
+    packet_out_header_t packet_out;
+    packet_in_header_t  packet_in;
+    fake_ethernet_t     fake_ethernet;
+    ethernet_t          ethernet;
+    vlan_tag_t          vlan_tag;
+    eth_type_t          eth_type;
+    mpls_t              mpls;
+    ipv4_t              ipv4;
+    ipv6_t              ipv6;
+    tcp_t               tcp;
+    udp_t               udp;
+    icmp_t              icmp;
+    gtpu_t              gtpu;
+    gtpu_options_t      gtpu_options;
+    gtpu_ext_psc_t      gtpu_ext_psc;
+    vxlan_t             vxlan;
+    ethernet_t          inner_ethernet;
+    eth_type_t          inner_eth_type;
+    ipv4_t              inner_ipv4;
+    tcp_t               inner_tcp;
+    udp_t               inner_udp;
+    icmp_t              inner_icmp;
+}
+
+struct egress_headers_t {
+    packet_in_header_t     packet_in;
+    fake_ethernet_t        fake_ethernet;
+    ethernet_t             report_ethernet;
+    eth_type_t             report_eth_type;
+    mpls_t                 report_mpls;
+    ipv4_t                 report_ipv4;
+    udp_t                  report_udp;
+    report_fixed_header_t  report_fixed_header;
+    common_report_header_t common_report_header;
+    local_report_header_t  local_report_header;
+    drop_report_header_t   drop_report_header;
+    ethernet_t             ethernet;
+    vlan_tag_t             vlan_tag;
+    eth_type_t             eth_type;
+    mpls_t                 mpls;
+    ipv4_t                 ipv4;
+    ipv6_t                 ipv6;
+    udp_t                  udp;
+}
+
+struct fabric_v1model_metadata_t {
+    bool                      skip_egress;
+    bool                      do_upf_uplink_recirc;
+    bit<1>                    drop_ctl;
+    IntReportType_t           int_mirror_type;
+    fabric_ingress_metadata_t ingress;
+    fabric_egress_metadata_t  egress;
+    @field_list(PRESERVE_INT_MD) 
+    IntReportType_t           recirc_preserved_report_type;
+    @field_list(PRESERVE_INT_MD) 
+    FabricPortId_t            recirc_preserved_egress_port;
+    @field_list(PRESERVE_INT_MD) 
+    IntDropReason_t           recirc_preserved_drop_reason;
+    @field_list(PRESERVE_INGRESS_PORT) 
+    FabricPortId_t            recirc_preserved_ingress_port;
+}
+
+struct v1model_header_t {
+    ingress_headers_t ingress;
+    egress_headers_t  egress;
+}
+
+parser FabricParser(packet_in packet, out v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) {
+    state start {
+        fabric_md.egress.pkt_length = (bit<16>)standard_md.packet_length;
+        fabric_md.ingress.bridged.setValid();
+        fabric_md.ingress.bridged.bmd_type = BridgedMdType_t.INGRESS_TO_EGRESS;
+        fabric_md.ingress.bridged.base.ig_port = standard_md.ingress_port;
+        fabric_md.recirc_preserved_ingress_port = (FabricPortId_t)standard_md.ingress_port;
+        fabric_md.ingress.bridged.base.ig_tstamp = standard_md.ingress_global_timestamp;
+        fabric_md.ingress.egress_port_set = false;
+        fabric_md.ingress.punt_to_cpu = false;
+        fabric_md.ingress.bridged.base.ip_eth_type = 0;
+        fabric_md.ingress.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_UNKNOWN;
+        fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_NOT_WIP;
+        fabric_md.ingress.bridged.base.encap_presence = EncapPresence.NONE;
+        fabric_md.ingress.upf_meter_color = MeterColor_t.GREEN;
+        transition check_ethernet;
+    }
+    state check_ethernet {
+        fake_ethernet_t tmp = packet.lookahead<fake_ethernet_t>();
+        transition select(tmp.ether_type) {
+            ETHERTYPE_CPU_LOOPBACK_INGRESS: parse_fake_ethernet;
+            ETHERTYPE_CPU_LOOPBACK_EGRESS: parse_fake_ethernet_and_accept;
+            ETHERTYPE_PACKET_OUT: check_packet_out;
+            ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4;
+            ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls;
+            default: parse_ethernet;
+        }
+    }
+    state check_packet_out {
+        packet_out_header_t tmp = packet.lookahead<packet_out_header_t>();
+        transition select(tmp.do_forwarding) {
+            0: parse_packet_out_and_accept;
+            default: strip_packet_out;
+        }
+    }
+    state parse_int_wip_ipv4 {
+        hdr.ingress.ethernet.setValid();
+        hdr.ingress.eth_type.setValid();
+        hdr.ingress.eth_type.value = ETHERTYPE_IPV4;
+        fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP;
+        fabric_md.ingress.bridged.base.mpls_label = 0;
+        fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1;
+        packet.advance(14 * 8);
+        transition parse_ipv4;
+    }
+    state parse_int_wip_mpls {
+        hdr.ingress.ethernet.setValid();
+        hdr.ingress.eth_type.setValid();
+        hdr.ingress.eth_type.value = ETHERTYPE_MPLS;
+        fabric_md.ingress.bridged.int_bmd.wip_type = INT_IS_WIP_WITH_MPLS;
+        packet.advance(14 * 8);
+        transition parse_mpls;
+    }
+    state parse_packet_out_and_accept {
+        packet.extract(hdr.ingress.packet_out);
+        transition accept;
+    }
+    state strip_packet_out {
+        packet.advance(14 * 8);
+        transition parse_ethernet;
+    }
+    state parse_fake_ethernet {
+        packet.extract(hdr.ingress.fake_ethernet);
+        fake_ethernet_t tmp = packet.lookahead<fake_ethernet_t>();
+        transition select(tmp.ether_type) {
+            ETHERTYPE_INT_WIP_IPV4: parse_int_wip_ipv4;
+            ETHERTYPE_INT_WIP_MPLS: parse_int_wip_mpls;
+            default: parse_ethernet;
+        }
+    }
+    state parse_fake_ethernet_and_accept {
+        packet.extract(hdr.ingress.fake_ethernet);
+        transition accept;
+    }
+    state parse_ethernet {
+        packet.extract(hdr.ingress.ethernet);
+        transition select(packet.lookahead<bit<16>>()) {
+            ETHERTYPE_QINQ: parse_vlan_tag;
+            ETHERTYPE_VLAN &&& 0xefff: parse_vlan_tag;
+            default: parse_untagged;
+        }
+    }
+    state parse_vlan_tag {
+        packet.extract(hdr.ingress.vlan_tag);
+        fabric_md.ingress.bridged.base.vlan_id = hdr.ingress.vlan_tag.vlan_id;
+        transition select(packet.lookahead<bit<16>>()) {
+            default: parse_eth_type;
+        }
+    }
+    state parse_untagged {
+        fabric_md.ingress.bridged.base.vlan_id = DEFAULT_VLAN_ID;
+        transition parse_eth_type;
+    }
+    state parse_eth_type {
+        packet.extract(hdr.ingress.eth_type);
+        transition select(hdr.ingress.eth_type.value) {
+            ETHERTYPE_MPLS: parse_mpls;
+            ETHERTYPE_IPV4: parse_non_mpls;
+            ETHERTYPE_IPV6: parse_non_mpls;
+            default: accept;
+        }
+    }
+    state parse_mpls {
+        packet.extract(hdr.ingress.mpls);
+        fabric_md.ingress.bridged.base.mpls_label = hdr.ingress.mpls.label;
+        fabric_md.ingress.bridged.base.mpls_ttl = hdr.ingress.mpls.ttl;
+        transition select(packet.lookahead<bit<4>>()) {
+            4: parse_ipv4;
+            6: parse_ipv6;
+            default: reject_packet;
+        }
+    }
+    state reject_packet {
+        verify(false, error.PacketRejectedByParser);
+        transition accept;
+    }
+    state parse_non_mpls {
+        fabric_md.ingress.bridged.base.mpls_label = 0;
+        fabric_md.ingress.bridged.base.mpls_ttl = DEFAULT_MPLS_TTL + 1;
+        transition select(hdr.ingress.eth_type.value) {
+            ETHERTYPE_IPV4: parse_ipv4;
+            ETHERTYPE_IPV6: parse_ipv6;
+            default: accept;
+        }
+    }
+    state parse_ipv4 {
+        packet.extract(hdr.ingress.ipv4);
+        fabric_md.ingress.routing_ipv4_dst = hdr.ingress.ipv4.dst_addr;
+        fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV4;
+        transition select(hdr.ingress.ipv4.protocol) {
+            PROTO_TCP: parse_tcp;
+            PROTO_UDP: parse_udp;
+            PROTO_ICMP: parse_icmp;
+            default: accept;
+        }
+    }
+    state parse_ipv6 {
+        packet.extract(hdr.ingress.ipv6);
+        fabric_md.ingress.bridged.base.ip_eth_type = ETHERTYPE_IPV6;
+        transition select(hdr.ingress.ipv6.next_hdr) {
+            PROTO_TCP: parse_tcp;
+            PROTO_UDP: parse_udp;
+            PROTO_ICMPV6: parse_icmp;
+            default: accept;
+        }
+    }
+    state parse_icmp {
+        packet.extract(hdr.ingress.icmp);
+        transition accept;
+    }
+    state parse_tcp {
+        packet.extract(hdr.ingress.tcp);
+        transition accept;
+    }
+    state parse_udp {
+        packet.extract(hdr.ingress.udp);
+        gtpu_t gtpu = packet.lookahead<gtpu_t>();
+        transition select(hdr.ingress.udp.dport, gtpu.version, gtpu.msgtype) {
+            (GTPU_UDP_PORT, GTP_V1, GTPU_GPDU): parse_gtpu;
+            (VXLAN_UDP_PORT, default, default): parse_vxlan;
+            default: accept;
+        }
+    }
+    state parse_gtpu {
+        packet.extract(hdr.ingress.gtpu);
+        transition select(hdr.ingress.gtpu.ex_flag, hdr.ingress.gtpu.seq_flag, hdr.ingress.gtpu.npdu_flag) {
+            (0, 0, 0): set_gtpu_only;
+            default: parse_gtpu_options;
+        }
+    }
+    state set_gtpu_only {
+        fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_ONLY;
+        transition parse_inner_ipv4;
+    }
+    state parse_gtpu_options {
+        packet.extract(hdr.ingress.gtpu_options);
+        bit<8> gtpu_ext_len = packet.lookahead<bit<8>>();
+        transition select(hdr.ingress.gtpu_options.next_ext, gtpu_ext_len) {
+            (GTPU_NEXT_EXT_PSC, GTPU_EXT_PSC_LEN): parse_gtpu_ext_psc;
+            default: accept;
+        }
+    }
+    state parse_gtpu_ext_psc {
+        packet.extract(hdr.ingress.gtpu_ext_psc);
+        fabric_md.ingress.bridged.base.encap_presence = EncapPresence.GTPU_WITH_PSC;
+        transition select(hdr.ingress.gtpu_ext_psc.next_ext) {
+            GTPU_NEXT_EXT_NONE: parse_inner_ipv4;
+            default: accept;
+        }
+    }
+    state parse_vxlan {
+        packet.extract(hdr.ingress.vxlan);
+        fabric_md.ingress.bridged.base.encap_presence = EncapPresence.VXLAN;
+        transition parse_inner_ethernet;
+    }
+    state parse_inner_ethernet {
+        packet.extract(hdr.ingress.inner_ethernet);
+        packet.extract(hdr.ingress.inner_eth_type);
+        transition select(hdr.ingress.inner_eth_type.value) {
+            ETHERTYPE_IPV4: parse_inner_ipv4;
+            default: accept;
+        }
+    }
+    state parse_inner_ipv4 {
+        packet.extract(hdr.ingress.inner_ipv4);
+        transition select(hdr.ingress.inner_ipv4.protocol) {
+            PROTO_TCP: parse_inner_tcp;
+            PROTO_UDP: parse_inner_udp;
+            PROTO_ICMP: parse_inner_icmp;
+            default: accept;
+        }
+    }
+    state parse_inner_tcp {
+        packet.extract(hdr.ingress.inner_tcp);
+        transition accept;
+    }
+    state parse_inner_udp {
+        packet.extract(hdr.ingress.inner_udp);
+        transition accept;
+    }
+    state parse_inner_icmp {
+        packet.extract(hdr.ingress.inner_icmp);
+        transition accept;
+    }
+}
+
+control FabricDeparser(packet_out packet, in v1model_header_t hdr) {
+    apply {
+        packet.emit(hdr.ingress.fake_ethernet);
+        packet.emit(hdr.ingress.packet_in);
+        packet.emit(hdr.egress.report_ethernet);
+        packet.emit(hdr.egress.report_eth_type);
+        packet.emit(hdr.egress.report_mpls);
+        packet.emit(hdr.egress.report_ipv4);
+        packet.emit(hdr.egress.report_udp);
+        packet.emit(hdr.egress.report_fixed_header);
+        packet.emit(hdr.egress.common_report_header);
+        packet.emit(hdr.egress.local_report_header);
+        packet.emit(hdr.egress.drop_report_header);
+        packet.emit(hdr.ingress.ethernet);
+        packet.emit(hdr.ingress.vlan_tag);
+        packet.emit(hdr.ingress.eth_type);
+        packet.emit(hdr.ingress.mpls);
+        packet.emit(hdr.ingress.ipv4);
+        packet.emit(hdr.ingress.ipv6);
+        packet.emit(hdr.ingress.tcp);
+        packet.emit(hdr.ingress.udp);
+        packet.emit(hdr.ingress.icmp);
+        packet.emit(hdr.ingress.gtpu);
+        packet.emit(hdr.ingress.gtpu_options);
+        packet.emit(hdr.ingress.gtpu_ext_psc);
+        packet.emit(hdr.ingress.vxlan);
+        packet.emit(hdr.ingress.inner_ethernet);
+        packet.emit(hdr.ingress.inner_eth_type);
+        packet.emit(hdr.ingress.inner_ipv4);
+        packet.emit(hdr.ingress.inner_tcp);
+        packet.emit(hdr.ingress.inner_udp);
+        packet.emit(hdr.ingress.inner_icmp);
+    }
+}
+
+control Acl(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port, inout bit<1> drop_ctl) {
+    direct_counter(CounterType.packets_and_bytes) acl_counter;
+    action set_next_id_acl(next_id_t next_id) {
+        fabric_md.next_id = next_id;
+        acl_counter.count();
+        fabric_md.skip_next = false;
+        drop_ctl = 0;
+    }
+    action copy_to_cpu() {
+        clone_preserving_field_list(CloneType.I2E, (bit<32>)PACKET_IN_MIRROR_SESSION_ID, PRESERVE_INGRESS_PORT);
+        acl_counter.count();
+    }
+    action punt_to_cpu() {
+        copy_to_cpu();
+        fabric_md.skip_next = true;
+        fabric_md.punt_to_cpu = true;
+        drop_ctl = 1;
+    }
+    action drop() {
+        drop_ctl = 1;
+        fabric_md.skip_next = true;
+        fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_ACL_DENY;
+        acl_counter.count();
+    }
+    action set_output_port(FabricPortId_t port_num) {
+        standard_md.egress_spec = (PortId_t)port_num;
+        recirc_preserved_egress_port = port_num;
+        fabric_md.egress_port_set = true;
+        fabric_md.skip_next = true;
+        drop_ctl = 0;
+        acl_counter.count();
+    }
+    action nop_acl() {
+        acl_counter.count();
+    }
+    table acl {
+        key = {
+            fabric_md.bridged.base.ig_port: ternary @name("ig_port") ;
+            fabric_md.lkp.eth_dst         : ternary @name("eth_dst") ;
+            fabric_md.lkp.eth_src         : ternary @name("eth_src") ;
+            fabric_md.lkp.vlan_id         : ternary @name("vlan_id") ;
+            fabric_md.lkp.eth_type        : ternary @name("eth_type") ;
+            fabric_md.lkp.ipv4_src        : ternary @name("ipv4_src") ;
+            fabric_md.lkp.ipv4_dst        : ternary @name("ipv4_dst") ;
+            fabric_md.lkp.ip_proto        : ternary @name("ip_proto") ;
+            fabric_md.lkp.icmp_type       : ternary @name("icmp_type") ;
+            fabric_md.lkp.icmp_code       : ternary @name("icmp_code") ;
+            fabric_md.lkp.l4_sport        : ternary @name("l4_sport") ;
+            fabric_md.lkp.l4_dport        : ternary @name("l4_dport") ;
+            fabric_md.ig_port_type        : ternary @name("ig_port_type") ;
+        }
+        actions = {
+            set_next_id_acl;
+            punt_to_cpu;
+            copy_to_cpu;
+            drop;
+            set_output_port;
+            nop_acl;
+        }
+        const default_action = nop_acl();
+        size = 1024;
+        counters = acl_counter;
+    }
+    apply {
+        acl.apply();
+    }
+}
+
+control Next(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) {
+    @hidden action output(FabricPortId_t port_num) {
+        standard_md.egress_spec = (PortId_t)port_num;
+        recirc_preserved_egress_port = port_num;
+        fabric_md.egress_port_set = true;
+    }
+    @hidden action rewrite_smac(mac_addr_t smac) {
+        hdr.ethernet.src_addr = smac;
+    }
+    @hidden action rewrite_dmac(mac_addr_t dmac) {
+        hdr.ethernet.dst_addr = dmac;
+    }
+    @hidden action routing(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) {
+        rewrite_smac(smac);
+        rewrite_dmac(dmac);
+        output(port_num);
+    }
+    direct_counter(CounterType.packets_and_bytes) simple_counter;
+    action output_simple(FabricPortId_t port_num) {
+        output(port_num);
+        simple_counter.count();
+    }
+    action routing_simple(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) {
+        routing(port_num, smac, dmac);
+        simple_counter.count();
+    }
+    table simple {
+        key = {
+            fabric_md.next_id: exact @name("next_id") ;
+        }
+        actions = {
+            output_simple;
+            routing_simple;
+            @defaultonly nop;
+        }
+        const default_action = nop();
+        counters = simple_counter;
+        size = 1024;
+    }
+    @max_group_size(32w16) action_selector(HashAlgorithm.crc16, 32w16, 32w16) hashed_profile;
+    direct_counter(CounterType.packets_and_bytes) hashed_counter;
+    action output_hashed(FabricPortId_t port_num) {
+        output(port_num);
+        hashed_counter.count();
+    }
+    action routing_hashed(FabricPortId_t port_num, mac_addr_t smac, mac_addr_t dmac) {
+        routing(port_num, smac, dmac);
+        hashed_counter.count();
+    }
+    table hashed {
+        key = {
+            fabric_md.next_id  : exact @name("next_id") ;
+            fabric_md.ecmp_hash: selector;
+        }
+        actions = {
+            output_hashed;
+            routing_hashed;
+            @defaultonly nop;
+        }
+        implementation = hashed_profile;
+        counters = hashed_counter;
+        const default_action = nop();
+        size = 1024;
+    }
+    direct_counter(CounterType.packets_and_bytes) multicast_counter;
+    action set_mcast_group_id(MulticastGroupId_t group_id) {
+        standard_md.mcast_grp = group_id;
+        fabric_md.bridged.base.is_multicast = true;
+        multicast_counter.count();
+    }
+    action reset_mcast_group_id() {
+        standard_md.mcast_grp = 0;
+        fabric_md.bridged.base.is_multicast = false;
+    }
+    table multicast {
+        key = {
+            fabric_md.next_id: exact @name("next_id") ;
+        }
+        actions = {
+            set_mcast_group_id;
+            @defaultonly reset_mcast_group_id;
+        }
+        counters = multicast_counter;
+        const default_action = reset_mcast_group_id();
+        size = 1024;
+    }
+    apply {
+        simple.apply();
+        hashed.apply();
+        multicast.apply();
+    }
+}
+
+control EgressNextControl(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntDropReason_t recirc_preserved_drop_reason, inout bit<1> drop_ctl) {
+    @hidden action pop_mpls_if_present() {
+        hdr.mpls.setInvalid();
+        hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type;
+    }
+    @hidden action set_mpls() {
+        hdr.mpls.setValid();
+        hdr.mpls.label = fabric_md.bridged.base.mpls_label;
+        hdr.mpls.tc = 3w0;
+        hdr.mpls.bos = 1w1;
+        hdr.mpls.ttl = fabric_md.bridged.base.mpls_ttl;
+        hdr.eth_type.value = ETHERTYPE_MPLS;
+    }
+    @hidden action push_outer_vlan() {
+        hdr.vlan_tag.setValid();
+        hdr.vlan_tag.eth_type = ETHERTYPE_VLAN;
+        hdr.vlan_tag.vlan_id = fabric_md.bridged.base.vlan_id;
+    }
+    direct_counter(CounterType.packets_and_bytes) egress_vlan_counter;
+    action push_vlan() {
+        push_outer_vlan();
+        egress_vlan_counter.count();
+    }
+    action pop_vlan() {
+        hdr.vlan_tag.setInvalid();
+        egress_vlan_counter.count();
+    }
+    action drop() {
+        drop_ctl = 1;
+        egress_vlan_counter.count();
+        recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_EGRESS_NEXT_MISS;
+    }
+    table egress_vlan {
+        key = {
+            fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ;
+            standard_md.egress_port       : exact @name("eg_port") ;
+        }
+        actions = {
+            push_vlan;
+            pop_vlan;
+            @defaultonly drop;
+        }
+        const default_action = drop();
+        counters = egress_vlan_counter;
+        size = 1024;
+    }
+    apply {
+        if (fabric_md.bridged.base.is_multicast && fabric_md.bridged.base.ig_port == standard_md.egress_port) {
+            fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT;
+            drop_ctl = 1;
+        }
+        if (fabric_md.bridged.base.mpls_label == 0) {
+            if (hdr.mpls.isValid()) {
+                pop_mpls_if_present();
+            }
+        } else {
+            set_mpls();
+        }
+        if (!fabric_md.is_int_recirc) {
+            egress_vlan.apply();
+        }
+        bool regular_packet = true;
+        regular_packet = !(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP || fabric_md.bridged.bmd_type == BridgedMdType_t.EGRESS_MIRROR);
+        if (hdr.mpls.isValid()) {
+            hdr.mpls.ttl = hdr.mpls.ttl - 1;
+            if (hdr.mpls.ttl == 0) {
+                drop_ctl = 1;
+                recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_MPLS_TTL_ZERO;
+            }
+        } else {
+            if (hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) {
+                if (regular_packet) {
+                    hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
+                }
+                if (hdr.ipv4.ttl == 0) {
+                    drop_ctl = 1;
+                    recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO;
+                }
+            } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING) {
+                if (regular_packet) {
+                    hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1;
+                }
+                if (hdr.ipv6.hop_limit == 0) {
+                    drop_ctl = 1;
+                    recirc_preserved_drop_reason = IntDropReason_t.DROP_REASON_IP_TTL_ZERO;
+                }
+            }
+        }
+    }
+}
+
+const bit<10> UNSET_FLOW_ID = 0;
+control StatsIngress(in lookup_metadata_t lkp, in PortId_t ig_port, out bit<10> stats_flow_id) {
+    direct_counter(CounterType.packets_and_bytes) flow_counter;
+    action count(bit<10> flow_id) {
+        stats_flow_id = flow_id;
+        flow_counter.count();
+    }
+    table flows {
+        key = {
+            lkp.ipv4_src: ternary @name("ipv4_src") ;
+            lkp.ipv4_dst: ternary @name("ipv4_dst") ;
+            lkp.ip_proto: ternary @name("ip_proto") ;
+            lkp.l4_sport: ternary @name("l4_sport") ;
+            lkp.l4_dport: ternary @name("l4_dport") ;
+            ig_port     : exact @name("ig_port") ;
+        }
+        actions = {
+            count;
+        }
+        const default_action = count(UNSET_FLOW_ID);
+        const size = 1 << 10;
+        counters = flow_counter;
+    }
+    apply {
+        flows.apply();
+    }
+}
+
+control StatsEgress(in bit<10> stats_flow_id, in PortId_t eg_port, in BridgedMdType_t bmd_type) {
+    direct_counter(CounterType.packets_and_bytes) flow_counter;
+    action count() {
+        flow_counter.count();
+    }
+    table flows {
+        key = {
+            stats_flow_id: exact @name("stats_flow_id") ;
+            eg_port      : exact @name("eg_port") ;
+        }
+        actions = {
+            count;
+        }
+        const default_action = count;
+        const size = 1 << 10;
+        counters = flow_counter;
+    }
+    apply {
+        if (bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS) {
+            flows.apply();
+        }
+    }
+}
+
+control Hasher(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) {
+    flow_hash_t max = 0xffffffff;
+    flow_hash_t base = 0;
+    apply {
+        hash(fabric_md.bridged.base.inner_hash, HashAlgorithm.crc32, base, { fabric_md.lkp.ipv4_src, fabric_md.lkp.ipv4_dst, fabric_md.lkp.ip_proto, fabric_md.lkp.l4_sport, fabric_md.lkp.l4_dport }, max);
+        if (hdr.gtpu.isValid()) {
+            hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ipv4.src_addr, hdr.ipv4.dst_addr, hdr.gtpu.teid }, max);
+        } else if (fabric_md.lkp.is_ipv4) {
+            fabric_md.ecmp_hash = fabric_md.bridged.base.inner_hash;
+        } else {
+            fabric_md.bridged.base.inner_hash = 0;
+            hash(fabric_md.ecmp_hash, HashAlgorithm.crc32, base, { hdr.ethernet.dst_addr, hdr.ethernet.src_addr, hdr.eth_type.value }, max);
+        }
+    }
+}
+
+control IngressSliceTcClassifier(inout ingress_headers_t hdr, inout standard_metadata_t standard_md, inout fabric_ingress_metadata_t fabric_md) {
+    direct_counter(CounterType.packets) classifier_stats;
+    action set_slice_id_tc(slice_id_t slice_id, tc_t tc) {
+        fabric_md.slice_id = slice_id;
+        fabric_md.tc = tc;
+        fabric_md.tc_unknown = false;
+        classifier_stats.count();
+    }
+    action no_classification() {
+        set_slice_id_tc(DEFAULT_SLICE_ID, DEFAULT_TC);
+        fabric_md.tc_unknown = true;
+    }
+    action trust_dscp() {
+        fabric_md.slice_id = hdr.ipv4.dscp[4 + 2 - 1:2];
+        fabric_md.tc = hdr.ipv4.dscp[2 - 1:0];
+        fabric_md.tc_unknown = false;
+        classifier_stats.count();
+    }
+    table classifier {
+        key = {
+            fabric_md.bridged.base.ig_port: ternary @name("ig_port") ;
+            fabric_md.lkp.ipv4_src        : ternary @name("ipv4_src") ;
+            fabric_md.lkp.ipv4_dst        : ternary @name("ipv4_dst") ;
+            fabric_md.lkp.ip_proto        : ternary @name("ip_proto") ;
+            fabric_md.lkp.l4_sport        : ternary @name("l4_sport") ;
+            fabric_md.lkp.l4_dport        : ternary @name("l4_dport") ;
+        }
+        actions = {
+            set_slice_id_tc;
+            trust_dscp;
+            @defaultonly no_classification;
+        }
+        const default_action = no_classification();
+        counters = classifier_stats;
+        size = 512;
+    }
+    apply {
+        classifier.apply();
+    }
+}
+
+control IngressQos(inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) {
+    bit<2> packet_color = 2w0;
+    @hidden action use_upf() {
+        fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id ++ fabric_md.upf_tc;
+    }
+    @hidden action use_default() {
+        fabric_md.bridged.base.slice_tc = fabric_md.slice_id ++ fabric_md.tc;
+    }
+    @hidden table set_slice_tc {
+        key = {
+            fabric_md.is_upf_hit: exact;
+        }
+        actions = {
+            use_upf;
+            use_default;
+        }
+        const size = 2;
+        const entries = {
+                        true : use_upf;
+                        false : use_default;
+        }
+    }
+    meter(1 << 4 + 2, MeterType.bytes) slice_tc_meter;
+    direct_counter(CounterType.packets) queues_stats;
+    action set_queue(QueueId_t qid) {
+        queues_stats.count();
+    }
+    action meter_drop() {
+        drop_ctl = 1;
+        fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_INGRESS_QOS_METER;
+        queues_stats.count();
+    }
+    table queues {
+        key = {
+            fabric_md.bridged.base.slice_tc: exact @name("slice_tc") ;
+            packet_color                   : ternary @name("color") ;
+        }
+        actions = {
+            set_queue;
+            meter_drop;
+        }
+        const default_action = set_queue(QUEUE_ID_BEST_EFFORT);
+        counters = queues_stats;
+        size = 1 << 4 + 2 + 1;
+    }
+    action set_default_tc(tc_t tc) {
+        fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 + 2 - 1:2] ++ tc;
+    }
+    table default_tc {
+        key = {
+            fabric_md.bridged.base.slice_tc: ternary @name("slice_tc") ;
+            fabric_md.tc_unknown           : exact @name("tc_unknown") ;
+        }
+        actions = {
+            set_default_tc;
+            @defaultonly nop;
+        }
+        const default_action = nop;
+        size = 1 << 4;
+    }
+    apply {
+        set_slice_tc.apply();
+        default_tc.apply();
+        if (fabric_md.upf_meter_color != MeterColor_t.RED) {
+            slice_tc_meter.execute_meter((bit<32>)fabric_md.bridged.base.slice_tc, packet_color);
+        } else {
+            packet_color = MeterColor_t.RED;
+        }
+        queues.apply();
+    }
+}
+
+control EgressDscpRewriter(inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout ingress_headers_t hdr) {
+    bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;
+    action rewrite() {
+    }
+    action clear() {
+        tmp_dscp = 0;
+    }
+    table rewriter {
+        key = {
+            standard_md.egress_port: exact @name("eg_port") ;
+        }
+        actions = {
+            rewrite;
+            clear;
+            @defaultonly nop;
+        }
+        const default_action = nop;
+        size = 512;
+    }
+    apply {
+        if (rewriter.apply().hit) {
+            if (hdr.ipv4.isValid()) {
+                hdr.ipv4.dscp = tmp_dscp;
+            }
+        }
+    }
+}
+
+control FabricVerifyChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t meta) {
+    apply {
+        verify_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16);
+        verify_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16);
+    }
+}
+
+control FabricComputeChecksum(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md) {
+    apply {
+        update_checksum(hdr.ingress.ipv4.isValid(), { hdr.ingress.ipv4.version, hdr.ingress.ipv4.ihl, hdr.ingress.ipv4.dscp, hdr.ingress.ipv4.ecn, hdr.ingress.ipv4.total_len, hdr.ingress.ipv4.identification, hdr.ingress.ipv4.flags, hdr.ingress.ipv4.frag_offset, hdr.ingress.ipv4.ttl, hdr.ingress.ipv4.protocol, hdr.ingress.ipv4.src_addr, hdr.ingress.ipv4.dst_addr }, hdr.ingress.ipv4.hdr_checksum, HashAlgorithm.csum16);
+        update_checksum(hdr.ingress.inner_ipv4.isValid(), { hdr.ingress.inner_ipv4.version, hdr.ingress.inner_ipv4.ihl, hdr.ingress.inner_ipv4.dscp, hdr.ingress.inner_ipv4.ecn, hdr.ingress.inner_ipv4.total_len, hdr.ingress.inner_ipv4.identification, hdr.ingress.inner_ipv4.flags, hdr.ingress.inner_ipv4.frag_offset, hdr.ingress.inner_ipv4.ttl, hdr.ingress.inner_ipv4.protocol, hdr.ingress.inner_ipv4.src_addr, hdr.ingress.inner_ipv4.dst_addr }, hdr.ingress.inner_ipv4.hdr_checksum, HashAlgorithm.csum16);
+        update_checksum(hdr.egress.report_ipv4.isValid(), { hdr.egress.report_ipv4.version, hdr.egress.report_ipv4.ihl, hdr.egress.report_ipv4.dscp, hdr.egress.report_ipv4.ecn, hdr.egress.report_ipv4.total_len, hdr.egress.report_ipv4.identification, hdr.egress.report_ipv4.flags, hdr.egress.report_ipv4.frag_offset, hdr.egress.report_ipv4.ttl, hdr.egress.report_ipv4.protocol, hdr.egress.report_ipv4.src_addr, hdr.egress.report_ipv4.dst_addr }, hdr.egress.report_ipv4.hdr_checksum, HashAlgorithm.csum16);
+    }
+}
+
+control PacketIoIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout bool skip_egress, inout standard_metadata_t standard_md, inout FabricPortId_t recirc_preserved_egress_port) {
+    @hidden action do_packet_out() {
+        standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port;
+        recirc_preserved_egress_port = hdr.packet_out.egress_port;
+        fabric_md.egress_port_set = true;
+        hdr.packet_out.setInvalid();
+        skip_egress = true;
+        fabric_md.bridged.setInvalid();
+        exit;
+    }
+    apply {
+        if (hdr.packet_out.isValid()) {
+            do_packet_out();
+        }
+    }
+}
+
+control PacketIoEgress(inout ingress_headers_t hdr, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md, in FabricPortId_t preserved_ig_port) {
+    action set_switch_info(FabricPortId_t cpu_port) {
+        fabric_md.cpu_port = (PortId_t)cpu_port;
+    }
+    table switch_info {
+        actions = {
+            set_switch_info;
+            @defaultonly nop;
+        }
+        default_action = nop;
+        const size = 1;
+    }
+    apply {
+        switch_info.apply();
+        if (standard_md.egress_port == fabric_md.cpu_port) {
+            hdr.packet_in.setValid();
+            hdr.packet_in.ingress_port = preserved_ig_port;
+            hdr.fake_ethernet.setInvalid();
+            exit;
+        }
+        if (hdr.fake_ethernet.isValid() && hdr.fake_ethernet.ether_type == ETHERTYPE_CPU_LOOPBACK_EGRESS) {
+            fabric_md.pkt_length = (bit<16>)standard_md.packet_length - 14;
+        }
+    }
+}
+
+control PreNext(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md) {
+    direct_counter(CounterType.packets_and_bytes) next_mpls_counter;
+    action set_mpls_label(mpls_label_t label) {
+        fabric_md.bridged.base.mpls_label = label;
+        next_mpls_counter.count();
+    }
+    table next_mpls {
+        key = {
+            fabric_md.next_id: exact @name("next_id") ;
+        }
+        actions = {
+            set_mpls_label;
+            @defaultonly nop;
+        }
+        const default_action = nop();
+        counters = next_mpls_counter;
+        size = 1024;
+    }
+    direct_counter(CounterType.packets_and_bytes) next_vlan_counter;
+    action set_vlan(vlan_id_t vlan_id) {
+        fabric_md.bridged.base.vlan_id = vlan_id;
+        next_vlan_counter.count();
+    }
+    table next_vlan {
+        key = {
+            fabric_md.next_id: exact @name("next_id") ;
+        }
+        actions = {
+            set_vlan;
+            @defaultonly nop;
+        }
+        const default_action = nop();
+        counters = next_vlan_counter;
+        size = 1024;
+    }
+    apply {
+        next_mpls.apply();
+        next_vlan.apply();
+    }
+}
+
+control Filtering(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md) {
+    direct_counter(CounterType.packets_and_bytes) ingress_port_vlan_counter;
+    action deny() {
+        fabric_md.skip_forwarding = true;
+        fabric_md.skip_next = true;
+        fabric_md.ig_port_type = PortType_t.UNKNOWN;
+        fabric_md.bridged.int_bmd.drop_reason = IntDropReason_t.DROP_REASON_PORT_VLAN_MAPPING_MISS;
+        ingress_port_vlan_counter.count();
+    }
+    action permit(PortType_t port_type) {
+        fabric_md.ig_port_type = port_type;
+        ingress_port_vlan_counter.count();
+    }
+    action permit_with_internal_vlan(vlan_id_t vlan_id, PortType_t port_type) {
+        fabric_md.bridged.base.vlan_id = vlan_id;
+        permit(port_type);
+    }
+    table ingress_port_vlan {
+        key = {
+            fabric_md.bridged.base.ig_port: exact @name("ig_port") ;
+            hdr.vlan_tag.isValid()        : exact @name("vlan_is_valid") ;
+            hdr.vlan_tag.vlan_id          : ternary @name("vlan_id") ;
+        }
+        actions = {
+            deny();
+            permit();
+            permit_with_internal_vlan();
+        }
+        const default_action = deny();
+        counters = ingress_port_vlan_counter;
+        size = 1024;
+    }
+    direct_counter(CounterType.packets_and_bytes) fwd_classifier_counter;
+    action set_forwarding_type(fwd_type_t fwd_type) {
+        fabric_md.bridged.base.fwd_type = fwd_type;
+        fwd_classifier_counter.count();
+    }
+    counter(8, CounterType.packets_and_bytes) fwd_type_counter;
+    table fwd_classifier {
+        key = {
+            fabric_md.bridged.base.ig_port    : exact @name("ig_port") ;
+            fabric_md.lkp.eth_dst             : ternary @name("eth_dst") ;
+            fabric_md.lkp.eth_type            : ternary @name("eth_type") ;
+            fabric_md.bridged.base.ip_eth_type: exact @name("ip_eth_type") ;
+        }
+        actions = {
+            set_forwarding_type;
+        }
+        const default_action = set_forwarding_type(FWD_BRIDGING);
+        counters = fwd_classifier_counter;
+        size = 1024;
+    }
+    apply {
+        ingress_port_vlan.apply();
+        fwd_classifier.apply();
+        fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type);
+    }
+}
+
+control Forwarding(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) {
+    action set_int_drop_reason(bit<8> drop_reason) {
+        fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason;
+    }
+    @hidden action set_next_id(next_id_t next_id) {
+        fabric_md.next_id = next_id;
+    }
+    direct_counter(CounterType.packets_and_bytes) bridging_counter;
+    action set_next_id_bridging(next_id_t next_id) {
+        set_next_id(next_id);
+        bridging_counter.count();
+    }
+    table bridging {
+        key = {
+            fabric_md.bridged.base.vlan_id: exact @name("vlan_id") ;
+            hdr.ethernet.dst_addr         : ternary @name("eth_dst") ;
+        }
+        actions = {
+            set_next_id_bridging;
+            @defaultonly set_int_drop_reason;
+        }
+        const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_BRIDGING_MISS);
+        counters = bridging_counter;
+        size = 1024;
+    }
+    direct_counter(CounterType.packets_and_bytes) mpls_counter;
+    action pop_mpls_and_next(next_id_t next_id) {
+        hdr.mpls.setInvalid();
+        hdr.eth_type.value = fabric_md.bridged.base.ip_eth_type;
+        fabric_md.bridged.base.mpls_label = 0;
+        set_next_id(next_id);
+        mpls_counter.count();
+    }
+    table mpls {
+        key = {
+            fabric_md.bridged.base.mpls_label: exact @name("mpls_label") ;
+        }
+        actions = {
+            pop_mpls_and_next;
+            @defaultonly set_int_drop_reason;
+        }
+        const default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_MPLS_MISS);
+        counters = mpls_counter;
+        size = 1024;
+    }
+    direct_counter(CounterType.packets_and_bytes) routing_v4_counter;
+    action set_next_id_routing_v4(next_id_t next_id) {
+        set_next_id(next_id);
+        routing_v4_counter.count();
+    }
+    action nop_routing_v4() {
+        routing_v4_counter.count();
+    }
+    action drop_routing_v4() {
+        fabric_md.skip_next = true;
+        routing_v4_counter.count();
+        drop_ctl = 1;
+    }
+    table routing_v4 {
+        key = {
+            fabric_md.routing_ipv4_dst: lpm @name("ipv4_dst") ;
+        }
+        actions = {
+            set_next_id_routing_v4;
+            nop_routing_v4;
+            drop_routing_v4;
+            @defaultonly set_int_drop_reason;
+        }
+        default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V4_MISS);
+        counters = routing_v4_counter;
+        size = 1024;
+    }
+    direct_counter(CounterType.packets_and_bytes) routing_v6_counter;
+    action set_next_id_routing_v6(next_id_t next_id) {
+        set_next_id(next_id);
+        routing_v6_counter.count();
+    }
+    action drop_routing_v6() {
+        fabric_md.skip_next = true;
+        routing_v6_counter.count();
+        drop_ctl = 1;
+    }
+    table routing_v6 {
+        key = {
+            hdr.ipv6.dst_addr: lpm @name("ipv6_dst") ;
+        }
+        actions = {
+            set_next_id_routing_v6;
+            drop_routing_v6;
+            @defaultonly set_int_drop_reason;
+        }
+        default_action = set_int_drop_reason(IntDropReason_t.DROP_REASON_ROUTING_V6_MISS);
+        counters = routing_v6_counter;
+        size = 1024;
+    }
+    apply {
+        if (hdr.ethernet.isValid() && fabric_md.bridged.base.fwd_type == FWD_BRIDGING) {
+            bridging.apply();
+        } else if (hdr.mpls.isValid() && fabric_md.bridged.base.fwd_type == FWD_MPLS) {
+            mpls.apply();
+        } else if (fabric_md.lkp.is_ipv4 && (fabric_md.bridged.base.fwd_type == FWD_IPV4_UNICAST || fabric_md.bridged.base.fwd_type == FWD_IPV4_MULTICAST)) {
+            routing_v4.apply();
+        } else if (hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type == FWD_IPV6_UNICAST) {
+            routing_v6.apply();
+        }
+    }
+}
+
+control LookupMdInit(in ingress_headers_t hdr, out lookup_metadata_t lkp_md) {
+    apply {
+        lkp_md.eth_dst = hdr.ethernet.dst_addr;
+        lkp_md.eth_src = hdr.ethernet.src_addr;
+        lkp_md.eth_type = hdr.eth_type.value;
+        lkp_md.vlan_id = 0;
+        if (hdr.vlan_tag.isValid()) {
+            lkp_md.vlan_id = hdr.vlan_tag.vlan_id;
+        }
+        lkp_md.is_ipv4 = false;
+        lkp_md.ipv4_src = 0;
+        lkp_md.ipv4_dst = 0;
+        lkp_md.ip_proto = 0;
+        lkp_md.l4_sport = 0;
+        lkp_md.l4_dport = 0;
+        lkp_md.icmp_type = 0;
+        lkp_md.icmp_code = 0;
+        if (hdr.inner_ipv4.isValid()) {
+            lkp_md.is_ipv4 = true;
+            lkp_md.ipv4_src = hdr.inner_ipv4.src_addr;
+            lkp_md.ipv4_dst = hdr.inner_ipv4.dst_addr;
+            lkp_md.ip_proto = hdr.inner_ipv4.protocol;
+            if (hdr.inner_tcp.isValid()) {
+                lkp_md.l4_sport = hdr.inner_tcp.sport;
+                lkp_md.l4_dport = hdr.inner_tcp.dport;
+            } else if (hdr.inner_udp.isValid()) {
+                lkp_md.l4_sport = hdr.inner_udp.sport;
+                lkp_md.l4_dport = hdr.inner_udp.dport;
+            } else if (hdr.inner_icmp.isValid()) {
+                lkp_md.icmp_type = hdr.inner_icmp.icmp_type;
+                lkp_md.icmp_code = hdr.inner_icmp.icmp_code;
+            }
+        } else if (hdr.ipv4.isValid()) {
+            lkp_md.is_ipv4 = true;
+            lkp_md.ipv4_src = hdr.ipv4.src_addr;
+            lkp_md.ipv4_dst = hdr.ipv4.dst_addr;
+            lkp_md.ip_proto = hdr.ipv4.protocol;
+            if (hdr.tcp.isValid()) {
+                lkp_md.l4_sport = hdr.tcp.sport;
+                lkp_md.l4_dport = hdr.tcp.dport;
+            } else if (hdr.udp.isValid()) {
+                lkp_md.l4_sport = hdr.udp.sport;
+                lkp_md.l4_dport = hdr.udp.dport;
+            } else if (hdr.icmp.isValid()) {
+                lkp_md.icmp_type = hdr.icmp.icmp_type;
+                lkp_md.icmp_code = hdr.icmp.icmp_code;
+            }
+        }
+    }
+}
+
+control IntWatchlist(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout IntReportType_t recirc_preserved_report_type) {
+    direct_counter(CounterType.packets_and_bytes) watchlist_counter;
+    action mark_to_report() {
+        fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_FLOW;
+        recirc_preserved_report_type = INT_REPORT_TYPE_FLOW;
+        watchlist_counter.count();
+    }
+    action no_report() {
+        fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT;
+        recirc_preserved_report_type = INT_REPORT_TYPE_NO_REPORT;
+    }
+    action no_report_collector() {
+        fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_NO_REPORT;
+    }
+    table watchlist {
+        key = {
+            fabric_md.lkp.is_ipv4 : exact @name("ipv4_valid") ;
+            fabric_md.lkp.ipv4_src: ternary @name("ipv4_src") ;
+            fabric_md.lkp.ipv4_dst: ternary @name("ipv4_dst") ;
+            fabric_md.lkp.ip_proto: ternary @name("ip_proto") ;
+            fabric_md.lkp.l4_sport: range @name("l4_sport") ;
+            fabric_md.lkp.l4_dport: range @name("l4_dport") ;
+        }
+        actions = {
+            mark_to_report;
+            no_report_collector;
+            @defaultonly no_report();
+        }
+        const default_action = no_report();
+        const size = 64;
+        counters = watchlist_counter;
+    }
+    apply {
+        watchlist.apply();
+    }
+}
+
+control IntIngress(inout ingress_headers_t hdr, inout fabric_ingress_metadata_t fabric_md, inout standard_metadata_t standard_md, inout bit<1> drop_ctl) {
+    direct_counter(CounterType.packets_and_bytes) drop_report_counter;
+    @hidden action report_drop() {
+        fabric_md.bridged.bmd_type = BridgedMdType_t.INT_INGRESS_DROP;
+        fabric_md.bridged.int_bmd.report_type = INT_REPORT_TYPE_DROP;
+        fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID;
+        fabric_md.bridged.base.mpls_label = 0;
+        drop_ctl = 0;
+        standard_md.egress_spec = FAKE_V1MODEL_RECIRC_PORT;
+        drop_report_counter.count();
+    }
+    @hidden table drop_report {
+        key = {
+            fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ;
+            drop_ctl                             : exact @name("drop_ctl") ;
+            fabric_md.punt_to_cpu                : exact @name("punt_to_cpu") ;
+            fabric_md.egress_port_set            : exact @name("egress_port_set") ;
+            standard_md.mcast_grp                : ternary @name("mcast_group_id") ;
+        }
+        actions = {
+            report_drop;
+            @defaultonly nop;
+        }
+        const entries = {
+                        (INT_REPORT_TYPE_FLOW, 1, false, false, default) : report_drop();
+                        (INT_REPORT_TYPE_FLOW, 1, false, true, default) : report_drop();
+                        (INT_REPORT_TYPE_FLOW, 0, false, false, 0) : report_drop();
+        }
+        const default_action = nop();
+        counters = drop_report_counter;
+    }
+    apply {
+        fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec;
+        fabric_md.bridged.int_bmd.queue_id = 0;
+        drop_report.apply();
+    }
+}
+
+control IntEgress(inout v1model_header_t hdr_v1model, inout fabric_v1model_metadata_t fabric_v1model, inout standard_metadata_t standard_md) {
+    const bit<48> DEFAULT_TIMESTAMP_MASK = 0xffffc0000000;
+    const bit<32> DEFAULT_HOP_LATENCY_MASK = 0xffffff00;
+    egress_headers_t hdr = hdr_v1model.egress;
+    fabric_egress_metadata_t fabric_md = fabric_v1model.egress;
+    direct_counter(CounterType.packets_and_bytes) report_counter;
+    direct_counter(CounterType.packets_and_bytes) int_metadata_counter;
+    QueueId_t egress_qid = 0;
+    @hidden register<bit<32>>(1024) seq_number;
+    @hidden action get_seq_number(in bit<32> seq_number_idx, out bit<32> result) {
+        bit<32> reg = 0;
+        seq_number.read(reg, seq_number_idx);
+        reg = reg + 1;
+        result = reg;
+        seq_number.write(seq_number_idx, reg);
+    }
+    action check_quota() {
+    }
+    action reset_quota() {
+    }
+    table queue_latency_thresholds {
+        key = {
+            egress_qid                         : exact @name("egress_qid") ;
+            fabric_md.int_md.hop_latency[31:16]: range @name("hop_latency_upper") ;
+            fabric_md.int_md.hop_latency[15:0] : range @name("hop_latency_lower") ;
+        }
+        actions = {
+            check_quota;
+            reset_quota;
+            @defaultonly nop;
+        }
+        default_action = nop();
+        const size = 32 * 4;
+    }
+    action set_config(bit<32> hop_latency_mask, bit<48> timestamp_mask) {
+        fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask;
+        fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask;
+    }
+    table config {
+        actions = {
+            @defaultonly set_config;
+        }
+        default_action = set_config(DEFAULT_HOP_LATENCY_MASK, DEFAULT_TIMESTAMP_MASK);
+        const size = 1;
+    }
+    @hidden action _report_encap_common(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) {
+        random(hdr.report_ipv4.identification, 0, 0xffff);
+        hdr.report_ipv4.src_addr = src_ip;
+        hdr.report_ipv4.dst_addr = mon_ip;
+        hdr.report_udp.dport = mon_port;
+        get_seq_number((bit<32>)hdr.report_fixed_header.hw_id, hdr.report_fixed_header.seq_no);
+        hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type;
+        hdr.common_report_header.switch_id = switch_id;
+        hdr.common_report_header.pad1 = 0;
+        hdr.common_report_header.pad2 = 0;
+        hdr.common_report_header.pad3 = 0;
+        hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type;
+        fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INVALID;
+        report_counter.count();
+    }
+    action do_local_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) {
+        _report_encap_common(src_ip, mon_ip, mon_port, switch_id);
+        hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4;
+        hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER;
+        hdr.local_report_header.setValid();
+    }
+    action do_local_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) {
+        do_local_report_encap(src_ip, mon_ip, mon_port, switch_id);
+        hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS;
+        hdr.report_mpls.setValid();
+        hdr.report_mpls.tc = 0;
+        hdr.report_mpls.bos = 0;
+        hdr.report_mpls.ttl = DEFAULT_MPLS_TTL;
+        hdr.report_mpls.label = mon_label;
+    }
+    action do_drop_report_encap(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, bit<32> switch_id) {
+        _report_encap_common(src_ip, mon_ip, mon_port, switch_id);
+        hdr.report_eth_type.value = ETHERTYPE_INT_WIP_IPV4;
+        hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_DROP_HEADER;
+        hdr.drop_report_header.setValid();
+        hdr.local_report_header.setInvalid();
+        hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason;
+    }
+    action do_drop_report_encap_mpls(ipv4_addr_t src_ip, ipv4_addr_t mon_ip, l4_port_t mon_port, mpls_label_t mon_label, bit<32> switch_id) {
+        do_drop_report_encap(src_ip, mon_ip, mon_port, switch_id);
+        hdr.report_eth_type.value = ETHERTYPE_INT_WIP_MPLS;
+        hdr.report_mpls.setValid();
+        hdr.report_mpls.tc = 0;
+        hdr.report_mpls.bos = 0;
+        hdr.report_mpls.ttl = DEFAULT_MPLS_TTL;
+        hdr.report_mpls.label = mon_label;
+        hdr.report_mpls.label = mon_label;
+    }
+    table report {
+        key = {
+            fabric_md.int_report_md.bmd_type   : exact @name("bmd_type") ;
+            fabric_md.int_report_md.mirror_type: exact @name("mirror_type") ;
+            fabric_md.int_report_md.report_type: exact @name("int_report_type") ;
+        }
+        actions = {
+            do_local_report_encap;
+            do_local_report_encap_mpls;
+            do_drop_report_encap;
+            do_drop_report_encap_mpls;
+            @defaultonly nop();
+        }
+        default_action = nop;
+        const size = 6;
+        counters = report_counter;
+    }
+    @hidden action init_int_metadata(bit<3> report_type) {
+        fabric_md.bridged.int_bmd.mirror_session_id = V1MODEL_INT_MIRROR_SESSION;
+        fabric_md.int_report_md.setValid();
+        fabric_v1model.int_mirror_type = (bit<3>)FabricMirrorType_t.INT_REPORT;
+        fabric_md.int_report_md.bmd_type = BridgedMdType_t.EGRESS_MIRROR;
+        fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INT_REPORT;
+        fabric_md.int_report_md.report_type = fabric_md.bridged.int_bmd.report_type;
+        fabric_md.int_report_md.ig_port = fabric_md.bridged.base.ig_port;
+        fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port;
+        fabric_md.int_report_md.queue_id = egress_qid;
+        fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth;
+        fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0];
+        fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0];
+        fabric_md.int_report_md.ip_eth_type = fabric_md.bridged.base.ip_eth_type;
+        fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash;
+        fabric_md.int_report_md.report_type = report_type;
+        int_metadata_counter.count();
+    }
+    @hidden table int_metadata {
+        key = {
+            fabric_md.bridged.int_bmd.report_type: exact @name("int_report_type") ;
+            fabric_v1model.drop_ctl              : exact @name("drop_ctl") ;
+            fabric_md.int_md.queue_report        : exact @name("queue_report") ;
+        }
+        actions = {
+            init_int_metadata;
+            @defaultonly nop();
+        }
+        const default_action = nop();
+        const entries = {
+                        (INT_REPORT_TYPE_FLOW, 0, false) : init_int_metadata(INT_REPORT_TYPE_FLOW);
+                        (INT_REPORT_TYPE_FLOW, 1, false) : init_int_metadata(INT_REPORT_TYPE_DROP);
+        }
+        counters = int_metadata_counter;
+    }
+    @hidden action adjust_ip_udp_len(bit<16> adjust_ip, bit<16> adjust_udp) {
+        hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip;
+        hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp;
+    }
+    @hidden table adjust_int_report_hdr_length {
+        key = {
+            fabric_md.bridged.int_bmd.wip_type: exact @name("is_int_wip") ;
+        }
+        actions = {
+            @defaultonly nop();
+            adjust_ip_udp_len;
+        }
+        const default_action = nop();
+        const entries = {
+                        INT_IS_WIP : adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES);
+                        INT_IS_WIP_WITH_MPLS : adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES);
+        }
+    }
+    apply {
+        fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0];
+        fabric_md.int_md.timestamp = standard_md.egress_global_timestamp;
+        queue_latency_thresholds.apply();
+        config.apply();
+        hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7];
+        if (fabric_md.int_report_md.isValid()) {
+            report.apply();
+        } else {
+            if (int_metadata.apply().hit) {
+                clone_preserving_field_list(CloneType.E2E, (bit<32>)fabric_md.bridged.int_bmd.mirror_session_id, PRESERVE_INT_MD);
+            }
+        }
+        adjust_int_report_hdr_length.apply();
+        fabric_v1model.egress = fabric_md;
+        hdr_v1model.egress = hdr;
+    }
+}
+
+control IntTnaEgressParserEmulator(inout v1model_header_t hdr_v1model, inout fabric_egress_metadata_t fabric_md, inout standard_metadata_t standard_md) {
+    egress_headers_t hdr = hdr_v1model.egress;
+    @hidden action set_common_int_headers() {
+        hdr.report_ethernet.setValid();
+        hdr.report_eth_type.setValid();
+        hdr.report_ipv4.setValid();
+        hdr.report_ipv4.version = 4w4;
+        hdr.report_ipv4.ihl = 4w5;
+        hdr.report_ipv4.dscp = 0;
+        hdr.report_ipv4.ecn = 2w0;
+        hdr.report_ipv4.flags = 0;
+        hdr.report_ipv4.frag_offset = 0;
+        hdr.report_ipv4.ttl = DEFAULT_IPV4_TTL;
+        hdr.report_ipv4.protocol = PROTO_UDP;
+        hdr.report_udp.setValid();
+        hdr.report_udp.sport = 0;
+        hdr.report_fixed_header.setValid();
+        hdr.report_fixed_header.ver = 0;
+        hdr.report_fixed_header.nproto = NPROTO_TELEMETRY_SWITCH_LOCAL_HEADER;
+        hdr.report_fixed_header.rsvd = 0;
+        hdr.common_report_header.setValid();
+    }
+    @hidden action set_common_int_drop_headers() {
+        set_common_int_headers();
+        fabric_md.int_report_md.setValid();
+        fabric_md.int_report_md.ip_eth_type = ETHERTYPE_IPV4;
+        fabric_md.int_report_md.report_type = INT_REPORT_TYPE_DROP;
+        fabric_md.int_report_md.mirror_type = FabricMirrorType_t.INVALID;
+        hdr.drop_report_header.setValid();
+    }
+    @hidden action parse_int_ingress_drop() {
+        set_common_int_drop_headers();
+        fabric_md.int_report_md.bmd_type = BridgedMdType_t.INT_INGRESS_DROP;
+        fabric_md.int_report_md.encap_presence = fabric_md.bridged.base.encap_presence;
+        fabric_md.int_report_md.flow_hash = fabric_md.bridged.base.inner_hash;
+        hdr.drop_report_header.drop_reason = fabric_md.bridged.int_bmd.drop_reason;
+        hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0];
+        hdr.common_report_header.ig_port = fabric_md.bridged.base.ig_port;
+        hdr.common_report_header.eg_port = 0;
+        hdr.common_report_header.queue_id = 0;
+    }
+    @hidden action parse_int_report_mirror() {
+        set_common_int_headers();
+        fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type;
+        fabric_md.bridged.base.vlan_id = DEFAULT_VLAN_ID;
+        fabric_md.bridged.base.mpls_label = 0;
+        hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp;
+        hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port;
+        hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port;
+        hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id;
+        hdr.local_report_header.setValid();
+        hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy;
+        hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp;
+    }
+    apply {
+        fabric_md.is_int_recirc = true;
+        hdr_v1model.ingress.vlan_tag.setInvalid();
+        if (hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()) {
+            hdr_v1model.ingress.ipv4.setInvalid();
+            hdr_v1model.ingress.tcp.setInvalid();
+            hdr_v1model.ingress.udp.setInvalid();
+            hdr_v1model.ingress.icmp.setInvalid();
+            hdr_v1model.ingress.vxlan.setInvalid();
+            hdr_v1model.ingress.inner_ethernet.setInvalid();
+            hdr_v1model.ingress.inner_eth_type.setInvalid();
+            hdr_v1model.ingress.gtpu.setInvalid();
+            hdr_v1model.ingress.gtpu_options.setInvalid();
+            hdr_v1model.ingress.gtpu_ext_psc.setInvalid();
+        }
+        if ((bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) {
+            parse_int_ingress_drop();
+            recirculate_preserving_field_list(NO_PRESERVATION);
+        } else {
+            parse_int_report_mirror();
+            recirculate_preserving_field_list(PRESERVE_INT_MD);
+        }
+        hdr_v1model.egress = hdr;
+    }
+}
+
+control FabricIngress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) {
+    LookupMdInit() lkp_md_init;
+    StatsIngress() stats;
+    PacketIoIngress() pkt_io;
+    Filtering() filtering;
+    Forwarding() forwarding;
+    PreNext() pre_next;
+    Acl() acl;
+    Next() next;
+    Hasher() hasher;
+    IngressSliceTcClassifier() slice_tc_classifier;
+    IngressQos() qos;
+    IntWatchlist() int_watchlist;
+    IntIngress() int_ingress;
+    apply {
+        mark_to_drop(standard_md);
+        if (standard_md.parser_error == error.PacketRejectedByParser) {
+            exit;
+        }
+        if (standard_md.instance_type == 4) {
+            fabric_md.ingress.bridged.base.ig_port = FAKE_V1MODEL_RECIRC_PORT;
+        }
+        lkp_md_init.apply(hdr.ingress, fabric_md.ingress.lkp);
+        pkt_io.apply(hdr.ingress, fabric_md.ingress, fabric_md.skip_egress, standard_md, fabric_md.recirc_preserved_egress_port);
+        int_watchlist.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_report_type);
+        stats.apply(fabric_md.ingress.lkp, fabric_md.ingress.bridged.base.ig_port, fabric_md.ingress.bridged.base.stats_flow_id);
+        slice_tc_classifier.apply(hdr.ingress, standard_md, fabric_md.ingress);
+        filtering.apply(hdr.ingress, fabric_md.ingress, standard_md);
+        if (!fabric_md.ingress.skip_forwarding) {
+            forwarding.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl);
+        }
+        hasher.apply(hdr.ingress, fabric_md.ingress);
+        if (!fabric_md.ingress.skip_next) {
+            pre_next.apply(hdr.ingress, fabric_md.ingress);
+        }
+        acl.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port, fabric_md.drop_ctl);
+        if (!fabric_md.ingress.skip_next) {
+            next.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.recirc_preserved_egress_port);
+        }
+        qos.apply(fabric_md.ingress, standard_md, fabric_md.drop_ctl);
+        int_ingress.apply(hdr.ingress, fabric_md.ingress, standard_md, fabric_md.drop_ctl);
+        fabric_md.egress.bridged = fabric_md.ingress.bridged;
+        if (fabric_md.drop_ctl == 1) {
+            mark_to_drop(standard_md);
+        }
+    }
+}
+
+control FabricEgress(inout v1model_header_t hdr, inout fabric_v1model_metadata_t fabric_md, inout standard_metadata_t standard_md) {
+    StatsEgress() stats;
+    PacketIoEgress() pkt_io_egress;
+    EgressNextControl() egress_next;
+    EgressDscpRewriter() dscp_rewriter;
+    IntTnaEgressParserEmulator() parser_emulator;
+    IntEgress() int_egress;
+    apply {
+        fabric_md.egress.cpu_port = 0;
+        if (fabric_md.skip_egress) {
+            exit;
+        }
+        if (standard_md.instance_type == 2) {
+            fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md.recirc_preserved_drop_reason;
+            fabric_md.egress.bridged.int_bmd.report_type = fabric_md.recirc_preserved_report_type;
+            parser_emulator.apply(hdr, fabric_md.egress, standard_md);
+        }
+        if ((bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP) {
+            parser_emulator.apply(hdr, fabric_md.egress, standard_md);
+        }
+        pkt_io_egress.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_ingress_port);
+        stats.apply(fabric_md.egress.bridged.base.stats_flow_id, standard_md.egress_port, fabric_md.egress.bridged.bmd_type);
+        egress_next.apply(hdr.ingress, fabric_md.egress, standard_md, fabric_md.recirc_preserved_drop_reason, fabric_md.drop_ctl);
+        int_egress.apply(hdr, fabric_md, standard_md);
+        dscp_rewriter.apply(fabric_md.egress, standard_md, hdr.ingress);
+        if (fabric_md.do_upf_uplink_recirc) {
+            recirculate_preserving_field_list(NO_PRESERVATION);
+        }
+        if (fabric_md.drop_ctl == 1) {
+            mark_to_drop(standard_md);
+        }
+    }
+}
+
+V1Switch(FabricParser(), FabricVerifyChecksum(), FabricIngress(), FabricEgress(), FabricComputeChecksum(), FabricDeparser()) main;
+
diff --git a/src/tests/p4-int-routing-acl/p4src/bmv2.json b/src/tests/p4-int-routing-acl/p4src/bmv2.json
new file mode 100644
index 0000000000000000000000000000000000000000..80136b953ec822618243c8d325fbfbca201ab7cc
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/p4src/bmv2.json
@@ -0,0 +1,21728 @@
+{
+  "header_types" : [
+    {
+      "name" : "scalars_0",
+      "id" : 0,
+      "fields" : [
+        ["tmp_2", 16, false],
+        ["tmp_4", 1, false],
+        ["tmp_6", 16, false],
+        ["tmp_12", 3, false],
+        ["tmp_13", 8, false],
+        ["gtpu_ext_len_0", 8, false],
+        ["tmp_3", 16, false],
+        ["tmp_5", 16, false],
+        ["tmp_7", 4, false],
+        ["tmp_8", 112, false],
+        ["tmp_9", 112, false],
+        ["tmp_10", 112, false],
+        ["tmp_11", 64, false],
+        ["tmp_14", 32, false],
+        ["tmp_15", 32, false],
+        ["tmp_16", 32, false],
+        ["tmp_17", 32, false],
+        ["tmp_18", 48, false],
+        ["tmp_19", 48, false],
+        ["tmp_20", 16, false],
+        ["tmp_21", 32, false],
+        ["tmp_22", 32, false],
+        ["tmp_23", 8, false],
+        ["tmp_24", 16, false],
+        ["tmp_25", 16, false],
+        ["tmp_26", 32, false],
+        ["qos_packet_color", 2, false],
+        ["tmp_27", 32, false],
+        ["tmp_28", 32, false],
+        ["tmp_29", 32, false],
+        ["tmp_30", 32, false],
+        ["tmp_31", 32, false],
+        ["tmp_32", 32, false],
+        ["tmp_33", 32, false],
+        ["tmp_34", 32, false],
+        ["tmp_35", 32, false],
+        ["dscp_rewriter_tmp_dscp", 6, false],
+        ["int_egress_fabric_md_pkt_length", 16, false],
+        ["int_egress_egress_qid", 5, false],
+        ["int_egress_reg", 32, false],
+        ["key_0", 16, false],
+        ["key_1", 16, false],
+        ["userMetadata._skip_egress0", 1, false],
+        ["userMetadata._do_upf_uplink_recirc1", 1, false],
+        ["userMetadata._drop_ctl2", 1, false],
+        ["userMetadata._int_mirror_type3", 3, false],
+        ["userMetadata._ingress_ecmp_hash5", 32, false],
+        ["userMetadata._ingress_lkp_eth_dst6", 48, false],
+        ["userMetadata._ingress_lkp_eth_src7", 48, false],
+        ["userMetadata._ingress_lkp_eth_type8", 16, false],
+        ["userMetadata._ingress_lkp_vlan_id9", 12, false],
+        ["userMetadata._ingress_lkp_is_ipv410", 1, false],
+        ["userMetadata._ingress_lkp_ipv4_src11", 32, false],
+        ["userMetadata._ingress_lkp_ipv4_dst12", 32, false],
+        ["userMetadata._ingress_lkp_ip_proto13", 8, false],
+        ["userMetadata._ingress_lkp_l4_sport14", 16, false],
+        ["userMetadata._ingress_lkp_l4_dport15", 16, false],
+        ["userMetadata._ingress_lkp_icmp_type16", 8, false],
+        ["userMetadata._ingress_lkp_icmp_code17", 8, false],
+        ["userMetadata._ingress_routing_ipv4_dst18", 32, false],
+        ["userMetadata._ingress_skip_forwarding19", 1, false],
+        ["userMetadata._ingress_skip_next20", 1, false],
+        ["userMetadata._ingress_next_id21", 32, false],
+        ["userMetadata._ingress_egress_port_set22", 1, false],
+        ["userMetadata._ingress_punt_to_cpu23", 1, false],
+        ["userMetadata._ingress_ipv4_checksum_err24", 1, false],
+        ["userMetadata._ingress_inner_ipv4_checksum_err25", 1, false],
+        ["userMetadata._ingress_slice_id26", 4, false],
+        ["userMetadata._ingress_tc27", 2, false],
+        ["userMetadata._ingress_tc_unknown28", 1, false],
+        ["userMetadata._ingress_is_upf_hit29", 1, false],
+        ["userMetadata._ingress_upf_slice_id30", 4, false],
+        ["userMetadata._ingress_upf_tc31", 2, false],
+        ["userMetadata._ingress_upf_meter_color32", 2, false],
+        ["userMetadata._ingress_ig_port_type33", 2, false],
+        ["userMetadata._ingress_mirror_mirror_session_id34", 10, false],
+        ["userMetadata._ingress_mirror_bmd_type35", 8, false],
+        ["userMetadata._egress_cpu_port37", 9, false],
+        ["userMetadata._egress_int_md_hop_latency39", 32, false],
+        ["userMetadata._egress_int_md_timestamp40", 48, false],
+        ["userMetadata._egress_int_md_vlan_stripped41", 1, false],
+        ["userMetadata._egress_int_md_queue_report42", 1, false],
+        ["userMetadata._egress_int_ipv4_len43", 16, false],
+        ["userMetadata._egress_is_int_recirc44", 1, false],
+        ["userMetadata._egress_pkt_length45", 16, false],
+        ["userMetadata._recirc_preserved_report_type46", 3, false],
+        ["userMetadata._recirc_preserved_egress_port47", 9, false],
+        ["userMetadata._recirc_preserved_drop_reason48", 8, false],
+        ["userMetadata._recirc_preserved_ingress_port49", 9, false],
+        ["_padding_1", 5, false]
+      ]
+    },
+    {
+      "name" : "fake_ethernet_t",
+      "id" : 1,
+      "fields" : [
+        ["_pad0", 48, false],
+        ["_pad1", 48, false],
+        ["ether_type", 16, false]
+      ]
+    },
+    {
+      "name" : "packet_out_header_t",
+      "id" : 2,
+      "fields" : [
+        ["pad0", 7, false],
+        ["egress_port", 9, false],
+        ["pad1", 3, false],
+        ["queue_id", 5, false],
+        ["pad2", 5, false],
+        ["cpu_loopback_mode", 2, false],
+        ["do_forwarding", 1, false],
+        ["pad3", 16, false],
+        ["pad4", 48, false],
+        ["ether_type", 16, false]
+      ]
+    },
+    {
+      "name" : "gtpu_t",
+      "id" : 3,
+      "fields" : [
+        ["version", 3, false],
+        ["pt", 1, false],
+        ["spare", 1, false],
+        ["ex_flag", 1, false],
+        ["seq_flag", 1, false],
+        ["npdu_flag", 1, false],
+        ["msgtype", 8, false],
+        ["msglen", 16, false],
+        ["teid", 32, false]
+      ]
+    },
+    {
+      "name" : "ethernet_t",
+      "id" : 4,
+      "fields" : [
+        ["dst_addr", 48, false],
+        ["src_addr", 48, false]
+      ]
+    },
+    {
+      "name" : "eth_type_t",
+      "id" : 5,
+      "fields" : [
+        ["value", 16, false]
+      ]
+    },
+    {
+      "name" : "ipv4_t",
+      "id" : 6,
+      "fields" : [
+        ["version", 4, false],
+        ["ihl", 4, false],
+        ["dscp", 6, false],
+        ["ecn", 2, false],
+        ["total_len", 16, false],
+        ["identification", 16, false],
+        ["flags", 3, false],
+        ["frag_offset", 13, false],
+        ["ttl", 8, false],
+        ["protocol", 8, false],
+        ["hdr_checksum", 16, false],
+        ["src_addr", 32, false],
+        ["dst_addr", 32, false]
+      ]
+    },
+    {
+      "name" : "udp_t",
+      "id" : 7,
+      "fields" : [
+        ["sport", 16, false],
+        ["dport", 16, false],
+        ["len", 16, false],
+        ["checksum", 16, false]
+      ]
+    },
+    {
+      "name" : "report_fixed_header_t",
+      "id" : 8,
+      "fields" : [
+        ["ver", 4, false],
+        ["nproto", 4, false],
+        ["dqf", 3, false],
+        ["rsvd", 15, false],
+        ["hw_id", 6, false],
+        ["seq_no", 32, false],
+        ["ig_tstamp", 32, false]
+      ]
+    },
+    {
+      "name" : "common_report_header_t",
+      "id" : 9,
+      "fields" : [
+        ["switch_id", 32, false],
+        ["pad1", 7, false],
+        ["ig_port", 9, false],
+        ["pad2", 7, false],
+        ["eg_port", 9, false],
+        ["pad3", 3, false],
+        ["queue_id", 5, false]
+      ]
+    },
+    {
+      "name" : "local_report_header_t",
+      "id" : 10,
+      "fields" : [
+        ["pad1", 5, false],
+        ["queue_occupancy", 19, false],
+        ["eg_tstamp", 32, false]
+      ]
+    },
+    {
+      "name" : "drop_report_header_t",
+      "id" : 11,
+      "fields" : [
+        ["drop_reason", 8, false],
+        ["pad", 16, false]
+      ]
+    },
+    {
+      "name" : "mpls_t",
+      "id" : 12,
+      "fields" : [
+        ["label", 20, false],
+        ["tc", 3, false],
+        ["bos", 1, false],
+        ["ttl", 8, false]
+      ]
+    },
+    {
+      "name" : "bridged_metadata_t",
+      "id" : 13,
+      "fields" : [
+        ["_bmd_type0", 8, false],
+        ["_base_inner_hash1", 32, false],
+        ["_base_mpls_label2", 20, false],
+        ["_base_ig_port3", 9, false],
+        ["_base_is_multicast4", 1, 0],
+        ["_base_fwd_type5", 3, false],
+        ["_base_vlan_id6", 12, false],
+        ["_base_encap_presence7", 2, false],
+        ["_base_mpls_ttl8", 8, false],
+        ["_base_ig_tstamp9", 48, false],
+        ["_base_ip_eth_type10", 16, false],
+        ["_base_stats_flow_id11", 10, false],
+        ["_base_slice_tc12", 6, false],
+        ["_int_bmd_report_type13", 3, false],
+        ["_int_bmd_mirror_session_id14", 10, false],
+        ["_int_bmd_drop_reason15", 8, false],
+        ["_int_bmd_queue_id16", 5, false],
+        ["_int_bmd_egress_port17", 9, false],
+        ["_int_bmd_wip_type18", 8, false],
+        ["__pad019", 1, false],
+        ["__pad220", 5, false]
+      ]
+    },
+    {
+      "name" : "int_report_metadata_t",
+      "id" : 14,
+      "fields" : [
+        ["bmd_type", 8, false],
+        ["_pad0", 5, false],
+        ["mirror_type", 3, false],
+        ["_pad1", 7, false],
+        ["ig_port", 9, false],
+        ["_pad2", 7, false],
+        ["eg_port", 9, false],
+        ["_pad3", 3, false],
+        ["queue_id", 5, false],
+        ["_pad4", 5, false],
+        ["queue_occupancy", 19, false],
+        ["ig_tstamp", 32, false],
+        ["eg_tstamp", 32, false],
+        ["drop_reason", 8, false],
+        ["ip_eth_type", 16, false],
+        ["_pad5", 6, false],
+        ["encap_presence", 2, false],
+        ["report_type", 3, false],
+        ["_pad6", 5, false],
+        ["flow_hash", 32, false]
+      ]
+    },
+    {
+      "name" : "int_metadata_t",
+      "id" : 15,
+      "fields" : [
+        ["hop_latency", 32, false],
+        ["timestamp", 48, false],
+        ["vlan_stripped", 1, 0],
+        ["queue_report", 1, 0],
+        ["_padding", 6, false]
+      ]
+    },
+    {
+      "name" : "standard_metadata",
+      "id" : 16,
+      "fields" : [
+        ["ingress_port", 9, false],
+        ["egress_spec", 9, false],
+        ["egress_port", 9, false],
+        ["instance_type", 32, false],
+        ["packet_length", 32, false],
+        ["enq_timestamp", 32, false],
+        ["enq_qdepth", 19, false],
+        ["deq_timedelta", 32, false],
+        ["deq_qdepth", 19, false],
+        ["ingress_global_timestamp", 48, false],
+        ["egress_global_timestamp", 48, false],
+        ["mcast_grp", 16, false],
+        ["egress_rid", 16, false],
+        ["checksum_error", 1, false],
+        ["parser_error", 32, false],
+        ["priority", 3, false],
+        ["_padding_0", 3, false]
+      ]
+    },
+    {
+      "name" : "packet_in_header_t",
+      "id" : 17,
+      "fields" : [
+        ["ingress_port", 9, false],
+        ["_pad0", 7, false]
+      ]
+    },
+    {
+      "name" : "vlan_tag_t",
+      "id" : 18,
+      "fields" : [
+        ["eth_type", 16, false],
+        ["pri", 3, false],
+        ["cfi", 1, false],
+        ["vlan_id", 12, false]
+      ]
+    },
+    {
+      "name" : "ipv6_t",
+      "id" : 19,
+      "fields" : [
+        ["version", 4, false],
+        ["traffic_class", 8, false],
+        ["flow_label", 20, false],
+        ["payload_len", 16, false],
+        ["next_hdr", 8, false],
+        ["hop_limit", 8, false],
+        ["src_addr", 128, false],
+        ["dst_addr", 128, false]
+      ]
+    },
+    {
+      "name" : "tcp_t",
+      "id" : 20,
+      "fields" : [
+        ["sport", 16, false],
+        ["dport", 16, false]
+      ]
+    },
+    {
+      "name" : "icmp_t",
+      "id" : 21,
+      "fields" : [
+        ["icmp_type", 8, false],
+        ["icmp_code", 8, false]
+      ]
+    },
+    {
+      "name" : "gtpu_options_t",
+      "id" : 22,
+      "fields" : [
+        ["seq_num", 16, false],
+        ["n_pdu_num", 8, false],
+        ["next_ext", 8, false]
+      ]
+    },
+    {
+      "name" : "gtpu_ext_psc_t",
+      "id" : 23,
+      "fields" : [
+        ["len", 8, false],
+        ["type", 4, false],
+        ["spare0", 4, false],
+        ["ppp", 1, false],
+        ["rqi", 1, false],
+        ["qfi", 6, false],
+        ["next_ext", 8, false]
+      ]
+    },
+    {
+      "name" : "vxlan_t",
+      "id" : 24,
+      "fields" : [
+        ["flags", 8, false],
+        ["reserved", 24, false],
+        ["vni", 24, false],
+        ["reserved_2", 8, false]
+      ]
+    }
+  ],
+  "headers" : [
+    {
+      "name" : "tmp",
+      "id" : 0,
+      "header_type" : "fake_ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "tmp_0",
+      "id" : 1,
+      "header_type" : "packet_out_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "tmp_1",
+      "id" : 2,
+      "header_type" : "fake_ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "gtpu_0",
+      "id" : 3,
+      "header_type" : "gtpu_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_report_ethernet",
+      "id" : 4,
+      "header_type" : "ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_report_eth_type",
+      "id" : 5,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_report_ipv4",
+      "id" : 6,
+      "header_type" : "ipv4_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_report_udp",
+      "id" : 7,
+      "header_type" : "udp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_report_fixed_header",
+      "id" : 8,
+      "header_type" : "report_fixed_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_common_report_header",
+      "id" : 9,
+      "header_type" : "common_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_local_report_header",
+      "id" : 10,
+      "header_type" : "local_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "parser_emulator_hdr_drop_report_header",
+      "id" : 11,
+      "header_type" : "drop_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_report_eth_type",
+      "id" : 12,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_report_mpls",
+      "id" : 13,
+      "header_type" : "mpls_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_report_ipv4",
+      "id" : 14,
+      "header_type" : "ipv4_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_report_udp",
+      "id" : 15,
+      "header_type" : "udp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_report_fixed_header",
+      "id" : 16,
+      "header_type" : "report_fixed_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_common_report_header",
+      "id" : 17,
+      "header_type" : "common_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_local_report_header",
+      "id" : 18,
+      "header_type" : "local_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_drop_report_header",
+      "id" : 19,
+      "header_type" : "drop_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_hdr_eth_type",
+      "id" : 20,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_fabric_md_bridged",
+      "id" : 21,
+      "header_type" : "bridged_metadata_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_fabric_md_int_report_md",
+      "id" : 22,
+      "header_type" : "int_report_metadata_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "int_egress_fabric_md_int_md",
+      "id" : 23,
+      "header_type" : "int_metadata_t",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "scalars",
+      "id" : 24,
+      "header_type" : "scalars_0",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "standard_metadata",
+      "id" : 25,
+      "header_type" : "standard_metadata",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_packet_out0",
+      "id" : 26,
+      "header_type" : "packet_out_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_packet_in1",
+      "id" : 27,
+      "header_type" : "packet_in_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_fake_ethernet2",
+      "id" : 28,
+      "header_type" : "fake_ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_ethernet3",
+      "id" : 29,
+      "header_type" : "ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_vlan_tag4",
+      "id" : 30,
+      "header_type" : "vlan_tag_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_eth_type5",
+      "id" : 31,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_mpls6",
+      "id" : 32,
+      "header_type" : "mpls_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_ipv47",
+      "id" : 33,
+      "header_type" : "ipv4_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_ipv68",
+      "id" : 34,
+      "header_type" : "ipv6_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_tcp9",
+      "id" : 35,
+      "header_type" : "tcp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_udp10",
+      "id" : 36,
+      "header_type" : "udp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_icmp11",
+      "id" : 37,
+      "header_type" : "icmp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_gtpu12",
+      "id" : 38,
+      "header_type" : "gtpu_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_gtpu_options13",
+      "id" : 39,
+      "header_type" : "gtpu_options_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_gtpu_ext_psc14",
+      "id" : 40,
+      "header_type" : "gtpu_ext_psc_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_vxlan15",
+      "id" : 41,
+      "header_type" : "vxlan_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_inner_ethernet16",
+      "id" : 42,
+      "header_type" : "ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_inner_eth_type17",
+      "id" : 43,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_inner_ipv418",
+      "id" : 44,
+      "header_type" : "ipv4_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_inner_tcp19",
+      "id" : 45,
+      "header_type" : "tcp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_inner_udp20",
+      "id" : 46,
+      "header_type" : "udp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_inner_icmp21",
+      "id" : 47,
+      "header_type" : "icmp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_packet_in22",
+      "id" : 48,
+      "header_type" : "packet_in_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_fake_ethernet23",
+      "id" : 49,
+      "header_type" : "fake_ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_report_ethernet24",
+      "id" : 50,
+      "header_type" : "ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_report_eth_type25",
+      "id" : 51,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_report_mpls26",
+      "id" : 52,
+      "header_type" : "mpls_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_report_ipv427",
+      "id" : 53,
+      "header_type" : "ipv4_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_report_udp28",
+      "id" : 54,
+      "header_type" : "udp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_report_fixed_header29",
+      "id" : 55,
+      "header_type" : "report_fixed_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_common_report_header30",
+      "id" : 56,
+      "header_type" : "common_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_local_report_header31",
+      "id" : 57,
+      "header_type" : "local_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_drop_report_header32",
+      "id" : 58,
+      "header_type" : "drop_report_header_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_ethernet33",
+      "id" : 59,
+      "header_type" : "ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_vlan_tag34",
+      "id" : 60,
+      "header_type" : "vlan_tag_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_eth_type35",
+      "id" : 61,
+      "header_type" : "eth_type_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_mpls36",
+      "id" : 62,
+      "header_type" : "mpls_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_ipv437",
+      "id" : 63,
+      "header_type" : "ipv4_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_ipv638",
+      "id" : 64,
+      "header_type" : "ipv6_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_udp39",
+      "id" : 65,
+      "header_type" : "udp_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_ingress_bridged4",
+      "id" : 66,
+      "header_type" : "bridged_metadata_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_bridged36",
+      "id" : 67,
+      "header_type" : "bridged_metadata_t",
+      "metadata" : false,
+      "pi_omit" : true
+    },
+    {
+      "name" : "_egress_int_report_md38",
+      "id" : 68,
+      "header_type" : "int_report_metadata_t",
+      "metadata" : false,
+      "pi_omit" : true
+    }
+  ],
+  "header_stacks" : [],
+  "header_union_types" : [],
+  "header_unions" : [],
+  "header_union_stacks" : [],
+  "field_lists" : [
+    {
+      "id" : 1,
+      "name" : "field_list241",
+      "elements" : [
+        {
+          "type" : "field",
+          "value" : ["scalars", "userMetadata._recirc_preserved_report_type46"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"]
+        }
+      ]
+    },
+    {
+      "id" : 2,
+      "name" : "field_list231",
+      "elements" : [
+        {
+          "type" : "field",
+          "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port49"]
+        }
+      ]
+    },
+    {
+      "id" : 3,
+      "name" : "empty",
+      "elements" : []
+    },
+    {
+      "id" : 4,
+      "name" : "empty_0",
+      "elements" : []
+    },
+    {
+      "id" : 5,
+      "name" : "empty_1",
+      "elements" : []
+    }
+  ],
+  "errors" : [
+    ["NoError", 1],
+    ["PacketTooShort", 2],
+    ["NoMatch", 3],
+    ["StackOutOfBounds", 4],
+    ["HeaderTooShort", 5],
+    ["ParserTimeout", 6],
+    ["ParserInvalidArgument", 7],
+    ["PacketRejectedByParser", 8]
+  ],
+  "enums" : [],
+  "parsers" : [
+    {
+      "name" : "parser",
+      "id" : 0,
+      "init_state" : "start",
+      "parse_states" : [
+        {
+          "name" : "start",
+          "id" : 0,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "userMetadata._egress_pkt_length45"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "field",
+                            "value" : ["standard_metadata", "packet_length"]
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x0000ffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "_ingress_bridged4"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_bmd_type0"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x01"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_ig_port3"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["standard_metadata", "ingress_port"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port49"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["standard_metadata", "ingress_port"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_ig_tstamp9"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["standard_metadata", "ingress_global_timestamp"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "b2d",
+                      "left" : null,
+                      "right" : {
+                        "type" : "bool",
+                        "value" : false
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "b2d",
+                      "left" : null,
+                      "right" : {
+                        "type" : "bool",
+                        "value" : false
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_ip_eth_type10"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x0000"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_int_bmd_wip_type18"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_encap_presence7"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_8"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 112]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "tmp"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp", "_pad0"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_8"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x40"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffffffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp", "_pad1"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_8"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x10"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffffffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp", "ether_type"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "tmp_8"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_2"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "tmp_8"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0xbf02",
+              "mask" : null,
+              "next_state" : "parse_fake_ethernet"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf03",
+              "mask" : null,
+              "next_state" : "parse_fake_ethernet_and_accept"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf01",
+              "mask" : null,
+              "next_state" : "check_packet_out"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf04",
+              "mask" : null,
+              "next_state" : "parse_int_wip_ipv4"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf05",
+              "mask" : null,
+              "next_state" : "parse_int_wip_mpls"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_ethernet"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_2"]
+            }
+          ]
+        },
+        {
+          "name" : "check_packet_out",
+          "id" : 1,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_9"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 112]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "tmp_0"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "pad0"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x69"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x7f"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "egress_port"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x60"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01ff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "pad1"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x5d"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "queue_id"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x58"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x1f"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "pad2"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x53"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x1f"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "cpu_loopback_mode"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x51"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x03"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "do_forwarding"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x50"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "pad3"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x40"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "pad4"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x10"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffffffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_0", "ether_type"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "tmp_9"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_4"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x50"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x00",
+              "mask" : null,
+              "next_state" : "parse_packet_out_and_accept"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "strip_packet_out"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_4"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_int_wip_ipv4",
+          "id" : 2,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "_ingress_ethernet3"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "_ingress_eth_type5"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_eth_type5", "value"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x0800"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_int_bmd_wip_type18"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x01"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_mpls_label2"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x000000"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_mpls_ttl8"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x41"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00000070"
+                }
+              ],
+              "op" : "advance"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_ipv4"
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_int_wip_mpls",
+          "id" : 3,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "_ingress_ethernet3"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "_ingress_eth_type5"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_eth_type5", "value"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x8847"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_int_bmd_wip_type18"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x02"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00000070"
+                }
+              ],
+              "op" : "advance"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_mpls"
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_packet_out_and_accept",
+          "id" : 4,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_packet_out0"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "strip_packet_out",
+          "id" : 5,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "hexstr",
+                  "value" : "0x00000070"
+                }
+              ],
+              "op" : "advance"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_ethernet"
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_fake_ethernet",
+          "id" : 6,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_fake_ethernet2"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_10"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 112]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "tmp_1"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_1", "_pad0"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_10"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x40"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffffffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_1", "_pad1"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_10"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x10"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffffffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["tmp_1", "ether_type"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "tmp_10"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_6"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "tmp_10"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0xbf04",
+              "mask" : null,
+              "next_state" : "parse_int_wip_ipv4"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf05",
+              "mask" : null,
+              "next_state" : "parse_int_wip_mpls"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_ethernet"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_6"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_fake_ethernet_and_accept",
+          "id" : 7,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_fake_ethernet2"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_ethernet",
+          "id" : 8,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_ethernet3"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_3"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 16]
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x88a8",
+              "mask" : null,
+              "next_state" : "parse_vlan_tag"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x8100",
+              "mask" : "0xefff",
+              "next_state" : "parse_vlan_tag"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_untagged"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_3"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_vlan_tag",
+          "id" : 9,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_vlan_tag4"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_vlan_id6"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_vlan_tag4", "vlan_id"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_5"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 16]
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_eth_type"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_5"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_untagged",
+          "id" : 10,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_vlan_id6"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x0ffe"
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_eth_type"
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_eth_type",
+          "id" : 11,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_eth_type5"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x8847",
+              "mask" : null,
+              "next_state" : "parse_mpls"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0800",
+              "mask" : null,
+              "next_state" : "parse_non_mpls"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x86dd",
+              "mask" : null,
+              "next_state" : "parse_non_mpls"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_mpls",
+          "id" : 12,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_mpls6"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_mpls_label2"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_mpls6", "label"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_mpls_ttl8"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_mpls6", "ttl"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_7"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 4]
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x04",
+              "mask" : null,
+              "next_state" : "parse_ipv4"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x06",
+              "mask" : null,
+              "next_state" : "parse_ipv6"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "reject_packet"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_7"]
+            }
+          ]
+        },
+        {
+          "name" : "reject_packet",
+          "id" : 13,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "bool",
+                  "value" : false
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x8"
+                }
+              ],
+              "op" : "verify"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_non_mpls",
+          "id" : 14,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_mpls_label2"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x000000"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_mpls_ttl8"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x41"
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x0800",
+              "mask" : null,
+              "next_state" : "parse_ipv4"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x86dd",
+              "mask" : null,
+              "next_state" : "parse_ipv6"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_ipv4",
+          "id" : 15,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_ipv47"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"]
+                },
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_ipv47", "dst_addr"]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_ip_eth_type10"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x0800"
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x06",
+              "mask" : null,
+              "next_state" : "parse_tcp"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11",
+              "mask" : null,
+              "next_state" : "parse_udp"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01",
+              "mask" : null,
+              "next_state" : "parse_icmp"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "protocol"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_ipv6",
+          "id" : 16,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_ipv68"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_ip_eth_type10"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x86dd"
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x06",
+              "mask" : null,
+              "next_state" : "parse_tcp"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11",
+              "mask" : null,
+              "next_state" : "parse_udp"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x3a",
+              "mask" : null,
+              "next_state" : "parse_icmp"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv68", "next_hdr"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_icmp",
+          "id" : 17,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_icmp11"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_tcp",
+          "id" : 18,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_tcp9"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_udp",
+          "id" : 19,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_udp10"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_11"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 64]
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "parameters" : [
+                    {
+                      "type" : "header",
+                      "value" : "gtpu_0"
+                    }
+                  ],
+                  "op" : "add_header"
+                }
+              ],
+              "op" : "primitive"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "version"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3d"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "pt"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3c"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "spare"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3b"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "ex_flag"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3a"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "seq_flag"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x39"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "npdu_flag"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x38"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x01"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "msgtype"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x30"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "msglen"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x20"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["gtpu_0", "teid"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "tmp_11"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_12"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3d"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "tmp_13"]
+                },
+                {
+                  "type" : "expression",
+                  "value" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : ">>",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "tmp_11"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x30"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffffffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xff"
+                      }
+                    }
+                  }
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x086801ff",
+              "mask" : null,
+              "next_state" : "parse_gtpu"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x12b50000",
+              "mask" : "0xffff0000",
+              "next_state" : "parse_vxlan"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_udp10", "dport"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_12"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_13"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_gtpu",
+          "id" : 20,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_gtpu12"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x000000",
+              "mask" : null,
+              "next_state" : "set_gtpu_only"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_gtpu_options"
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_gtpu12", "ex_flag"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_gtpu12", "seq_flag"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_gtpu12", "npdu_flag"]
+            }
+          ]
+        },
+        {
+          "name" : "set_gtpu_only",
+          "id" : 21,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_encap_presence7"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x01"
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : "parse_inner_ipv4"
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_gtpu_options",
+          "id" : 22,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_gtpu_options13"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["scalars", "gtpu_ext_len_0"]
+                },
+                {
+                  "type" : "lookahead",
+                  "value" : [0, 8]
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x8501",
+              "mask" : null,
+              "next_state" : "parse_gtpu_ext_psc"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_gtpu_options13", "next_ext"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "gtpu_ext_len_0"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_gtpu_ext_psc",
+          "id" : 23,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_gtpu_ext_psc14"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_encap_presence7"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x02"
+                }
+              ],
+              "op" : "set"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x00",
+              "mask" : null,
+              "next_state" : "parse_inner_ipv4"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_gtpu_ext_psc14", "next_ext"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_vxlan",
+          "id" : 24,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_vxlan15"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "field",
+                  "value" : ["_ingress_bridged4", "_base_encap_presence7"]
+                },
+                {
+                  "type" : "hexstr",
+                  "value" : "0x03"
+                }
+              ],
+              "op" : "set"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_inner_ethernet16"
+                }
+              ],
+              "op" : "extract"
+            },
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_inner_eth_type17"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x0800",
+              "mask" : null,
+              "next_state" : "parse_inner_ipv4"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_eth_type17", "value"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_inner_ipv4",
+          "id" : 25,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_inner_ipv418"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x06",
+              "mask" : null,
+              "next_state" : "parse_inner_tcp"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11",
+              "mask" : null,
+              "next_state" : "parse_inner_udp"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01",
+              "mask" : null,
+              "next_state" : "parse_inner_icmp"
+            },
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_ipv418", "protocol"]
+            }
+          ]
+        },
+        {
+          "name" : "parse_inner_tcp",
+          "id" : 26,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_inner_tcp19"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_inner_udp",
+          "id" : 27,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_inner_udp20"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        },
+        {
+          "name" : "parse_inner_icmp",
+          "id" : 28,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "_ingress_inner_icmp21"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "type" : "default",
+              "value" : null,
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        }
+      ]
+    }
+  ],
+  "parse_vsets" : [],
+  "deparsers" : [
+    {
+      "name" : "deparser",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/parser.p4",
+        "line" : 321,
+        "column" : 8,
+        "source_fragment" : "FabricDeparser"
+      },
+      "order" : ["_ingress_fake_ethernet2", "_ingress_packet_in1", "_egress_report_ethernet24", "_egress_report_eth_type25", "_egress_report_mpls26", "_egress_report_ipv427", "_egress_report_udp28", "_egress_report_fixed_header29", "_egress_common_report_header30", "_egress_local_report_header31", "_egress_drop_report_header32", "_ingress_ethernet3", "_ingress_vlan_tag4", "_ingress_eth_type5", "_ingress_mpls6", "_ingress_ipv47", "_ingress_ipv68", "_ingress_tcp9", "_ingress_udp10", "_ingress_icmp11", "_ingress_gtpu12", "_ingress_gtpu_options13", "_ingress_gtpu_ext_psc14", "_ingress_vxlan15", "_ingress_inner_ethernet16", "_ingress_inner_eth_type17", "_ingress_inner_ipv418", "_ingress_inner_tcp19", "_ingress_inner_udp20", "_ingress_inner_icmp21"],
+      "primitives" : []
+    }
+  ],
+  "meter_arrays" : [
+    {
+      "name" : "FabricIngress.qos.slice_tc_meter",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+        "line" : 104,
+        "column" : 41,
+        "source_fragment" : "slice_tc_meter"
+      },
+      "is_direct" : false,
+      "size" : 64,
+      "rate_count" : 2,
+      "type" : "bytes"
+    }
+  ],
+  "counter_arrays" : [
+    {
+      "name" : "FabricIngress.stats.flow_counter",
+      "id" : 0,
+      "is_direct" : true,
+      "binding" : "FabricIngress.stats.flows",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4",
+        "line" : 14,
+        "column" : 50,
+        "source_fragment" : "flow_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.filtering.ingress_port_vlan_counter",
+      "id" : 1,
+      "is_direct" : true,
+      "binding" : "FabricIngress.filtering.ingress_port_vlan",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+        "line" : 17,
+        "column" : 50,
+        "source_fragment" : "ingress_port_vlan_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.filtering.fwd_classifier_counter",
+      "id" : 2,
+      "is_direct" : true,
+      "binding" : "FabricIngress.filtering.fwd_classifier",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+        "line" : 71,
+        "column" : 50,
+        "source_fragment" : "fwd_classifier_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.filtering.fwd_type_counter",
+      "id" : 3,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+        "line" : 78,
+        "column" : 46,
+        "source_fragment" : "fwd_type_counter"
+      },
+      "size" : 8,
+      "is_direct" : false
+    },
+    {
+      "name" : "FabricIngress.forwarding.bridging_counter",
+      "id" : 4,
+      "is_direct" : true,
+      "binding" : "FabricIngress.forwarding.bridging",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+        "line" : 29,
+        "column" : 50,
+        "source_fragment" : "bridging_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.forwarding.mpls_counter",
+      "id" : 5,
+      "is_direct" : true,
+      "binding" : "FabricIngress.forwarding.mpls",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+        "line" : 64,
+        "column" : 50,
+        "source_fragment" : "mpls_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.forwarding.routing_v4_counter",
+      "id" : 6,
+      "is_direct" : true,
+      "binding" : "FabricIngress.forwarding.routing_v4",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+        "line" : 98,
+        "column" : 50,
+        "source_fragment" : "routing_v4_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.forwarding.routing_v6_counter",
+      "id" : 7,
+      "is_direct" : true,
+      "binding" : "FabricIngress.forwarding.routing_v6",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+        "line" : 142,
+        "column" : 50,
+        "source_fragment" : "routing_v6_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.pre_next.next_mpls_counter",
+      "id" : 8,
+      "is_direct" : true,
+      "binding" : "FabricIngress.pre_next.next_mpls",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4",
+        "line" : 15,
+        "column" : 50,
+        "source_fragment" : "next_mpls_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.pre_next.next_vlan_counter",
+      "id" : 9,
+      "is_direct" : true,
+      "binding" : "FabricIngress.pre_next.next_vlan",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4",
+        "line" : 39,
+        "column" : 50,
+        "source_fragment" : "next_vlan_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.acl.acl_counter",
+      "id" : 10,
+      "is_direct" : true,
+      "binding" : "FabricIngress.acl.acl",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+        "line" : 19,
+        "column" : 50,
+        "source_fragment" : "acl_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.next.simple_counter",
+      "id" : 11,
+      "is_direct" : true,
+      "binding" : "FabricIngress.next.simple",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+        "line" : 76,
+        "column" : 50,
+        "source_fragment" : "simple_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.next.hashed_counter",
+      "id" : 12,
+      "is_direct" : true,
+      "binding" : "FabricIngress.next.hashed",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+        "line" : 115,
+        "column" : 50,
+        "source_fragment" : "hashed_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.next.multicast_counter",
+      "id" : 13,
+      "is_direct" : true,
+      "binding" : "FabricIngress.next.multicast",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+        "line" : 148,
+        "column" : 50,
+        "source_fragment" : "multicast_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.slice_tc_classifier.classifier_stats",
+      "id" : 14,
+      "is_direct" : true,
+      "binding" : "FabricIngress.slice_tc_classifier.classifier",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+        "line" : 20,
+        "column" : 40,
+        "source_fragment" : "classifier_stats"
+      }
+    },
+    {
+      "name" : "FabricIngress.qos.queues_stats",
+      "id" : 15,
+      "is_direct" : true,
+      "binding" : "FabricIngress.qos.queues",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+        "line" : 106,
+        "column" : 40,
+        "source_fragment" : "queues_stats"
+      }
+    },
+    {
+      "name" : "FabricIngress.int_watchlist.watchlist_counter",
+      "id" : 16,
+      "is_direct" : true,
+      "binding" : "FabricIngress.int_watchlist.watchlist",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+        "line" : 15,
+        "column" : 50,
+        "source_fragment" : "watchlist_counter"
+      }
+    },
+    {
+      "name" : "FabricIngress.int_ingress.drop_report_counter",
+      "id" : 17,
+      "is_direct" : true,
+      "binding" : "FabricIngress.int_ingress.drop_report",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+        "line" : 64,
+        "column" : 50,
+        "source_fragment" : "drop_report_counter"
+      }
+    },
+    {
+      "name" : "FabricEgress.stats.flow_counter",
+      "id" : 18,
+      "is_direct" : true,
+      "binding" : "FabricEgress.stats.flows",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4",
+        "line" : 47,
+        "column" : 50,
+        "source_fragment" : "flow_counter"
+      }
+    },
+    {
+      "name" : "FabricEgress.egress_next.egress_vlan_counter",
+      "id" : 19,
+      "is_direct" : true,
+      "binding" : "FabricEgress.egress_next.egress_vlan",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+        "line" : 241,
+        "column" : 50,
+        "source_fragment" : "egress_vlan_counter"
+      }
+    },
+    {
+      "name" : "FabricEgress.int_egress.report_counter",
+      "id" : 20,
+      "is_direct" : true,
+      "binding" : "FabricEgress.int_egress.report",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+        "line" : 131,
+        "column" : 50,
+        "source_fragment" : "report_counter"
+      }
+    },
+    {
+      "name" : "FabricEgress.int_egress.int_metadata_counter",
+      "id" : 21,
+      "is_direct" : true,
+      "binding" : "FabricEgress.int_egress.int_metadata",
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+        "line" : 132,
+        "column" : 50,
+        "source_fragment" : "int_metadata_counter"
+      }
+    }
+  ],
+  "register_arrays" : [
+    {
+      "name" : "FabricEgress.int_egress.seq_number",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+        "line" : 138,
+        "column" : 28,
+        "source_fragment" : "seq_number"
+      },
+      "size" : 1024,
+      "bitwidth" : 32
+    }
+  ],
+  "calculations" : [
+    {
+      "name" : "calc",
+      "id" : 0,
+      "algo" : "crc32",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_15"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_16"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_17"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_0",
+      "id" : 1,
+      "algo" : "crc32",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_18"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_19"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_20"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_1",
+      "id" : 2,
+      "algo" : "crc32",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_21"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_22"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_23"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_24"]
+        },
+        {
+          "type" : "field",
+          "value" : ["scalars", "tmp_25"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_2",
+      "id" : 3,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 55,
+        "column" : 8,
+        "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..."
+      },
+      "algo" : "csum16",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "version"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "ihl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "dscp"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "ecn"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "total_len"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "identification"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "flags"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "frag_offset"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "ttl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "protocol"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "src_addr"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "dst_addr"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_3",
+      "id" : 4,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 73,
+        "column" : 8,
+        "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..."
+      },
+      "algo" : "csum16",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "version"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "ihl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "dscp"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "ecn"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "total_len"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "identification"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "flags"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "frag_offset"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "ttl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "protocol"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "src_addr"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "dst_addr"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_4",
+      "id" : 5,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 92,
+        "column" : 8,
+        "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..."
+      },
+      "algo" : "csum16",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "version"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "ihl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "dscp"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "ecn"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "total_len"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "identification"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "flags"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "frag_offset"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "ttl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "protocol"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "src_addr"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_egress_report_ipv427", "dst_addr"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_5",
+      "id" : 6,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 13,
+        "column" : 8,
+        "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..."
+      },
+      "algo" : "csum16",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "version"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "ihl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "dscp"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "ecn"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "total_len"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "identification"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "flags"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "frag_offset"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "ttl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "protocol"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "src_addr"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_ipv47", "dst_addr"]
+        }
+      ]
+    },
+    {
+      "name" : "calc_6",
+      "id" : 7,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 31,
+        "column" : 8,
+        "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..."
+      },
+      "algo" : "csum16",
+      "input" : [
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "version"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "ihl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "dscp"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "ecn"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "total_len"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "identification"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "flags"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "frag_offset"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "ttl"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "protocol"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "src_addr"]
+        },
+        {
+          "type" : "field",
+          "value" : ["_ingress_inner_ipv418", "dst_addr"]
+        }
+      ]
+    }
+  ],
+  "learn_lists" : [],
+  "actions" : [
+    {
+      "name" : "nop",
+      "id" : 0,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 1,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 2,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 3,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 4,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 5,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "NoAction",
+      "id" : 6,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricIngress.stats.count",
+      "id" : 7,
+      "runtime_data" : [
+        {
+          "name" : "flow_id",
+          "bitwidth" : 10
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_stats_flow_id11"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4",
+            "line" : 17,
+            "column" : 22,
+            "source_fragment" : "= flow_id; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.pkt_io.do_packet_out",
+      "id" : 8,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_packet_out0", "egress_port"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 13,
+            "column" : 8,
+            "source_fragment" : "standard_md.egress_spec = (PortId_t)hdr.packet_out.egress_port"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_packet_out0", "egress_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 14,
+            "column" : 37,
+            "source_fragment" : "= hdr.packet_out.egress_port; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 15,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_packet_out0"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 16,
+            "column" : 8,
+            "source_fragment" : "hdr.packet_out.setInvalid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._skip_egress0"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 17,
+            "column" : 20,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_bridged4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 19,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.setInvalid()"
+          }
+        },
+        {
+          "op" : "exit",
+          "parameters" : [],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 20,
+            "column" : 8,
+            "source_fragment" : "exit"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.filtering.deny",
+      "id" : 9,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 22,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 23,
+            "column" : 28,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_ig_port_type33"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 100,
+            "column" : 14,
+            "source_fragment" : "0x0, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x37"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 250,
+            "column" : 41,
+            "source_fragment" : "55, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.filtering.permit",
+      "id" : 10,
+      "runtime_data" : [
+        {
+          "name" : "port_type",
+          "bitwidth" : 2
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_ig_port_type33"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 33,
+            "column" : 31,
+            "source_fragment" : "= port_type; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.filtering.permit_with_internal_vlan",
+      "id" : 11,
+      "runtime_data" : [
+        {
+          "name" : "vlan_id",
+          "bitwidth" : 12
+        },
+        {
+          "name" : "port_type",
+          "bitwidth" : 2
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_vlan_id6"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 38,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_ig_port_type33"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 33,
+            "column" : 31,
+            "source_fragment" : "= port_type; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.filtering.set_forwarding_type",
+      "id" : 12,
+      "runtime_data" : [
+        {
+          "name" : "fwd_type",
+          "bitwidth" : 3
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 74,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.fwd_type = fwd_type"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_int_drop_reason",
+      "id" : 13,
+      "runtime_data" : [
+        {
+          "name" : "drop_reason",
+          "bitwidth" : 8
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 17,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_int_drop_reason",
+      "id" : 14,
+      "runtime_data" : [
+        {
+          "name" : "drop_reason",
+          "bitwidth" : 8
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 17,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_int_drop_reason",
+      "id" : 15,
+      "runtime_data" : [
+        {
+          "name" : "drop_reason",
+          "bitwidth" : 8
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 17,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_int_drop_reason",
+      "id" : 16,
+      "runtime_data" : [
+        {
+          "name" : "drop_reason",
+          "bitwidth" : 8
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 17,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.int_bmd.drop_reason = (IntDropReason_t)drop_reason"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_next_id_bridging",
+      "id" : 17,
+      "runtime_data" : [
+        {
+          "name" : "next_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_next_id21"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 23,
+            "column" : 26,
+            "source_fragment" : "= next_id; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.pop_mpls_and_next",
+      "id" : 18,
+      "runtime_data" : [
+        {
+          "name" : "next_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_mpls6"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 67,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.setInvalid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_ip_eth_type10"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 68,
+            "column" : 8,
+            "source_fragment" : "hdr.eth_type.value = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_mpls_label2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 69,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.mpls_label = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_next_id21"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 23,
+            "column" : 26,
+            "source_fragment" : "= next_id; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_next_id_routing_v4",
+      "id" : 19,
+      "runtime_data" : [
+        {
+          "name" : "next_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_next_id21"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 23,
+            "column" : 26,
+            "source_fragment" : "= next_id; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.nop_routing_v4",
+      "id" : 20,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricIngress.forwarding.drop_routing_v4",
+      "id" : 21,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 111,
+            "column" : 28,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 113,
+            "column" : 17,
+            "source_fragment" : "= 1; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.set_next_id_routing_v6",
+      "id" : 22,
+      "runtime_data" : [
+        {
+          "name" : "next_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_next_id21"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 23,
+            "column" : 26,
+            "source_fragment" : "= next_id; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.forwarding.drop_routing_v6",
+      "id" : 23,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 150,
+            "column" : 28,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 152,
+            "column" : 17,
+            "source_fragment" : "= 1; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.pre_next.set_mpls_label",
+      "id" : 24,
+      "runtime_data" : [
+        {
+          "name" : "label",
+          "bitwidth" : 20
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_mpls_label2"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4",
+            "line" : 18,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.mpls_label = label"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.pre_next.set_vlan",
+      "id" : 25,
+      "runtime_data" : [
+        {
+          "name" : "vlan_id",
+          "bitwidth" : 12
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_vlan_id6"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4",
+            "line" : 42,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.vlan_id = vlan_id"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.acl.set_next_id_acl",
+      "id" : 26,
+      "runtime_data" : [
+        {
+          "name" : "next_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_next_id21"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 22,
+            "column" : 26,
+            "source_fragment" : "= next_id; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : false
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 26,
+            "column" : 28,
+            "source_fragment" : "= false; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 27,
+            "column" : 17,
+            "source_fragment" : "= 0; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.acl.copy_to_cpu",
+      "id" : 27,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "clone_ingress_pkt_to_egress",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x000001ff"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x2"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 31,
+            "column" : 8,
+            "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.acl.punt_to_cpu",
+      "id" : 28,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "clone_ingress_pkt_to_egress",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x000001ff"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x2"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 31,
+            "column" : 8,
+            "source_fragment" : "clone_preserving_field_list(CloneType.I2E, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 40,
+            "column" : 28,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_punt_to_cpu23"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 41,
+            "column" : 30,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 42,
+            "column" : 17,
+            "source_fragment" : "= 1; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.acl.drop",
+      "id" : 29,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 46,
+            "column" : 17,
+            "source_fragment" : "= 1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 47,
+            "column" : 28,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x50"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 252,
+            "column" : 27,
+            "source_fragment" : "80, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.acl.set_output_port",
+      "id" : 30,
+      "runtime_data" : [
+        {
+          "name" : "port_num",
+          "bitwidth" : 9
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 62,
+            "column" : 8,
+            "source_fragment" : "standard_md.egress_spec = (PortId_t) port_num"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 63,
+            "column" : 37,
+            "source_fragment" : "= port_num; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 64,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 65,
+            "column" : 28,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 66,
+            "column" : 17,
+            "source_fragment" : "= 0; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.acl.nop_acl",
+      "id" : 31,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricIngress.next.output_simple",
+      "id" : 32,
+      "runtime_data" : [
+        {
+          "name" : "port_num",
+          "bitwidth" : 9
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 16,
+            "column" : 8,
+            "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 17,
+            "column" : 37,
+            "source_fragment" : "= port_num; // Needed by INT. ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 18,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.next.routing_simple",
+      "id" : 33,
+      "runtime_data" : [
+        {
+          "name" : "port_num",
+          "bitwidth" : 9
+        },
+        {
+          "name" : "smac",
+          "bitwidth" : 48
+        },
+        {
+          "name" : "dmac",
+          "bitwidth" : 48
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "src_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 23,
+            "column" : 8,
+            "source_fragment" : "hdr.ethernet.src_addr = smac; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "dst_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 2
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 28,
+            "column" : 8,
+            "source_fragment" : "hdr.ethernet.dst_addr = dmac; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 16,
+            "column" : 8,
+            "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 17,
+            "column" : 37,
+            "source_fragment" : "= port_num; // Needed by INT. ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 18,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.next.output_hashed",
+      "id" : 34,
+      "runtime_data" : [
+        {
+          "name" : "port_num",
+          "bitwidth" : 9
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 16,
+            "column" : 8,
+            "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 17,
+            "column" : 37,
+            "source_fragment" : "= port_num; // Needed by INT. ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 18,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.next.routing_hashed",
+      "id" : 35,
+      "runtime_data" : [
+        {
+          "name" : "port_num",
+          "bitwidth" : 9
+        },
+        {
+          "name" : "smac",
+          "bitwidth" : 48
+        },
+        {
+          "name" : "dmac",
+          "bitwidth" : 48
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "src_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 23,
+            "column" : 8,
+            "source_fragment" : "hdr.ethernet.src_addr = smac; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "dst_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 2
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 28,
+            "column" : 8,
+            "source_fragment" : "hdr.ethernet.dst_addr = dmac; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 16,
+            "column" : 8,
+            "source_fragment" : "standard_md.egress_spec = (PortId_t)port_num"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_egress_port47"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 17,
+            "column" : 37,
+            "source_fragment" : "= port_num; // Needed by INT. ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_egress_port_set22"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 18,
+            "column" : 34,
+            "source_fragment" : "= true; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.next.set_mcast_group_id",
+      "id" : 36,
+      "runtime_data" : [
+        {
+          "name" : "group_id",
+          "bitwidth" : 16
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "mcast_grp"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 151,
+            "column" : 8,
+            "source_fragment" : "standard_md.mcast_grp = group_id"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_is_multicast4"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 152,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.is_multicast = true"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.next.reset_mcast_group_id",
+      "id" : 37,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "mcast_grp"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 157,
+            "column" : 8,
+            "source_fragment" : "standard_md.mcast_grp = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_is_multicast4"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : false
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 158,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.is_multicast = false"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.slice_tc_classifier.set_slice_id_tc",
+      "id" : 38,
+      "runtime_data" : [
+        {
+          "name" : "slice_id",
+          "bitwidth" : 4
+        },
+        {
+          "name" : "tc",
+          "bitwidth" : 2
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_slice_id26"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 23,
+            "column" : 27,
+            "source_fragment" : "= slice_id; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc27"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 24,
+            "column" : 21,
+            "source_fragment" : "= tc; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc_unknown28"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : false
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 25,
+            "column" : 29,
+            "source_fragment" : "= false; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.slice_tc_classifier.no_classification",
+      "id" : 39,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_slice_id26"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 57,
+            "column" : 36,
+            "source_fragment" : "0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc27"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 58,
+            "column" : 24,
+            "source_fragment" : "0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc_unknown28"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : false
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 25,
+            "column" : 29,
+            "source_fragment" : "= false; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc_unknown28"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 31,
+            "column" : 29,
+            "source_fragment" : "= true; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.slice_tc_classifier.trust_dscp",
+      "id" : 40,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_slice_id26"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : ">>",
+                          "left" : {
+                            "type" : "field",
+                            "value" : ["_ingress_ipv47", "dscp"]
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x2"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x3f"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x0f"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 38,
+            "column" : 27,
+            "source_fragment" : "= hdr.ipv4.dscp[4 +2 -1:2]; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc27"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_ipv47", "dscp"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x03"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 39,
+            "column" : 21,
+            "source_fragment" : "= hdr.ipv4.dscp[2 -1:0]; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_tc_unknown28"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : false
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 40,
+            "column" : 29,
+            "source_fragment" : "= false; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.qos.use_upf",
+      "id" : 41,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_slice_tc12"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "|",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "<<",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "userMetadata._ingress_upf_slice_id30"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3f"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x2"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x3f"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "field",
+                            "value" : ["scalars", "userMetadata._ingress_upf_tc31"]
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x3f"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 81,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.upf_slice_id++fabric_md.upf_tc"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.qos.use_default",
+      "id" : 42,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_slice_tc12"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "|",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "<<",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["scalars", "userMetadata._ingress_slice_id26"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3f"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x2"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x3f"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "field",
+                            "value" : ["scalars", "userMetadata._ingress_tc27"]
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x3f"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 86,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.slice_id++fabric_md.tc"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.qos.set_queue",
+      "id" : 43,
+      "runtime_data" : [
+        {
+          "name" : "qid",
+          "bitwidth" : 5
+        }
+      ],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricIngress.qos.meter_drop",
+      "id" : 44,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 115,
+            "column" : 17,
+            "source_fragment" : "= 1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xa0"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 269,
+            "column" : 36,
+            "source_fragment" : "160, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.qos.set_default_tc",
+      "id" : 45,
+      "runtime_data" : [
+        {
+          "name" : "tc",
+          "bitwidth" : 2
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_slice_tc12"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "|",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "<<",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "expression",
+                                "value" : {
+                                  "op" : "&",
+                                  "left" : {
+                                    "type" : "expression",
+                                    "value" : {
+                                      "op" : "&",
+                                      "left" : {
+                                        "type" : "expression",
+                                        "value" : {
+                                          "op" : ">>",
+                                          "left" : {
+                                            "type" : "field",
+                                            "value" : ["_ingress_bridged4", "_base_slice_tc12"]
+                                          },
+                                          "right" : {
+                                            "type" : "hexstr",
+                                            "value" : "0x2"
+                                          }
+                                        }
+                                      },
+                                      "right" : {
+                                        "type" : "hexstr",
+                                        "value" : "0x3f"
+                                      }
+                                    }
+                                  },
+                                  "right" : {
+                                    "type" : "hexstr",
+                                    "value" : "0x0f"
+                                  }
+                                }
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x3f"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x2"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x3f"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "local",
+                            "value" : 0
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x3f"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 146,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.slice_tc = fabric_md.bridged.base.slice_tc[4 +2 -1:2]++tc"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.int_watchlist.mark_to_report",
+      "id" : 46,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_report_type13"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 223,
+            "column" : 45,
+            "source_fragment" : "1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_report_type46"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 223,
+            "column" : 45,
+            "source_fragment" : "1; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.int_watchlist.no_report",
+      "id" : 47,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_report_type13"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 219,
+            "column" : 50,
+            "source_fragment" : "0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_report_type46"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 219,
+            "column" : 50,
+            "source_fragment" : "0; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.int_watchlist.no_report_collector",
+      "id" : 48,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_report_type13"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 219,
+            "column" : 50,
+            "source_fragment" : "0; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricIngress.int_ingress.report_drop",
+      "id" : 49,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_bmd_type0"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 169,
+            "column" : 23,
+            "source_fragment" : "4, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_report_type13"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 221,
+            "column" : 45,
+            "source_fragment" : "4; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_vlan_id6"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0ffe"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 147,
+            "column" : 34,
+            "source_fragment" : "12w4094; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_mpls_label2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 71,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.mpls_label = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 79,
+            "column" : 17,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01fe"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4",
+            "line" : 36,
+            "column" : 42,
+            "source_fragment" : "510; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model64",
+      "id" : 50,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "exit",
+          "parameters" : [],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 64,
+            "column" : 12,
+            "source_fragment" : "exit"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model61",
+      "id" : 51,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "mark_to_drop",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "standard_metadata"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 61,
+            "column" : 8,
+            "source_fragment" : "mark_to_drop(standard_md)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model70",
+      "id" : 52,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_ig_port3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01fe"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4",
+            "line" : 36,
+            "column" : 42,
+            "source_fragment" : "510; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init21",
+      "id" : 53,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_vlan_tag4", "vlan_id"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 21,
+            "column" : 27,
+            "source_fragment" : "= hdr.vlan_tag.vlan_id; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init15",
+      "id" : 54,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_eth_dst6"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "dst_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 15,
+            "column" : 23,
+            "source_fragment" : "= hdr.ethernet.dst_addr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_eth_src7"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "src_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 16,
+            "column" : 23,
+            "source_fragment" : "= hdr.ethernet.src_addr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_eth_type8"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 17,
+            "column" : 24,
+            "source_fragment" : "= hdr.eth_type.value; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 19,
+            "column" : 23,
+            "source_fragment" : "= 0; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init38",
+      "id" : 55,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_tcp19", "sport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 38,
+            "column" : 32,
+            "source_fragment" : "= hdr.inner_tcp.sport; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_tcp19", "dport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 39,
+            "column" : 32,
+            "source_fragment" : "= hdr.inner_tcp.dport; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init41",
+      "id" : 56,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_udp20", "sport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 41,
+            "column" : 32,
+            "source_fragment" : "= hdr.inner_udp.sport; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_udp20", "dport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 42,
+            "column" : 32,
+            "source_fragment" : "= hdr.inner_udp.dport; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init44",
+      "id" : 57,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_icmp21", "icmp_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 44,
+            "column" : 33,
+            "source_fragment" : "= hdr.inner_icmp.icmp_type; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_icmp21", "icmp_code"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 45,
+            "column" : 33,
+            "source_fragment" : "= hdr.inner_icmp.icmp_code; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init33",
+      "id" : 58,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 33,
+            "column" : 27,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_ipv418", "src_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 34,
+            "column" : 28,
+            "source_fragment" : "= hdr.inner_ipv4.src_addr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_ipv418", "dst_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 35,
+            "column" : 28,
+            "source_fragment" : "= hdr.inner_ipv4.dst_addr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_inner_ipv418", "protocol"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 36,
+            "column" : 28,
+            "source_fragment" : "= hdr.inner_ipv4.protocol; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init53",
+      "id" : 59,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_tcp9", "sport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 53,
+            "column" : 32,
+            "source_fragment" : "= hdr.tcp.sport; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_tcp9", "dport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 54,
+            "column" : 32,
+            "source_fragment" : "= hdr.tcp.dport; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init56",
+      "id" : 60,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_udp10", "sport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 56,
+            "column" : 32,
+            "source_fragment" : "= hdr.udp.sport; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_udp10", "dport"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 57,
+            "column" : 32,
+            "source_fragment" : "= hdr.udp.dport; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init59",
+      "id" : 61,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_icmp11", "icmp_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 59,
+            "column" : 33,
+            "source_fragment" : "= hdr.icmp.icmp_type; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_icmp11", "icmp_code"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 60,
+            "column" : 33,
+            "source_fragment" : "= hdr.icmp.icmp_code; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init48",
+      "id" : 62,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 48,
+            "column" : 27,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "src_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 49,
+            "column" : 28,
+            "source_fragment" : "= hdr.ipv4.src_addr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "dst_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 50,
+            "column" : 28,
+            "source_fragment" : "= hdr.ipv4.dst_addr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "protocol"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 51,
+            "column" : 28,
+            "source_fragment" : "= hdr.ipv4.protocol; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "lookup_md_init24",
+      "id" : 63,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : false
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 24,
+            "column" : 23,
+            "source_fragment" : "= false; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 25,
+            "column" : 24,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 26,
+            "column" : 24,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 27,
+            "column" : 24,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 28,
+            "column" : 24,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 29,
+            "column" : 24,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 30,
+            "column" : 25,
+            "source_fragment" : "= 0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 31,
+            "column" : 25,
+            "source_fragment" : "= 0; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "filtering100",
+      "id" : 64,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_14"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 100,
+            "column" : 31,
+            "source_fragment" : "(bit<32>)fabric_md.bridged.base.fwd_type"
+          }
+        },
+        {
+          "op" : "count",
+          "parameters" : [
+            {
+              "type" : "counter_array",
+              "value" : "FabricIngress.filtering.fwd_type_counter"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_14"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 100,
+            "column" : 8,
+            "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "hasher39",
+      "id" : 65,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_15"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "src_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 43,
+            "column" : 17,
+            "source_fragment" : "hdr.ipv4.src_addr"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_16"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "dst_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 43,
+            "column" : 36,
+            "source_fragment" : "hdr.ipv4.dst_addr"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_17"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_gtpu12", "teid"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 43,
+            "column" : 55,
+            "source_fragment" : "hdr.gtpu.teid"
+          }
+        },
+        {
+          "op" : "modify_field_with_hash_based_offset",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00000000"
+            },
+            {
+              "type" : "calculation",
+              "value" : "calc"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffffffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 39,
+            "column" : 12,
+            "source_fragment" : "hash( ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "hasher50",
+      "id" : 66,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_inner_hash1"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 50,
+            "column" : 32,
+            "source_fragment" : "= fabric_md.bridged.base.inner_hash; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "hasher66",
+      "id" : 67,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_inner_hash1"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 66,
+            "column" : 12,
+            "source_fragment" : "fabric_md.bridged.base.inner_hash = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_18"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "dst_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 71,
+            "column" : 17,
+            "source_fragment" : "hdr.ethernet.dst_addr"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_19"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_ethernet3", "src_addr"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 71,
+            "column" : 40,
+            "source_fragment" : "hdr.ethernet.src_addr"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_20"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 71,
+            "column" : 63,
+            "source_fragment" : "hdr.eth_type.value"
+          }
+        },
+        {
+          "op" : "modify_field_with_hash_based_offset",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00000000"
+            },
+            {
+              "type" : "calculation",
+              "value" : "calc_0"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffffffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 67,
+            "column" : 12,
+            "source_fragment" : "hash( ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "hasher17",
+      "id" : 68,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_21"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 91,
+            "column" : 34,
+            "source_fragment" : "fabric_md"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_22"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 91,
+            "column" : 34,
+            "source_fragment" : "fabric_md"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_23"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 91,
+            "column" : 34,
+            "source_fragment" : "fabric_md"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_24"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 91,
+            "column" : 34,
+            "source_fragment" : "fabric_md"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_25"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 91,
+            "column" : 34,
+            "source_fragment" : "fabric_md"
+          }
+        },
+        {
+          "op" : "modify_field_with_hash_based_offset",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_base_inner_hash1"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00000000"
+            },
+            {
+              "type" : "calculation",
+              "value" : "calc_1"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffffffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 17,
+            "column" : 8,
+            "source_fragment" : "hash( ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "slicing174",
+      "id" : 69,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_26"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_bridged4", "_base_slice_tc12"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 174,
+            "column" : 41,
+            "source_fragment" : "(bit<32>) fabric_md.bridged.base.slice_tc"
+          }
+        },
+        {
+          "op" : "execute_meter",
+          "parameters" : [
+            {
+              "type" : "meter_array",
+              "value" : "FabricIngress.qos.slice_tc_meter"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_26"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "qos_packet_color"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 174,
+            "column" : 12,
+            "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "slicing177",
+      "id" : 70,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "qos_packet_color"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/define_v1model.p4",
+            "line" : 25,
+            "column" : 10,
+            "source_fragment" : "2 ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int112",
+      "id" : 71,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_egress_port17"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 112,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.int_bmd.egress_port = standard_md.egress_spec"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_bridged4", "_int_bmd_queue_id16"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 113,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.int_bmd.queue_id = 0"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model110",
+      "id" : 72,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "mark_to_drop",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "standard_metadata"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 110,
+            "column" : 12,
+            "source_fragment" : "mark_to_drop(standard_md)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model106",
+      "id" : 73,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_bridged36"
+            },
+            {
+              "type" : "header",
+              "value" : "_ingress_bridged4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 106,
+            "column" : 8,
+            "source_fragment" : "fabric_md.egress.bridged = fabric_md"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "nop",
+      "id" : 74,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 75,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 76,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 77,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 78,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "nop",
+      "id" : 79,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricEgress.stats.count",
+      "id" : 80,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricEgress.pkt_io_egress.set_switch_info",
+      "id" : 81,
+      "runtime_data" : [
+        {
+          "name" : "cpu_port",
+          "bitwidth" : 9
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_cpu_port37"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "local",
+                    "value" : 0
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01ff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 36,
+            "column" : 27,
+            "source_fragment" : "= (PortId_t)cpu_port; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.egress_next.pop_mpls_if_present",
+      "id" : 82,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_mpls6"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 198,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.setInvalid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_ip_eth_type10"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 200,
+            "column" : 8,
+            "source_fragment" : "hdr.eth_type.value = fabric_md.bridged"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.egress_next.set_mpls",
+      "id" : 83,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_mpls6"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 205,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_mpls6", "label"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_mpls_label2"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 206,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.label = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_mpls6", "tc"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 207,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.tc = 3w0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_mpls6", "bos"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 208,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.bos = 1w1"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_mpls6", "ttl"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_mpls_ttl8"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 209,
+            "column" : 8,
+            "source_fragment" : "hdr.mpls.ttl = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_eth_type5", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x8847"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 112,
+            "column" : 31,
+            "source_fragment" : "0x8847; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.egress_next.push_vlan",
+      "id" : 84,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_vlan_tag4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 217,
+            "column" : 8,
+            "source_fragment" : "hdr.vlan_tag.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_vlan_tag4", "eth_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x8100"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 111,
+            "column" : 31,
+            "source_fragment" : "0x8100; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_vlan_tag4", "vlan_id"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_vlan_id6"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 221,
+            "column" : 8,
+            "source_fragment" : "hdr.vlan_tag.vlan_id = fabric_md.bridged"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.egress_next.pop_vlan",
+      "id" : 85,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_vlan_tag4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 249,
+            "column" : 8,
+            "source_fragment" : "hdr.vlan_tag.setInvalid()"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.egress_next.drop",
+      "id" : 86,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 254,
+            "column" : 17,
+            "source_fragment" : "= 1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x82"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 257,
+            "column" : 35,
+            "source_fragment" : "130, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.dscp_rewriter.rewrite",
+      "id" : 87,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricEgress.dscp_rewriter.clear",
+      "id" : 88,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "dscp_rewriter_tmp_dscp"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 198,
+            "column" : 8,
+            "source_fragment" : "tmp_dscp = 0"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop",
+      "id" : 89,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 20,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ethernet.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 25,
+            "column" : 8,
+            "source_fragment" : "hdr.report_eth_type.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 37,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "version"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 38,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.version = 4w4"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ihl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x05"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 39,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ihl = 4w5"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "dscp"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 40,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dscp = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ecn"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 41,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ecn = 2w0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "flags"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 44,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.flags = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 45,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.frag_offset = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ttl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x40"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 150,
+            "column" : 32,
+            "source_fragment" : "64; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "protocol"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 134,
+            "column" : 25,
+            "source_fragment" : "17; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 53,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_udp", "sport"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 54,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.sport = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 60,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ver"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 61,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ver = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 203,
+            "column" : 52,
+            "source_fragment" : "2; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 66,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.rsvd = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 71,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_int_report_md38"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 79,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "ip_eth_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0800"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 114,
+            "column" : 31,
+            "source_fragment" : "0x0800; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "report_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 221,
+            "column" : 45,
+            "source_fragment" : "4; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "mirror_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 178,
+            "column" : 14,
+            "source_fragment" : "0, ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 85,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "bmd_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 169,
+            "column" : 23,
+            "source_fragment" : "4, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "encap_presence"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_encap_presence7"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 93,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "flow_hash"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_inner_hash1"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 94,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_int_bmd_drop_reason15"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 97,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_base_ig_tstamp9"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 99,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "ig_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_ig_port3"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 101,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "eg_port"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 102,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.eg_port = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "queue_id"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 103,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.queue_id = 0"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.parser_emulator.parse_int_ingress_drop",
+      "id" : 90,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 20,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ethernet.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 25,
+            "column" : 8,
+            "source_fragment" : "hdr.report_eth_type.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 37,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "version"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 38,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.version = 4w4"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ihl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x05"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 39,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ihl = 4w5"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "dscp"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 40,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dscp = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ecn"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 41,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ecn = 2w0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "flags"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 44,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.flags = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 45,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.frag_offset = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ttl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x40"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 150,
+            "column" : 32,
+            "source_fragment" : "64; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "protocol"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 134,
+            "column" : 25,
+            "source_fragment" : "17; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 53,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_udp", "sport"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 54,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.sport = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 60,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ver"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 61,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ver = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 203,
+            "column" : 52,
+            "source_fragment" : "2; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 66,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.rsvd = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 71,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_int_report_md38"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 79,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "ip_eth_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0800"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 114,
+            "column" : 31,
+            "source_fragment" : "0x0800; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "report_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 221,
+            "column" : 45,
+            "source_fragment" : "4; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "mirror_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 178,
+            "column" : 14,
+            "source_fragment" : "0, ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 85,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "bmd_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 169,
+            "column" : 23,
+            "source_fragment" : "4, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "encap_presence"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_encap_presence7"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 93,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.encap_presence = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "flow_hash"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_inner_hash1"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 94,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.flow_hash = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_drop_report_header", "drop_reason"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_int_bmd_drop_reason15"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 97,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.drop_reason = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_base_ig_tstamp9"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 99,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "ig_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_ig_port3"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 101,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.bridged"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "eg_port"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 102,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.eg_port = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "queue_id"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 103,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.queue_id = 0"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.parser_emulator.parse_int_report_mirror",
+      "id" : 91,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 20,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ethernet.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 25,
+            "column" : 8,
+            "source_fragment" : "hdr.report_eth_type.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 37,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "version"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 38,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.version = 4w4"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ihl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x05"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 39,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ihl = 4w5"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "dscp"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 40,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dscp = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ecn"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 41,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ecn = 2w0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "flags"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 44,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.flags = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 45,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.frag_offset = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ttl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x40"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 150,
+            "column" : 32,
+            "source_fragment" : "64; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "protocol"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 134,
+            "column" : 25,
+            "source_fragment" : "17; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 53,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_udp", "sport"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 54,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.sport = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 60,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ver"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 61,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ver = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 203,
+            "column" : 52,
+            "source_fragment" : "2; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 66,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.rsvd = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 71,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_bmd_type0"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "bmd_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 110,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_vlan_id6"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0ffe"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 147,
+            "column" : 34,
+            "source_fragment" : "12w4094; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_mpls_label2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 112,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.mpls_label = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "ig_tstamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 118,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "ig_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "ig_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 121,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "eg_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "eg_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 122,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "queue_id"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "queue_id"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 123,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 126,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "queue_occupancy"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 127,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "eg_tstamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 128,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.parser_emulator.parse_int_report_mirror",
+      "id" : 92,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 20,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ethernet.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 25,
+            "column" : 8,
+            "source_fragment" : "hdr.report_eth_type.setValid()"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 37,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "version"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 38,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.version = 4w4"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ihl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x05"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 39,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ihl = 4w5"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "dscp"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 40,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dscp = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ecn"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 41,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.ecn = 2w0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "flags"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 44,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.flags = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "frag_offset"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 45,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.frag_offset = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "ttl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x40"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 150,
+            "column" : 32,
+            "source_fragment" : "64; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_ipv4", "protocol"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x11"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 134,
+            "column" : 25,
+            "source_fragment" : "17; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 53,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_udp", "sport"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 54,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.sport = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 60,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ver"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 61,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ver = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 203,
+            "column" : 52,
+            "source_fragment" : "2; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "rsvd"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 66,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.rsvd = 0"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 71,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_bmd_type0"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "bmd_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 110,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.bmd_type = fabric_md.int_report_md.bmd_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_vlan_id6"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0ffe"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 147,
+            "column" : 34,
+            "source_fragment" : "12w4094; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_mpls_label2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x000000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 112,
+            "column" : 8,
+            "source_fragment" : "fabric_md.bridged.base.mpls_label = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_report_fixed_header", "ig_tstamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "ig_tstamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 118,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.ig_tstamp = fabric_md.int_report_md.ig_tstamp"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "ig_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "ig_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 121,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.ig_port = fabric_md.int_report_md.ig_port"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "eg_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "eg_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 122,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.eg_port = fabric_md.int_report_md.eg_port"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_common_report_header", "queue_id"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "queue_id"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 123,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.queue_id = fabric_md.int_report_md.queue_id"
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 126,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_local_report_header", "queue_occupancy"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "queue_occupancy"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 127,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.queue_occupancy = fabric_md.int_report_md.queue_occupancy"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["parser_emulator_hdr_local_report_header", "eg_tstamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_int_report_md38", "eg_tstamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 128,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.eg_tstamp = fabric_md.int_report_md.eg_tstamp"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.check_quota",
+      "id" : 93,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricEgress.int_egress.reset_quota",
+      "id" : 94,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "FabricEgress.int_egress.set_config",
+      "id" : 95,
+      "runtime_data" : [
+        {
+          "name" : "hop_latency_mask",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "timestamp_mask",
+          "bitwidth" : 48
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "hop_latency"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_fabric_md_int_md", "hop_latency"]
+                  },
+                  "right" : {
+                    "type" : "local",
+                    "value" : 0
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 179,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_md.hop_latency = fabric_md.int_md.hop_latency & hop_latency_mask"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "timestamp"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_fabric_md_int_md", "timestamp"]
+                  },
+                  "right" : {
+                    "type" : "local",
+                    "value" : 1
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 180,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_md.timestamp = fabric_md.int_md.timestamp & timestamp_mask"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.do_local_report_encap",
+      "id" : 96,
+      "runtime_data" : [
+        {
+          "name" : "src_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_port",
+          "bitwidth" : 16
+        },
+        {
+          "name" : "switch_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "modify_field_rng_uniform",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "identification"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 195,
+            "column" : 8,
+            "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "src_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 197,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "dst_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 198,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_udp", "dport"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 2
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 199,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.dport = mon_port; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_27"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_read",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_27"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 143,
+            "column" : 8,
+            "source_fragment" : "seq_number.read(reg, seq_number_idx)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "int_egress_reg"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x00000001"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 144,
+            "column" : 8,
+            "source_fragment" : "reg = reg + 1"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_28"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_write",
+          "parameters" : [
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_28"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 146,
+            "column" : 8,
+            "source_fragment" : "seq_number.write(seq_number_idx, reg)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "seq_no"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ]
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "dqf"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "report_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 201,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "switch_id"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 3
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 202,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad1"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 203,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad1 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 204,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad2 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 205,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad3 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_eth_type", "value"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 207,
+            "column" : 8,
+            "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._int_mirror_type3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 178,
+            "column" : 14,
+            "source_fragment" : "0, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_eth_type", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 125,
+            "column" : 39,
+            "source_fragment" : "0xBF04; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 203,
+            "column" : 52,
+            "source_fragment" : "2; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 218,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.setValid()"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.do_local_report_encap_mpls",
+      "id" : 97,
+      "runtime_data" : [
+        {
+          "name" : "src_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_port",
+          "bitwidth" : 16
+        },
+        {
+          "name" : "mon_label",
+          "bitwidth" : 20
+        },
+        {
+          "name" : "switch_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "modify_field_rng_uniform",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "identification"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 195,
+            "column" : 8,
+            "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "src_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 197,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "dst_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 198,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_udp", "dport"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 2
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 199,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.dport = mon_port; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_29"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_read",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_29"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 143,
+            "column" : 8,
+            "source_fragment" : "seq_number.read(reg, seq_number_idx)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "int_egress_reg"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x00000001"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 144,
+            "column" : 8,
+            "source_fragment" : "reg = reg + 1"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_30"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_write",
+          "parameters" : [
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_30"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 146,
+            "column" : 8,
+            "source_fragment" : "seq_number.write(seq_number_idx, reg)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "seq_no"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ]
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "dqf"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "report_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 201,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "switch_id"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 4
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 202,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad1"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 203,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad1 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 204,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad2 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 205,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad3 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_eth_type", "value"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 207,
+            "column" : 8,
+            "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._int_mirror_type3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 178,
+            "column" : 14,
+            "source_fragment" : "0, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_eth_type", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 125,
+            "column" : 39,
+            "source_fragment" : "0xBF04; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 203,
+            "column" : 52,
+            "source_fragment" : "2; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 218,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_eth_type", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf05"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 126,
+            "column" : 39,
+            "source_fragment" : "0xBF05; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_mpls"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 226,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "tc"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 227,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.tc = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "bos"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 228,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.bos = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "ttl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x40"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 149,
+            "column" : 32,
+            "source_fragment" : "64; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "label"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 3
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 230,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.label = mon_label"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.do_drop_report_encap",
+      "id" : 98,
+      "runtime_data" : [
+        {
+          "name" : "src_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_port",
+          "bitwidth" : 16
+        },
+        {
+          "name" : "switch_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "modify_field_rng_uniform",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "identification"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 195,
+            "column" : 8,
+            "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "src_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 197,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "dst_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 198,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_udp", "dport"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 2
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 199,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.dport = mon_port; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_31"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_read",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_31"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 143,
+            "column" : 8,
+            "source_fragment" : "seq_number.read(reg, seq_number_idx)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "int_egress_reg"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x00000001"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 144,
+            "column" : 8,
+            "source_fragment" : "reg = reg + 1"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_32"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_write",
+          "parameters" : [
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_32"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 146,
+            "column" : 8,
+            "source_fragment" : "seq_number.write(seq_number_idx, reg)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "seq_no"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ]
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "dqf"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "report_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 201,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "switch_id"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 3
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 202,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad1"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 203,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad1 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 204,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad2 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 205,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad3 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_eth_type", "value"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 207,
+            "column" : 8,
+            "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._int_mirror_type3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 178,
+            "column" : 14,
+            "source_fragment" : "0, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_eth_type", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 125,
+            "column" : 39,
+            "source_fragment" : "0xBF04; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 202,
+            "column" : 44,
+            "source_fragment" : "1; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 238,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 241,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.setInvalid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_drop_report_header", "drop_reason"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason15"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 243,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.drop_reason ="
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.do_drop_report_encap_mpls",
+      "id" : 99,
+      "runtime_data" : [
+        {
+          "name" : "src_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_ip",
+          "bitwidth" : 32
+        },
+        {
+          "name" : "mon_port",
+          "bitwidth" : 16
+        },
+        {
+          "name" : "mon_label",
+          "bitwidth" : 20
+        },
+        {
+          "name" : "switch_id",
+          "bitwidth" : 32
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "modify_field_rng_uniform",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "identification"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xffff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 195,
+            "column" : 8,
+            "source_fragment" : "random(hdr.report_ipv4.identification, 0, 0xffff)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "src_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 197,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.src_addr = src_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_ipv4", "dst_addr"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 1
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 198,
+            "column" : 8,
+            "source_fragment" : "hdr.report_ipv4.dst_addr = mon_ip; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_udp", "dport"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 2
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 199,
+            "column" : 8,
+            "source_fragment" : "hdr.report_udp.dport = mon_port; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_33"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_read",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_33"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 143,
+            "column" : 8,
+            "source_fragment" : "seq_number.read(reg, seq_number_idx)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "int_egress_reg"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x00000001"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 144,
+            "column" : 8,
+            "source_fragment" : "reg = reg + 1"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_34"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 200,
+            "column" : 23,
+            "source_fragment" : "(bit<32>)hdr.report_fixed_header.hw_id"
+          }
+        },
+        {
+          "op" : "register_write",
+          "parameters" : [
+            {
+              "type" : "register_array",
+              "value" : "FabricEgress.int_egress.seq_number"
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_34"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 146,
+            "column" : 8,
+            "source_fragment" : "seq_number.write(seq_number_idx, reg)"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "seq_no"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_reg"]
+            }
+          ]
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "dqf"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "report_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 201,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.dqf = fabric_md.int_report_md.report_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "switch_id"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 4
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 202,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.switch_id = switch_id; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad1"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 203,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad1 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 204,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad2 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_common_report_header", "pad3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 205,
+            "column" : 8,
+            "source_fragment" : "hdr.common_report_header.pad3 = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_eth_type", "value"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 207,
+            "column" : 8,
+            "source_fragment" : "hdr.eth_type.value = fabric_md.int_report_md.ip_eth_type"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._int_mirror_type3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 178,
+            "column" : 14,
+            "source_fragment" : "0, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_eth_type", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf04"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 125,
+            "column" : 39,
+            "source_fragment" : "0xBF04; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "nproto"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 202,
+            "column" : 44,
+            "source_fragment" : "1; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 238,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.setValid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 241,
+            "column" : 8,
+            "source_fragment" : "hdr.local_report_header.setInvalid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_drop_report_header", "drop_reason"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_bridged", "_int_bmd_drop_reason15"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 243,
+            "column" : 8,
+            "source_fragment" : "hdr.drop_report_header.drop_reason ="
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_eth_type", "value"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0xbf05"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 126,
+            "column" : 39,
+            "source_fragment" : "0xBF05; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_mpls"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 251,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "tc"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 252,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.tc = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "bos"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 253,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.bos = 0"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "ttl"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x40"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 149,
+            "column" : 32,
+            "source_fragment" : "64; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_mpls", "label"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 3
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 256,
+            "column" : 8,
+            "source_fragment" : "hdr.report_mpls.label = mon_label"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.init_int_metadata",
+      "id" : 100,
+      "runtime_data" : [
+        {
+          "name" : "report_type",
+          "bitwidth" : 3
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id14"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01fa"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 208,
+            "column" : 43,
+            "source_fragment" : "0x1FA; ..."
+          }
+        },
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_fabric_md_int_report_md"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 293,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._int_mirror_type3"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 179,
+            "column" : 17,
+            "source_fragment" : "1, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "bmd_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x02"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 167,
+            "column" : 20,
+            "source_fragment" : "2, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "mirror_type"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 179,
+            "column" : 17,
+            "source_fragment" : "1, ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ig_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_bridged", "_base_ig_port3"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 299,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.ig_port ="
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "eg_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 300,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.eg_port = (PortId_t)standard_md.egress_port"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "queue_id"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_egress_qid"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 301,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.queue_id = egress_qid"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "queue_occupancy"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "deq_qdepth"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 302,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.queue_occupancy = standard_md.deq_qdepth"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ig_tstamp"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 303,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.ig_tstamp = fabric_md.bridged.base.ig_tstamp[31:0]"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "eg_tstamp"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["standard_metadata", "egress_global_timestamp"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 304,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.eg_tstamp = standard_md.egress_global_timestamp[31:0]"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "ip_eth_type"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_bridged", "_base_ip_eth_type10"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 305,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.ip_eth_type ="
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "flow_hash"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_bridged", "_base_inner_hash1"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 306,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.flow_hash ="
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_report_md", "report_type"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 309,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_report_md.report_type = report_type"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "FabricEgress.int_egress.adjust_ip_udp_len",
+      "id" : 101,
+      "runtime_data" : [
+        {
+          "name" : "adjust_ip",
+          "bitwidth" : 16
+        },
+        {
+          "name" : "adjust_udp",
+          "bitwidth" : 16
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "total_len"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "int_egress_fabric_md_pkt_length"]
+                      },
+                      "right" : {
+                        "type" : "local",
+                        "value" : 0
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 342,
+            "column" : 8,
+            "source_fragment" : "hdr_v1model.ingress.ipv4.total_len = fabric_md.pkt_length + adjust_ip"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_udp10", "len"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["scalars", "int_egress_fabric_md_pkt_length"]
+                      },
+                      "right" : {
+                        "type" : "local",
+                        "value" : 1
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 343,
+            "column" : 8,
+            "source_fragment" : "hdr_v1model.ingress.udp.len = fabric_md.pkt_length + adjust_udp"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model136",
+      "id" : 102,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "exit",
+          "parameters" : [],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 136,
+            "column" : 12,
+            "source_fragment" : "exit"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model133",
+      "id" : 103,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_cpu_port37"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x0000"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 133,
+            "column" : 8,
+            "source_fragment" : "fabric_md.egress.cpu_port = 0"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator148",
+      "id" : 104,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_ipv47"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 148,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_tcp9"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 149,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_udp10"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 150,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_icmp11"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 151,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_vxlan15"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 153,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_inner_ethernet16"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 154,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_inner_eth_type17"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 155,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_gtpu12"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 157,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_gtpu_options13"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 158,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_gtpu_ext_psc14"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 159,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator14",
+      "id" : 105,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_int_bmd_drop_reason15"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 144,
+            "column" : 12,
+            "source_fragment" : "fabric_md.egress.bridged.int_bmd.drop_reason = fabric_md"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_int_bmd_report_type13"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_report_type46"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 145,
+            "column" : 12,
+            "source_fragment" : "fabric_md.egress.bridged.int_bmd.report_type = fabric_md"
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_ethernet24"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_eth_type25"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_ipv427"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_udp28"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_fixed_header29"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_common_report_header30"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_local_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_local_report_header31"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_drop_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_drop_report_header32"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_is_int_recirc44"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 134,
+            "column" : 32,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_vlan_tag4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 140,
+            "column" : 8,
+            "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator166",
+      "id" : 106,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "recirculate",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x3"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 166,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator169",
+      "id" : 107,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "recirculate",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x1"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 169,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator173",
+      "id" : 108,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_ethernet24"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_eth_type25"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_ipv427"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_udp28"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_fixed_header29"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_common_report_header30"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_local_report_header31"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_drop_report_header32"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator148_0",
+      "id" : 109,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_ipv47"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 148,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_tcp9"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 149,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.tcp.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_udp10"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 150,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.udp.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_icmp11"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 151,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.icmp.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_vxlan15"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 153,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.vxlan.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_inner_ethernet16"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 154,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.inner_ethernet.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_inner_eth_type17"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 155,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.inner_eth_type.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_gtpu12"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 157,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.gtpu.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_gtpu_options13"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 158,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.gtpu_options.setInvalid()"
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_gtpu_ext_psc14"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 159,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.gtpu_ext_psc.setInvalid()"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator14_0",
+      "id" : 110,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_ethernet24"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_eth_type25"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_ipv427"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_udp28"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_fixed_header29"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_common_report_header30"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_local_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_local_report_header31"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_drop_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_drop_report_header32"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_is_int_recirc44"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 134,
+            "column" : 32,
+            "source_fragment" : "= true; ..."
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_vlan_tag4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 140,
+            "column" : 8,
+            "source_fragment" : "hdr_v1model.ingress.vlan_tag.setInvalid()"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator166_0",
+      "id" : 111,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "recirculate",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 166,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator169_0",
+      "id" : 112,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "recirculate",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x1"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 169,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int_tna_parser_emulator173_0",
+      "id" : 113,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_ethernet24"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ethernet"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_eth_type25"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_ipv427"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_udp28"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_fixed_header29"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_common_report_header30"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_local_report_header31"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_drop_report_header32"
+            },
+            {
+              "type" : "header",
+              "value" : "parser_emulator_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "packetio51",
+      "id" : 114,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "add_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_packet_in1"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 51,
+            "column" : 12,
+            "source_fragment" : "hdr.packet_in.setValid()"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_packet_in1", "ingress_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_ingress_port49"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 52,
+            "column" : 12,
+            "source_fragment" : "hdr.packet_in.ingress_port = preserved_ig_port; ..."
+          }
+        },
+        {
+          "op" : "remove_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_ingress_fake_ethernet2"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 53,
+            "column" : 12,
+            "source_fragment" : "hdr.fake_ethernet.setInvalid()"
+          }
+        },
+        {
+          "op" : "exit",
+          "parameters" : [],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 54,
+            "column" : 12,
+            "source_fragment" : "exit"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "packetio60",
+      "id" : 115,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_pkt_length45"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["standard_metadata", "packet_length"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x0000ffff"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xfff2"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 60,
+            "column" : 37,
+            "source_fragment" : "= (bit<16>)standard_md.packet_length - 14; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next283",
+      "id" : 116,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_int_bmd_report_type13"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 219,
+            "column" : 50,
+            "source_fragment" : "0; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 285,
+            "column" : 21,
+            "source_fragment" : "= 1; ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next325",
+      "id" : 117,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 325,
+            "column" : 25,
+            "source_fragment" : "= 1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x83"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 258,
+            "column" : 32,
+            "source_fragment" : "131, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next323",
+      "id" : 118,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_mpls6", "ttl"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["_ingress_mpls6", "ttl"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xff"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 323,
+            "column" : 12,
+            "source_fragment" : "hdr.mpls.ttl = hdr.mpls.ttl - 1"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next333",
+      "id" : 119,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "ttl"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["_ingress_ipv47", "ttl"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xff"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 333,
+            "column" : 20,
+            "source_fragment" : "hdr.ipv4.ttl = hdr.ipv4.ttl - 1"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next336",
+      "id" : 120,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 336,
+            "column" : 29,
+            "source_fragment" : "= 1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x1a"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 247,
+            "column" : 30,
+            "source_fragment" : "26, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next343",
+      "id" : 121,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv68", "hop_limit"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "+",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["_ingress_ipv68", "hop_limit"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xff"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 343,
+            "column" : 20,
+            "source_fragment" : "hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "next346",
+      "id" : 122,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._drop_ctl2"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 346,
+            "column" : 29,
+            "source_fragment" : "= 1; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._recirc_preserved_drop_reason48"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x1a"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../shared/define.p4",
+            "line" : 247,
+            "column" : 30,
+            "source_fragment" : "26, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int128",
+      "id" : 123,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_eth_type"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_eth_type25"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_mpls"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_mpls26"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_ipv4"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_ipv427"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_udp"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_udp28"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_fixed_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_report_fixed_header29"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_common_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_common_report_header30"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_local_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_local_report_header31"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_drop_report_header"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_drop_report_header32"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_eth_type"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_eth_type35"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_fabric_md_bridged"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_bridged36"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "int_egress_fabric_md_int_report_md"
+            },
+            {
+              "type" : "header",
+              "value" : "_egress_int_report_md38"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "hop_latency"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_int_md_hop_latency39"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_int_md_timestamp40"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "vlan_stripped"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "d2b",
+                      "left" : null,
+                      "right" : {
+                        "type" : "field",
+                        "value" : ["scalars", "userMetadata._egress_int_md_vlan_stripped41"]
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "queue_report"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "d2b",
+                      "left" : null,
+                      "right" : {
+                        "type" : "field",
+                        "value" : ["scalars", "userMetadata._egress_int_md_queue_report42"]
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_fabric_md_pkt_length"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_pkt_length45"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 129,
+            "column" : 4,
+            "source_fragment" : "fabric_egress_metadata_t fabric_md = fabric_v1model.egress; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "int_egress_egress_qid"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x00"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 135,
+            "column" : 4,
+            "source_fragment" : "QueueId_t egress_qid = 0;"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "hop_latency"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "-",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "field",
+                            "value" : ["standard_metadata", "egress_global_timestamp"]
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffff"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "field",
+                            "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"]
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0xffffffff"
+                          }
+                        }
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 365,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_md.hop_latency = standard_md.egress_global_timestamp[31:0] - fabric_md.bridged.base.ig_tstamp[31:0]"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_global_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 366,
+            "column" : 8,
+            "source_fragment" : "fabric_md.int_md.timestamp = standard_md.egress_global_timestamp"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "key_0"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : ">>",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "expression",
+                                "value" : {
+                                  "op" : "-",
+                                  "left" : {
+                                    "type" : "expression",
+                                    "value" : {
+                                      "op" : "&",
+                                      "left" : {
+                                        "type" : "field",
+                                        "value" : ["standard_metadata", "egress_global_timestamp"]
+                                      },
+                                      "right" : {
+                                        "type" : "hexstr",
+                                        "value" : "0xffffffff"
+                                      }
+                                    }
+                                  },
+                                  "right" : {
+                                    "type" : "expression",
+                                    "value" : {
+                                      "op" : "&",
+                                      "left" : {
+                                        "type" : "field",
+                                        "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"]
+                                      },
+                                      "right" : {
+                                        "type" : "hexstr",
+                                        "value" : "0xffffffff"
+                                      }
+                                    }
+                                  }
+                                }
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0xffffffff"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x10"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffff"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 166,
+            "column" : 12,
+            "source_fragment" : "            fabric_md.int_md.hop_latency[31:16]: range @name(\\\"hop_latency_upper\\\");"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "key_1"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "-",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["standard_metadata", "egress_global_timestamp"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0xffffffff"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "field",
+                                "value" : ["int_egress_fabric_md_bridged", "_base_ig_tstamp9"]
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0xffffffff"
+                              }
+                            }
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0xffffffff"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 167,
+            "column" : 12,
+            "source_fragment" : "            fabric_md.int_md.hop_latency[15:0]: range @name(\\\"hop_latency_lower\\\");"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int383",
+      "id" : 124,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_35"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["int_egress_fabric_md_bridged", "_int_bmd_mirror_session_id14"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xffffffff"
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 384,
+            "column" : 20,
+            "source_fragment" : "(bit<32>)fabric_md.bridged.int_bmd.mirror_session_id"
+          }
+        },
+        {
+          "op" : "clone_egress_pkt_to_egress",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "tmp_35"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x1"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 383,
+            "column" : 16,
+            "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "int373",
+      "id" : 125,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["int_egress_hdr_report_fixed_header", "hw_id"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "|",
+                  "left" : {
+                    "type" : "hexstr",
+                    "value" : "0x00"
+                  },
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "&",
+                      "left" : {
+                        "type" : "expression",
+                        "value" : {
+                          "op" : "&",
+                          "left" : {
+                            "type" : "expression",
+                            "value" : {
+                              "op" : "&",
+                              "left" : {
+                                "type" : "expression",
+                                "value" : {
+                                  "op" : "&",
+                                  "left" : {
+                                    "type" : "expression",
+                                    "value" : {
+                                      "op" : ">>",
+                                      "left" : {
+                                        "type" : "field",
+                                        "value" : ["standard_metadata", "egress_spec"]
+                                      },
+                                      "right" : {
+                                        "type" : "hexstr",
+                                        "value" : "0x7"
+                                      }
+                                    }
+                                  },
+                                  "right" : {
+                                    "type" : "hexstr",
+                                    "value" : "0x01ff"
+                                  }
+                                }
+                              },
+                              "right" : {
+                                "type" : "hexstr",
+                                "value" : "0x03"
+                              }
+                            }
+                          },
+                          "right" : {
+                            "type" : "hexstr",
+                            "value" : "0x3f"
+                          }
+                        }
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x07"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 373,
+            "column" : 8,
+            "source_fragment" : "hdr.report_fixed_header.hw_id = 4w0 ++ standard_md.egress_spec[8:7]"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "slicing217",
+      "id" : 126,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["_ingress_ipv47", "dscp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["scalars", "dscp_rewriter_tmp_dscp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 217,
+            "column" : 16,
+            "source_fragment" : "hdr.ipv4.dscp = tmp_dscp"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "slicing189",
+      "id" : 127,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_bridged36"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_fabric_md_bridged"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 391,
+            "column" : 30,
+            "source_fragment" : "= fabric_md; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_int_report_md38"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_fabric_md_int_report_md"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 391,
+            "column" : 30,
+            "source_fragment" : "= fabric_md; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_int_md_hop_latency39"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "hop_latency"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 391,
+            "column" : 30,
+            "source_fragment" : "= fabric_md; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "userMetadata._egress_int_md_timestamp40"]
+            },
+            {
+              "type" : "field",
+              "value" : ["int_egress_fabric_md_int_md", "timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 391,
+            "column" : 30,
+            "source_fragment" : "= fabric_md; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_eth_type25"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_mpls26"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_mpls"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_ipv427"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_ipv4"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_udp28"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_udp"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_report_fixed_header29"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_report_fixed_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_common_report_header30"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_common_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_local_report_header31"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_local_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_drop_report_header32"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_drop_report_header"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign_header",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "_egress_eth_type35"
+            },
+            {
+              "type" : "header",
+              "value" : "int_egress_hdr_eth_type"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 392,
+            "column" : 27,
+            "source_fragment" : "= hdr; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "dscp_rewriter_tmp_dscp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["_egress_bridged36", "_base_slice_tc12"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 189,
+            "column" : 4,
+            "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc;"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model170",
+      "id" : 128,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "recirculate",
+          "parameters" : [
+            {
+              "type" : "hexstr",
+              "value" : "0x5"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 170,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "fabric_v1model174",
+      "id" : 129,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "mark_to_drop",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "standard_metadata"
+            }
+          ],
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 174,
+            "column" : 12,
+            "source_fragment" : "mark_to_drop(standard_md)"
+          }
+        }
+      ]
+    }
+  ],
+  "pipelines" : [
+    {
+      "name" : "ingress",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+        "line" : 35,
+        "column" : 8,
+        "source_fragment" : "FabricIngress"
+      },
+      "init_table" : "tbl_fabric_v1model61",
+      "tables" : [
+        {
+          "name" : "tbl_fabric_v1model61",
+          "id" : 0,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 61,
+            "column" : 8,
+            "source_fragment" : "mark_to_drop(standard_md)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [51],
+          "actions" : ["fabric_v1model61"],
+          "base_default_next" : "node_3",
+          "next_tables" : {
+            "fabric_v1model61" : "node_3"
+          },
+          "default_entry" : {
+            "action_id" : 51,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_fabric_v1model64",
+          "id" : 1,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 64,
+            "column" : 12,
+            "source_fragment" : "exit"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [50],
+          "actions" : ["fabric_v1model64"],
+          "base_default_next" : "node_5",
+          "next_tables" : {
+            "fabric_v1model64" : "node_5"
+          },
+          "default_entry" : {
+            "action_id" : 50,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_fabric_v1model70",
+          "id" : 2,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 70,
+            "column" : 51,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [52],
+          "actions" : ["fabric_v1model70"],
+          "base_default_next" : "tbl_lookup_md_init15",
+          "next_tables" : {
+            "fabric_v1model70" : "tbl_lookup_md_init15"
+          },
+          "default_entry" : {
+            "action_id" : 52,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init15",
+          "id" : 3,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 15,
+            "column" : 23,
+            "source_fragment" : "= hdr.ethernet.dst_addr; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [54],
+          "actions" : ["lookup_md_init15"],
+          "base_default_next" : "node_8",
+          "next_tables" : {
+            "lookup_md_init15" : "node_8"
+          },
+          "default_entry" : {
+            "action_id" : 54,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init21",
+          "id" : 4,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 21,
+            "column" : 27,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [53],
+          "actions" : ["lookup_md_init21"],
+          "base_default_next" : "tbl_lookup_md_init24",
+          "next_tables" : {
+            "lookup_md_init21" : "tbl_lookup_md_init24"
+          },
+          "default_entry" : {
+            "action_id" : 53,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init24",
+          "id" : 5,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 24,
+            "column" : 23,
+            "source_fragment" : "= false; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [63],
+          "actions" : ["lookup_md_init24"],
+          "base_default_next" : "node_11",
+          "next_tables" : {
+            "lookup_md_init24" : "node_11"
+          },
+          "default_entry" : {
+            "action_id" : 63,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init33",
+          "id" : 6,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 33,
+            "column" : 27,
+            "source_fragment" : "= true; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [58],
+          "actions" : ["lookup_md_init33"],
+          "base_default_next" : "node_13",
+          "next_tables" : {
+            "lookup_md_init33" : "node_13"
+          },
+          "default_entry" : {
+            "action_id" : 58,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init38",
+          "id" : 7,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 38,
+            "column" : 32,
+            "source_fragment" : "= hdr.inner_tcp.sport; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [55],
+          "actions" : ["lookup_md_init38"],
+          "base_default_next" : "node_27",
+          "next_tables" : {
+            "lookup_md_init38" : "node_27"
+          },
+          "default_entry" : {
+            "action_id" : 55,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init41",
+          "id" : 8,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 41,
+            "column" : 32,
+            "source_fragment" : "= hdr.inner_udp.sport; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [56],
+          "actions" : ["lookup_md_init41"],
+          "base_default_next" : "node_27",
+          "next_tables" : {
+            "lookup_md_init41" : "node_27"
+          },
+          "default_entry" : {
+            "action_id" : 56,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init44",
+          "id" : 9,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 44,
+            "column" : 33,
+            "source_fragment" : "= hdr.inner_icmp.icmp_type; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [57],
+          "actions" : ["lookup_md_init44"],
+          "base_default_next" : "node_27",
+          "next_tables" : {
+            "lookup_md_init44" : "node_27"
+          },
+          "default_entry" : {
+            "action_id" : 57,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init48",
+          "id" : 10,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 48,
+            "column" : 27,
+            "source_fragment" : "= true; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [62],
+          "actions" : ["lookup_md_init48"],
+          "base_default_next" : "node_21",
+          "next_tables" : {
+            "lookup_md_init48" : "node_21"
+          },
+          "default_entry" : {
+            "action_id" : 62,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init53",
+          "id" : 11,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 53,
+            "column" : 32,
+            "source_fragment" : "= hdr.tcp.sport; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [59],
+          "actions" : ["lookup_md_init53"],
+          "base_default_next" : "node_27",
+          "next_tables" : {
+            "lookup_md_init53" : "node_27"
+          },
+          "default_entry" : {
+            "action_id" : 59,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init56",
+          "id" : 12,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 56,
+            "column" : 32,
+            "source_fragment" : "= hdr.udp.sport; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [60],
+          "actions" : ["lookup_md_init56"],
+          "base_default_next" : "node_27",
+          "next_tables" : {
+            "lookup_md_init56" : "node_27"
+          },
+          "default_entry" : {
+            "action_id" : 60,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_lookup_md_init59",
+          "id" : 13,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 59,
+            "column" : 33,
+            "source_fragment" : "= hdr.icmp.icmp_type; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [61],
+          "actions" : ["lookup_md_init59"],
+          "base_default_next" : "node_27",
+          "next_tables" : {
+            "lookup_md_init59" : "node_27"
+          },
+          "default_entry" : {
+            "action_id" : 61,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_pkt_io_do_packet_out",
+          "id" : 14,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 25,
+            "column" : 12,
+            "source_fragment" : "do_packet_out()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [8],
+          "actions" : ["FabricIngress.pkt_io.do_packet_out"],
+          "base_default_next" : "FabricIngress.int_watchlist.watchlist",
+          "next_tables" : {
+            "FabricIngress.pkt_io.do_packet_out" : "FabricIngress.int_watchlist.watchlist"
+          },
+          "default_entry" : {
+            "action_id" : 8,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.int_watchlist.watchlist",
+          "id" : 15,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 34,
+            "column" : 10,
+            "source_fragment" : "watchlist"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "ipv4_valid",
+              "target" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_src",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_dst",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ip_proto",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"],
+              "mask" : null
+            },
+            {
+              "match_type" : "range",
+              "name" : "l4_sport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"],
+              "mask" : null
+            },
+            {
+              "match_type" : "range",
+              "name" : "l4_dport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "range",
+          "type" : "simple",
+          "max_size" : 64,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [46, 48, 47],
+          "actions" : ["FabricIngress.int_watchlist.mark_to_report", "FabricIngress.int_watchlist.no_report_collector", "FabricIngress.int_watchlist.no_report"],
+          "base_default_next" : "FabricIngress.stats.flows",
+          "next_tables" : {
+            "FabricIngress.int_watchlist.mark_to_report" : "FabricIngress.stats.flows",
+            "FabricIngress.int_watchlist.no_report_collector" : "FabricIngress.stats.flows",
+            "FabricIngress.int_watchlist.no_report" : "FabricIngress.stats.flows"
+          },
+          "default_entry" : {
+            "action_id" : 47,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.stats.flows",
+          "id" : 16,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4",
+            "line" : 21,
+            "column" : 10,
+            "source_fragment" : "flows"
+          },
+          "key" : [
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_src",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_dst",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ip_proto",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "l4_sport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "l4_dport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "ig_port",
+              "target" : ["_ingress_bridged4", "_base_ig_port3"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [7],
+          "actions" : ["FabricIngress.stats.count"],
+          "base_default_next" : "FabricIngress.slice_tc_classifier.classifier",
+          "next_tables" : {
+            "FabricIngress.stats.count" : "FabricIngress.slice_tc_classifier.classifier"
+          },
+          "default_entry" : {
+            "action_id" : 7,
+            "action_const" : true,
+            "action_data" : ["0x0"],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.slice_tc_classifier.classifier",
+          "id" : 17,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 44,
+            "column" : 10,
+            "source_fragment" : "classifier"
+          },
+          "key" : [
+            {
+              "match_type" : "ternary",
+              "name" : "ig_port",
+              "target" : ["_ingress_bridged4", "_base_ig_port3"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_src",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_dst",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ip_proto",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "l4_sport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "l4_dport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 512,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [38, 40, 39],
+          "actions" : ["FabricIngress.slice_tc_classifier.set_slice_id_tc", "FabricIngress.slice_tc_classifier.trust_dscp", "FabricIngress.slice_tc_classifier.no_classification"],
+          "base_default_next" : "FabricIngress.filtering.ingress_port_vlan",
+          "next_tables" : {
+            "FabricIngress.slice_tc_classifier.set_slice_id_tc" : "FabricIngress.filtering.ingress_port_vlan",
+            "FabricIngress.slice_tc_classifier.trust_dscp" : "FabricIngress.filtering.ingress_port_vlan",
+            "FabricIngress.slice_tc_classifier.no_classification" : "FabricIngress.filtering.ingress_port_vlan"
+          },
+          "default_entry" : {
+            "action_id" : 39,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.filtering.ingress_port_vlan",
+          "id" : 18,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 42,
+            "column" : 10,
+            "source_fragment" : "ingress_port_vlan"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "ig_port",
+              "target" : ["_ingress_bridged4", "_base_ig_port3"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "vlan_is_valid",
+              "target" : ["_ingress_vlan_tag4", "$valid$"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "vlan_id",
+              "target" : ["_ingress_vlan_tag4", "vlan_id"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [9, 10, 11],
+          "actions" : ["FabricIngress.filtering.deny", "FabricIngress.filtering.permit", "FabricIngress.filtering.permit_with_internal_vlan"],
+          "base_default_next" : "FabricIngress.filtering.fwd_classifier",
+          "next_tables" : {
+            "FabricIngress.filtering.deny" : "FabricIngress.filtering.fwd_classifier",
+            "FabricIngress.filtering.permit" : "FabricIngress.filtering.fwd_classifier",
+            "FabricIngress.filtering.permit_with_internal_vlan" : "FabricIngress.filtering.fwd_classifier"
+          },
+          "default_entry" : {
+            "action_id" : 9,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.filtering.fwd_classifier",
+          "id" : 19,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 80,
+            "column" : 10,
+            "source_fragment" : "fwd_classifier"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "ig_port",
+              "target" : ["_ingress_bridged4", "_base_ig_port3"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "eth_dst",
+              "target" : ["_ingress_ethernet3", "dst_addr"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "eth_type",
+              "target" : ["_ingress_eth_type5", "value"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "ip_eth_type",
+              "target" : ["_ingress_bridged4", "_base_ip_eth_type10"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [12],
+          "actions" : ["FabricIngress.filtering.set_forwarding_type"],
+          "base_default_next" : "tbl_filtering100",
+          "next_tables" : {
+            "FabricIngress.filtering.set_forwarding_type" : "tbl_filtering100"
+          },
+          "default_entry" : {
+            "action_id" : 12,
+            "action_const" : true,
+            "action_data" : ["0x0"],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_filtering100",
+          "id" : 20,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/filtering.p4",
+            "line" : 100,
+            "column" : 8,
+            "source_fragment" : "fwd_type_counter.count((bit<32>)fabric_md.bridged.base.fwd_type)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [64],
+          "actions" : ["filtering100"],
+          "base_default_next" : "node_35",
+          "next_tables" : {
+            "filtering100" : "node_35"
+          },
+          "default_entry" : {
+            "action_id" : 64,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.forwarding.bridging",
+          "id" : 21,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 39,
+            "column" : 10,
+            "source_fragment" : "bridging"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "vlan_id",
+              "target" : ["_ingress_bridged4", "_base_vlan_id6"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "eth_dst",
+              "target" : ["_ingress_ethernet3", "dst_addr"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [17, 13],
+          "actions" : ["FabricIngress.forwarding.set_next_id_bridging", "FabricIngress.forwarding.set_int_drop_reason"],
+          "base_default_next" : "tbl_hasher17",
+          "next_tables" : {
+            "FabricIngress.forwarding.set_next_id_bridging" : "tbl_hasher17",
+            "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17"
+          },
+          "default_entry" : {
+            "action_id" : 13,
+            "action_const" : true,
+            "action_data" : ["0x59"],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.forwarding.mpls",
+          "id" : 22,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 74,
+            "column" : 10,
+            "source_fragment" : "mpls"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "mpls_label",
+              "target" : ["_ingress_bridged4", "_base_mpls_label2"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [18, 14],
+          "actions" : ["FabricIngress.forwarding.pop_mpls_and_next", "FabricIngress.forwarding.set_int_drop_reason"],
+          "base_default_next" : "tbl_hasher17",
+          "next_tables" : {
+            "FabricIngress.forwarding.pop_mpls_and_next" : "tbl_hasher17",
+            "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17"
+          },
+          "default_entry" : {
+            "action_id" : 14,
+            "action_const" : true,
+            "action_data" : ["0x81"],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.forwarding.routing_v4",
+          "id" : 23,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 116,
+            "column" : 10,
+            "source_fragment" : "routing_v4"
+          },
+          "key" : [
+            {
+              "match_type" : "lpm",
+              "name" : "ipv4_dst",
+              "target" : ["scalars", "userMetadata._ingress_routing_ipv4_dst18"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "lpm",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [19, 20, 21, 15],
+          "actions" : ["FabricIngress.forwarding.set_next_id_routing_v4", "FabricIngress.forwarding.nop_routing_v4", "FabricIngress.forwarding.drop_routing_v4", "FabricIngress.forwarding.set_int_drop_reason"],
+          "base_default_next" : "tbl_hasher17",
+          "next_tables" : {
+            "FabricIngress.forwarding.set_next_id_routing_v4" : "tbl_hasher17",
+            "FabricIngress.forwarding.nop_routing_v4" : "tbl_hasher17",
+            "FabricIngress.forwarding.drop_routing_v4" : "tbl_hasher17",
+            "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17"
+          },
+          "default_entry" : {
+            "action_id" : 15,
+            "action_const" : false,
+            "action_data" : ["0x1d"],
+            "action_entry_const" : false
+          }
+        },
+        {
+          "name" : "FabricIngress.forwarding.routing_v6",
+          "id" : 24,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 155,
+            "column" : 10,
+            "source_fragment" : "routing_v6"
+          },
+          "key" : [
+            {
+              "match_type" : "lpm",
+              "name" : "ipv6_dst",
+              "target" : ["_ingress_ipv68", "dst_addr"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "lpm",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [22, 23, 16],
+          "actions" : ["FabricIngress.forwarding.set_next_id_routing_v6", "FabricIngress.forwarding.drop_routing_v6", "FabricIngress.forwarding.set_int_drop_reason"],
+          "base_default_next" : "tbl_hasher17",
+          "next_tables" : {
+            "FabricIngress.forwarding.set_next_id_routing_v6" : "tbl_hasher17",
+            "FabricIngress.forwarding.drop_routing_v6" : "tbl_hasher17",
+            "FabricIngress.forwarding.set_int_drop_reason" : "tbl_hasher17"
+          },
+          "default_entry" : {
+            "action_id" : 16,
+            "action_const" : false,
+            "action_data" : ["0x1d"],
+            "action_entry_const" : false
+          }
+        },
+        {
+          "name" : "tbl_hasher17",
+          "id" : 25,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 17,
+            "column" : 8,
+            "source_fragment" : "hash( ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [68],
+          "actions" : ["hasher17"],
+          "base_default_next" : "node_45",
+          "next_tables" : {
+            "hasher17" : "node_45"
+          },
+          "default_entry" : {
+            "action_id" : 68,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_hasher39",
+          "id" : 26,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 39,
+            "column" : 12,
+            "source_fragment" : "hash( ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [65],
+          "actions" : ["hasher39"],
+          "base_default_next" : "node_50",
+          "next_tables" : {
+            "hasher39" : "node_50"
+          },
+          "default_entry" : {
+            "action_id" : 65,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_hasher50",
+          "id" : 27,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 50,
+            "column" : 32,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [66],
+          "actions" : ["hasher50"],
+          "base_default_next" : "node_50",
+          "next_tables" : {
+            "hasher50" : "node_50"
+          },
+          "default_entry" : {
+            "action_id" : 66,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_hasher66",
+          "id" : 28,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 66,
+            "column" : 46,
+            "source_fragment" : "= 0; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [67],
+          "actions" : ["hasher66"],
+          "base_default_next" : "node_50",
+          "next_tables" : {
+            "hasher66" : "node_50"
+          },
+          "default_entry" : {
+            "action_id" : 67,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.pre_next.next_mpls",
+          "id" : 29,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4",
+            "line" : 22,
+            "column" : 10,
+            "source_fragment" : "next_mpls"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "next_id",
+              "target" : ["scalars", "userMetadata._ingress_next_id21"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [24, 0],
+          "actions" : ["FabricIngress.pre_next.set_mpls_label", "nop"],
+          "base_default_next" : "FabricIngress.pre_next.next_vlan",
+          "next_tables" : {
+            "FabricIngress.pre_next.set_mpls_label" : "FabricIngress.pre_next.next_vlan",
+            "nop" : "FabricIngress.pre_next.next_vlan"
+          },
+          "default_entry" : {
+            "action_id" : 0,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.pre_next.next_vlan",
+          "id" : 30,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/pre_next.p4",
+            "line" : 54,
+            "column" : 10,
+            "source_fragment" : "next_vlan"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "next_id",
+              "target" : ["scalars", "userMetadata._ingress_next_id21"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [25, 1],
+          "actions" : ["FabricIngress.pre_next.set_vlan", "nop"],
+          "base_default_next" : "FabricIngress.acl.acl",
+          "next_tables" : {
+            "FabricIngress.pre_next.set_vlan" : "FabricIngress.acl.acl",
+            "nop" : "FabricIngress.acl.acl"
+          },
+          "default_entry" : {
+            "action_id" : 1,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.acl.acl",
+          "id" : 31,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/acl.p4",
+            "line" : 74,
+            "column" : 10,
+            "source_fragment" : "acl"
+          },
+          "key" : [
+            {
+              "match_type" : "ternary",
+              "name" : "ig_port",
+              "target" : ["_ingress_bridged4", "_base_ig_port3"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "eth_dst",
+              "target" : ["_ingress_ethernet3", "dst_addr"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "eth_src",
+              "target" : ["_ingress_ethernet3", "src_addr"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "vlan_id",
+              "target" : ["scalars", "userMetadata._ingress_lkp_vlan_id9"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "eth_type",
+              "target" : ["scalars", "userMetadata._ingress_lkp_eth_type8"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_src",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_src11"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ipv4_dst",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ipv4_dst12"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ip_proto",
+              "target" : ["scalars", "userMetadata._ingress_lkp_ip_proto13"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "icmp_type",
+              "target" : ["scalars", "userMetadata._ingress_lkp_icmp_type16"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "icmp_code",
+              "target" : ["scalars", "userMetadata._ingress_lkp_icmp_code17"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "l4_sport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_sport14"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "l4_dport",
+              "target" : ["scalars", "userMetadata._ingress_lkp_l4_dport15"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "ig_port_type",
+              "target" : ["scalars", "userMetadata._ingress_ig_port_type33"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [26, 28, 27, 29, 30, 31],
+          "actions" : ["FabricIngress.acl.set_next_id_acl", "FabricIngress.acl.punt_to_cpu", "FabricIngress.acl.copy_to_cpu", "FabricIngress.acl.drop", "FabricIngress.acl.set_output_port", "FabricIngress.acl.nop_acl"],
+          "base_default_next" : "node_54",
+          "next_tables" : {
+            "FabricIngress.acl.set_next_id_acl" : "node_54",
+            "FabricIngress.acl.punt_to_cpu" : "node_54",
+            "FabricIngress.acl.copy_to_cpu" : "node_54",
+            "FabricIngress.acl.drop" : "node_54",
+            "FabricIngress.acl.set_output_port" : "node_54",
+            "FabricIngress.acl.nop_acl" : "node_54"
+          },
+          "default_entry" : {
+            "action_id" : 31,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.next.simple",
+          "id" : 32,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 88,
+            "column" : 10,
+            "source_fragment" : "simple"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "next_id",
+              "target" : ["scalars", "userMetadata._ingress_next_id21"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [32, 33, 2],
+          "actions" : ["FabricIngress.next.output_simple", "FabricIngress.next.routing_simple", "nop"],
+          "base_default_next" : "FabricIngress.next.hashed",
+          "next_tables" : {
+            "FabricIngress.next.output_simple" : "FabricIngress.next.hashed",
+            "FabricIngress.next.routing_simple" : "FabricIngress.next.hashed",
+            "nop" : "FabricIngress.next.hashed"
+          },
+          "default_entry" : {
+            "action_id" : 2,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.next.hashed",
+          "id" : 33,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 127,
+            "column" : 10,
+            "source_fragment" : "hashed"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "next_id",
+              "target" : ["scalars", "userMetadata._ingress_next_id21"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "indirect_ws",
+          "action_profile" : "FabricIngress.next.hashed_profile",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [34, 35, 3],
+          "actions" : ["FabricIngress.next.output_hashed", "FabricIngress.next.routing_hashed", "nop"],
+          "base_default_next" : "FabricIngress.next.multicast",
+          "next_tables" : {
+            "FabricIngress.next.output_hashed" : "FabricIngress.next.multicast",
+            "FabricIngress.next.routing_hashed" : "FabricIngress.next.multicast",
+            "nop" : "FabricIngress.next.multicast"
+          }
+        },
+        {
+          "name" : "FabricIngress.next.multicast",
+          "id" : 34,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 161,
+            "column" : 10,
+            "source_fragment" : "multicast"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "next_id",
+              "target" : ["scalars", "userMetadata._ingress_next_id21"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [36, 37],
+          "actions" : ["FabricIngress.next.set_mcast_group_id", "FabricIngress.next.reset_mcast_group_id"],
+          "base_default_next" : "FabricIngress.qos.set_slice_tc",
+          "next_tables" : {
+            "FabricIngress.next.set_mcast_group_id" : "FabricIngress.qos.set_slice_tc",
+            "FabricIngress.next.reset_mcast_group_id" : "FabricIngress.qos.set_slice_tc"
+          },
+          "default_entry" : {
+            "action_id" : 37,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.qos.set_slice_tc",
+          "id" : 35,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 91,
+            "column" : 10,
+            "source_fragment" : "set_slice_tc"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "fabric_md.is_upf_hit",
+              "target" : ["scalars", "userMetadata._ingress_is_upf_hit29"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 2,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [41, 42, 6],
+          "actions" : ["FabricIngress.qos.use_upf", "FabricIngress.qos.use_default", "NoAction"],
+          "base_default_next" : "FabricIngress.qos.default_tc",
+          "next_tables" : {
+            "FabricIngress.qos.use_upf" : "FabricIngress.qos.default_tc",
+            "FabricIngress.qos.use_default" : "FabricIngress.qos.default_tc",
+            "NoAction" : "FabricIngress.qos.default_tc"
+          },
+          "default_entry" : {
+            "action_id" : 6,
+            "action_const" : false,
+            "action_data" : [],
+            "action_entry_const" : false
+          },
+          "entries" : [
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+                "line" : 96,
+                "column" : 12,
+                "source_fragment" : "true: use_upf"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 41,
+                "action_data" : []
+              },
+              "priority" : 1
+            },
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+                "line" : 97,
+                "column" : 12,
+                "source_fragment" : "false: use_default"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 42,
+                "action_data" : []
+              },
+              "priority" : 2
+            }
+          ]
+        },
+        {
+          "name" : "FabricIngress.qos.default_tc",
+          "id" : 36,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 150,
+            "column" : 10,
+            "source_fragment" : "default_tc"
+          },
+          "key" : [
+            {
+              "match_type" : "ternary",
+              "name" : "slice_tc",
+              "target" : ["_ingress_bridged4", "_base_slice_tc12"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "tc_unknown",
+              "target" : ["scalars", "userMetadata._ingress_tc_unknown28"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 16,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [45, 4],
+          "actions" : ["FabricIngress.qos.set_default_tc", "nop"],
+          "base_default_next" : "node_60",
+          "next_tables" : {
+            "FabricIngress.qos.set_default_tc" : "node_60",
+            "nop" : "node_60"
+          },
+          "default_entry" : {
+            "action_id" : 4,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_slicing174",
+          "id" : 37,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 174,
+            "column" : 12,
+            "source_fragment" : "slice_tc_meter.execute_meter((bit<32>) fabric_md.bridged.base.slice_tc, packet_color)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [69],
+          "actions" : ["slicing174"],
+          "base_default_next" : "FabricIngress.qos.queues",
+          "next_tables" : {
+            "slicing174" : "FabricIngress.qos.queues"
+          },
+          "default_entry" : {
+            "action_id" : 69,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_slicing177",
+          "id" : 38,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 177,
+            "column" : 25,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [70],
+          "actions" : ["slicing177"],
+          "base_default_next" : "FabricIngress.qos.queues",
+          "next_tables" : {
+            "slicing177" : "FabricIngress.qos.queues"
+          },
+          "default_entry" : {
+            "action_id" : 70,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.qos.queues",
+          "id" : 39,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 122,
+            "column" : 10,
+            "source_fragment" : "queues"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "slice_tc",
+              "target" : ["_ingress_bridged4", "_base_slice_tc12"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "color",
+              "target" : ["scalars", "qos_packet_color"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 128,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [43, 44],
+          "actions" : ["FabricIngress.qos.set_queue", "FabricIngress.qos.meter_drop"],
+          "base_default_next" : "tbl_int112",
+          "next_tables" : {
+            "FabricIngress.qos.set_queue" : "tbl_int112",
+            "FabricIngress.qos.meter_drop" : "tbl_int112"
+          },
+          "default_entry" : {
+            "action_id" : 43,
+            "action_const" : true,
+            "action_data" : ["0x0"],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int112",
+          "id" : 40,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 112,
+            "column" : 46,
+            "source_fragment" : "= standard_md.egress_spec; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [71],
+          "actions" : ["int112"],
+          "base_default_next" : "FabricIngress.int_ingress.drop_report",
+          "next_tables" : {
+            "int112" : "FabricIngress.int_ingress.drop_report"
+          },
+          "default_entry" : {
+            "action_id" : 71,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricIngress.int_ingress.drop_report",
+          "id" : 41,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 86,
+            "column" : 10,
+            "source_fragment" : "drop_report"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "int_report_type",
+              "target" : ["_ingress_bridged4", "_int_bmd_report_type13"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "drop_ctl",
+              "target" : ["scalars", "userMetadata._drop_ctl2"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "punt_to_cpu",
+              "target" : ["scalars", "userMetadata._ingress_punt_to_cpu23"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "egress_port_set",
+              "target" : ["scalars", "userMetadata._ingress_egress_port_set22"],
+              "mask" : null
+            },
+            {
+              "match_type" : "ternary",
+              "name" : "mcast_group_id",
+              "target" : ["standard_metadata", "mcast_grp"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "ternary",
+          "type" : "simple",
+          "max_size" : 3,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [49, 5],
+          "actions" : ["FabricIngress.int_ingress.report_drop", "nop"],
+          "base_default_next" : "tbl_fabric_v1model106",
+          "next_tables" : {
+            "FabricIngress.int_ingress.report_drop" : "tbl_fabric_v1model106",
+            "nop" : "tbl_fabric_v1model106"
+          },
+          "default_entry" : {
+            "action_id" : 5,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          },
+          "entries" : [
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 101,
+                "column" : 12,
+                "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, false, _): report_drop()"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "ternary",
+                  "key" : "0x0000",
+                  "mask" : "0x0000"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 49,
+                "action_data" : []
+              },
+              "priority" : 1
+            },
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 102,
+                "column" : 12,
+                "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false, true, _): report_drop()"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "ternary",
+                  "key" : "0x0000",
+                  "mask" : "0x0000"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 49,
+                "action_data" : []
+              },
+              "priority" : 2
+            },
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 104,
+                "column" : 12,
+                "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false, false, 0): report_drop()"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "ternary",
+                  "key" : "0x0000",
+                  "mask" : "0xffff"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 49,
+                "action_data" : []
+              },
+              "priority" : 3
+            }
+          ]
+        },
+        {
+          "name" : "tbl_fabric_v1model106",
+          "id" : 42,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 106,
+            "column" : 33,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [73],
+          "actions" : ["fabric_v1model106"],
+          "base_default_next" : "node_67",
+          "next_tables" : {
+            "fabric_v1model106" : "node_67"
+          },
+          "default_entry" : {
+            "action_id" : 73,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_fabric_v1model110",
+          "id" : 43,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 110,
+            "column" : 12,
+            "source_fragment" : "mark_to_drop(standard_md)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [72],
+          "actions" : ["fabric_v1model110"],
+          "base_default_next" : null,
+          "next_tables" : {
+            "fabric_v1model110" : null
+          },
+          "default_entry" : {
+            "action_id" : 72,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        }
+      ],
+      "action_profiles" : [
+        {
+          "name" : "FabricIngress.next.hashed_profile",
+          "id" : 0,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 112,
+            "column" : 15,
+            "source_fragment" : "hashed_profile"
+          },
+          "max_size" : 16,
+          "selector" : {
+            "algo" : "crc16",
+            "input" : [
+              {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._ingress_ecmp_hash5"]
+              }
+            ]
+          }
+        }
+      ],
+      "conditionals" : [
+        {
+          "name" : "node_3",
+          "id" : 0,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 62,
+            "column" : 12,
+            "source_fragment" : "standard_md.parser_error == error.PacketRejectedByParser"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["standard_metadata", "parser_error"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x8"
+              }
+            }
+          },
+          "true_next" : "tbl_fabric_v1model64",
+          "false_next" : "node_5"
+        },
+        {
+          "name" : "node_5",
+          "id" : 1,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 67,
+            "column" : 13,
+            "source_fragment" : "standard_md.instance_type == 4"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["standard_metadata", "instance_type"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x00000004"
+              }
+            }
+          },
+          "true_next" : "tbl_fabric_v1model70",
+          "false_next" : "tbl_lookup_md_init15"
+        },
+        {
+          "name" : "node_8",
+          "id" : 2,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 20,
+            "column" : 12,
+            "source_fragment" : "hdr.vlan_tag.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_vlan_tag4", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init21",
+          "false_next" : "tbl_lookup_md_init24"
+        },
+        {
+          "name" : "node_11",
+          "id" : 3,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 32,
+            "column" : 12,
+            "source_fragment" : "hdr.inner_ipv4.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_inner_ipv418", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init33",
+          "false_next" : "node_19"
+        },
+        {
+          "name" : "node_13",
+          "id" : 4,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 37,
+            "column" : 16,
+            "source_fragment" : "hdr.inner_tcp.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_inner_tcp19", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init38",
+          "false_next" : "node_15"
+        },
+        {
+          "name" : "node_15",
+          "id" : 5,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 40,
+            "column" : 23,
+            "source_fragment" : "hdr.inner_udp.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_inner_udp20", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init41",
+          "false_next" : "node_17"
+        },
+        {
+          "name" : "node_17",
+          "id" : 6,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 43,
+            "column" : 23,
+            "source_fragment" : "hdr.inner_icmp.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_inner_icmp21", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init44",
+          "false_next" : "node_27"
+        },
+        {
+          "name" : "node_19",
+          "id" : 7,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 47,
+            "column" : 19,
+            "source_fragment" : "hdr.ipv4.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_ipv47", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init48",
+          "false_next" : "node_27"
+        },
+        {
+          "name" : "node_21",
+          "id" : 8,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 52,
+            "column" : 16,
+            "source_fragment" : "hdr.tcp.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_tcp9", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init53",
+          "false_next" : "node_23"
+        },
+        {
+          "name" : "node_23",
+          "id" : 9,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 55,
+            "column" : 23,
+            "source_fragment" : "hdr.udp.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_udp10", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init56",
+          "false_next" : "node_25"
+        },
+        {
+          "name" : "node_25",
+          "id" : 10,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/lookup_md_init.p4",
+            "line" : 58,
+            "column" : 23,
+            "source_fragment" : "hdr.icmp.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_icmp11", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_lookup_md_init59",
+          "false_next" : "node_27"
+        },
+        {
+          "name" : "node_27",
+          "id" : 11,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 24,
+            "column" : 12,
+            "source_fragment" : "hdr.packet_out.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_packet_out0", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_pkt_io_do_packet_out",
+          "false_next" : "FabricIngress.int_watchlist.watchlist"
+        },
+        {
+          "name" : "node_35",
+          "id" : 12,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 88,
+            "column" : 13,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._ingress_skip_forwarding19"]
+              }
+            }
+          },
+          "false_next" : "node_36",
+          "true_next" : "tbl_hasher17"
+        },
+        {
+          "name" : "node_36",
+          "id" : 13,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 178,
+            "column" : 12,
+            "source_fragment" : "hdr.ethernet.isValid() && ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_ethernet3", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x00"
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "FabricIngress.forwarding.bridging",
+          "false_next" : "node_38"
+        },
+        {
+          "name" : "node_38",
+          "id" : 14,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 181,
+            "column" : 19,
+            "source_fragment" : "hdr.mpls.isValid() && ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_mpls6", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x01"
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "FabricIngress.forwarding.mpls",
+          "false_next" : "node_40"
+        },
+        {
+          "name" : "node_40",
+          "id" : 15,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 184,
+            "column" : 19,
+            "source_fragment" : "fabric_md.lkp.is_ipv4 && ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "or",
+                  "left" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "==",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x02"
+                      }
+                    }
+                  },
+                  "right" : {
+                    "type" : "expression",
+                    "value" : {
+                      "op" : "==",
+                      "left" : {
+                        "type" : "field",
+                        "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+                      },
+                      "right" : {
+                        "type" : "hexstr",
+                        "value" : "0x03"
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "FabricIngress.forwarding.routing_v4",
+          "false_next" : "node_42"
+        },
+        {
+          "name" : "node_42",
+          "id" : 16,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/forwarding.p4",
+            "line" : 188,
+            "column" : 19,
+            "source_fragment" : "hdr.ipv6.isValid() && ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_ipv68", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_bridged4", "_base_fwd_type5"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x04"
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "FabricIngress.forwarding.routing_v6",
+          "false_next" : "tbl_hasher17"
+        },
+        {
+          "name" : "node_45",
+          "id" : 17,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/hasher.p4",
+            "line" : 38,
+            "column" : 12,
+            "source_fragment" : "hdr.gtpu.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_gtpu12", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_hasher39",
+          "false_next" : "node_47"
+        },
+        {
+          "name" : "node_47",
+          "id" : 18,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 91,
+            "column" : 34,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._ingress_lkp_is_ipv410"]
+              }
+            }
+          },
+          "true_next" : "tbl_hasher50",
+          "false_next" : "tbl_hasher66"
+        },
+        {
+          "name" : "node_50",
+          "id" : 19,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 92,
+            "column" : 13,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+              }
+            }
+          },
+          "false_next" : "FabricIngress.pre_next.next_mpls",
+          "true_next" : "FabricIngress.acl.acl"
+        },
+        {
+          "name" : "node_54",
+          "id" : 20,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 96,
+            "column" : 13,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._ingress_skip_next20"]
+              }
+            }
+          },
+          "false_next" : "FabricIngress.next.simple",
+          "true_next" : "FabricIngress.qos.set_slice_tc"
+        },
+        {
+          "name" : "node_60",
+          "id" : 21,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 173,
+            "column" : 12,
+            "source_fragment" : "fabric_md.upf_meter_color != MeterColor_t.RED"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "!=",
+              "left" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._ingress_upf_meter_color32"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x02"
+              }
+            }
+          },
+          "true_next" : "tbl_slicing174",
+          "false_next" : "tbl_slicing177"
+        },
+        {
+          "name" : "node_67",
+          "id" : 22,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 109,
+            "column" : 12,
+            "source_fragment" : "fabric_md.drop_ctl == 1"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._drop_ctl2"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x01"
+              }
+            }
+          },
+          "false_next" : null,
+          "true_next" : "tbl_fabric_v1model110"
+        }
+      ]
+    },
+    {
+      "name" : "egress",
+      "id" : 1,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+        "line" : 115,
+        "column" : 8,
+        "source_fragment" : "FabricEgress"
+      },
+      "init_table" : "tbl_fabric_v1model133",
+      "tables" : [
+        {
+          "name" : "tbl_fabric_v1model133",
+          "id" : 44,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 133,
+            "column" : 34,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [103],
+          "actions" : ["fabric_v1model133"],
+          "base_default_next" : "node_72",
+          "next_tables" : {
+            "fabric_v1model133" : "node_72"
+          },
+          "default_entry" : {
+            "action_id" : 103,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_fabric_v1model136",
+          "id" : 45,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 136,
+            "column" : 12,
+            "source_fragment" : "exit"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [102],
+          "actions" : ["fabric_v1model136"],
+          "base_default_next" : "node_74",
+          "next_tables" : {
+            "fabric_v1model136" : "node_74"
+          },
+          "default_entry" : {
+            "action_id" : 102,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator14",
+          "id" : 46,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [105],
+          "actions" : ["int_tna_parser_emulator14"],
+          "base_default_next" : "node_76",
+          "next_tables" : {
+            "int_tna_parser_emulator14" : "node_76"
+          },
+          "default_entry" : {
+            "action_id" : 105,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator148",
+          "id" : 47,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 148,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [104],
+          "actions" : ["int_tna_parser_emulator148"],
+          "base_default_next" : "node_78",
+          "next_tables" : {
+            "int_tna_parser_emulator148" : "node_78"
+          },
+          "default_entry" : {
+            "action_id" : 104,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_parser_emulator_parse_int_ingress_drop",
+          "id" : 48,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 165,
+            "column" : 12,
+            "source_fragment" : "parse_int_ingress_drop()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [89],
+          "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"],
+          "base_default_next" : "tbl_int_tna_parser_emulator166",
+          "next_tables" : {
+            "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166"
+          },
+          "default_entry" : {
+            "action_id" : 89,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator166",
+          "id" : 49,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 166,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [106],
+          "actions" : ["int_tna_parser_emulator166"],
+          "base_default_next" : "tbl_int_tna_parser_emulator173",
+          "next_tables" : {
+            "int_tna_parser_emulator166" : "tbl_int_tna_parser_emulator173"
+          },
+          "default_entry" : {
+            "action_id" : 106,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_parser_emulator_parse_int_report_mirror",
+          "id" : 50,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 168,
+            "column" : 12,
+            "source_fragment" : "parse_int_report_mirror()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [91],
+          "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"],
+          "base_default_next" : "tbl_int_tna_parser_emulator169",
+          "next_tables" : {
+            "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169"
+          },
+          "default_entry" : {
+            "action_id" : 91,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator169",
+          "id" : 51,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 169,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [107],
+          "actions" : ["int_tna_parser_emulator169"],
+          "base_default_next" : "tbl_int_tna_parser_emulator173",
+          "next_tables" : {
+            "int_tna_parser_emulator169" : "tbl_int_tna_parser_emulator173"
+          },
+          "default_entry" : {
+            "action_id" : 107,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator173",
+          "id" : 52,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [108],
+          "actions" : ["int_tna_parser_emulator173"],
+          "base_default_next" : "node_84",
+          "next_tables" : {
+            "int_tna_parser_emulator173" : "node_84"
+          },
+          "default_entry" : {
+            "action_id" : 108,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator14_0",
+          "id" : 53,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 14,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [110],
+          "actions" : ["int_tna_parser_emulator14_0"],
+          "base_default_next" : "node_86",
+          "next_tables" : {
+            "int_tna_parser_emulator14_0" : "node_86"
+          },
+          "default_entry" : {
+            "action_id" : 110,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator148_0",
+          "id" : 54,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 148,
+            "column" : 12,
+            "source_fragment" : "hdr_v1model.ingress.ipv4.setInvalid(); ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [109],
+          "actions" : ["int_tna_parser_emulator148_0"],
+          "base_default_next" : "node_88",
+          "next_tables" : {
+            "int_tna_parser_emulator148_0" : "node_88"
+          },
+          "default_entry" : {
+            "action_id" : 109,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_parser_emulator_parse_int_ingress_drop_0",
+          "id" : 55,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 165,
+            "column" : 12,
+            "source_fragment" : "parse_int_ingress_drop()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [90],
+          "actions" : ["FabricEgress.parser_emulator.parse_int_ingress_drop"],
+          "base_default_next" : "tbl_int_tna_parser_emulator166_0",
+          "next_tables" : {
+            "FabricEgress.parser_emulator.parse_int_ingress_drop" : "tbl_int_tna_parser_emulator166_0"
+          },
+          "default_entry" : {
+            "action_id" : 90,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator166_0",
+          "id" : 56,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 166,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [111],
+          "actions" : ["int_tna_parser_emulator166_0"],
+          "base_default_next" : "tbl_int_tna_parser_emulator173_0",
+          "next_tables" : {
+            "int_tna_parser_emulator166_0" : "tbl_int_tna_parser_emulator173_0"
+          },
+          "default_entry" : {
+            "action_id" : 111,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_parser_emulator_parse_int_report_mirror_0",
+          "id" : 57,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 168,
+            "column" : 12,
+            "source_fragment" : "parse_int_report_mirror()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [92],
+          "actions" : ["FabricEgress.parser_emulator.parse_int_report_mirror"],
+          "base_default_next" : "tbl_int_tna_parser_emulator169_0",
+          "next_tables" : {
+            "FabricEgress.parser_emulator.parse_int_report_mirror" : "tbl_int_tna_parser_emulator169_0"
+          },
+          "default_entry" : {
+            "action_id" : 92,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator169_0",
+          "id" : 58,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 169,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(PRESERVE_INT_MD)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [112],
+          "actions" : ["int_tna_parser_emulator169_0"],
+          "base_default_next" : "tbl_int_tna_parser_emulator173_0",
+          "next_tables" : {
+            "int_tna_parser_emulator169_0" : "tbl_int_tna_parser_emulator173_0"
+          },
+          "default_entry" : {
+            "action_id" : 112,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int_tna_parser_emulator173_0",
+          "id" : 59,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 173,
+            "column" : 27,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [113],
+          "actions" : ["int_tna_parser_emulator173_0"],
+          "base_default_next" : "FabricEgress.pkt_io_egress.switch_info",
+          "next_tables" : {
+            "int_tna_parser_emulator173_0" : "FabricEgress.pkt_io_egress.switch_info"
+          },
+          "default_entry" : {
+            "action_id" : 113,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.pkt_io_egress.switch_info",
+          "id" : 60,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 39,
+            "column" : 10,
+            "source_fragment" : "switch_info"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [81, 74],
+          "actions" : ["FabricEgress.pkt_io_egress.set_switch_info", "nop"],
+          "base_default_next" : "node_95",
+          "next_tables" : {
+            "FabricEgress.pkt_io_egress.set_switch_info" : "node_95",
+            "nop" : "node_95"
+          },
+          "default_entry" : {
+            "action_id" : 74,
+            "action_const" : false,
+            "action_data" : [],
+            "action_entry_const" : false
+          }
+        },
+        {
+          "name" : "tbl_packetio51",
+          "id" : 61,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 51,
+            "column" : 12,
+            "source_fragment" : "hdr.packet_in.setValid(); ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [114],
+          "actions" : ["packetio51"],
+          "base_default_next" : "node_97",
+          "next_tables" : {
+            "packetio51" : "node_97"
+          },
+          "default_entry" : {
+            "action_id" : 114,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_packetio60",
+          "id" : 62,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 60,
+            "column" : 37,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [115],
+          "actions" : ["packetio60"],
+          "base_default_next" : "node_99",
+          "next_tables" : {
+            "packetio60" : "node_99"
+          },
+          "default_entry" : {
+            "action_id" : 115,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.stats.flows",
+          "id" : 63,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4",
+            "line" : 53,
+            "column" : 10,
+            "source_fragment" : "flows"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "stats_flow_id",
+              "target" : ["_egress_bridged36", "_base_stats_flow_id11"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "eg_port",
+              "target" : ["standard_metadata", "egress_port"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [80],
+          "actions" : ["FabricEgress.stats.count"],
+          "base_default_next" : "node_101",
+          "next_tables" : {
+            "FabricEgress.stats.count" : "node_101"
+          },
+          "default_entry" : {
+            "action_id" : 80,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next283",
+          "id" : 64,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 283,
+            "column" : 50,
+            "source_fragment" : "= INT_REPORT_TYPE_NO_REPORT; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [116],
+          "actions" : ["next283"],
+          "base_default_next" : "node_103",
+          "next_tables" : {
+            "next283" : "node_103"
+          },
+          "default_entry" : {
+            "action_id" : 116,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_egress_next_pop_mpls_if_present",
+          "id" : 65,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 289,
+            "column" : 36,
+            "source_fragment" : "pop_mpls_if_present()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [82],
+          "actions" : ["FabricEgress.egress_next.pop_mpls_if_present"],
+          "base_default_next" : "node_107",
+          "next_tables" : {
+            "FabricEgress.egress_next.pop_mpls_if_present" : "node_107"
+          },
+          "default_entry" : {
+            "action_id" : 82,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_egress_next_set_mpls",
+          "id" : 66,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 291,
+            "column" : 12,
+            "source_fragment" : "set_mpls()"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [83],
+          "actions" : ["FabricEgress.egress_next.set_mpls"],
+          "base_default_next" : "node_107",
+          "next_tables" : {
+            "FabricEgress.egress_next.set_mpls" : "node_107"
+          },
+          "default_entry" : {
+            "action_id" : 83,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.egress_next.egress_vlan",
+          "id" : 67,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 264,
+            "column" : 10,
+            "source_fragment" : "egress_vlan"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "vlan_id",
+              "target" : ["_egress_bridged36", "_base_vlan_id6"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "eg_port",
+              "target" : ["standard_metadata", "egress_port"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [84, 85, 86],
+          "actions" : ["FabricEgress.egress_next.push_vlan", "FabricEgress.egress_next.pop_vlan", "FabricEgress.egress_next.drop"],
+          "base_default_next" : "node_109",
+          "next_tables" : {
+            "FabricEgress.egress_next.push_vlan" : "node_109",
+            "FabricEgress.egress_next.pop_vlan" : "node_109",
+            "FabricEgress.egress_next.drop" : "node_109"
+          },
+          "default_entry" : {
+            "action_id" : 86,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next323",
+          "id" : 68,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 323,
+            "column" : 25,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [118],
+          "actions" : ["next323"],
+          "base_default_next" : "node_111",
+          "next_tables" : {
+            "next323" : "node_111"
+          },
+          "default_entry" : {
+            "action_id" : 118,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next325",
+          "id" : 69,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 325,
+            "column" : 25,
+            "source_fragment" : "= 1; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [117],
+          "actions" : ["next325"],
+          "base_default_next" : "tbl_int128",
+          "next_tables" : {
+            "next325" : "tbl_int128"
+          },
+          "default_entry" : {
+            "action_id" : 117,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next333",
+          "id" : 70,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 333,
+            "column" : 33,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [119],
+          "actions" : ["next333"],
+          "base_default_next" : "node_116",
+          "next_tables" : {
+            "next333" : "node_116"
+          },
+          "default_entry" : {
+            "action_id" : 119,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next336",
+          "id" : 71,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 336,
+            "column" : 29,
+            "source_fragment" : "= 1; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [120],
+          "actions" : ["next336"],
+          "base_default_next" : "tbl_int128",
+          "next_tables" : {
+            "next336" : "tbl_int128"
+          },
+          "default_entry" : {
+            "action_id" : 120,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next343",
+          "id" : 72,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 343,
+            "column" : 39,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [121],
+          "actions" : ["next343"],
+          "base_default_next" : "node_121",
+          "next_tables" : {
+            "next343" : "node_121"
+          },
+          "default_entry" : {
+            "action_id" : 121,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_next346",
+          "id" : 73,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 346,
+            "column" : 29,
+            "source_fragment" : "= 1; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [122],
+          "actions" : ["next346"],
+          "base_default_next" : "tbl_int128",
+          "next_tables" : {
+            "next346" : "tbl_int128"
+          },
+          "default_entry" : {
+            "action_id" : 122,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_int128",
+          "id" : 74,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 128,
+            "column" : 4,
+            "source_fragment" : "egress_headers_t hdr = hdr_v1model.egress; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [123],
+          "actions" : ["int128"],
+          "base_default_next" : "FabricEgress.int_egress.queue_latency_thresholds",
+          "next_tables" : {
+            "int128" : "FabricEgress.int_egress.queue_latency_thresholds"
+          },
+          "default_entry" : {
+            "action_id" : 123,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.int_egress.queue_latency_thresholds",
+          "id" : 75,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 159,
+            "column" : 10,
+            "source_fragment" : "queue_latency_thresholds"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "egress_qid",
+              "target" : ["scalars", "int_egress_egress_qid"],
+              "mask" : null
+            },
+            {
+              "match_type" : "range",
+              "name" : "hop_latency_upper",
+              "target" : ["scalars", "key_0"],
+              "mask" : null
+            },
+            {
+              "match_type" : "range",
+              "name" : "hop_latency_lower",
+              "target" : ["scalars", "key_1"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "range",
+          "type" : "simple",
+          "max_size" : 128,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [93, 94, 76],
+          "actions" : ["FabricEgress.int_egress.check_quota", "FabricEgress.int_egress.reset_quota", "nop"],
+          "base_default_next" : "FabricEgress.int_egress.config",
+          "next_tables" : {
+            "FabricEgress.int_egress.check_quota" : "FabricEgress.int_egress.config",
+            "FabricEgress.int_egress.reset_quota" : "FabricEgress.int_egress.config",
+            "nop" : "FabricEgress.int_egress.config"
+          },
+          "default_entry" : {
+            "action_id" : 76,
+            "action_const" : false,
+            "action_data" : [],
+            "action_entry_const" : false
+          }
+        },
+        {
+          "name" : "FabricEgress.int_egress.config",
+          "id" : 76,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 183,
+            "column" : 10,
+            "source_fragment" : "config"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [95],
+          "actions" : ["FabricEgress.int_egress.set_config"],
+          "base_default_next" : "tbl_int373",
+          "next_tables" : {
+            "FabricEgress.int_egress.set_config" : "tbl_int373"
+          },
+          "default_entry" : {
+            "action_id" : 95,
+            "action_const" : false,
+            "action_data" : ["0xffffff00", "0xffffc0000000"],
+            "action_entry_const" : false
+          }
+        },
+        {
+          "name" : "tbl_int373",
+          "id" : 77,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 373,
+            "column" : 38,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [125],
+          "actions" : ["int373"],
+          "base_default_next" : "node_127",
+          "next_tables" : {
+            "int373" : "node_127"
+          },
+          "default_entry" : {
+            "action_id" : 125,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.int_egress.report",
+          "id" : 78,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 260,
+            "column" : 10,
+            "source_fragment" : "report"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "bmd_type",
+              "target" : ["int_egress_fabric_md_int_report_md", "bmd_type"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "mirror_type",
+              "target" : ["int_egress_fabric_md_int_report_md", "mirror_type"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "int_report_type",
+              "target" : ["int_egress_fabric_md_int_report_md", "report_type"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 6,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [96, 97, 98, 99, 77],
+          "actions" : ["FabricEgress.int_egress.do_local_report_encap", "FabricEgress.int_egress.do_local_report_encap_mpls", "FabricEgress.int_egress.do_drop_report_encap", "FabricEgress.int_egress.do_drop_report_encap_mpls", "nop"],
+          "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+          "next_tables" : {
+            "FabricEgress.int_egress.do_local_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+            "FabricEgress.int_egress.do_local_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+            "FabricEgress.int_egress.do_drop_report_encap" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+            "FabricEgress.int_egress.do_drop_report_encap_mpls" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+            "nop" : "FabricEgress.int_egress.adjust_int_report_hdr_length"
+          },
+          "default_entry" : {
+            "action_id" : 77,
+            "action_const" : false,
+            "action_data" : [],
+            "action_entry_const" : false
+          }
+        },
+        {
+          "name" : "FabricEgress.int_egress.int_metadata",
+          "id" : 79,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 315,
+            "column" : 10,
+            "source_fragment" : "int_metadata"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "int_report_type",
+              "target" : ["_egress_bridged36", "_int_bmd_report_type13"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "drop_ctl",
+              "target" : ["scalars", "userMetadata._drop_ctl2"],
+              "mask" : null
+            },
+            {
+              "match_type" : "exact",
+              "name" : "queue_report",
+              "target" : ["scalars", "userMetadata._egress_int_md_queue_report42"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 2,
+          "with_counters" : true,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [100, 78],
+          "actions" : ["FabricEgress.int_egress.init_int_metadata", "nop"],
+          "base_default_next" : null,
+          "next_tables" : {
+            "__HIT__" : "tbl_int383",
+            "__MISS__" : "FabricEgress.int_egress.adjust_int_report_hdr_length"
+          },
+          "default_entry" : {
+            "action_id" : 78,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          },
+          "entries" : [
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 327,
+                "column" : 12,
+                "source_fragment" : "(INT_REPORT_TYPE_FLOW, 0, false): init_int_metadata(INT_REPORT_TYPE_FLOW)"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 100,
+                "action_data" : ["0x1"]
+              },
+              "priority" : 1
+            },
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 329,
+                "column" : 12,
+                "source_fragment" : "(INT_REPORT_TYPE_FLOW, 1, false): init_int_metadata(INT_REPORT_TYPE_DROP)"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                },
+                {
+                  "match_type" : "exact",
+                  "key" : "0x00"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 100,
+                "action_data" : ["0x4"]
+              },
+              "priority" : 2
+            }
+          ]
+        },
+        {
+          "name" : "tbl_int383",
+          "id" : 80,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 383,
+            "column" : 16,
+            "source_fragment" : "clone_preserving_field_list(CloneType.E2E, ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [124],
+          "actions" : ["int383"],
+          "base_default_next" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+          "next_tables" : {
+            "int383" : "FabricEgress.int_egress.adjust_int_report_hdr_length"
+          },
+          "default_entry" : {
+            "action_id" : 124,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.int_egress.adjust_int_report_hdr_length",
+          "id" : 81,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 347,
+            "column" : 10,
+            "source_fragment" : "adjust_int_report_hdr_length"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "is_int_wip",
+              "target" : ["int_egress_fabric_md_bridged", "_int_bmd_wip_type18"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 2,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [79, 101],
+          "actions" : ["nop", "FabricEgress.int_egress.adjust_ip_udp_len"],
+          "base_default_next" : "tbl_slicing189",
+          "next_tables" : {
+            "nop" : "tbl_slicing189",
+            "FabricEgress.int_egress.adjust_ip_udp_len" : "tbl_slicing189"
+          },
+          "default_entry" : {
+            "action_id" : 79,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          },
+          "entries" : [
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 358,
+                "column" : 12,
+                "source_fragment" : "INT_IS_WIP: adjust_ip_udp_len(INT_WIP_ADJUST_IP_BYTES, INT_WIP_ADJUST_UDP_BYTES)"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x01"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 101,
+                "action_data" : ["0xfff2", "0xffde"]
+              },
+              "priority" : 1
+            },
+            {
+              "source_info" : {
+                "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+                "line" : 359,
+                "column" : 12,
+                "source_fragment" : "INT_IS_WIP_WITH_MPLS: adjust_ip_udp_len(INT_WIP_ADJUST_IP_MPLS_BYTES, INT_WIP_ADJUST_UDP_MPLS_BYTES)"
+              },
+              "match_key" : [
+                {
+                  "match_type" : "exact",
+                  "key" : "0x02"
+                }
+              ],
+              "action_entry" : {
+                "action_id" : 101,
+                "action_data" : ["0xffee", "0xffda"]
+              },
+              "priority" : 2
+            }
+          ]
+        },
+        {
+          "name" : "tbl_slicing189",
+          "id" : 82,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 189,
+            "column" : 4,
+            "source_fragment" : "bit<6> tmp_dscp = fabric_md.bridged.base.slice_tc; ..."
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [127],
+          "actions" : ["slicing189"],
+          "base_default_next" : "FabricEgress.dscp_rewriter.rewriter",
+          "next_tables" : {
+            "slicing189" : "FabricEgress.dscp_rewriter.rewriter"
+          },
+          "default_entry" : {
+            "action_id" : 127,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "FabricEgress.dscp_rewriter.rewriter",
+          "id" : 83,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 201,
+            "column" : 10,
+            "source_fragment" : "rewriter"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "eg_port",
+              "target" : ["standard_metadata", "egress_port"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 512,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [87, 88, 75],
+          "actions" : ["FabricEgress.dscp_rewriter.rewrite", "FabricEgress.dscp_rewriter.clear", "nop"],
+          "base_default_next" : null,
+          "next_tables" : {
+            "__HIT__" : "node_134",
+            "__MISS__" : "node_136"
+          },
+          "default_entry" : {
+            "action_id" : 75,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_slicing217",
+          "id" : 84,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 217,
+            "column" : 30,
+            "source_fragment" : "="
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [126],
+          "actions" : ["slicing217"],
+          "base_default_next" : "node_136",
+          "next_tables" : {
+            "slicing217" : "node_136"
+          },
+          "default_entry" : {
+            "action_id" : 126,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_fabric_v1model170",
+          "id" : 85,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 170,
+            "column" : 12,
+            "source_fragment" : "recirculate_preserving_field_list(NO_PRESERVATION)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [128],
+          "actions" : ["fabric_v1model170"],
+          "base_default_next" : "node_138",
+          "next_tables" : {
+            "fabric_v1model170" : "node_138"
+          },
+          "default_entry" : {
+            "action_id" : 128,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_fabric_v1model174",
+          "id" : 86,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 174,
+            "column" : 12,
+            "source_fragment" : "mark_to_drop(standard_md)"
+          },
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [129],
+          "actions" : ["fabric_v1model174"],
+          "base_default_next" : null,
+          "next_tables" : {
+            "fabric_v1model174" : null
+          },
+          "default_entry" : {
+            "action_id" : 129,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        }
+      ],
+      "action_profiles" : [],
+      "conditionals" : [
+        {
+          "name" : "node_72",
+          "id" : 23,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 135,
+            "column" : 12,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._skip_egress0"]
+              }
+            }
+          },
+          "true_next" : "tbl_fabric_v1model136",
+          "false_next" : "node_74"
+        },
+        {
+          "name" : "node_74",
+          "id" : 24,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 140,
+            "column" : 13,
+            "source_fragment" : "standard_md.instance_type == 2"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["standard_metadata", "instance_type"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x00000002"
+              }
+            }
+          },
+          "true_next" : "tbl_int_tna_parser_emulator14",
+          "false_next" : "node_84"
+        },
+        {
+          "name" : "node_76",
+          "id" : 25,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 145,
+            "column" : 11,
+            "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "or",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_gtpu12", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_vxlan15", "$valid$"]
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "tbl_int_tna_parser_emulator148",
+          "false_next" : "node_78"
+        },
+        {
+          "name" : "node_78",
+          "id" : 26,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 164,
+            "column" : 12,
+            "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["scalars", "userMetadata._recirc_preserved_report_type46"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x04"
+              }
+            }
+          },
+          "true_next" : "tbl_parser_emulator_parse_int_ingress_drop",
+          "false_next" : "tbl_parser_emulator_parse_int_report_mirror"
+        },
+        {
+          "name" : "node_84",
+          "id" : 27,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 150,
+            "column" : 11,
+            "source_fragment" : "(bit<8>)fabric_md.egress.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_int_bmd_report_type13"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x04"
+              }
+            }
+          },
+          "true_next" : "tbl_int_tna_parser_emulator14_0",
+          "false_next" : "FabricEgress.pkt_io_egress.switch_info"
+        },
+        {
+          "name" : "node_86",
+          "id" : 28,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 145,
+            "column" : 11,
+            "source_fragment" : "hdr_v1model.ingress.gtpu.isValid() || hdr_v1model.ingress.vxlan.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "or",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_gtpu12", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_vxlan15", "$valid$"]
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "tbl_int_tna_parser_emulator148_0",
+          "false_next" : "node_88"
+        },
+        {
+          "name" : "node_88",
+          "id" : 29,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int_tna_parser_emulator.p4",
+            "line" : 164,
+            "column" : 12,
+            "source_fragment" : "(bit<8>)fabric_md.bridged.int_bmd.report_type == BridgedMdType_t.INT_INGRESS_DROP"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "&",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_int_bmd_report_type13"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xff"
+                  }
+                }
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x04"
+              }
+            }
+          },
+          "true_next" : "tbl_parser_emulator_parse_int_ingress_drop_0",
+          "false_next" : "tbl_parser_emulator_parse_int_report_mirror_0"
+        },
+        {
+          "name" : "node_95",
+          "id" : 30,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 50,
+            "column" : 12,
+            "source_fragment" : "standard_md.egress_port == fabric_md.cpu_port"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["standard_metadata", "egress_port"]
+              },
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._egress_cpu_port37"]
+              }
+            }
+          },
+          "true_next" : "tbl_packetio51",
+          "false_next" : "node_97"
+        },
+        {
+          "name" : "node_97",
+          "id" : 31,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/packetio.p4",
+            "line" : 58,
+            "column" : 12,
+            "source_fragment" : "hdr.fake_ethernet.isValid() && ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_fake_ethernet2", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_ingress_fake_ethernet2", "ether_type"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0xbf03"
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "tbl_packetio60",
+          "false_next" : "node_99"
+        },
+        {
+          "name" : "node_99",
+          "id" : 32,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/stats.p4",
+            "line" : 67,
+            "column" : 12,
+            "source_fragment" : "bmd_type == BridgedMdType_t.INGRESS_TO_EGRESS"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["_egress_bridged36", "_bmd_type0"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x01"
+              }
+            }
+          },
+          "true_next" : "FabricEgress.stats.flows",
+          "false_next" : "node_101"
+        },
+        {
+          "name" : "node_101",
+          "id" : 33,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 280,
+            "column" : 12,
+            "source_fragment" : "fabric_md.bridged.base.is_multicast ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_base_is_multicast4"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_base_ig_port3"]
+                  },
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["standard_metadata", "egress_port"]
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "tbl_next283",
+          "false_next" : "node_103"
+        },
+        {
+          "name" : "node_103",
+          "id" : 34,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 288,
+            "column" : 12,
+            "source_fragment" : "fabric_md.bridged.base.mpls_label == 0"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["_egress_bridged36", "_base_mpls_label2"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x000000"
+              }
+            }
+          },
+          "true_next" : "node_104",
+          "false_next" : "tbl_egress_next_set_mpls"
+        },
+        {
+          "name" : "node_104",
+          "id" : 35,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 289,
+            "column" : 16,
+            "source_fragment" : "hdr.mpls.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_mpls6", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_egress_next_pop_mpls_if_present",
+          "false_next" : "node_107"
+        },
+        {
+          "name" : "node_107",
+          "id" : 36,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 159,
+            "column" : 39,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._egress_is_int_recirc44"]
+              }
+            }
+          },
+          "false_next" : "FabricEgress.egress_next.egress_vlan",
+          "true_next" : "node_109"
+        },
+        {
+          "name" : "node_109",
+          "id" : 37,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 322,
+            "column" : 12,
+            "source_fragment" : "hdr.mpls.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_mpls6", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_next323",
+          "false_next" : "node_113"
+        },
+        {
+          "name" : "node_111",
+          "id" : 38,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 324,
+            "column" : 16,
+            "source_fragment" : "hdr.mpls.ttl == 0"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["_ingress_mpls6", "ttl"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x00"
+              }
+            }
+          },
+          "true_next" : "tbl_next325",
+          "false_next" : "tbl_int128"
+        },
+        {
+          "name" : "node_113",
+          "id" : 39,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 331,
+            "column" : 16,
+            "source_fragment" : "hdr.ipv4.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_ipv47", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "!=",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_base_fwd_type5"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x00"
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "node_114",
+          "false_next" : "node_118"
+        },
+        {
+          "name" : "node_114",
+          "id" : 40,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 319,
+            "column" : 28,
+            "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "or",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_bmd_type0"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x04"
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_bmd_type0"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x02"
+                  }
+                }
+              }
+            }
+          },
+          "false_next" : "tbl_next333",
+          "true_next" : "node_116"
+        },
+        {
+          "name" : "node_116",
+          "id" : 41,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 335,
+            "column" : 20,
+            "source_fragment" : "hdr.ipv4.ttl == 0"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["_ingress_ipv47", "ttl"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x00"
+              }
+            }
+          },
+          "true_next" : "tbl_next336",
+          "false_next" : "tbl_int128"
+        },
+        {
+          "name" : "node_118",
+          "id" : 42,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 341,
+            "column" : 23,
+            "source_fragment" : "hdr.ipv6.isValid() && fabric_md.bridged.base.fwd_type != FWD_BRIDGING"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "and",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "d2b",
+                  "left" : null,
+                  "right" : {
+                    "type" : "field",
+                    "value" : ["_ingress_ipv68", "$valid$"]
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "!=",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_base_fwd_type5"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x00"
+                  }
+                }
+              }
+            }
+          },
+          "true_next" : "node_119",
+          "false_next" : "tbl_int128"
+        },
+        {
+          "name" : "node_119",
+          "id" : 43,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 319,
+            "column" : 28,
+            "source_fragment" : "(fabric_md.bridged.bmd_type == BridgedMdType_t.INT_INGRESS_DROP) || ..."
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "or",
+              "left" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_bmd_type0"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x04"
+                  }
+                }
+              },
+              "right" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "==",
+                  "left" : {
+                    "type" : "field",
+                    "value" : ["_egress_bridged36", "_bmd_type0"]
+                  },
+                  "right" : {
+                    "type" : "hexstr",
+                    "value" : "0x02"
+                  }
+                }
+              }
+            }
+          },
+          "false_next" : "tbl_next343",
+          "true_next" : "node_121"
+        },
+        {
+          "name" : "node_121",
+          "id" : 44,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/next.p4",
+            "line" : 345,
+            "column" : 20,
+            "source_fragment" : "hdr.ipv6.hop_limit == 0"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["_ingress_ipv68", "hop_limit"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x00"
+              }
+            }
+          },
+          "true_next" : "tbl_next346",
+          "false_next" : "tbl_int128"
+        },
+        {
+          "name" : "node_127",
+          "id" : 45,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/int.p4",
+            "line" : 375,
+            "column" : 12,
+            "source_fragment" : "fabric_md.int_report_md.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["int_egress_fabric_md_int_report_md", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "FabricEgress.int_egress.report",
+          "false_next" : "FabricEgress.int_egress.int_metadata"
+        },
+        {
+          "name" : "node_134",
+          "id" : 46,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/slicing.p4",
+            "line" : 216,
+            "column" : 16,
+            "source_fragment" : "hdr.ipv4.isValid()"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["_ingress_ipv47", "$valid$"]
+              }
+            }
+          },
+          "true_next" : "tbl_slicing217",
+          "false_next" : "node_136"
+        },
+        {
+          "name" : "node_136",
+          "id" : 47,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 168,
+            "column" : 12,
+            "source_fragment" : "fabric_md"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "d2b",
+              "left" : null,
+              "right" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._do_upf_uplink_recirc1"]
+              }
+            }
+          },
+          "true_next" : "tbl_fabric_v1model170",
+          "false_next" : "node_138"
+        },
+        {
+          "name" : "node_138",
+          "id" : 48,
+          "source_info" : {
+            "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+            "line" : 173,
+            "column" : 12,
+            "source_fragment" : "fabric_md.drop_ctl == 1"
+          },
+          "expression" : {
+            "type" : "expression",
+            "value" : {
+              "op" : "==",
+              "left" : {
+                "type" : "field",
+                "value" : ["scalars", "userMetadata._drop_ctl2"]
+              },
+              "right" : {
+                "type" : "hexstr",
+                "value" : "0x01"
+              }
+            }
+          },
+          "false_next" : null,
+          "true_next" : "tbl_fabric_v1model174"
+        }
+      ]
+    }
+  ],
+  "checksums" : [
+    {
+      "name" : "cksum",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 55,
+        "column" : 8,
+        "source_fragment" : "update_checksum(hdr.ingress.ipv4.isValid(), ..."
+      },
+      "target" : ["_ingress_ipv47", "hdr_checksum"],
+      "type" : "generic",
+      "calculation" : "calc_2",
+      "verify" : false,
+      "update" : true,
+      "if_cond" : {
+        "type" : "expression",
+        "value" : {
+          "op" : "d2b",
+          "left" : null,
+          "right" : {
+            "type" : "field",
+            "value" : ["_ingress_ipv47", "$valid$"]
+          }
+        }
+      }
+    },
+    {
+      "name" : "cksum_0",
+      "id" : 1,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 73,
+        "column" : 8,
+        "source_fragment" : "update_checksum(hdr.ingress.inner_ipv4.isValid(), ..."
+      },
+      "target" : ["_ingress_inner_ipv418", "hdr_checksum"],
+      "type" : "generic",
+      "calculation" : "calc_3",
+      "verify" : false,
+      "update" : true,
+      "if_cond" : {
+        "type" : "expression",
+        "value" : {
+          "op" : "d2b",
+          "left" : null,
+          "right" : {
+            "type" : "field",
+            "value" : ["_ingress_inner_ipv418", "$valid$"]
+          }
+        }
+      }
+    },
+    {
+      "name" : "cksum_1",
+      "id" : 2,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 92,
+        "column" : 8,
+        "source_fragment" : "update_checksum(hdr.egress.report_ipv4.isValid(), ..."
+      },
+      "target" : ["_egress_report_ipv427", "hdr_checksum"],
+      "type" : "generic",
+      "calculation" : "calc_4",
+      "verify" : false,
+      "update" : true,
+      "if_cond" : {
+        "type" : "expression",
+        "value" : {
+          "op" : "d2b",
+          "left" : null,
+          "right" : {
+            "type" : "field",
+            "value" : ["_egress_report_ipv427", "$valid$"]
+          }
+        }
+      }
+    },
+    {
+      "name" : "cksum_2",
+      "id" : 3,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 13,
+        "column" : 8,
+        "source_fragment" : "verify_checksum(hdr.ingress.ipv4.isValid(), ..."
+      },
+      "target" : ["_ingress_ipv47", "hdr_checksum"],
+      "type" : "generic",
+      "calculation" : "calc_5",
+      "verify" : true,
+      "update" : false,
+      "if_cond" : {
+        "type" : "expression",
+        "value" : {
+          "op" : "d2b",
+          "left" : null,
+          "right" : {
+            "type" : "field",
+            "value" : ["_ingress_ipv47", "$valid$"]
+          }
+        }
+      }
+    },
+    {
+      "name" : "cksum_3",
+      "id" : 4,
+      "source_info" : {
+        "filename" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/../v1model/include/control/checksum.p4",
+        "line" : 31,
+        "column" : 8,
+        "source_fragment" : "verify_checksum(hdr.ingress.inner_ipv4.isValid(), ..."
+      },
+      "target" : ["_ingress_inner_ipv418", "hdr_checksum"],
+      "type" : "generic",
+      "calculation" : "calc_6",
+      "verify" : true,
+      "update" : false,
+      "if_cond" : {
+        "type" : "expression",
+        "value" : {
+          "op" : "d2b",
+          "left" : null,
+          "right" : {
+            "type" : "field",
+            "value" : ["_ingress_inner_ipv418", "$valid$"]
+          }
+        }
+      }
+    }
+  ],
+  "force_arith" : [],
+  "extern_instances" : [],
+  "field_aliases" : [
+    [
+      "queueing_metadata.enq_timestamp",
+      ["standard_metadata", "enq_timestamp"]
+    ],
+    [
+      "queueing_metadata.enq_qdepth",
+      ["standard_metadata", "enq_qdepth"]
+    ],
+    [
+      "queueing_metadata.deq_timedelta",
+      ["standard_metadata", "deq_timedelta"]
+    ],
+    [
+      "queueing_metadata.deq_qdepth",
+      ["standard_metadata", "deq_qdepth"]
+    ],
+    [
+      "intrinsic_metadata.ingress_global_timestamp",
+      ["standard_metadata", "ingress_global_timestamp"]
+    ],
+    [
+      "intrinsic_metadata.egress_global_timestamp",
+      ["standard_metadata", "egress_global_timestamp"]
+    ],
+    [
+      "intrinsic_metadata.mcast_grp",
+      ["standard_metadata", "mcast_grp"]
+    ],
+    [
+      "intrinsic_metadata.egress_rid",
+      ["standard_metadata", "egress_rid"]
+    ],
+    [
+      "intrinsic_metadata.priority",
+      ["standard_metadata", "priority"]
+    ]
+  ],
+  "program" : "/home/ubuntu/tfs-setup/fabric-tna/p4src/v1model/fabric_v1model.p4",
+  "__meta__" : {
+    "version" : [2, 23],
+    "compiler" : "https://github.com/p4lang/p4c"
+  }
+}
\ No newline at end of file
diff --git a/src/tests/p4-int-routing-acl/p4src/p4info.txt b/src/tests/p4-int-routing-acl/p4src/p4info.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4e54f2861496816db734612ad4558cf4d03e69f8
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/p4src/p4info.txt
@@ -0,0 +1,1911 @@
+pkg_info {
+  arch: "v1model"
+}
+tables {
+  preamble {
+    id: 41243186
+    name: "FabricIngress.stats.flows"
+    alias: "FabricIngress.stats.flows"
+  }
+  match_fields {
+    id: 1
+    name: "ipv4_src"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 2
+    name: "ipv4_dst"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 3
+    name: "ip_proto"
+    bitwidth: 8
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 4
+    name: "l4_sport"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 5
+    name: "l4_dport"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 6
+    name: "ig_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  action_refs {
+    id: 21929788
+  }
+  const_default_action_id: 21929788
+  direct_resource_ids: 333776332
+  size: 1024
+}
+tables {
+  preamble {
+    id: 43310977
+    name: "FabricIngress.filtering.ingress_port_vlan"
+    alias: "ingress_port_vlan"
+  }
+  match_fields {
+    id: 1
+    name: "ig_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "vlan_is_valid"
+    bitwidth: 1
+    match_type: EXACT
+  }
+  match_fields {
+    id: 3
+    name: "vlan_id"
+    bitwidth: 12
+    match_type: TERNARY
+  }
+  action_refs {
+    id: 17164167
+  }
+  action_refs {
+    id: 24158268
+  }
+  action_refs {
+    id: 24266015
+  }
+  const_default_action_id: 17164167
+  direct_resource_ids: 326221069
+  size: 1024
+}
+tables {
+  preamble {
+    id: 49718154
+    name: "FabricIngress.filtering.fwd_classifier"
+    alias: "fwd_classifier"
+  }
+  match_fields {
+    id: 1
+    name: "ig_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "eth_dst"
+    bitwidth: 48
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 3
+    name: "eth_type"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 4
+    name: "ip_eth_type"
+    bitwidth: 16
+    match_type: EXACT
+  }
+  action_refs {
+    id: 25032921
+  }
+  const_default_action_id: 25032921
+  direct_resource_ids: 335473470
+  size: 1024
+}
+tables {
+  preamble {
+    id: 43623757
+    name: "FabricIngress.forwarding.bridging"
+    alias: "bridging"
+  }
+  match_fields {
+    id: 1
+    name: "vlan_id"
+    bitwidth: 12
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "eth_dst"
+    bitwidth: 48
+    match_type: TERNARY
+  }
+  action_refs {
+    id: 21791748
+  }
+  action_refs {
+    id: 29734112
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 29734112
+  direct_resource_ids: 330959985
+  size: 1024
+}
+tables {
+  preamble {
+    id: 37768578
+    name: "FabricIngress.forwarding.mpls"
+    alias: "mpls"
+  }
+  match_fields {
+    id: 1
+    name: "mpls_label"
+    bitwidth: 20
+    match_type: EXACT
+  }
+  action_refs {
+    id: 30066030
+  }
+  action_refs {
+    id: 29734112
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 29734112
+  direct_resource_ids: 318961579
+  size: 1024
+}
+tables {
+  preamble {
+    id: 41754650
+    name: "FabricIngress.forwarding.routing_v4"
+    alias: "routing_v4"
+  }
+  match_fields {
+    id: 1
+    name: "ipv4_dst"
+    bitwidth: 32
+    match_type: LPM
+  }
+  action_refs {
+    id: 19792090
+  }
+  action_refs {
+    id: 29124955
+  }
+  action_refs {
+    id: 17639597
+  }
+  action_refs {
+    id: 29734112
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  direct_resource_ids: 333425635
+  size: 1024
+}
+tables {
+  preamble {
+    id: 49342721
+    name: "FabricIngress.forwarding.routing_v6"
+    alias: "routing_v6"
+  }
+  match_fields {
+    id: 1
+    name: "ipv6_dst"
+    bitwidth: 128
+    match_type: LPM
+  }
+  action_refs {
+    id: 21856023
+  }
+  action_refs {
+    id: 24646532
+  }
+  action_refs {
+    id: 29734112
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  direct_resource_ids: 324042090
+  size: 1024
+}
+tables {
+  preamble {
+    id: 36626242
+    name: "FabricIngress.pre_next.next_mpls"
+    alias: "next_mpls"
+  }
+  match_fields {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+    match_type: EXACT
+  }
+  action_refs {
+    id: 22765924
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28485346
+  direct_resource_ids: 330020245
+  size: 1024
+}
+tables {
+  preamble {
+    id: 48011802
+    name: "FabricIngress.pre_next.next_vlan"
+    alias: "next_vlan"
+  }
+  match_fields {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+    match_type: EXACT
+  }
+  action_refs {
+    id: 33475378
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28485346
+  direct_resource_ids: 333692067
+  size: 1024
+}
+tables {
+  preamble {
+    id: 44104738
+    name: "FabricIngress.acl.acl"
+    alias: "acl"
+  }
+  match_fields {
+    id: 1
+    name: "ig_port"
+    bitwidth: 9
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 2
+    name: "eth_dst"
+    bitwidth: 48
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 3
+    name: "eth_src"
+    bitwidth: 48
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 4
+    name: "vlan_id"
+    bitwidth: 12
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 5
+    name: "eth_type"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 6
+    name: "ipv4_src"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 7
+    name: "ipv4_dst"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 8
+    name: "ip_proto"
+    bitwidth: 8
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 9
+    name: "icmp_type"
+    bitwidth: 8
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 10
+    name: "icmp_code"
+    bitwidth: 8
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 11
+    name: "l4_sport"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 12
+    name: "l4_dport"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 13
+    name: "ig_port_type"
+    bitwidth: 2
+    match_type: TERNARY
+  }
+  action_refs {
+    id: 23623126
+  }
+  action_refs {
+    id: 23579892
+  }
+  action_refs {
+    id: 21161133
+  }
+  action_refs {
+    id: 23570973
+  }
+  action_refs {
+    id: 24507494
+  }
+  action_refs {
+    id: 29607214
+  }
+  const_default_action_id: 29607214
+  direct_resource_ids: 319194241
+  size: 1024
+}
+tables {
+  preamble {
+    id: 39142283
+    name: "FabricIngress.next.simple"
+    alias: "simple"
+  }
+  match_fields {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+    match_type: EXACT
+  }
+  action_refs {
+    id: 19358572
+  }
+  action_refs {
+    id: 31887425
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28485346
+  direct_resource_ids: 326633416
+  size: 1024
+}
+tables {
+  preamble {
+    id: 47960972
+    name: "FabricIngress.next.hashed"
+    alias: "hashed"
+  }
+  match_fields {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+    match_type: EXACT
+  }
+  action_refs {
+    id: 27301117
+  }
+  action_refs {
+    id: 20985706
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28485346
+  implementation_id: 289544276
+  direct_resource_ids: 322798228
+  size: 1024
+}
+tables {
+  preamble {
+    id: 40619180
+    name: "FabricIngress.next.multicast"
+    alias: "multicast"
+  }
+  match_fields {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+    match_type: EXACT
+  }
+  action_refs {
+    id: 21629581
+  }
+  action_refs {
+    id: 23637707
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 23637707
+  direct_resource_ids: 319194968
+  size: 1024
+}
+tables {
+  preamble {
+    id: 34606298
+    name: "FabricIngress.slice_tc_classifier.classifier"
+    alias: "classifier"
+  }
+  match_fields {
+    id: 1
+    name: "ig_port"
+    bitwidth: 9
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 2
+    name: "ipv4_src"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 3
+    name: "ipv4_dst"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 4
+    name: "ip_proto"
+    bitwidth: 8
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 5
+    name: "l4_sport"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 6
+    name: "l4_dport"
+    bitwidth: 16
+    match_type: TERNARY
+  }
+  action_refs {
+    id: 23786376
+  }
+  action_refs {
+    id: 25983516
+  }
+  action_refs {
+    id: 30111108
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 30111108
+  direct_resource_ids: 334706097
+  size: 512
+}
+tables {
+  preamble {
+    id: 36435258
+    name: "FabricIngress.qos.queues"
+    alias: "queues"
+  }
+  match_fields {
+    id: 1
+    name: "slice_tc"
+    bitwidth: 6
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "color"
+    bitwidth: 2
+    match_type: TERNARY
+  }
+  action_refs {
+    id: 32116918
+  }
+  action_refs {
+    id: 28214351
+  }
+  const_default_action_id: 32116918
+  direct_resource_ids: 327743278
+  size: 128
+}
+tables {
+  preamble {
+    id: 43965782
+    name: "FabricIngress.qos.default_tc"
+    alias: "default_tc"
+  }
+  match_fields {
+    id: 1
+    name: "slice_tc"
+    bitwidth: 6
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 2
+    name: "tc_unknown"
+    bitwidth: 1
+    match_type: EXACT
+  }
+  action_refs {
+    id: 23587909
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28485346
+  size: 16
+}
+tables {
+  preamble {
+    id: 40748488
+    name: "FabricIngress.int_watchlist.watchlist"
+    alias: "watchlist"
+  }
+  match_fields {
+    id: 1
+    name: "ipv4_valid"
+    bitwidth: 1
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "ipv4_src"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 3
+    name: "ipv4_dst"
+    bitwidth: 32
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 4
+    name: "ip_proto"
+    bitwidth: 8
+    match_type: TERNARY
+  }
+  match_fields {
+    id: 5
+    name: "l4_sport"
+    bitwidth: 16
+    match_type: RANGE
+  }
+  match_fields {
+    id: 6
+    name: "l4_dport"
+    bitwidth: 16
+    match_type: RANGE
+  }
+  action_refs {
+    id: 25078550
+  }
+  action_refs {
+    id: 20118842
+  }
+  action_refs {
+    id: 28396787
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28396787
+  direct_resource_ids: 328581521
+  size: 64
+}
+tables {
+  preamble {
+    id: 43851059
+    name: "FabricEgress.stats.flows"
+    alias: "FabricEgress.stats.flows"
+  }
+  match_fields {
+    id: 1
+    name: "stats_flow_id"
+    bitwidth: 10
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "eg_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  action_refs {
+    id: 26838724
+  }
+  const_default_action_id: 26838724
+  direct_resource_ids: 334508337
+  size: 1024
+}
+tables {
+  preamble {
+    id: 35217901
+    name: "FabricEgress.pkt_io_egress.switch_info"
+    alias: "switch_info"
+  }
+  action_refs {
+    id: 32804382
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  size: 1
+}
+tables {
+  preamble {
+    id: 49262446
+    name: "FabricEgress.egress_next.egress_vlan"
+    alias: "egress_vlan"
+  }
+  match_fields {
+    id: 1
+    name: "vlan_id"
+    bitwidth: 12
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "eg_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  action_refs {
+    id: 30307755
+  }
+  action_refs {
+    id: 17183246
+  }
+  action_refs {
+    id: 30812542
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 30812542
+  direct_resource_ids: 318892680
+  size: 1024
+}
+tables {
+  preamble {
+    id: 49970092
+    name: "FabricEgress.dscp_rewriter.rewriter"
+    alias: "rewriter"
+  }
+  match_fields {
+    id: 1
+    name: "eg_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  action_refs {
+    id: 27951287
+  }
+  action_refs {
+    id: 24120545
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 28485346
+  size: 512
+}
+tables {
+  preamble {
+    id: 36860953
+    name: "FabricEgress.int_egress.queue_latency_thresholds"
+    alias: "queue_latency_thresholds"
+  }
+  match_fields {
+    id: 1
+    name: "egress_qid"
+    bitwidth: 5
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "hop_latency_upper"
+    bitwidth: 16
+    match_type: RANGE
+  }
+  match_fields {
+    id: 3
+    name: "hop_latency_lower"
+    bitwidth: 16
+    match_type: RANGE
+  }
+  action_refs {
+    id: 22415037
+  }
+  action_refs {
+    id: 19702294
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  size: 128
+}
+tables {
+  preamble {
+    id: 40475827
+    name: "FabricEgress.int_egress.config"
+    alias: "config"
+  }
+  action_refs {
+    id: 22425991
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  size: 1
+}
+tables {
+  preamble {
+    id: 46071383
+    name: "FabricEgress.int_egress.report"
+    alias: "report"
+  }
+  match_fields {
+    id: 1
+    name: "bmd_type"
+    bitwidth: 8
+    match_type: EXACT
+  }
+  match_fields {
+    id: 2
+    name: "mirror_type"
+    bitwidth: 3
+    match_type: EXACT
+  }
+  match_fields {
+    id: 3
+    name: "int_report_type"
+    bitwidth: 3
+    match_type: EXACT
+  }
+  action_refs {
+    id: 30783845
+  }
+  action_refs {
+    id: 22769901
+  }
+  action_refs {
+    id: 32486459
+  }
+  action_refs {
+    id: 25343592
+  }
+  action_refs {
+    id: 28485346
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  direct_resource_ids: 325056546
+  size: 6
+}
+actions {
+  preamble {
+    id: 28485346
+    name: "nop"
+    alias: "nop"
+  }
+}
+actions {
+  preamble {
+    id: 21257015
+    name: "NoAction"
+    alias: "NoAction"
+    annotations: "@noWarn(\"unused\")"
+  }
+}
+actions {
+  preamble {
+    id: 21929788
+    name: "FabricIngress.stats.count"
+    alias: "FabricIngress.stats.count"
+  }
+  params {
+    id: 1
+    name: "flow_id"
+    bitwidth: 10
+  }
+}
+actions {
+  preamble {
+    id: 17164167
+    name: "FabricIngress.filtering.deny"
+    alias: "deny"
+  }
+}
+actions {
+  preamble {
+    id: 24158268
+    name: "FabricIngress.filtering.permit"
+    alias: "permit"
+  }
+  params {
+    id: 1
+    name: "port_type"
+    bitwidth: 2
+  }
+}
+actions {
+  preamble {
+    id: 24266015
+    name: "FabricIngress.filtering.permit_with_internal_vlan"
+    alias: "permit_with_internal_vlan"
+  }
+  params {
+    id: 1
+    name: "vlan_id"
+    bitwidth: 12
+  }
+  params {
+    id: 2
+    name: "port_type"
+    bitwidth: 2
+  }
+}
+actions {
+  preamble {
+    id: 25032921
+    name: "FabricIngress.filtering.set_forwarding_type"
+    alias: "set_forwarding_type"
+  }
+  params {
+    id: 1
+    name: "fwd_type"
+    bitwidth: 3
+  }
+}
+actions {
+  preamble {
+    id: 29734112
+    name: "FabricIngress.forwarding.set_int_drop_reason"
+    alias: "set_int_drop_reason"
+  }
+  params {
+    id: 1
+    name: "drop_reason"
+    bitwidth: 8
+  }
+}
+actions {
+  preamble {
+    id: 21791748
+    name: "FabricIngress.forwarding.set_next_id_bridging"
+    alias: "set_next_id_bridging"
+  }
+  params {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 30066030
+    name: "FabricIngress.forwarding.pop_mpls_and_next"
+    alias: "pop_mpls_and_next"
+  }
+  params {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 19792090
+    name: "FabricIngress.forwarding.set_next_id_routing_v4"
+    alias: "set_next_id_routing_v4"
+  }
+  params {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 29124955
+    name: "FabricIngress.forwarding.nop_routing_v4"
+    alias: "nop_routing_v4"
+  }
+}
+actions {
+  preamble {
+    id: 17639597
+    name: "FabricIngress.forwarding.drop_routing_v4"
+    alias: "drop_routing_v4"
+  }
+}
+actions {
+  preamble {
+    id: 21856023
+    name: "FabricIngress.forwarding.set_next_id_routing_v6"
+    alias: "set_next_id_routing_v6"
+  }
+  params {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 24646532
+    name: "FabricIngress.forwarding.drop_routing_v6"
+    alias: "drop_routing_v6"
+  }
+}
+actions {
+  preamble {
+    id: 22765924
+    name: "FabricIngress.pre_next.set_mpls_label"
+    alias: "set_mpls_label"
+  }
+  params {
+    id: 1
+    name: "label"
+    bitwidth: 20
+  }
+}
+actions {
+  preamble {
+    id: 33475378
+    name: "FabricIngress.pre_next.set_vlan"
+    alias: "set_vlan"
+  }
+  params {
+    id: 1
+    name: "vlan_id"
+    bitwidth: 12
+  }
+}
+actions {
+  preamble {
+    id: 23623126
+    name: "FabricIngress.acl.set_next_id_acl"
+    alias: "set_next_id_acl"
+  }
+  params {
+    id: 1
+    name: "next_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 21161133
+    name: "FabricIngress.acl.copy_to_cpu"
+    alias: "copy_to_cpu"
+  }
+}
+actions {
+  preamble {
+    id: 23579892
+    name: "FabricIngress.acl.punt_to_cpu"
+    alias: "punt_to_cpu"
+  }
+}
+actions {
+  preamble {
+    id: 23570973
+    name: "FabricIngress.acl.drop"
+    alias: "acl.drop"
+  }
+}
+actions {
+  preamble {
+    id: 24507494
+    name: "FabricIngress.acl.set_output_port"
+    alias: "set_output_port"
+  }
+  params {
+    id: 1
+    name: "port_num"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+}
+actions {
+  preamble {
+    id: 29607214
+    name: "FabricIngress.acl.nop_acl"
+    alias: "nop_acl"
+  }
+}
+actions {
+  preamble {
+    id: 19358572
+    name: "FabricIngress.next.output_simple"
+    alias: "output_simple"
+  }
+  params {
+    id: 1
+    name: "port_num"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+}
+actions {
+  preamble {
+    id: 31887425
+    name: "FabricIngress.next.routing_simple"
+    alias: "routing_simple"
+  }
+  params {
+    id: 1
+    name: "port_num"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+  params {
+    id: 2
+    name: "smac"
+    bitwidth: 48
+  }
+  params {
+    id: 3
+    name: "dmac"
+    bitwidth: 48
+  }
+}
+actions {
+  preamble {
+    id: 27301117
+    name: "FabricIngress.next.output_hashed"
+    alias: "output_hashed"
+  }
+  params {
+    id: 1
+    name: "port_num"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+}
+actions {
+  preamble {
+    id: 20985706
+    name: "FabricIngress.next.routing_hashed"
+    alias: "routing_hashed"
+  }
+  params {
+    id: 1
+    name: "port_num"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+  params {
+    id: 2
+    name: "smac"
+    bitwidth: 48
+  }
+  params {
+    id: 3
+    name: "dmac"
+    bitwidth: 48
+  }
+}
+actions {
+  preamble {
+    id: 21629581
+    name: "FabricIngress.next.set_mcast_group_id"
+    alias: "set_mcast_group_id"
+  }
+  params {
+    id: 1
+    name: "group_id"
+    bitwidth: 16
+  }
+}
+actions {
+  preamble {
+    id: 23637707
+    name: "FabricIngress.next.reset_mcast_group_id"
+    alias: "reset_mcast_group_id"
+  }
+}
+actions {
+  preamble {
+    id: 23786376
+    name: "FabricIngress.slice_tc_classifier.set_slice_id_tc"
+    alias: "set_slice_id_tc"
+  }
+  params {
+    id: 1
+    name: "slice_id"
+    bitwidth: 4
+  }
+  params {
+    id: 2
+    name: "tc"
+    bitwidth: 2
+  }
+}
+actions {
+  preamble {
+    id: 30111108
+    name: "FabricIngress.slice_tc_classifier.no_classification"
+    alias: "no_classification"
+  }
+}
+actions {
+  preamble {
+    id: 25983516
+    name: "FabricIngress.slice_tc_classifier.trust_dscp"
+    alias: "trust_dscp"
+  }
+}
+actions {
+  preamble {
+    id: 32116918
+    name: "FabricIngress.qos.set_queue"
+    alias: "set_queue"
+  }
+  params {
+    id: 1
+    name: "qid"
+    bitwidth: 5
+  }
+}
+actions {
+  preamble {
+    id: 28214351
+    name: "FabricIngress.qos.meter_drop"
+    alias: "meter_drop"
+  }
+}
+actions {
+  preamble {
+    id: 23587909
+    name: "FabricIngress.qos.set_default_tc"
+    alias: "set_default_tc"
+  }
+  params {
+    id: 1
+    name: "tc"
+    bitwidth: 2
+  }
+}
+actions {
+  preamble {
+    id: 25078550
+    name: "FabricIngress.int_watchlist.mark_to_report"
+    alias: "mark_to_report"
+  }
+}
+actions {
+  preamble {
+    id: 28396787
+    name: "FabricIngress.int_watchlist.no_report"
+    alias: "no_report"
+  }
+}
+actions {
+  preamble {
+    id: 20118842
+    name: "FabricIngress.int_watchlist.no_report_collector"
+    alias: "no_report_collector"
+  }
+}
+actions {
+  preamble {
+    id: 26838724
+    name: "FabricEgress.stats.count"
+    alias: "FabricEgress.stats.count"
+  }
+}
+actions {
+  preamble {
+    id: 32804382
+    name: "FabricEgress.pkt_io_egress.set_switch_info"
+    alias: "set_switch_info"
+  }
+  params {
+    id: 1
+    name: "cpu_port"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+}
+actions {
+  preamble {
+    id: 30307755
+    name: "FabricEgress.egress_next.push_vlan"
+    alias: "push_vlan"
+  }
+}
+actions {
+  preamble {
+    id: 17183246
+    name: "FabricEgress.egress_next.pop_vlan"
+    alias: "pop_vlan"
+  }
+}
+actions {
+  preamble {
+    id: 30812542
+    name: "FabricEgress.egress_next.drop"
+    alias: "egress_next.drop"
+  }
+}
+actions {
+  preamble {
+    id: 27951287
+    name: "FabricEgress.dscp_rewriter.rewrite"
+    alias: "rewrite"
+  }
+}
+actions {
+  preamble {
+    id: 24120545
+    name: "FabricEgress.dscp_rewriter.clear"
+    alias: "clear"
+  }
+}
+actions {
+  preamble {
+    id: 22415037
+    name: "FabricEgress.int_egress.check_quota"
+    alias: "check_quota"
+  }
+}
+actions {
+  preamble {
+    id: 19702294
+    name: "FabricEgress.int_egress.reset_quota"
+    alias: "reset_quota"
+  }
+}
+actions {
+  preamble {
+    id: 22425991
+    name: "FabricEgress.int_egress.set_config"
+    alias: "set_config"
+  }
+  params {
+    id: 1
+    name: "hop_latency_mask"
+    bitwidth: 32
+  }
+  params {
+    id: 2
+    name: "timestamp_mask"
+    bitwidth: 48
+  }
+}
+actions {
+  preamble {
+    id: 30783845
+    name: "FabricEgress.int_egress.do_local_report_encap"
+    alias: "do_local_report_encap"
+  }
+  params {
+    id: 1
+    name: "src_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 2
+    name: "mon_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 3
+    name: "mon_port"
+    bitwidth: 16
+  }
+  params {
+    id: 4
+    name: "switch_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 22769901
+    name: "FabricEgress.int_egress.do_local_report_encap_mpls"
+    alias: "do_local_report_encap_mpls"
+  }
+  params {
+    id: 1
+    name: "src_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 2
+    name: "mon_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 3
+    name: "mon_port"
+    bitwidth: 16
+  }
+  params {
+    id: 4
+    name: "mon_label"
+    bitwidth: 20
+  }
+  params {
+    id: 5
+    name: "switch_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 32486459
+    name: "FabricEgress.int_egress.do_drop_report_encap"
+    alias: "do_drop_report_encap"
+  }
+  params {
+    id: 1
+    name: "src_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 2
+    name: "mon_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 3
+    name: "mon_port"
+    bitwidth: 16
+  }
+  params {
+    id: 4
+    name: "switch_id"
+    bitwidth: 32
+  }
+}
+actions {
+  preamble {
+    id: 25343592
+    name: "FabricEgress.int_egress.do_drop_report_encap_mpls"
+    alias: "do_drop_report_encap_mpls"
+  }
+  params {
+    id: 1
+    name: "src_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 2
+    name: "mon_ip"
+    bitwidth: 32
+  }
+  params {
+    id: 3
+    name: "mon_port"
+    bitwidth: 16
+  }
+  params {
+    id: 4
+    name: "mon_label"
+    bitwidth: 20
+  }
+  params {
+    id: 5
+    name: "switch_id"
+    bitwidth: 32
+  }
+}
+action_profiles {
+  preamble {
+    id: 289544276
+    name: "FabricIngress.next.hashed_profile"
+    alias: "hashed_profile"
+  }
+  table_ids: 47960972
+  with_selector: true
+  size: 16
+  max_group_size: 16
+}
+counters {
+  preamble {
+    id: 309010261
+    name: "FabricIngress.filtering.fwd_type_counter"
+    alias: "fwd_type_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  size: 8
+}
+direct_counters {
+  preamble {
+    id: 333776332
+    name: "FabricIngress.stats.flow_counter"
+    alias: "FabricIngress.stats.flow_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 41243186
+}
+direct_counters {
+  preamble {
+    id: 326221069
+    name: "FabricIngress.filtering.ingress_port_vlan_counter"
+    alias: "ingress_port_vlan_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 43310977
+}
+direct_counters {
+  preamble {
+    id: 335473470
+    name: "FabricIngress.filtering.fwd_classifier_counter"
+    alias: "fwd_classifier_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 49718154
+}
+direct_counters {
+  preamble {
+    id: 330959985
+    name: "FabricIngress.forwarding.bridging_counter"
+    alias: "bridging_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 43623757
+}
+direct_counters {
+  preamble {
+    id: 318961579
+    name: "FabricIngress.forwarding.mpls_counter"
+    alias: "mpls_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 37768578
+}
+direct_counters {
+  preamble {
+    id: 333425635
+    name: "FabricIngress.forwarding.routing_v4_counter"
+    alias: "routing_v4_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 41754650
+}
+direct_counters {
+  preamble {
+    id: 324042090
+    name: "FabricIngress.forwarding.routing_v6_counter"
+    alias: "routing_v6_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 49342721
+}
+direct_counters {
+  preamble {
+    id: 330020245
+    name: "FabricIngress.pre_next.next_mpls_counter"
+    alias: "next_mpls_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 36626242
+}
+direct_counters {
+  preamble {
+    id: 333692067
+    name: "FabricIngress.pre_next.next_vlan_counter"
+    alias: "next_vlan_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 48011802
+}
+direct_counters {
+  preamble {
+    id: 319194241
+    name: "FabricIngress.acl.acl_counter"
+    alias: "acl_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 44104738
+}
+direct_counters {
+  preamble {
+    id: 326633416
+    name: "FabricIngress.next.simple_counter"
+    alias: "simple_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 39142283
+}
+direct_counters {
+  preamble {
+    id: 322798228
+    name: "FabricIngress.next.hashed_counter"
+    alias: "hashed_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 47960972
+}
+direct_counters {
+  preamble {
+    id: 319194968
+    name: "FabricIngress.next.multicast_counter"
+    alias: "multicast_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 40619180
+}
+direct_counters {
+  preamble {
+    id: 334706097
+    name: "FabricIngress.slice_tc_classifier.classifier_stats"
+    alias: "classifier_stats"
+  }
+  spec {
+    unit: PACKETS
+  }
+  direct_table_id: 34606298
+}
+direct_counters {
+  preamble {
+    id: 327743278
+    name: "FabricIngress.qos.queues_stats"
+    alias: "queues_stats"
+  }
+  spec {
+    unit: PACKETS
+  }
+  direct_table_id: 36435258
+}
+direct_counters {
+  preamble {
+    id: 328581521
+    name: "FabricIngress.int_watchlist.watchlist_counter"
+    alias: "watchlist_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 40748488
+}
+direct_counters {
+  preamble {
+    id: 334508337
+    name: "FabricEgress.stats.flow_counter"
+    alias: "FabricEgress.stats.flow_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 43851059
+}
+direct_counters {
+  preamble {
+    id: 318892680
+    name: "FabricEgress.egress_next.egress_vlan_counter"
+    alias: "egress_vlan_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 49262446
+}
+direct_counters {
+  preamble {
+    id: 325056546
+    name: "FabricEgress.int_egress.report_counter"
+    alias: "report_counter"
+  }
+  spec {
+    unit: BOTH
+  }
+  direct_table_id: 46071383
+}
+meters {
+  preamble {
+    id: 348573637
+    name: "FabricIngress.qos.slice_tc_meter"
+    alias: "slice_tc_meter"
+  }
+  spec {
+    unit: BYTES
+  }
+  size: 64
+}
+controller_packet_metadata {
+  preamble {
+    id: 81826293
+    name: "packet_in"
+    alias: "packet_in"
+    annotations: "@controller_header(\"packet_in\")"
+  }
+  metadata {
+    id: 1
+    name: "ingress_port"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+  metadata {
+    id: 2
+    name: "_pad0"
+    bitwidth: 7
+  }
+}
+controller_packet_metadata {
+  preamble {
+    id: 76689799
+    name: "packet_out"
+    alias: "packet_out"
+    annotations: "@controller_header(\"packet_out\")"
+  }
+  metadata {
+    id: 1
+    name: "pad0"
+    annotations: "@padding"
+    bitwidth: 7
+  }
+  metadata {
+    id: 2
+    name: "egress_port"
+    bitwidth: 9
+    type_name {
+      name: "FabricPortId_t"
+    }
+  }
+  metadata {
+    id: 3
+    name: "pad1"
+    annotations: "@padding"
+    bitwidth: 3
+  }
+  metadata {
+    id: 4
+    name: "queue_id"
+    bitwidth: 5
+  }
+  metadata {
+    id: 5
+    name: "pad2"
+    annotations: "@padding"
+    bitwidth: 5
+  }
+  metadata {
+    id: 6
+    name: "cpu_loopback_mode"
+    bitwidth: 2
+  }
+  metadata {
+    id: 7
+    name: "do_forwarding"
+    bitwidth: 1
+  }
+  metadata {
+    id: 8
+    name: "pad3"
+    annotations: "@padding"
+    bitwidth: 16
+  }
+  metadata {
+    id: 9
+    name: "pad4"
+    annotations: "@padding"
+    bitwidth: 48
+  }
+  metadata {
+    id: 10
+    name: "ether_type"
+    bitwidth: 16
+  }
+}
+registers {
+  preamble {
+    id: 376533241
+    name: "FabricEgress.int_egress.seq_number"
+    alias: "seq_number"
+    annotations: "@hidden"
+  }
+  type_spec {
+    bitstring {
+      bit {
+        bitwidth: 32
+      }
+    }
+  }
+  size: 1024
+}
+type_info {
+  serializable_enums {
+    key: "BridgedMdType_t"
+    value {
+      underlying_type {
+        bitwidth: 8
+      }
+      members {
+        name: "INVALID"
+        value: "\000"
+      }
+      members {
+        name: "INGRESS_TO_EGRESS"
+        value: "\001"
+      }
+      members {
+        name: "EGRESS_MIRROR"
+        value: "\002"
+      }
+      members {
+        name: "INGRESS_MIRROR"
+        value: "\003"
+      }
+      members {
+        name: "INT_INGRESS_DROP"
+        value: "\004"
+      }
+      members {
+        name: "DEFLECTED"
+        value: "\005"
+      }
+    }
+  }
+  serializable_enums {
+    key: "CpuLoopbackMode_t"
+    value {
+      underlying_type {
+        bitwidth: 2
+      }
+      members {
+        name: "DISABLED"
+        value: "\000"
+      }
+      members {
+        name: "DIRECT"
+        value: "\001"
+      }
+      members {
+        name: "INGRESS"
+        value: "\002"
+      }
+    }
+  }
+  serializable_enums {
+    key: "FabricMirrorType_t"
+    value {
+      underlying_type {
+        bitwidth: 3
+      }
+      members {
+        name: "INVALID"
+        value: "\000"
+      }
+      members {
+        name: "INT_REPORT"
+        value: "\001"
+      }
+      members {
+        name: "PACKET_IN"
+        value: "\002"
+      }
+    }
+  }
+  serializable_enums {
+    key: "PortType_t"
+    value {
+      underlying_type {
+        bitwidth: 2
+      }
+      members {
+        name: "UNKNOWN"
+        value: "\000"
+      }
+      members {
+        name: "EDGE"
+        value: "\001"
+      }
+      members {
+        name: "INFRA"
+        value: "\002"
+      }
+      members {
+        name: "INTERNAL"
+        value: "\003"
+      }
+    }
+  }
+  new_types {
+    key: "FabricPortId_t"
+    value {
+      original_type {
+        bitstring {
+          bit {
+            bitwidth: 9
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/src/tests/p4-int-routing-acl/run_test_01_bootstrap.sh b/src/tests/p4-int-routing-acl/run_test_01_bootstrap.sh
new file mode 100755
index 0000000000000000000000000000000000000000..76469ca55455aec65569a7c104f87e8d6673dec9
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/run_test_01_bootstrap.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# make sure to source the following scripts:
+# - my_deploy.sh
+# - tfs_runtime_env_vars.sh
+
+source tfs_runtime_env_vars.sh
+python3 -m pytest --verbose src/tests/p4-int-routing-acl/test_functional_bootstrap.py
diff --git a/src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh b/src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6709d66c62cae11ecc1e555bae81c680dfeaafc8
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/run_test_02_rules_provision.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source tfs_runtime_env_vars.sh
+python3 -m pytest --verbose src/tests/p4-int-routing-acl/test_functional_rules_provision.py
diff --git a/src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.sh b/src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3a67fad8a04520bc48c666b48d684b5ad7fe3d13
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/run_test_03_rules_deprovision.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source tfs_runtime_env_vars.sh
+python3 -m pytest --verbose src/tests/p4-int-routing-acl/test_functional_rules_deprovision.py
diff --git a/src/tests/p4-int-routing-acl/run_test_04_cleanup.sh b/src/tests/p4-int-routing-acl/run_test_04_cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..917a2af2dab0ab1b9d0d05ad272c6494486d9580
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/run_test_04_cleanup.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+source tfs_runtime_env_vars.sh
+python3 -m pytest --verbose src/tests/p4-int-routing-acl/test_functional_cleanup.py
diff --git a/src/tests/p4-int-routing-acl/setup.sh b/src/tests/p4-int-routing-acl/setup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c771642769fe528fe1179909ab0b8edb768f7264
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/setup.sh
@@ -0,0 +1,22 @@
+#! /bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+
+export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}')
+
+kubectl exec ${POD_NAME} -n=tfs -c=server -- mkdir -p /root/p4
+
+kubectl cp src/tests/p4-int-routing-acl/p4src/p4info.txt tfs/${POD_NAME}:/root/p4 -c=server
+kubectl cp src/tests/p4-int-routing-acl/p4src/bmv2.json tfs/${POD_NAME}:/root/p4 -c=server
diff --git a/src/tests/p4-int-routing-acl/test_common.py b/src/tests/p4-int-routing-acl/test_common.py
new file mode 100644
index 0000000000000000000000000000000000000000..8254eddc5bb5f2f2bbf4c0866a9409552872b2c8
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/test_common.py
@@ -0,0 +1,111 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 os
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum
+from common.tools.object_factory.Context import json_context_id
+
+# Context info
+CONTEXT_NAME_P4 = DEFAULT_CONTEXT_NAME
+ADMIN_CONTEXT_ID = ContextId(**json_context_id(CONTEXT_NAME_P4))
+
+# Device and rule cardinality variables
+DEV_NB = 3
+CONNECTION_RULES = 3
+ENDPOINT_RULES = 2
+DATAPLANE_RULES_NB_INT_B1 = 5
+DATAPLANE_RULES_NB_INT_B2 = 6
+DATAPLANE_RULES_NB_INT_B3 = 8
+DATAPLANE_RULES_NB_RT_EDGE = 7
+DATAPLANE_RULES_NB_RT_CORP = 7
+DATAPLANE_RULES_NB_ACL = 1
+DATAPLANE_RULES_NB_TOT = \
+    DATAPLANE_RULES_NB_INT_B1 +\
+    DATAPLANE_RULES_NB_INT_B2 +\
+    DATAPLANE_RULES_NB_INT_B3 +\
+    DATAPLANE_RULES_NB_RT_EDGE +\
+    DATAPLANE_RULES_NB_RT_CORP +\
+    DATAPLANE_RULES_NB_ACL
+
+# Topology descriptor
+DESC_TOPO = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'topology.json'
+)
+
+# Rule insertion descriptors
+# The switch cannot digest all rules at once, hence we insert in batches
+DESC_FILE_RULES_INSERT_INT_B1 = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-insert-int-b1.json'
+)
+DESC_FILE_RULES_INSERT_INT_B2 = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-insert-int-b2.json'
+)
+DESC_FILE_RULES_INSERT_INT_B3 = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-insert-int-b3.json'
+)
+DESC_FILE_RULES_INSERT_ROUTING_EDGE = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-insert-routing-edge.json'
+)
+DESC_FILE_RULES_INSERT_ROUTING_CORP = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-insert-routing-corp.json'
+)
+DESC_FILE_RULES_INSERT_ACL = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-insert-acl.json'
+)
+
+# Rule deletion descriptor
+DESC_FILE_RULES_DELETE_ALL = os.path.join(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    ),
+    'descriptors', 'rules-remove.json'
+)
+
+def verify_number_of_rules(devices, desired_rules_nb):
+    # Iterate all devices
+    for device in devices:
+        # Skip non-P4 devices
+        if device.device_type != "p4-switch": continue
+
+        # We want the device to be active
+        assert \
+            device.device_operational_status == DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
+
+        # Get the configuration rules of this device
+        config_rules = device.device_config.config_rules
+
+        # Expected rule cardinality
+        assert len(config_rules) == desired_rules_nb
diff --git a/src/tests/p4-int-routing-acl/test_functional_bootstrap.py b/src/tests/p4-int-routing-acl/test_functional_bootstrap.py
new file mode 100644
index 0000000000000000000000000000000000000000..b5b72cc331ea1c7bf6e57aefc484532d66cb8504
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/test_functional_bootstrap.py
@@ -0,0 +1,70 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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, time
+from common.proto.context_pb2 import DeviceOperationalStatusEnum, Empty
+from common.tools.descriptor.Loader import DescriptorLoader, \
+    check_descriptor_load_results, validate_empty_scenario
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from tests.Fixtures import context_client, device_client # pylint: disable=unused-import
+from test_common import *
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+def test_scenario_bootstrap(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    """
+    This test assumes that the environment is in a clean state (empty)
+    before bootstrapping the P4 topology.
+    It loads the topology descriptor and verifies that no other services
+    or slices are created.
+    """
+    validate_empty_scenario(context_client)
+
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_TOPO, context_client=context_client, device_client=device_client)
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+    descriptor_loader.validate()
+
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    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
diff --git a/src/tests/p4-int-routing-acl/test_functional_cleanup.py b/src/tests/p4-int-routing-acl/test_functional_cleanup.py
new file mode 100644
index 0000000000000000000000000000000000000000..60c8684b098aa886fdd62db28a07a2d5c8adc125
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/test_functional_cleanup.py
@@ -0,0 +1,41 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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
+from common.Constants import DEFAULT_CONTEXT_NAME
+from common.proto.context_pb2 import ContextId
+from common.tools.descriptor.Loader import DescriptorLoader, validate_empty_scenario
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from tests.Fixtures import context_client, device_client # pylint: disable=unused-import
+from test_common import *
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+def test_scenario_cleanup(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Verify the scenario has no services/slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    assert len(response.service_ids) == 0
+    assert len(response.slice_ids) == 0
+
+    # Unload topology and validate empty scenario
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_TOPO, context_client=context_client, device_client=device_client)
+    descriptor_loader.validate()
+    descriptor_loader.unload()
+    validate_empty_scenario(context_client)
diff --git a/src/tests/p4-int-routing-acl/test_functional_rules_deprovision.py b/src/tests/p4-int-routing-acl/test_functional_rules_deprovision.py
new file mode 100644
index 0000000000000000000000000000000000000000..2d54ae9088600381a000722608bd39eb49483a03
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/test_functional_rules_deprovision.py
@@ -0,0 +1,93 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from tests.Fixtures import context_client, device_client   # pylint: disable=unused-import
+from test_common import *
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+def test_initial_context(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # Verify the scenario has 0 service and 0 slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    assert len(response.service_ids) == 0
+    assert len(response.slice_ids) == 0
+
+    # Check there are no slices
+    response = context_client.ListSlices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response)))
+    assert len(response.slices) == 0
+
+    # Check there is 0 service
+    response = context_client.ListServices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
+    assert len(response.services) == 0
+
+    # Check there are 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+def test_rules_before_removal(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1 + \
+        DATAPLANE_RULES_NB_INT_B2 + \
+        DATAPLANE_RULES_NB_INT_B3 + \
+        DATAPLANE_RULES_NB_RT_EDGE + \
+        DATAPLANE_RULES_NB_RT_CORP + \
+        DATAPLANE_RULES_NB_ACL
+    assert desired_rules_nb == CONNECTION_RULES + ENDPOINT_RULES + DATAPLANE_RULES_NB_TOT
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_removal(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load dataplane rules for removal
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_DELETE_ALL, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_removal(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** removing all dataplane rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Only connection and endpoint rules must be in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES
+    verify_number_of_rules(response.devices, desired_rules_nb)
diff --git a/src/tests/p4-int-routing-acl/test_functional_rules_provision.py b/src/tests/p4-int-routing-acl/test_functional_rules_provision.py
new file mode 100644
index 0000000000000000000000000000000000000000..86a82d2129e495f3c3be9f9ea7b67b24d27a8db7
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/test_functional_rules_provision.py
@@ -0,0 +1,238 @@
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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 common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from tests.Fixtures import context_client, device_client # pylint: disable=unused-import
+from test_common import *
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+def test_initial_context(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # Verify the scenario has 0 service and 0 slices
+    response = context_client.GetContext(ADMIN_CONTEXT_ID)
+    assert len(response.service_ids) == 0
+    assert len(response.slice_ids) == 0
+
+    # Check there are no slices
+    response = context_client.ListSlices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Slices[{:d}] = {:s}'.format(len(response.slices), grpc_message_to_json_string(response)))
+    assert len(response.slices) == 0
+
+    # Check there is 0 service
+    response = context_client.ListServices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
+    assert len(response.services) == 0
+
+    # Check there are 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+def test_rules_before_insertion(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_insertion_int_batch_1(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load INT batch 1 rules for insertion
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_INSERT_INT_B1, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_insertion_int_batch_1(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** inserting batch 1 of INT rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_insertion_int_batch_2(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load INT batch 2 rules for insertion
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_INSERT_INT_B2, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_insertion_int_batch_2(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** inserting batch 2 of INT rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1 + \
+        DATAPLANE_RULES_NB_INT_B2
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_insertion_int_batch_3(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load INT batch 3 rules for insertion
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_INSERT_INT_B3, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_insertion_int_batch_3(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** inserting batch 3 of INT rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1 + \
+        DATAPLANE_RULES_NB_INT_B2 + \
+        DATAPLANE_RULES_NB_INT_B3
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_insertion_routing_edge_batch_4(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load routing edge batch 4 rules for insertion
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_INSERT_ROUTING_EDGE, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_insertion_routing_edge_batch_4(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** inserting batch 4 of routing edge rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1 + \
+        DATAPLANE_RULES_NB_INT_B2 + \
+        DATAPLANE_RULES_NB_INT_B3 + \
+        DATAPLANE_RULES_NB_RT_EDGE
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_insertion_routing_corp_batch_5(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load routing corp batch 5 rules for insertion
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_INSERT_ROUTING_CORP, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_insertion_routing_corp_batch_5(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** inserting batch 5 of routing corp rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1 + \
+        DATAPLANE_RULES_NB_INT_B2 + \
+        DATAPLANE_RULES_NB_INT_B3 + \
+        DATAPLANE_RULES_NB_RT_EDGE + \
+        DATAPLANE_RULES_NB_RT_CORP
+    verify_number_of_rules(response.devices, desired_rules_nb)
+
+def test_rules_insertion_acl_batch_6(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient    # pylint: disable=redefined-outer-name
+) -> None:
+    # Load ACL batch 6 rules for insertion
+    descriptor_loader = DescriptorLoader(
+        descriptors_file=DESC_FILE_RULES_INSERT_ACL, context_client=context_client, device_client=device_client
+    )
+    results = descriptor_loader.process()
+    check_descriptor_load_results(results, descriptor_loader)
+
+def test_rules_after_insertion_acl_batch_6(
+    context_client : ContextClient # pylint: disable=redefined-outer-name
+) -> None:
+    # State **after** inserting batch 6 of ACL rules
+    # Still 3 devices
+    response = context_client.ListDevices(ADMIN_CONTEXT_ID)
+    LOGGER.warning('Devices[{:d}] = {:s}'.format(len(response.devices), grpc_message_to_json_string(response)))
+    assert len(response.devices) == DEV_NB
+
+    # Verify that the following rules are in place
+    desired_rules_nb = \
+        CONNECTION_RULES + \
+        ENDPOINT_RULES + \
+        DATAPLANE_RULES_NB_INT_B1 + \
+        DATAPLANE_RULES_NB_INT_B2 + \
+        DATAPLANE_RULES_NB_INT_B3 + \
+        DATAPLANE_RULES_NB_RT_EDGE + \
+        DATAPLANE_RULES_NB_RT_CORP + \
+        DATAPLANE_RULES_NB_ACL
+    assert desired_rules_nb == CONNECTION_RULES + ENDPOINT_RULES + DATAPLANE_RULES_NB_TOT
+    verify_number_of_rules(response.devices, desired_rules_nb)
diff --git a/src/tests/p4-int-routing-acl/topology/README.md b/src/tests/p4-int-routing-acl/topology/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..30d4d84bcf2771bb9732e9686a680de0a643fa79
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/topology/README.md
@@ -0,0 +1,166 @@
+# P4 Topology
+
+This directory contains scripts for deploying a single software-based Stratum switch on a VM or bare metal machine.
+
+## Prerequisites
+
+The machine on which Stratum will be deployed must have at least 3 network interfaces as follows:
+
+- a management interface for the switch to communicate with the control plane (i.e., TFS controller and INT collector)
+- a west data plane interface towards a certain subnet (we call it edge subnet in this example)
+- an est data plane interface towards another subnet (we call it corporate subnet in this example)
+
+Also, due to Stratum's restrictions, the desired OS of the machine shall be `Ubuntu server 20.04 LTS`.
+
+To build Stratum on this machine, follow the steps [here](https://github.com/stratum/stratum/blob/main/stratum/hal/bin/bmv2/README.md).
+It is preferred to run Stratum as a binary.
+
+## Steps to setup the environment and deploy the Stratum switch
+
+We create a Linux namespace for Stratum to live in an isolated space from the rest of the system.
+The two data plane interfaces of the VM need to be enclosed into this namespace, while for this namespace to interact with the outside world (i.e., root namespace and outside the VM), a dedicated virtual interface pair is created.
+
+Follow the steps below to create the environment, deploy Stratum, and restore the VM to its previous state (cleanup).
+Prior to this take a look at the environment configuration file, where one can change the names of the interfaces, according to your network setup.
+
+```shell
+nano p4-switch-conf-common.sh
+
+HOST_IFACE_EXT="ens3"     # Interface towards TFS (management)
+SW_IFACE_DATA_EDGE="ens4" # Interface towards the edge subnet (data plane)
+SW_IFACE_DATA_CORP="ens5" # Interface towards the corporate subnet (data plane)
+
+...
+```
+
+### Step 1: Setup environment
+
+Edit the `setup` script to modify the subnets' information according to your network setup:
+
+```shell
+nano p4-switch-setup.sh
+
+# Subnets managed by the switch
+DOMAIN_EDGE_IP="10.158.72.0/24"  # Left-hand side subnet
+DOMAIN_CORP_IP="172.16.10.0/24"  # Right-hand side subnet
+```
+
+Once your network setup is applied, run the `setup` script as follows:
+
+```shell
+sudo bash p4-switch-setup.sh
+```
+
+To verify that the switch namespace is in place, issue the following command:
+
+```shell
+sudo ip netns exec ns-switch ip a
+```
+
+The output should show 4 network interfaces, i.e., a `loopback` interface, 2 data planes interfaces (e.g., `ens4`, `ens5` in this example), and a virtual interface for sending telemetry data out of the switch (i.e., `veth-int-sw` in this example).
+From this latter interface you can ping towards the other end of the virtual interface pair (i.e., `veth-int-host`):
+
+```shell
+sudo ip netns exec ns-switch ping 10.0.0.254
+```
+
+This ensures that telemetry data leaves the switch and ends up on the host VM.
+To dispatch this telemetry data towards TFS, the `p4-switch-setup.sh` implements packet mirroring from `veth-int-host` to the VM's management interface (i.e., `ens3` in this example).
+We assume that TFS is deployed on a machine that is accessible via the management interface (i.e., `ens3`) of this VM.
+
+### Step 2: Deploy Stratum in the namespace
+
+Now the namespace is ready to host the Stratum switch.
+
+First you need to configure the chassis configuration file with the correct network interfaces names.
+To do so, modify the `name` field changing `ens4`, `ens5`, and `ens3` to your desired interfaces.
+These interface names must agree with the ones you added in `p4-switch-conf-common.sh`.
+
+```shell
+cat p4-switch-three-port-chassis-config-phy.pb.txt
+
+# Copyright 2018-present Open Networking Foundation
+# SPDX-License-Identifier: Apache-2.0
+
+description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports"
+chassis {
+  platform: PLT_P4_SOFT_SWITCH
+  name: "bmv2-switch"
+}
+nodes {
+  id: 1
+  slot: 1
+  index: 1
+}
+singleton_ports {
+  id: 1
+  name: "ens4"
+  slot: 1
+  port: 1
+  channel: 1
+  speed_bps: 100000000000
+  config_params {
+    admin_state: ADMIN_STATE_ENABLED
+  }
+  node: 1
+}
+singleton_ports {
+  id: 2
+  name: "ens5"
+  slot: 1
+  port: 2
+  channel: 1
+  speed_bps: 100000000000
+  config_params {
+    admin_state: ADMIN_STATE_ENABLED
+  }
+  node: 1
+}
+singleton_ports {
+  id: 3
+  name: "veth-int-sw"
+  slot: 1
+  port: 3
+  channel: 1
+  speed_bps: 100000000000
+  config_params {
+    admin_state: ADMIN_STATE_ENABLED
+  }
+  node: 1
+}
+```
+
+To deploy Stratum, do:
+
+```shell
+sudo bash run-stratum.sh
+```
+
+To run Stratum will verbose logging, open the `run-stratum.sh` and change:
+
+```shell
+LOG_LEVEL="debug"
+```
+
+Then, re-deploy Stratum as shown above.
+
+To verify that Stratum has been correctly deployed, you should see the following output:
+
+```
+<timestamp> config_monitoring_service.cc:94] Pushing the saved chassis config read from p4-switch-three-port-chassis-config-phy.pb.txt...
+<timestamp> bmv2_chassis_manager.cc:519] Registered port status callbacks successfully for node 1.
+<timestamp> bmv2_chassis_manager.cc:453] State of port 1 in node 1: UP.
+<timestamp> bmv2_chassis_manager.cc:453] State of port 2 in node 1: UP.
+<timestamp> bmv2_chassis_manager.cc:453] State of port 3 in node 1: UP.
+<timestamp> bmv2_switch.cc:74] P4-based forwarding pipeline config pushed successfully to node with ID 1.
+<timestamp> hal.cc:220] Stratum external facing services are listening to 0.0.0.0:50000, 0.0.0.0:50001, 0.0.0.0:50101...
+```
+
+### Step 3: Restore to the original setup
+
+When your tests with Stratum and TFS are over, you may want to restore your setup.
+To do so, execute the following script:
+
+```shell
+sudo bash p4-switch-tear-down.sh
+```
diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-conf-common.sh b/src/tests/p4-int-routing-acl/topology/p4-switch-conf-common.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3ba84651e7e9550ef4b47d28f9ce3efa1f8fd2c8
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/topology/p4-switch-conf-common.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Switch lives in a namespace
+SWITCH_NS="ns-switch"
+
+# Physical interfaces
+HOST_IFACE_EXT="ens3"     # Interface towards TFS (management)
+SW_IFACE_DATA_EDGE="ens4" # Interface towards the edge subnet (data plane)
+SW_IFACE_DATA_CORP="ens5" # Interface towards the corporate subnet (data plane)
+
+# Virtual interfaces for INT
+SW_IFACE_INT="veth-int-sw"
+HOST_IFACE_INT="veth-int-host"
+
+# IP subnet for INT
+TOPO_INT_NET="10.0.0.0/24"
+TOPO_INT_NET_IP="10.0.0.0"
+TOPO_INT_NET_MASK="255.255.255.0"
+
+# Transport port where the P4Runtime gRPC server is deployed on the switch
+SW_P4RT_GRPC_PORT="50001"
+
+# Transport port where the P4Runtime gNMI server is deployed on the switch
+SW_P4RT_GNMI_PORT="50000"
+
+# Transport port where Stratum listens to local calls
+SW_P4RT_LOCAL_PORT="50101"
diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-setup.sh b/src/tests/p4-int-routing-acl/topology/p4-switch-setup.sh
new file mode 100644
index 0000000000000000000000000000000000000000..1a5f37b2fbe2b1acd6c3ef69682d645591093f69
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/topology/p4-switch-setup.sh
@@ -0,0 +1,134 @@
+#!bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# You must run this script as root
+if [ "$EUID" -ne 0 ]; then
+    echo "Please run as root"
+    exit 1
+fi
+
+source "p4-switch-conf-common.sh"
+
+# MAC addresses of the virtual INT interfaces
+SW_INT_MAC="00:11:22:33:44:11"
+HOST_INT_MAC="00:11:22:33:44:22"
+
+# IP addresses of the virtual INT interfaces
+SWITCH_INT_IP="10.0.0.1"
+HOST_INT_IP="10.0.0.254"
+
+SWITCH_INT_IP_NET=${SWITCH_INT_IP}"/24"
+HOST_INT_IP_NET=${HOST_INT_IP}"/24"
+
+# Subnets managed by the switch
+DOMAIN_EDGE_IP="10.158.72.22/24" # Edge domain side IP address
+DOMAIN_CORP_IP="172.16.10.4/24"  # Corporate domain side IP address
+
+# INT subnet MTU
+MTU_LEN=9000
+
+kill_stratum() {
+    pkill stratum
+}
+
+create_namespaces() {
+    ip netns add ${SWITCH_NS}
+}
+
+create_virtual_interfaces() {
+    ip link add ${HOST_IFACE_INT} type veth peer name ${SW_IFACE_INT}
+}
+
+assign_virtual_interfaces() {
+    ip link set ${SW_IFACE_DATA_EDGE} netns ${SWITCH_NS}
+    ip link set ${SW_IFACE_DATA_CORP} netns ${SWITCH_NS}
+    ip link set ${SW_IFACE_INT} netns ${SWITCH_NS}
+}
+
+set_mac_addresses() {
+    ip netns exec ${SWITCH_NS} ifconfig ${SW_IFACE_INT} hw ether ${SW_INT_MAC}
+    ifconfig ${HOST_IFACE_INT} hw ether ${HOST_INT_MAC}
+}
+
+set_mtu() {
+    ip netns exec ${SWITCH_NS} ip link set dev ${SW_IFACE_INT} mtu ${MTU_LEN}
+    ip link set dev ${HOST_IFACE_INT} mtu ${MTU_LEN}
+}
+
+set_ip_addresses() {
+    ip -n ${SWITCH_NS} addr add ${DOMAIN_EDGE_IP} dev ${SW_IFACE_DATA_EDGE}
+    ip -n ${SWITCH_NS} addr add ${DOMAIN_CORP_IP} dev ${SW_IFACE_DATA_CORP}
+    ip -n ${SWITCH_NS} addr add ${SWITCH_INT_IP_NET} dev ${SW_IFACE_INT}
+    ifconfig ${HOST_IFACE_INT} ${HOST_INT_IP_NET}
+}
+
+bring_interfaces_up() {
+    ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_EDGE} up
+    ip -n ${SWITCH_NS} link set ${SW_IFACE_DATA_CORP} up
+    ip -n ${SWITCH_NS} link set ${SW_IFACE_INT} up
+    ifconfig ${HOST_IFACE_INT} up
+}
+
+disable_csum_offloading() {
+    ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_EDGE} rx off tx off
+    ip netns exec ${SWITCH_NS} ethtool -K ${SW_IFACE_DATA_CORP} rx off tx off
+}
+
+switch_default_gw() {
+    ip netns exec ${SWITCH_NS} ip route add default via ${HOST_INT_IP}
+}
+
+enable_ip_fwd() {
+    sysctl net.ipv4.ip_forward=1
+    sysctl net.ipv4.conf.${HOST_IFACE_EXT}.forwarding=1
+    sysctl net.ipv4.conf.${HOST_IFACE_INT}.forwarding=1
+}
+
+switch_access_to_internet() {
+    iptables -P FORWARD DROP
+    iptables -t nat -A POSTROUTING -s ${TOPO_INT_NET_IP}/${TOPO_INT_NET_MASK} -o ${HOST_IFACE_EXT} -j MASQUERADE
+    iptables -A FORWARD -i ${HOST_IFACE_EXT} -o ${HOST_IFACE_INT} -j ACCEPT
+    iptables -A FORWARD -o ${HOST_IFACE_EXT} -i ${HOST_IFACE_INT} -j ACCEPT
+}
+
+grpc_port_forwarding() {
+    iptables -t nat -A PREROUTING -p tcp -i ${HOST_IFACE_EXT} --dport ${SW_P4RT_GRPC_PORT} -j DNAT --to-destination ${SWITCH_INT_IP}:${SW_P4RT_GRPC_PORT}
+    iptables -A FORWARD -p tcp -d ${SWITCH_INT_IP} --dport ${SW_P4RT_GRPC_PORT} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
+}
+
+int_packet_mirroring() {
+    sudo tc qdisc add dev ${HOST_IFACE_INT} ingress
+    sudo tc filter add dev ${HOST_IFACE_INT} parent ffff: \
+        protocol all prio 2 u32 \
+        match u32 0 0 flowid 1:1 \
+        action mirred egress mirror dev ${HOST_IFACE_EXT}
+}
+
+kill_stratum
+create_namespaces
+create_virtual_interfaces
+assign_virtual_interfaces
+set_mac_addresses
+set_mtu
+set_ip_addresses
+bring_interfaces_up
+disable_csum_offloading
+switch_default_gw
+enable_ip_fwd
+switch_access_to_internet
+grpc_port_forwarding
+int_packet_mirroring
+
+exit 0
diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-tear-down.sh b/src/tests/p4-int-routing-acl/topology/p4-switch-tear-down.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9d79343a37e8b65167992e53f7c3e54944adfb1a
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/topology/p4-switch-tear-down.sh
@@ -0,0 +1,84 @@
+#!bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# You must run this script as root
+if [ "$EUID" -ne 0 ]; then
+    echo "Please run as root"
+    exit 1
+fi
+
+source "p4-switch-conf-common.sh"
+
+kill_stratum() {
+    pkill stratum
+}
+
+delete_virtual_interfaces() {
+    ip netns exec ${SWITCH_NS} ip link delete ${SW_IFACE_INT}
+}
+
+delete_namespaces() {
+    ip netns del ${SWITCH_NS}
+}
+
+bring_interfaces_up() {
+    ifconfig ${SW_IFACE_DATA_EDGE} up
+    ifconfig ${SW_IFACE_DATA_CORP} up
+}
+
+cleanup_iptables() {
+    # gRPC entries
+    entry_no=$(iptables --line-numbers -nvL | grep ${HOST_IFACE_INT} | cut -d " " -f 1 | head -1)
+    iptables -D FORWARD ${entry_no}
+    entry_no=$(iptables --line-numbers -nvL | grep ${HOST_IFACE_INT} | cut -d " " -f 1)
+    iptables -D FORWARD ${entry_no}
+    entry_no=$(iptables --line-numbers -nvL | grep ${SW_P4RT_GRPC_PORT} | cut -d " " -f 1)
+    iptables -D FORWARD ${entry_no}
+
+    entry_no=$(iptables -t nat --line-numbers -nvL | grep ${SW_P4RT_GRPC_PORT} | cut -d " " -f 1)
+    iptables -t nat -D PREROUTING ${entry_no}
+
+    entry_no=$(iptables -t nat --line-numbers -nvL | grep ${TOPO_INT_NET} | cut -d " " -f 1)
+    iptables -t nat -D POSTROUTING ${entry_no}
+
+    # Check new state
+    echo "Forwarding tables"
+    iptables --line-numbers -nvL
+    echo -e ""
+    echo "NAT tables"
+    iptables -t nat --line-numbers -nvL
+}
+
+cleanup_tc() {
+    sudo tc filter del dev ${HOST_IFACE_INT} parent ffff: \
+        protocol all prio 2 u32 \
+        match u32 0 0 flowid 1:1 \
+        action mirred egress mirror dev ${HOST_IFACE_EXT}
+    sudo tc qdisc del dev ${HOST_IFACE_INT} ingress
+
+    # Check new state
+    echo -e ""
+    echo -e "Linux tc status"
+    tc qdisc show
+}
+
+kill_stratum
+delete_virtual_interfaces
+delete_namespaces
+# bring_interfaces_up
+cleanup_iptables
+cleanup_tc
+
+exit 0
diff --git a/src/tests/p4-int-routing-acl/topology/p4-switch-three-port-chassis-config-phy.pb.txt b/src/tests/p4-int-routing-acl/topology/p4-switch-three-port-chassis-config-phy.pb.txt
new file mode 100644
index 0000000000000000000000000000000000000000..038d3626960e252a318edd5419ed887e2682a4b5
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/topology/p4-switch-three-port-chassis-config-phy.pb.txt
@@ -0,0 +1,63 @@
+# Copyright 2018-present Open Networking Foundation
+# SPDX-License-Identifier: Apache-2.0
+
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+description: "Chassis configuration for a single Stratum bmv2 switch with 3 ports"
+chassis {
+  platform: PLT_P4_SOFT_SWITCH
+  name: "bmv2-switch"
+}
+nodes {
+  id: 1
+  slot: 1
+  index: 1
+}
+singleton_ports {
+  id: 1
+  name: "ens4"
+  slot: 1
+  port: 1
+  channel: 1
+  speed_bps: 100000000000
+  config_params {
+    admin_state: ADMIN_STATE_ENABLED
+  }
+  node: 1
+}
+singleton_ports {
+  id: 2
+  name: "ens5"
+  slot: 1
+  port: 2
+  channel: 1
+  speed_bps: 100000000000
+  config_params {
+    admin_state: ADMIN_STATE_ENABLED
+  }
+  node: 1
+}
+singleton_ports {
+  id: 3
+  name: "veth-int-sw"
+  slot: 1
+  port: 3
+  channel: 1
+  speed_bps: 100000000000
+  config_params {
+    admin_state: ADMIN_STATE_ENABLED
+  }
+  node: 1
+}
diff --git a/src/tests/p4-int-routing-acl/topology/run-stratum.sh b/src/tests/p4-int-routing-acl/topology/run-stratum.sh
new file mode 100644
index 0000000000000000000000000000000000000000..29e4647793c79084dbc740d73af454cda16ac9d1
--- /dev/null
+++ b/src/tests/p4-int-routing-acl/topology/run-stratum.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# You must run this script as root
+if [ "$EUID" -ne 0 ]; then
+    echo "Please run as root"
+    exit 1
+fi
+
+source "p4-switch-conf-common.sh"
+
+LOG_FILE_DIR="/var/log/stratum/"
+
+sudo mkdir -p "${LOG_FILE_DIR}"
+
+LOG_LEVEL="info"
+READ_LOGS_FILE_PATH=${LOG_FILE_DIR}"p4_reads.pb.txt"
+WRITE_LOGS_FILE_PATH=${LOG_FILE_DIR}"p4_writes.pb.txt"
+CHASSIS_CONFIG="p4-switch-three-port-chassis-config-phy.pb.txt"
+
+[ -f ${CHASSIS_CONFIG} ] || { echo "$CHASSIS_CONFIG not found!" ; exit 1 ;}
+
+touch "${READ_LOGS_FILE_PATH}"
+touch "${WRITE_LOGS_FILE_PATH}"
+
+ip netns exec ns-switch stratum_bmv2 \
+        -chassis_config_file=${CHASSIS_CONFIG} \
+        -read_req_log_file=${READ_LOGS_FILE_PATH} \
+        -write_req_log_file=${WRITE_LOGS_FILE_PATH} \
+        -external_stratum_urls="0.0.0.0:"${SW_P4RT_GNMI_PORT}",0.0.0.0:"${SW_P4RT_GRPC_PORT} \
+        -local_stratum_url="0.0.0.0:"${SW_P4RT_LOCAL_PORT} \
+        -bmv2_log_level=${LOG_LEVEL}
+
+exit 0
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..b2ac55af45ba673cd7c119f19a5245d065d02ea3
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/Dockerfile
@@ -0,0 +1,37 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 python:3.9-slim
+
+# Set Python to show logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# Get generic Python packages
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install --upgrade setuptools wheel
+RUN python3 -m pip install --upgrade pip-tools
+
+# Create component sub-folders, and copy content
+RUN mkdir -p /var/teraflow/mock_ietf_l3vpn_sdn_ctrl
+WORKDIR /var/teraflow/mock_ietf_l3vpn_sdn_ctrl
+COPY . .
+
+# Get specific Python packages
+RUN pip-compile --quiet --output-file=requirements.txt requirements.in
+RUN python3 -m pip install -r requirements.txt
+
+RUN python3 -m pip list
+
+# Start the service
+ENTRYPOINT ["python", "MockIetfL3VPNSdnCtrl.py"]
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/L3VPNServices.py b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/L3VPNServices.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e4d7c6195a3dd0b0cb6c124f788c2efa5fe7927
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/L3VPNServices.py
@@ -0,0 +1,44 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# REST-API resource implementing minimal support for "IETF YANG Data Model for Transport Network Client Signals".
+# Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+
+from flask import jsonify, make_response, request
+from flask_restful import Resource
+
+VPN_SERVICES = {}
+
+
+class L3VPNServices(Resource):
+    def get(self):
+        return make_response(jsonify(VPN_SERVICES), 200)
+
+    def post(self):
+        json_request = request.get_json()
+        name = json_request["ietf-l3vpn-svc:l3vpn-svc"]["vpn-services"]["vpn-service"][0]["vpn-id"]
+        VPN_SERVICES[name] = json_request
+        return make_response(jsonify({}), 201)
+
+
+class L3VPNService(Resource):
+    def put(self, vpn_id: str):
+        json_request = request.get_json()
+        VPN_SERVICES[vpn_id] = json_request
+        return make_response(jsonify({}), 200)
+
+    def delete(self, vpn_id: str):
+        slice = VPN_SERVICES.pop(vpn_id, None)
+        data, status = ({}, 404) if slice is None else (slice, 204)
+        return make_response(jsonify(data), status)
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/MockIetfL3VPNSdnCtrl.py b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/MockIetfL3VPNSdnCtrl.py
new file mode 100644
index 0000000000000000000000000000000000000000..49685aa19902c619cdc0259b5cb0573dbf77bd63
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/MockIetfL3VPNSdnCtrl.py
@@ -0,0 +1,77 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Mock IETF ACTN SDN controller
+# -----------------------------
+# REST server implementing minimal support for:
+# - IETF YANG Data Model for Transport Network Client Signals
+#       Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+# - IETF YANG Data Model for Traffic Engineering Tunnels, Label Switched Paths and Interfaces
+#       Ref: https://www.ietf.org/archive/id/draft-ietf-teas-yang-te-34.html
+
+
+import functools, logging, sys, time
+from flask import Flask, request
+from flask_restful import Api
+
+from L3VPNServices import L3VPNService, L3VPNServices
+
+BIND_ADDRESS = "0.0.0.0"
+BIND_PORT = 8443
+BASE_URL = "/restconf/data/ietf-l3vpn-svc:l3vpn-svc/vpn-services"
+STR_ENDPOINT = "http://{:s}:{:s}{:s}".format(
+    str(BIND_ADDRESS), str(BIND_PORT), str(BASE_URL)
+)
+LOG_LEVEL = logging.DEBUG
+
+logging.basicConfig(
+    level=LOG_LEVEL, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s"
+)
+LOGGER = logging.getLogger(__name__)
+
+logging.getLogger("werkzeug").setLevel(logging.WARNING)
+
+
+def log_request(logger: logging.Logger, response):
+    timestamp = time.strftime("[%Y-%b-%d %H:%M]")
+    logger.info(
+        "%s %s %s %s %s",
+        timestamp,
+        request.remote_addr,
+        request.method,
+        request.full_path,
+        response.status,
+    )
+    return response
+
+
+def main():
+    LOGGER.info("Starting...")
+
+    app = Flask(__name__)
+    app.after_request(functools.partial(log_request, LOGGER))
+
+    api = Api(app, prefix=BASE_URL)
+    api.add_resource(L3VPNServices, "")
+    api.add_resource(L3VPNService, "/vpn-service=<string:vpn_id>")
+
+    LOGGER.info("Listening on {:s}...".format(str(STR_ENDPOINT)))
+    app.run(debug=True, host=BIND_ADDRESS, port=BIND_PORT)
+
+    LOGGER.info("Bye")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/README.md b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ed9d744f7641e20ddd39b51f837ea68e47fe64c0
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/README.md
@@ -0,0 +1,31 @@
+# Mock IETF L3VPN SDN Controller
+
+This REST server implements very basic support for the following YANG data models:
+- YANG Data Model for L3VPN Service Delivery
+  - Ref: https://datatracker.ietf.org/doc/html/rfc8049
+
+The aim of this server is to enable testing ietf netowrk slice service handler, ietf l3vpn service handler, and ietf l3vpn driver
+
+
+## 1. Install requirements for the Mock IETF Network Slice SDN controller
+__NOTE__: if you run the Mock IETF L3VPN SDN controller from the PyEnv used for developing on the TeraFlowSDN
+framework and you followed the official steps in
+[Development Guide > Configure Environment > Python](https://labs.etsi.org/rep/tfs/controller/-/wikis/2.-Development-Guide/2.1.-Configure-Environment/2.1.1.-Python),
+all the requirements are already in place. Install them only if you execute it in a separate/standalone environment.
+
+Install the required dependencies as follows:
+```bash
+pip install -r src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/requirements.in
+```
+
+Run the Mock IETF L3VPN SDN Controller as follows:
+```bash
+python src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/MockIetfL3VPNSdnCtrl.py
+```
+
+
+## 2. Run the Mock IETF L3VPN SDN controller
+Run the Mock IETF L3VPN SDN Controller as follows:
+```bash
+python src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/MockIetfL3VPNSdnCtrl.py
+```
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/__init__.py b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/tools/mock_ietf_l3vpn_sdn_ctrl/build.sh b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..e5f12798556b0c9c044d86c0f175aeec9d0cff23
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Make folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+docker build -t mock-ietf-l3vpn-sdn-ctrl:test -f Dockerfile .
+docker tag mock-ietf-l3vpn-sdn-ctrl:test localhost:32000/tfs/mock-ietf-l3vpn-sdn-ctrl:test
+docker push localhost:32000/tfs/mock-ietf-l3vpn-sdn-ctrl:test
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/deploy.sh b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/deploy.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1c6e68deb33de588cffab91fda550aafe222ce37
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/deploy.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+kubectl delete namespace mocks
+kubectl --namespace mocks apply -f mock-ietf-l3vpn-sdn-ctrl.yaml
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/mock-ietf-network-slice-sdn-ctrl.yaml b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/mock-ietf-network-slice-sdn-ctrl.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ace79810f0cbfbd6605ef049c71c6c75cf5c0317
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/mock-ietf-network-slice-sdn-ctrl.yaml
@@ -0,0 +1,64 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+kind: Namespace
+apiVersion: v1
+metadata:
+  name: mocks
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: mock-ietf-l3vpn-sdn-ctrl
+spec:
+  selector:
+    matchLabels:
+      app: mock-ietf-l3vpn-sdn-ctrl
+  replicas: 1
+  template:
+    metadata:
+      annotations:
+        config.linkerd.io/skip-inbound-ports: "8443"
+      labels:
+        app: mock-ietf-l3vpn-sdn-ctrl
+    spec:
+      terminationGracePeriodSeconds: 5
+      containers:
+      - name: server
+        image: localhost:32000/tfs/mock-ietf-l3vpn-sdn-ctrl:test
+        imagePullPolicy: IfNotPresent
+        ports:
+        - containerPort: 8443
+        resources:
+          requests:
+            cpu: 250m
+            memory: 512Mi
+          limits:
+            cpu: 700m
+            memory: 1024Mi
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: mock-ietf-l3vpn-sdn-ctrl
+  labels:
+    app: mock-ietf-l3vpn-sdn-ctrl
+spec:
+  type: ClusterIP
+  selector:
+    app: mock-ietf-l3vpn-sdn-ctrl
+  ports:
+  - name: http
+    port: 8443
+    targetPort: 8443
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/requirements.in b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..dbb8e95d65cfd0f1ee60d9bb4f840393ac893725
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/requirements.in
@@ -0,0 +1,22 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+cryptography==39.0.1
+pyopenssl==23.0.0
+Flask==2.1.3
+Flask-HTTPAuth==4.5.0
+Flask-RESTful==0.3.9
+jsonschema==4.4.0
+requests==2.27.1
+werkzeug==2.3.7
diff --git a/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/run.sh b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3c0ddc2b06f8f3af6ed3645a65fcea31888c82de
--- /dev/null
+++ b/src/tests/tools/mock_ietf_l3vpn_sdn_ctrl/run.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Make folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+python MockIetfL3VPNSdnCtrl.py
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..a624152de7d9188067a5828b4a8958b8d3418694
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/Dockerfile
@@ -0,0 +1,37 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 python:3.9-slim
+
+# Set Python to show logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# Get generic Python packages
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install --upgrade setuptools wheel
+RUN python3 -m pip install --upgrade pip-tools
+
+# Create component sub-folders, and copy content
+RUN mkdir -p /var/teraflow/mock_ietf_network_slice_sdn_ctrl
+WORKDIR /var/teraflow/mock_ietf_network_slice_sdn_ctrl
+COPY . .
+
+# Get specific Python packages
+RUN pip-compile --quiet --output-file=requirements.txt requirements.in
+RUN python3 -m pip install -r requirements.txt
+
+RUN python3 -m pip list
+
+# Start the service
+ENTRYPOINT ["python", "MockIetfNetworkSliceSdnCtrl.py"]
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/MockIetfNetworkSliceSdnCtrl.py b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/MockIetfNetworkSliceSdnCtrl.py
new file mode 100644
index 0000000000000000000000000000000000000000..8d13f1bafcd98c28f20033ab8859bc6cc4b207dd
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/MockIetfNetworkSliceSdnCtrl.py
@@ -0,0 +1,81 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Mock IETF ACTN SDN controller
+# -----------------------------
+# REST server implementing minimal support for:
+# - IETF YANG Data Model for Transport Network Client Signals
+#       Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+# - IETF YANG Data Model for Traffic Engineering Tunnels, Label Switched Paths and Interfaces
+#       Ref: https://www.ietf.org/archive/id/draft-ietf-teas-yang-te-34.html
+
+
+import functools, logging, sys, time
+from flask import Flask, request
+from flask_restful import Api
+from ResourceNetworkSlices import NetworkSliceService, NetworkSliceServices
+from ResourceConnectionGroups import ConnectionGroup
+
+BIND_ADDRESS = "0.0.0.0"
+BIND_PORT = 8443
+BASE_URL = "/restconf/data/ietf-network-slice-service:network-slice-services"
+STR_ENDPOINT = "http://{:s}:{:s}{:s}".format(
+    str(BIND_ADDRESS), str(BIND_PORT), str(BASE_URL)
+)
+LOG_LEVEL = logging.DEBUG
+
+logging.basicConfig(
+    level=LOG_LEVEL, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s"
+)
+LOGGER = logging.getLogger(__name__)
+
+logging.getLogger("werkzeug").setLevel(logging.WARNING)
+
+
+def log_request(logger: logging.Logger, response):
+    timestamp = time.strftime("[%Y-%b-%d %H:%M]")
+    logger.info(
+        "%s %s %s %s %s",
+        timestamp,
+        request.remote_addr,
+        request.method,
+        request.full_path,
+        response.status,
+    )
+    return response
+
+
+def main():
+    LOGGER.info("Starting...")
+
+    app = Flask(__name__)
+    app.after_request(functools.partial(log_request, LOGGER))
+
+    api = Api(app, prefix=BASE_URL)
+    api.add_resource(NetworkSliceServices, "")
+    api.add_resource(NetworkSliceService, "/slice-service=<string:slice_id>")
+    api.add_resource(
+        ConnectionGroup,
+        "/slice-service=<string:slice_id>/connection-groups/connection-group=<string:connection_group_id>",
+    )
+
+    LOGGER.info("Listening on {:s}...".format(str(STR_ENDPOINT)))
+    app.run(debug=True, host=BIND_ADDRESS, port=BIND_PORT)
+
+    LOGGER.info("Bye")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/README.md b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..493fe37362dbbb8e8dbdf1a9621cb81a15c64691
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/README.md
@@ -0,0 +1,31 @@
+# Mock IETF Network Slice SDN Controller
+
+This REST server implements very basic support for the following YANG data models:
+- IETF YANG Data Model for Transport Network Client Signals (draft-ietf-ccamp-client-signal-yang-10)
+  - Ref: https://datatracker.ietf.org/doc/draft-ietf-teas-ietf-network-slice-nbi-yang/
+
+The aim of this server is to enable testing ietf netowrk slice service driver and ietf slice service service handler
+
+
+## 1. Install requirements for the Mock IETF Network Slice SDN controller
+__NOTE__: if you run the Mock IETF Network Slice SDN controller from the PyEnv used for developing on the TeraFlowSDN
+framework and you followed the official steps in
+[Development Guide > Configure Environment > Python](https://labs.etsi.org/rep/tfs/controller/-/wikis/2.-Development-Guide/2.1.-Configure-Environment/2.1.1.-Python),
+all the requirements are already in place. Install them only if you execute it in a separate/standalone environment.
+
+Install the required dependencies as follows:
+```bash
+pip install -r src/tests/tools/mock_ietf_network_slice_sdn_ctrl/requirements.in
+```
+
+Run the Mock IETF Network Slice SDN Controller as follows:
+```bash
+python src/tests/tools/mock_ietf_network_slice_sdn_ctrl/MockIetfNetworkSliceSdnCtrl.py
+```
+
+
+## 2. Run the Mock IETF Network Slice SDN controller
+Run the Mock IETF Network Slice SDN Controller as follows:
+```bash
+python src/tests/tools/mock_ietf_network_slice_sdn_ctrl/MockIetfNetworkSliceSdnCtrl.py
+```
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/ResourceConnectionGroups.py b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/ResourceConnectionGroups.py
new file mode 100644
index 0000000000000000000000000000000000000000..19c84e181a97354940fd3dca8f3d6396c0a50068
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/ResourceConnectionGroups.py
@@ -0,0 +1,31 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# REST-API resource implementing minimal support for "IETF YANG Data Model for Transport Network Client Signals".
+# Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+
+from flask import jsonify, make_response, request
+from flask_restful import Resource
+
+CONNECTION_GROUPS = []
+
+
+class ConnectionGroup(Resource):
+    def get(self, slice_id: str, connection_group_id: str):
+        return make_response(jsonify(CONNECTION_GROUPS), 200)
+
+    def put(self, slice_id: str, connection_group_id: str):
+        json_request = request.get_json()
+        CONNECTION_GROUPS.append(json_request)
+        return make_response(jsonify({}), 200)
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/ResourceNetworkSlices.py b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/ResourceNetworkSlices.py
new file mode 100644
index 0000000000000000000000000000000000000000..80840f8da13e00af689c7b84e9577e952d9e2adf
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/ResourceNetworkSlices.py
@@ -0,0 +1,39 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# REST-API resource implementing minimal support for "IETF YANG Data Model for Transport Network Client Signals".
+# Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+
+from flask import jsonify, make_response, request
+from flask_restful import Resource
+
+NETWORK_SLICES = {}
+
+
+class NetworkSliceServices(Resource):
+    def get(self):
+        return make_response(jsonify(NETWORK_SLICES), 200)
+
+    def post(self):
+        json_request = request.get_json()
+        name = json_request["network-slice-services"]["slice-service"][0]["id"]
+        NETWORK_SLICES[name] = json_request
+        return make_response(jsonify({}), 201)
+
+
+class NetworkSliceService(Resource):
+    def delete(self, slice_id: str):
+        slice = NETWORK_SLICES.pop(slice_id, None)
+        data, status = ({}, 404) if slice is None else (slice, 204)
+        return make_response(jsonify(data), status)
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/__init__.py b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/tools/mock_ietf_network_slice_sdn_ctrl/build.sh b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8e4dda34d7c83ef76c9944bcf52475de05d5238d
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Make folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+docker build -t mock-ietf-network-slice-sdn-ctrl:test -f Dockerfile .
+docker tag mock-ietf-network-slice-sdn-ctrl:test localhost:32000/tfs/mock-ietf-network-slice-sdn-ctrl:test
+docker push localhost:32000/tfs/mock-ietf-network-slice-sdn-ctrl:test
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/deploy.sh b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/deploy.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6db45be588e4d538e04ecb8922b3350432439a70
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/deploy.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+kubectl delete namespace mocks
+kubectl --namespace mocks apply -f mock-ietf-network-slice-sdn-ctrl.yaml
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/mock-ietf-network-slice-sdn-ctrl.yaml b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/mock-ietf-network-slice-sdn-ctrl.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..cd5734a5f3087dc36d9a103a75e90f3eb902865d
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/mock-ietf-network-slice-sdn-ctrl.yaml
@@ -0,0 +1,64 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+kind: Namespace
+apiVersion: v1
+metadata:
+  name: mocks
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: mock-ietf-network-slice-sdn-ctrl
+spec:
+  selector:
+    matchLabels:
+      app: mock-ietf-network-slice-sdn-ctrl
+  replicas: 1
+  template:
+    metadata:
+      annotations:
+        config.linkerd.io/skip-inbound-ports: "8443"
+      labels:
+        app: mock-ietf-network-slice-sdn-ctrl
+    spec:
+      terminationGracePeriodSeconds: 5
+      containers:
+      - name: server
+        image: localhost:32000/tfs/mock-ietf-network-slice-sdn-ctrl:test
+        imagePullPolicy: IfNotPresent
+        ports:
+        - containerPort: 8443
+        resources:
+          requests:
+            cpu: 250m
+            memory: 512Mi
+          limits:
+            cpu: 700m
+            memory: 1024Mi
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: mock-ietf-network-slice-sdn-ctrl
+  labels:
+    app: mock-ietf-network-slice-sdn-ctrl
+spec:
+  type: ClusterIP
+  selector:
+    app: mock-ietf-network-slice-sdn-ctrl
+  ports:
+  - name: http
+    port: 8443
+    targetPort: 8443
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/requirements.in b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..dbb8e95d65cfd0f1ee60d9bb4f840393ac893725
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/requirements.in
@@ -0,0 +1,22 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+cryptography==39.0.1
+pyopenssl==23.0.0
+Flask==2.1.3
+Flask-HTTPAuth==4.5.0
+Flask-RESTful==0.3.9
+jsonschema==4.4.0
+requests==2.27.1
+werkzeug==2.3.7
diff --git a/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/run.sh b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..f52b6061b3d89b75504f2b80d77696573a09814d
--- /dev/null
+++ b/src/tests/tools/mock_ietf_network_slice_sdn_ctrl/run.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Make folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+python MockIetfNetworkSliceSdnCtrl.py
diff --git a/src/tests/tools/mock_nce_ctrl/Dockerfile b/src/tests/tools/mock_nce_ctrl/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..ae9dde4eb469a951c1ccf3f78a79a9ab2d07c122
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/Dockerfile
@@ -0,0 +1,37 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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 python:3.9-slim
+
+# Set Python to show logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# Get generic Python packages
+RUN python3 -m pip install --upgrade pip
+RUN python3 -m pip install --upgrade setuptools wheel
+RUN python3 -m pip install --upgrade pip-tools
+
+# Create component sub-folders, and copy content
+RUN mkdir -p /var/teraflow/mock_nce_ctrl
+WORKDIR /var/teraflow/mock_nce_ctrl
+COPY . .
+
+# Get specific Python packages
+RUN pip-compile --quiet --output-file=requirements.txt requirements.in
+RUN python3 -m pip install -r requirements.txt
+
+RUN python3 -m pip list
+
+# Start the service
+ENTRYPOINT ["python", "MockNCECtrl.py"]
diff --git a/src/tests/tools/mock_nce_ctrl/MockNCECtrl.py b/src/tests/tools/mock_nce_ctrl/MockNCECtrl.py
new file mode 100644
index 0000000000000000000000000000000000000000..e58a4dc445e74e6186267e7b43b2872b05cb114e
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/MockNCECtrl.py
@@ -0,0 +1,79 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Mock IETF ACTN SDN controller
+# -----------------------------
+# REST server implementing minimal support for:
+# - IETF YANG Data Model for Transport Network Client Signals
+#       Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+# - IETF YANG Data Model for Traffic Engineering Tunnels, Label Switched Paths and Interfaces
+#       Ref: https://www.ietf.org/archive/id/draft-ietf-teas-yang-te-34.html
+
+
+import functools, logging, sys, time
+from flask import Flask, jsonify, make_response, request
+from flask_restful import Api, Resource
+from ResourceApps import Apps, App
+from ResourceAppFlows import AppFlows, AppFlow
+
+BIND_ADDRESS = "0.0.0.0"
+BIND_PORT = 8443
+BASE_URL = "/restconf/v1/data/app-flows"
+STR_ENDPOINT = "http://{:s}:{:s}{:s}".format(
+    str(BIND_ADDRESS), str(BIND_PORT), str(BASE_URL)
+)
+LOG_LEVEL = logging.DEBUG
+
+logging.basicConfig(
+    level=LOG_LEVEL, format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s"
+)
+LOGGER = logging.getLogger(__name__)
+
+logging.getLogger("werkzeug").setLevel(logging.WARNING)
+
+
+def log_request(logger: logging.Logger, response):
+    timestamp = time.strftime("[%Y-%b-%d %H:%M]")
+    logger.info(
+        "%s %s %s %s %s",
+        timestamp,
+        request.remote_addr,
+        request.method,
+        request.full_path,
+        response.status,
+    )
+    return response
+
+
+def main():
+    LOGGER.info("Starting...")
+
+    app = Flask(__name__)
+    app.after_request(functools.partial(log_request, LOGGER))
+
+    api = Api(app, prefix=BASE_URL)
+    api.add_resource(Apps, "/apps")
+    api.add_resource(App, "/apps/application=<string:app_name>")
+    api.add_resource(AppFlows, "")
+    api.add_resource(AppFlow, "/app-flow=<string:app_name>")
+
+    LOGGER.info("Listening on {:s}...".format(str(STR_ENDPOINT)))
+    app.run(debug=True, host=BIND_ADDRESS, port=BIND_PORT)
+
+    LOGGER.info("Bye")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/src/tests/tools/mock_nce_ctrl/README.md b/src/tests/tools/mock_nce_ctrl/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..407f26425bd70b22e1426cc13dede15993925258
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/README.md
@@ -0,0 +1,29 @@
+# Mock NCE Controller
+
+This REST server implements very basic support for the NCE access controller.
+
+The aim of this server is to enable testing IETF Network Slice NBI, NCE driver and NCE service handler.
+
+
+## 1. Install requirements for the Mock NCE controller
+__NOTE__: if you run the Mock NCE controller from the PyEnv used for developing on the TeraFlowSDN
+framework and you followed the official steps in
+[Development Guide > Configure Environment > Python](https://labs.etsi.org/rep/tfs/controller/-/wikis/2.-Development-Guide/2.1.-Configure-Environment/2.1.1.-Python),
+all the requirements are already in place. Install them only if you execute it in a separate/standalone environment.
+
+Install the required dependencies as follows:
+```bash
+pip install -r src/tests/tools/mock_nce_ctrl/requirements.in
+```
+
+Run the Mock NCE Controller as follows:
+```bash
+python src/tests/tools/mock_nce_ctrl/MockNCECtrl.py
+```
+
+
+## 2. Run the Mock NCE controller
+Run the Mock NCE Controller as follows:
+```bash
+python src/tests/tools/mock_nce_ctrl/MockNCECtrl.py
+```
diff --git a/src/tests/tools/mock_nce_ctrl/ResourceAppFlows.py b/src/tests/tools/mock_nce_ctrl/ResourceAppFlows.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f7a8df41497293af912bcf4f77aa27eabdbf095
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/ResourceAppFlows.py
@@ -0,0 +1,39 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# REST-API resource implementing minimal support for "IETF YANG Data Model for Transport Network Client Signals".
+# Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+
+from flask import jsonify, make_response, request
+from flask_restful import Resource
+
+APP_FLOWS = {}
+
+
+class AppFlows(Resource):
+    def get(self):
+        return make_response(jsonify(APP_FLOWS), 200)
+
+    def post(self):
+        json_request = request.get_json()
+        name = json_request["app-flow"][0]["app-name"]
+        APP_FLOWS[name] = json_request
+        return make_response(jsonify({}), 201)
+
+
+class AppFlow(Resource):
+    def delete(self, app_name: str):
+        app_flow = APP_FLOWS.pop(app_name, None)
+        data, status = ({}, 404) if app_flow is None else (app_flow, 204)
+        return make_response(jsonify(data), status)
diff --git a/src/tests/tools/mock_nce_ctrl/ResourceApps.py b/src/tests/tools/mock_nce_ctrl/ResourceApps.py
new file mode 100644
index 0000000000000000000000000000000000000000..163d08fc2fed7fd3c21806418de06bf7ef08741a
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/ResourceApps.py
@@ -0,0 +1,39 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# REST-API resource implementing minimal support for "IETF YANG Data Model for Transport Network Client Signals".
+# Ref: https://www.ietf.org/archive/id/draft-ietf-ccamp-client-signal-yang-10.html
+
+from flask import jsonify, make_response, request
+from flask_restful import Resource
+
+APPS = {}
+
+
+class Apps(Resource):
+    def get(self):
+        return make_response(jsonify(APPS), 200)
+
+    def post(self):
+        json_request = request.get_json()
+        name = json_request["application"][0]["name"]
+        APPS[name] = json_request
+        return make_response(jsonify({}), 201)
+
+
+class App(Resource):
+    def delete(self, app_name: str):
+        app_flow = APPS.pop(app_name, None)
+        data, status = ({}, 404) if app_flow is None else (app_flow, 204)
+        return make_response(jsonify(data), status)
diff --git a/src/tests/tools/mock_nce_ctrl/__init__.py b/src/tests/tools/mock_nce_ctrl/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ccc21c7db78aac26daa1f8c5ff8e1ffd3f35460
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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/tests/tools/mock_nce_ctrl/build.sh b/src/tests/tools/mock_nce_ctrl/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..766d2c1dc5d3a890c5a74d88c22055792b089de4
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/build.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Make folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+docker build -t mock-nce-ctrl:test -f Dockerfile .
+docker tag mock-nce-ctrl:test localhost:32000/tfs/mock-nce-ctrl:test
+docker push localhost:32000/tfs/mock-nce-ctrl:test
diff --git a/src/tests/tools/mock_nce_ctrl/deploy.sh b/src/tests/tools/mock_nce_ctrl/deploy.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0e5faf26d435ee928f550106e36f85e65109ac66
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/deploy.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2022-2024 ETSI SDG TeraFlowSDN (TFS) (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.
+
+kubectl delete namespace mocks
+kubectl --namespace mocks apply -f mock-nce-ctrl.yaml
diff --git a/src/tests/tools/mock_nce_ctrl/mock-nce-ctrl.yaml b/src/tests/tools/mock_nce_ctrl/mock-nce-ctrl.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4a1512f238970afb0867a3cb79824df4ac60d5c9
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/mock-nce-ctrl.yaml
@@ -0,0 +1,64 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+kind: Namespace
+apiVersion: v1
+metadata:
+  name: mocks
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: mock-nce-ctrl
+spec:
+  selector:
+    matchLabels:
+      app: mock-nce-ctrl
+  replicas: 1
+  template:
+    metadata:
+      annotations:
+        config.linkerd.io/skip-inbound-ports: "8443"
+      labels:
+        app: mock-nce-ctrl
+    spec:
+      terminationGracePeriodSeconds: 5
+      containers:
+      - name: server
+        image: localhost:32000/tfs/mock-nce-ctrl:test
+        imagePullPolicy: IfNotPresent
+        ports:
+        - containerPort: 8443
+        resources:
+          requests:
+            cpu: 250m
+            memory: 512Mi
+          limits:
+            cpu: 700m
+            memory: 1024Mi
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: mock-nce-ctrl
+  labels:
+    app: mock-nce-ctrl
+spec:
+  type: ClusterIP
+  selector:
+    app: mock-nce-ctrl
+  ports:
+  - name: https
+    port: 8443
+    targetPort: 8443
diff --git a/src/tests/tools/mock_nce_ctrl/requirements.in b/src/tests/tools/mock_nce_ctrl/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..dbb8e95d65cfd0f1ee60d9bb4f840393ac893725
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/requirements.in
@@ -0,0 +1,22 @@
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+cryptography==39.0.1
+pyopenssl==23.0.0
+Flask==2.1.3
+Flask-HTTPAuth==4.5.0
+Flask-RESTful==0.3.9
+jsonschema==4.4.0
+requests==2.27.1
+werkzeug==2.3.7
diff --git a/src/tests/tools/mock_nce_ctrl/run.sh b/src/tests/tools/mock_nce_ctrl/run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..6aa1149a4a9571bc1e52ab66ca0a36391edc6f54
--- /dev/null
+++ b/src/tests/tools/mock_nce_ctrl/run.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+# Copyright 2022-2025 ETSI SDG TeraFlowSDN (TFS) (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.
+
+# Make folder containing the script the root folder for its execution
+cd $(dirname $0)
+
+python MockNCECtrl.py
diff --git a/src/vnt_manager/service/VNTManagerService.py b/src/vnt_manager/service/VNTManagerService.py
index b95ad089a454e9d73e99d9f14cbe525a6c9ca8cb..3f44c4a510245fc2ab145e35b8ff1f35e4ac0f78 100644
--- a/src/vnt_manager/service/VNTManagerService.py
+++ b/src/vnt_manager/service/VNTManagerService.py
@@ -12,19 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import logging
-
 from common.Constants import ServiceNameEnum
-from common.proto.vnt_manager_pb2_grpc import add_VNTManagerServiceServicer_to_server
 from common.Settings import get_service_port_grpc
+from common.proto.vnt_manager_pb2 import DESCRIPTOR as VNT_MANAGER_DESCRIPTOR
+from common.proto.vnt_manager_pb2_grpc import add_VNTManagerServiceServicer_to_server
 from common.tools.service.GenericGrpcService import GenericGrpcService
 from .VNTManagerServiceServicerImpl import VNTManagerServiceServicerImpl
 
-LOGGER = logging.getLogger(__name__)
-
-
 class VNTManagerService(GenericGrpcService):
-    def __init__(self, cls_name: str = __name__):
+    def __init__(self, cls_name: str = __name__) -> None:
         port = get_service_port_grpc(ServiceNameEnum.VNTMANAGER)
         super().__init__(port, cls_name=cls_name)
         self.vntmanager_servicer = VNTManagerServiceServicerImpl()
@@ -33,3 +29,5 @@ class VNTManagerService(GenericGrpcService):
         add_VNTManagerServiceServicer_to_server(
             self.vntmanager_servicer, self.server
         )
+
+        self.add_reflection_service_name(VNT_MANAGER_DESCRIPTOR, 'VNTManagerService')
diff --git a/src/webui/service/device/routes.py b/src/webui/service/device/routes.py
index eb86f9ef4b99ba11c0c68b73c32026cb3056a334..e490ff5d14a5a84d8241091219a557b884a4f618 100644
--- a/src/webui/service/device/routes.py
+++ b/src/webui/service/device/routes.py
@@ -12,11 +12,15 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import json ,logging , time 
-from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for
+import json
+from flask import (
+    current_app, render_template, Blueprint, flash, session, redirect, url_for
+)
 from common.DeviceTypes import DeviceTypeEnum
 from common.proto.context_pb2 import (
-    ConfigActionEnum, Device, DeviceDriverEnum, DeviceId, DeviceList, DeviceOperationalStatusEnum, Empty)
+    ConfigActionEnum, Device, DeviceDriverEnum, DeviceId, DeviceList,
+    DeviceOperationalStatusEnum, Empty
+)
 from common.tools.context_queries.Device import get_device
 from common.tools.context_queries.Topology import get_topology
 from context.client.ContextClient import ContextClient
diff --git a/src/webui/service/link/routes.py b/src/webui/service/link/routes.py
index dacf77534711c97237ca1afd54c3646fe9809a28..42f5984a3c0957a0740690ad6e37bed7438449b7 100644
--- a/src/webui/service/link/routes.py
+++ b/src/webui/service/link/routes.py
@@ -13,8 +13,10 @@
 # limitations under the License.
 
 
-from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for
-from common.proto.context_pb2 import Empty, Link, LinkId, LinkList
+from flask import (
+    current_app, render_template, Blueprint, flash, session, redirect, url_for
+)
+from common.proto.context_pb2 import Empty, Link, LinkId, LinkList, LinkTypeEnum
 from common.tools.context_queries.EndPoint import get_endpoint_names
 from common.tools.context_queries.Link import get_link
 from common.tools.context_queries.Topology import get_topology
@@ -50,7 +52,10 @@ def home():
         device_names, endpoints_data = get_endpoint_names(context_client, endpoint_ids)
     context_client.close()
 
-    return render_template('link/home.html', links=links, device_names=device_names, endpoints_data=endpoints_data)
+    return render_template(
+        'link/home.html', links=links, device_names=device_names,
+        endpoints_data=endpoints_data, lte=LinkTypeEnum
+    )
 
 
 @link.route('detail/<path:link_uuid>', methods=('GET', 'POST'))
@@ -64,7 +69,10 @@ def detail(link_uuid: str):
     else:
         device_names, endpoints_data = get_endpoint_names(context_client, link_obj.link_endpoint_ids)
     context_client.close()
-    return render_template('link/detail.html',link=link_obj, device_names=device_names, endpoints_data=endpoints_data)
+    return render_template(
+        'link/detail.html', link=link_obj, device_names=device_names,
+        endpoints_data=endpoints_data, lte=LinkTypeEnum
+    )
 
 @link.get('<path:link_uuid>/delete')
 def delete(link_uuid):
diff --git a/src/webui/service/slice/routes.py b/src/webui/service/slice/routes.py
index 922f8af96dc916f0ca5658e120cdf3dfa4ec9b21..f56c50f46d8c9df083a943a91704e7d16352e5a2 100644
--- a/src/webui/service/slice/routes.py
+++ b/src/webui/service/slice/routes.py
@@ -12,12 +12,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import json
+from typing import Dict, Optional, Tuple
 import grpc
 from flask import current_app, redirect, render_template, Blueprint, flash, session, url_for
-from common.proto.context_pb2 import IsolationLevelEnum, Slice, SliceId, SliceStatusEnum
+from common.method_wrappers.ServiceExceptions import InvalidArgumentsException
+from common.proto.context_pb2 import IsolationLevelEnum, Slice, SliceId, SliceStatusEnum, EndPointId, SliceConfig, ConfigRule
 from common.tools.context_queries.Context import get_context
 from common.tools.context_queries.EndPoint import get_endpoint_names
-from common.tools.context_queries.Slice import get_slice_by_uuid
+from common.tools.context_queries.Slice import get_slice_by_uuid, get_uuid_from_string
+from common.Constants import DEFAULT_CONTEXT_NAME
 from context.client.ContextClient import ContextClient
 from slice.client.SliceClient import SliceClient
 
@@ -26,6 +30,94 @@ slice = Blueprint('slice', __name__, url_prefix='/slice')
 context_client = ContextClient()
 slice_client = SliceClient()
 
+
+RUNNING_RESOURCE_KEY = "running_ietf_slice"
+CANDIDATE_RESOURCE_KEY = "candidate_ietf_slice"
+
+
+class ConfigRuleNotFoundError(Exception):
+    ...
+
+def get_custom_config_rule(
+    slice_config: SliceConfig, resource_key: str
+) -> Optional[ConfigRule]:
+    """
+    Retrieve the custom config rule with the given resource_key from a ServiceConfig.
+    """
+    for cr in slice_config.config_rules:
+        if (
+            cr.WhichOneof("config_rule") == "custom"
+            and cr.custom.resource_key == resource_key
+        ):
+            return cr
+    return None
+
+
+def get_ietf_data_from_config(slice_request: Slice, resource_key: str) -> Dict:
+    """
+    Retrieve the IETF data (as a Python dict) from a slice's config rule for the specified resource_key.
+    Raises an exception if not found.
+    """
+    config_rule = get_custom_config_rule(slice_request.slice_config, resource_key)
+    if not config_rule:
+        raise ConfigRuleNotFoundError(f"IETF data not found for resource_key: {resource_key}")
+    return json.loads(config_rule.custom.resource_value)
+
+
+def endpoint_get_uuid(
+    endpoint_id : EndPointId, endpoint_name : str = '', allow_random : bool = False
+) -> Tuple[str, str, str]:
+    device_uuid = endpoint_id.device_id.device_uuid.uuid
+    topology_uuid = endpoint_id.topology_id.topology_uuid.uuid
+    raw_endpoint_uuid = endpoint_id.endpoint_uuid.uuid
+
+    if len(raw_endpoint_uuid) > 0:
+        prefix_for_name = '{:s}/{:s}'.format(topology_uuid, device_uuid)
+        return topology_uuid, device_uuid, get_uuid_from_string(raw_endpoint_uuid, prefix_for_name=prefix_for_name)
+    if len(endpoint_name) > 0:
+        prefix_for_name = '{:s}/{:s}'.format(topology_uuid, device_uuid)
+        return topology_uuid, device_uuid, get_uuid_from_string(endpoint_name, prefix_for_name=prefix_for_name)
+
+    raise InvalidArgumentsException([
+        ('endpoint_id.endpoint_uuid.uuid', raw_endpoint_uuid),
+        ('name', endpoint_name),
+    ], extra_details=['At least one is required to produce a EndPoint UUID'])
+
+def get_slice_endpoints(slice_obj: Slice) -> list[EndPointId]:
+    '''
+    Get the list of endpoint ids for a slice.
+    If the slice has a `running_ietf_slice` config rule, return the list of endpoint ids from the config rule,
+    otherwise return the slice's list of endpoint ids.
+    '''
+    try:
+        first_slice_endpoint_id = slice_obj.slice_endpoint_ids[0]
+        topology_uuid = first_slice_endpoint_id.topology_id.topology_uuid.uuid
+        context_uuid = slice_obj.slice_id.context_id.context_uuid.uuid
+        running_ietf_data = get_ietf_data_from_config(slice_obj, RUNNING_RESOURCE_KEY)
+        slice_service = running_ietf_data["network-slice-services"]["slice-service"][0]
+        slice_sdps = slice_service["sdps"]["sdp"]
+        list_endpoint_ids = []
+        for sdp in slice_sdps:
+            endpoint = EndPointId()
+            endpoint.topology_id.context_id.context_uuid.uuid = context_uuid
+            endpoint.topology_id.topology_uuid.uuid = topology_uuid
+            device_uuid = get_uuid_from_string(sdp["node-id"])
+            endpoint.device_id.device_uuid.uuid = device_uuid
+            attachment_circuits = sdp["attachment-circuits"]["attachment-circuit"]
+            endpoint_name = attachment_circuits[0]["ac-tp-id"]
+            endpoint.endpoint_uuid.uuid = endpoint_name
+            _, _, endpoint_uuid = endpoint_get_uuid(endpoint)
+            endpoint.endpoint_uuid.uuid = endpoint_uuid
+            list_endpoint_ids.append(endpoint)
+        del slice_obj.slice_endpoint_ids[:]
+        slice_obj.slice_endpoint_ids.extend(list_endpoint_ids)
+
+    except ConfigRuleNotFoundError:
+        # The slice does not have `running_ietf_slice` config rule, return slice's list of endpoint ids
+        list_endpoint_ids = slice_obj.slice_endpoint_ids
+
+    return list_endpoint_ids
+
 @slice.get('/')
 def home():
     if 'context_uuid' not in session or 'topology_uuid' not in session:
@@ -50,7 +142,8 @@ def home():
         else:
             endpoint_ids = list()
             for slice_ in slices:
-                endpoint_ids.extend(slice_.slice_endpoint_ids)
+                slice_endpoint_ids = get_slice_endpoints(slice_)
+                endpoint_ids.extend(slice_endpoint_ids)
             device_names, endpoints_data = get_endpoint_names(context_client, endpoint_ids)
 
     context_client.close()
@@ -81,7 +174,8 @@ def detail(slice_uuid: str):
             flash('Context({:s})/Slice({:s}) not found'.format(str(context_uuid), str(slice_uuid)), 'danger')
             slice_obj = Slice()
         else:
-            device_names, endpoints_data = get_endpoint_names(context_client, slice_obj.slice_endpoint_ids)
+            slice_endpoint_ids = get_slice_endpoints(slice_obj)
+            device_names, endpoints_data = get_endpoint_names(context_client, slice_endpoint_ids)
 
         context_client.close()
 
@@ -111,5 +205,5 @@ def delete(slice_uuid: str):
         flash('Slice "{:s}" deleted successfully!'.format(slice_uuid), 'success')
     except Exception as e:
         flash('Problem deleting slice "{:s}": {:s}'.format(slice_uuid, str(e.details())), 'danger')
-        current_app.logger.exception(e) 
+        current_app.logger.exception(e)
     return redirect(url_for('slice.home'))
diff --git a/src/webui/service/static/topology_icons/ietf-slice.png b/src/webui/service/static/topology_icons/ietf-slice.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed2232e8223a39eb0d829e0e50975a697b0660fc
Binary files /dev/null and b/src/webui/service/static/topology_icons/ietf-slice.png differ
diff --git a/src/webui/service/static/topology_icons/nce.png b/src/webui/service/static/topology_icons/nce.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c9af8f37fbb7249fbe570a920e0bcd281582655
Binary files /dev/null and b/src/webui/service/static/topology_icons/nce.png differ
diff --git a/src/webui/service/templates/link/detail.html b/src/webui/service/templates/link/detail.html
index 7c5f732e33a209b6acbd36b4982da90d7f148f38..775e5392d3dad06eaf13414cda2c9cde2586fe12 100644
--- a/src/webui/service/templates/link/detail.html
+++ b/src/webui/service/templates/link/detail.html
@@ -39,6 +39,7 @@
     <div class="col-sm-4">
         <b>UUID: </b>{{ link.link_id.link_uuid.uuid }}<br>
         <b>Name: </b>{{ link.name }}<br>
+        <b>Type: </b>{{ lte.Name(link.link_type).replace('LINKTYPE_', '') }}<br>
     </div>
     <div class="col-sm-8">
         <table class="table table-striped table-hover">
diff --git a/src/webui/service/templates/link/home.html b/src/webui/service/templates/link/home.html
index d96da78147d344533bf94fcc1adecbecf8fe8dd2..6632898793c8601bf30f8d824e9090e3a2f7552e 100644
--- a/src/webui/service/templates/link/home.html
+++ b/src/webui/service/templates/link/home.html
@@ -12,87 +12,89 @@
     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.
-   -->
-   
-   {% extends 'base.html' %}
-   
-   {% block content %}
-       <h1>Links</h1>
-   
-       <div class="row">
-           <div class="col">
-               <!-- <a href="#" class="btn btn-primary" style="margin-bottom: 10px;">
-                   <i class="bi bi-plus"></i>
-                   Add New Link
-               </a> -->
-           </div>
-           <div class="col">
-               {{ links | length }} links found in context <i>{{ session['context_uuid'] }}</i>
-           </div>
-           <!-- <div class="col">
-               <form>
-                   <div class="input-group">
-                       <input type="text" aria-label="Search" placeholder="Search..." class="form-control"/>
-                       <button type="submit" class="btn btn-primary">Search</button>
-                     </div>
-               </form>
-           </div> -->
-       </div>
-   
-       <table class="table table-striped table-hover">
-           <thead>
-             <tr>
-               <th scope="col">UUID</th>
-               <th scope="col">Name</th>
-               <th scope="col">Endpoints</th>
-               <th scope="col"></th>
-             </tr>
-           </thead>
-           <tbody>
-               {% if links %}
-                   {% for link in links %}
-                   <tr>
-                       <td>
+-->
+
+{% extends 'base.html' %}
+
+{% block content %}
+    <h1>Links</h1>
+
+    <div class="row">
+        <div class="col">
+            <!-- <a href="#" class="btn btn-primary" style="margin-bottom: 10px;">
+                <i class="bi bi-plus"></i>
+                Add New Link
+            </a> -->
+        </div>
+        <div class="col">
+            {{ links | length }} links found in context <i>{{ session['context_uuid'] }}</i>
+        </div>
+        <!-- <div class="col">
+            <form>
+                <div class="input-group">
+                    <input type="text" aria-label="Search" placeholder="Search..." class="form-control"/>
+                    <button type="submit" class="btn btn-primary">Search</button>
+                </div>
+            </form>
+        </div> -->
+    </div>
+
+    <table class="table table-striped table-hover">
+        <thead>
+            <tr>
+                <th scope="col">UUID</th>
+                <th scope="col">Name</th>
+                <th scope="col">Type</th>
+                <th scope="col">Endpoints</th>
+                <th scope="col"></th>
+            </tr>
+        </thead>
+        <tbody>
+            {% if links %}
+                {% for link in links %}
+                    <tr>
+                        <td>
                             {{ link.link_id.link_uuid.uuid }}
-                       </td>
-                       <td>
+                        </td>
+                        <td>
                             {{ link.name }}
                         </td>
-
-                       <td>
-                           <ul>
-                               {% for endpoint in link.link_endpoint_ids %}
-                               <li>
-                                   {{ endpoints_data.get(endpoint.endpoint_uuid.uuid, (endpoint.endpoint_uuid.uuid, ''))[0] }} / 
-                                   Device: 
-                                   <a href="{{ url_for('device.detail', device_uuid=endpoint.device_id.device_uuid.uuid) }}">
-                                       {{ device_names.get(endpoint.device_id.device_uuid.uuid, endpoint.device_id.device_uuid.uuid) }}
-                                       <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16">
-                                           <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/>
-                                           <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
-                                       </svg>
-                                   </a>
-                               </li>
-                               {% endfor %}
-                           </ul>
-                       </td>
+                        <td>
+                            {{ lte.Name(link.link_type).replace('LINKTYPE_', '') }}
+                        </td>
+                        <td>
+                            <ul>
+                                {% for endpoint in link.link_endpoint_ids %}
+                                <li>
+                                    {{ endpoints_data.get(endpoint.endpoint_uuid.uuid, (endpoint.endpoint_uuid.uuid, ''))[0] }} / 
+                                    Device: 
+                                    <a href="{{ url_for('device.detail', device_uuid=endpoint.device_id.device_uuid.uuid) }}">
+                                        {{ device_names.get(endpoint.device_id.device_uuid.uuid, endpoint.device_id.device_uuid.uuid) }}
+                                        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16">
+                                            <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/>
+                                            <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
+                                        </svg>
+                                    </a>
+                                </li>
+                                {% endfor %}
+                            </ul>
+                        </td>
    
-                       <td> 
+                        <td> 
                             <a href="{{ url_for('link.detail', link_uuid=link.link_id.link_uuid.uuid) }}">
-                               <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16">
-                                   <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/>
-                                   <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
-                               </svg> 
-                           </a>
-                       </td>
-                   </tr>
-                   {% endfor %}
-               {% else %}
-                   <tr>
-                       <td colspan="7">No links found</td>
-                   </tr>
-               {% endif %}
-           </tbody>
-       </table>
-   
-   {% endblock %}
\ No newline at end of file
+                                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-eye" viewBox="0 0 16 16">
+                                    <path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"/>
+                                    <path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
+                                </svg> 
+                            </a>
+                        </td>
+                    </tr>
+                {% endfor %}
+            {% else %}
+                <tr>
+                    <td colspan="7">No links found</td>
+                </tr>
+            {% endif %}
+        </tbody>
+    </table>
+{% endblock %}