diff --git a/proto/context.proto b/proto/context.proto
index 5b49bd28866af919332ab7188bbf66203e8b766d..3f0532d231535c2e59c798cbc9a6b1c92e1eb4bf 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -158,6 +158,11 @@ message Device {
   DeviceOperationalStatusEnum device_operational_status = 4;
   repeated DeviceDriverEnum device_drivers = 5;
   repeated EndPoint device_endpoints = 6;
+  repeated Component component = 7; // Used for inventory
+}
+
+message Component {
+  repeated string comp_string = 1;
 }
 
 message DeviceConfig {
diff --git a/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java b/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
index 6d672fdea2c3e97f9f2a50c7efa8d77c05532357..466ebf7fefe69645cd23c72ca3b61d8e5bdd4713 100644
--- a/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
+++ b/src/automation/src/main/java/eu/teraflow/automation/AutomationGatewayImpl.java
@@ -76,12 +76,11 @@ public class AutomationGatewayImpl implements AutomationGateway {
 
     @Override
     public Uni<Automation.DeviceRoleState> ztpDelete(Automation.DeviceRole request) {
-        return Uni.createFrom()
-                .item(
-                        () ->
-                                Automation.DeviceRoleState.newBuilder()
-                                        .setDevRoleId(request.getDevRoleId())
-                                        .build());
+        final var devRoleId = request.getDevRoleId().getDevRoleId().getUuid();
+        return automationService
+                .deleteDevice(devRoleId)
+                .onItem()
+                .transform(device -> transformToDeviceRoleState(device, devRoleId, DeviceState.DELETED));
     }
 
     @Override
diff --git a/src/automation/src/main/java/eu/teraflow/automation/ContextSubscriber.java b/src/automation/src/main/java/eu/teraflow/automation/ContextSubscriber.java
index 2fc3a3356456b3c1bc55137f686a7e82570a3171..76e536d9bc03c196005a91be1c82d15879a6f8e8 100644
--- a/src/automation/src/main/java/eu/teraflow/automation/ContextSubscriber.java
+++ b/src/automation/src/main/java/eu/teraflow/automation/ContextSubscriber.java
@@ -79,8 +79,8 @@ public class ContextSubscriber {
                                     break;
                                 case UPDATE:
                                     LOGGER.warnf(
-                                        "Received %s for device [%s]. " +
-                                            "No automation action on an already updated device",
+                                            "Received %s for device [%s]. "
+                                                    + "No automation action on an already updated device",
                                             event, deviceId);
                                     break;
                                 case UNDEFINED:
diff --git a/src/automation/src/test/java/eu/teraflow/automation/AutomationServiceTest.java b/src/automation/src/test/java/eu/teraflow/automation/AutomationServiceTest.java
index 85ed170efbf938b11303d92a6697c89836e0bf70..e17fc8304455a543ffa96b4c1239abb77be4daca 100644
--- a/src/automation/src/test/java/eu/teraflow/automation/AutomationServiceTest.java
+++ b/src/automation/src/test/java/eu/teraflow/automation/AutomationServiceTest.java
@@ -280,6 +280,53 @@ class AutomationServiceTest {
         final var uuid = serializer.serializeUuid(UUID_VALUE);
         final var deviceRoleId = Automation.DeviceRoleId.newBuilder().setDevRoleId(uuid).build();
         final var deviceRole = Automation.DeviceRole.newBuilder().setDevRoleId(deviceRoleId).build();
+        final var DEVICE_ID = "0f14d0ab-9608-7862-a9e4-5ed26688389b";
+        final var DEVICE_ROLE_ID = "0f14d0ab-9608-7862-a9e4-5ed26688389a";
+        final var DEVICE_TYPE = "ztp";
+
+        final var deviceDrivers = List.of(DeviceDriverEnum.IETF_NETWORK_TOPOLOGY, DeviceDriverEnum.P4);
+
+        final var topologyIdA = new TopologyId("contextIdA", "idA");
+        final var deviceIdA = "deviceIdA";
+        final var idA = "idA";
+        final var endPointIdA = new EndPointId(topologyIdA, deviceIdA, idA);
+
+        final var endPointTypeA = "endPointTypeA";
+        final var kpiSampleTypesA =
+                List.of(KpiSampleType.BYTES_RECEIVED, KpiSampleType.BYTES_TRANSMITTED);
+        final var locationTypeRegionA = new LocationTypeRegion("ATH");
+        final var locationA = new Location(locationTypeRegionA);
+        final var endPointA =
+                new EndPointBuilder(endPointIdA, endPointTypeA, kpiSampleTypesA)
+                        .location(locationA)
+                        .build();
+
+        final var topologyIdB = new TopologyId("contextIdB", "idB");
+        final var deviceIdB = "deviceIdB";
+        final var idB = "idB";
+        final var endPointIdB = new EndPointId(topologyIdB, deviceIdB, idB);
+        final var endPointTypeB = "endPointTypeB";
+        final var kpiSampleTypesB =
+                List.of(KpiSampleType.BYTES_RECEIVED, KpiSampleType.BYTES_TRANSMITTED);
+        final var locationTypeRegionB = new LocationTypeRegion("ATH");
+        final var locationB = new Location(locationTypeRegionB);
+        final var endPointB =
+                new EndPointBuilder(endPointIdB, endPointTypeB, kpiSampleTypesB)
+                        .location(locationB)
+                        .build();
+
+        final var endPoints = List.of(endPointA, endPointB);
+
+        final var emptyDeviceConfig = new DeviceConfig(List.of());
+        final var device =
+                new Device(
+                        DEVICE_ID,
+                        DEVICE_TYPE,
+                        emptyDeviceConfig,
+                        DeviceOperationalStatus.ENABLED,
+                        deviceDrivers,
+                        endPoints);
+        Mockito.when(contextGateway.getDevice(Mockito.any())).thenReturn(Uni.createFrom().item(device));
 
         client
                 .ztpDelete(deviceRole)
diff --git a/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java b/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java
index 67e1ec736f9d83cbf95b419e9e61e92e82e73b88..217672b2e8de2d7c840833a937b0fb04c38a221b 100644
--- a/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java
+++ b/src/automation/target/generated-sources/grpc/kpi_sample_types/KpiSampleTypes.java
@@ -31,6 +31,10 @@ public final class KpiSampleTypes {
      * <code>KPISAMPLETYPE_PACKETS_RECEIVED = 102;</code>
      */
     KPISAMPLETYPE_PACKETS_RECEIVED(102),
+    /**
+     * <code>KPISAMPLETYPE_PACKETS_DROPPED = 103;</code>
+     */
+    KPISAMPLETYPE_PACKETS_DROPPED(103),
     /**
      * <code>KPISAMPLETYPE_BYTES_TRANSMITTED = 201;</code>
      */
@@ -39,6 +43,50 @@ public final class KpiSampleTypes {
      * <code>KPISAMPLETYPE_BYTES_RECEIVED = 202;</code>
      */
     KPISAMPLETYPE_BYTES_RECEIVED(202),
+    /**
+     * <code>KPISAMPLETYPE_BYTES_DROPPED = 203;</code>
+     */
+    KPISAMPLETYPE_BYTES_DROPPED(203),
+    /**
+     * <pre>
+     *. can be used by both optical and L3 without any issue
+     * </pre>
+     *
+     * <code>KPISAMPLETYPE_ML_CONFIDENCE = 401;</code>
+     */
+    KPISAMPLETYPE_ML_CONFIDENCE(401),
+    /**
+     * <pre>
+     *. can be used by both optical and L3 without any issue
+     * </pre>
+     *
+     * <code>KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501;</code>
+     */
+    KPISAMPLETYPE_OPTICAL_SECURITY_STATUS(501),
+    /**
+     * <code>KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601;</code>
+     */
+    KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS(601),
+    /**
+     * <code>KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS = 602;</code>
+     */
+    KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS(602),
+    /**
+     * <code>KPISAMPLETYPE_L3_UNIQUE_ATTACKERS = 603;</code>
+     */
+    KPISAMPLETYPE_L3_UNIQUE_ATTACKERS(603),
+    /**
+     * <code>KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CLIENTS = 604;</code>
+     */
+    KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CLIENTS(604),
+    /**
+     * <code>KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO = 605;</code>
+     */
+    KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO(605),
+    /**
+     * <code>KPISAMPLETYPE_SERVICE_LATENCY_MS = 701;</code>
+     */
+    KPISAMPLETYPE_SERVICE_LATENCY_MS(701),
     UNRECOGNIZED(-1),
     ;
 
@@ -54,6 +102,10 @@ public final class KpiSampleTypes {
      * <code>KPISAMPLETYPE_PACKETS_RECEIVED = 102;</code>
      */
     public static final int KPISAMPLETYPE_PACKETS_RECEIVED_VALUE = 102;
+    /**
+     * <code>KPISAMPLETYPE_PACKETS_DROPPED = 103;</code>
+     */
+    public static final int KPISAMPLETYPE_PACKETS_DROPPED_VALUE = 103;
     /**
      * <code>KPISAMPLETYPE_BYTES_TRANSMITTED = 201;</code>
      */
@@ -62,6 +114,50 @@ public final class KpiSampleTypes {
      * <code>KPISAMPLETYPE_BYTES_RECEIVED = 202;</code>
      */
     public static final int KPISAMPLETYPE_BYTES_RECEIVED_VALUE = 202;
+    /**
+     * <code>KPISAMPLETYPE_BYTES_DROPPED = 203;</code>
+     */
+    public static final int KPISAMPLETYPE_BYTES_DROPPED_VALUE = 203;
+    /**
+     * <pre>
+     *. can be used by both optical and L3 without any issue
+     * </pre>
+     *
+     * <code>KPISAMPLETYPE_ML_CONFIDENCE = 401;</code>
+     */
+    public static final int KPISAMPLETYPE_ML_CONFIDENCE_VALUE = 401;
+    /**
+     * <pre>
+     *. can be used by both optical and L3 without any issue
+     * </pre>
+     *
+     * <code>KPISAMPLETYPE_OPTICAL_SECURITY_STATUS = 501;</code>
+     */
+    public static final int KPISAMPLETYPE_OPTICAL_SECURITY_STATUS_VALUE = 501;
+    /**
+     * <code>KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS = 601;</code>
+     */
+    public static final int KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS_VALUE = 601;
+    /**
+     * <code>KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS = 602;</code>
+     */
+    public static final int KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS_VALUE = 602;
+    /**
+     * <code>KPISAMPLETYPE_L3_UNIQUE_ATTACKERS = 603;</code>
+     */
+    public static final int KPISAMPLETYPE_L3_UNIQUE_ATTACKERS_VALUE = 603;
+    /**
+     * <code>KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CLIENTS = 604;</code>
+     */
+    public static final int KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CLIENTS_VALUE = 604;
+    /**
+     * <code>KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO = 605;</code>
+     */
+    public static final int KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO_VALUE = 605;
+    /**
+     * <code>KPISAMPLETYPE_SERVICE_LATENCY_MS = 701;</code>
+     */
+    public static final int KPISAMPLETYPE_SERVICE_LATENCY_MS_VALUE = 701;
 
 
     public final int getNumber() {
@@ -91,8 +187,18 @@ public final class KpiSampleTypes {
         case 0: return KPISAMPLETYPE_UNKNOWN;
         case 101: return KPISAMPLETYPE_PACKETS_TRANSMITTED;
         case 102: return KPISAMPLETYPE_PACKETS_RECEIVED;
+        case 103: return KPISAMPLETYPE_PACKETS_DROPPED;
         case 201: return KPISAMPLETYPE_BYTES_TRANSMITTED;
         case 202: return KPISAMPLETYPE_BYTES_RECEIVED;
+        case 203: return KPISAMPLETYPE_BYTES_DROPPED;
+        case 401: return KPISAMPLETYPE_ML_CONFIDENCE;
+        case 501: return KPISAMPLETYPE_OPTICAL_SECURITY_STATUS;
+        case 601: return KPISAMPLETYPE_L3_UNIQUE_ATTACK_CONNS;
+        case 602: return KPISAMPLETYPE_L3_TOTAL_DROPPED_PACKTS;
+        case 603: return KPISAMPLETYPE_L3_UNIQUE_ATTACKERS;
+        case 604: return KPISAMPLETYPE_L3_UNIQUE_COMPROMISED_CLIENTS;
+        case 605: return KPISAMPLETYPE_L3_SECURITY_STATUS_CRYPTO;
+        case 701: return KPISAMPLETYPE_SERVICE_LATENCY_MS;
         default: return null;
       }
     }
@@ -159,12 +265,22 @@ public final class KpiSampleTypes {
   static {
     java.lang.String[] descriptorData = {
       "\n\026kpi_sample_types.proto\022\020kpi_sample_typ" +
-      "es*\276\001\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" +
+      "es*\327\004\n\rKpiSampleType\022\031\n\025KPISAMPLETYPE_UN" +
       "KNOWN\020\000\022%\n!KPISAMPLETYPE_PACKETS_TRANSMI" +
       "TTED\020e\022\"\n\036KPISAMPLETYPE_PACKETS_RECEIVED" +
-      "\020f\022$\n\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001" +
-      "\022!\n\034KPISAMPLETYPE_BYTES_RECEIVED\020\312\001b\006pro" +
-      "to3"
+      "\020f\022!\n\035KPISAMPLETYPE_PACKETS_DROPPED\020g\022$\n" +
+      "\037KPISAMPLETYPE_BYTES_TRANSMITTED\020\311\001\022!\n\034K" +
+      "PISAMPLETYPE_BYTES_RECEIVED\020\312\001\022 \n\033KPISAM" +
+      "PLETYPE_BYTES_DROPPED\020\313\001\022 \n\033KPISAMPLETYP" +
+      "E_ML_CONFIDENCE\020\221\003\022*\n%KPISAMPLETYPE_OPTI" +
+      "CAL_SECURITY_STATUS\020\365\003\022)\n$KPISAMPLETYPE_" +
+      "L3_UNIQUE_ATTACK_CONNS\020\331\004\022*\n%KPISAMPLETY" +
+      "PE_L3_TOTAL_DROPPED_PACKTS\020\332\004\022&\n!KPISAMP" +
+      "LETYPE_L3_UNIQUE_ATTACKERS\020\333\004\0220\n+KPISAMP" +
+      "LETYPE_L3_UNIQUE_COMPROMISED_CLIENTS\020\334\004\022" +
+      ",\n\'KPISAMPLETYPE_L3_SECURITY_STATUS_CRYP" +
+      "TO\020\335\004\022%\n KPISAMPLETYPE_SERVICE_LATENCY_M" +
+      "S\020\275\005b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
diff --git a/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java b/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java
index 9d05f3da8a831e74922e65473206539680c8d78b..38f026eb1ac730e8f825e460916dc57469f0d312 100644
--- a/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java
+++ b/src/automation/target/generated-sources/grpc/monitoring/Monitoring.java
@@ -139,6 +139,21 @@ public final class Monitoring {
      * <code>.context.SliceId slice_id = 8;</code>
      */
     context.ContextOuterClass.SliceIdOrBuilder getSliceIdOrBuilder();
+
+    /**
+     * <code>.context.ConnectionId connection_id = 9;</code>
+     * @return Whether the connectionId field is set.
+     */
+    boolean hasConnectionId();
+    /**
+     * <code>.context.ConnectionId connection_id = 9;</code>
+     * @return The connectionId.
+     */
+    context.ContextOuterClass.ConnectionId getConnectionId();
+    /**
+     * <code>.context.ConnectionId connection_id = 9;</code>
+     */
+    context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder();
   }
   /**
    * Protobuf type {@code monitoring.KpiDescriptor}
@@ -275,6 +290,19 @@ public final class Monitoring {
 
               break;
             }
+            case 74: {
+              context.ContextOuterClass.ConnectionId.Builder subBuilder = null;
+              if (connectionId_ != null) {
+                subBuilder = connectionId_.toBuilder();
+              }
+              connectionId_ = input.readMessage(context.ContextOuterClass.ConnectionId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(connectionId_);
+                connectionId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
             default: {
               if (!parseUnknownField(
                   input, unknownFields, extensionRegistry, tag)) {
@@ -537,6 +565,32 @@ public final class Monitoring {
       return getSliceId();
     }
 
+    public static final int CONNECTION_ID_FIELD_NUMBER = 9;
+    private context.ContextOuterClass.ConnectionId connectionId_;
+    /**
+     * <code>.context.ConnectionId connection_id = 9;</code>
+     * @return Whether the connectionId field is set.
+     */
+    @java.lang.Override
+    public boolean hasConnectionId() {
+      return connectionId_ != null;
+    }
+    /**
+     * <code>.context.ConnectionId connection_id = 9;</code>
+     * @return The connectionId.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionId getConnectionId() {
+      return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+    }
+    /**
+     * <code>.context.ConnectionId connection_id = 9;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
+      return getConnectionId();
+    }
+
     private byte memoizedIsInitialized = -1;
     @java.lang.Override
     public final boolean isInitialized() {
@@ -575,6 +629,9 @@ public final class Monitoring {
       if (sliceId_ != null) {
         output.writeMessage(8, getSliceId());
       }
+      if (connectionId_ != null) {
+        output.writeMessage(9, getConnectionId());
+      }
       unknownFields.writeTo(output);
     }
 
@@ -615,6 +672,10 @@ public final class Monitoring {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(8, getSliceId());
       }
+      if (connectionId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(9, getConnectionId());
+      }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
       return size;
@@ -660,6 +721,11 @@ public final class Monitoring {
         if (!getSliceId()
             .equals(other.getSliceId())) return false;
       }
+      if (hasConnectionId() != other.hasConnectionId()) return false;
+      if (hasConnectionId()) {
+        if (!getConnectionId()
+            .equals(other.getConnectionId())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -699,6 +765,10 @@ public final class Monitoring {
         hash = (37 * hash) + SLICE_ID_FIELD_NUMBER;
         hash = (53 * hash) + getSliceId().hashCode();
       }
+      if (hasConnectionId()) {
+        hash = (37 * hash) + CONNECTION_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getConnectionId().hashCode();
+      }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
@@ -873,6 +943,12 @@ public final class Monitoring {
           sliceId_ = null;
           sliceIdBuilder_ = null;
         }
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = null;
+        } else {
+          connectionId_ = null;
+          connectionIdBuilder_ = null;
+        }
         return this;
       }
 
@@ -936,6 +1012,11 @@ public final class Monitoring {
         } else {
           result.sliceId_ = sliceIdBuilder_.build();
         }
+        if (connectionIdBuilder_ == null) {
+          result.connectionId_ = connectionId_;
+        } else {
+          result.connectionId_ = connectionIdBuilder_.build();
+        }
         onBuilt();
         return result;
       }
@@ -1032,6 +1113,9 @@ public final class Monitoring {
         if (other.hasSliceId()) {
           mergeSliceId(other.getSliceId());
         }
+        if (other.hasConnectionId()) {
+          mergeConnectionId(other.getConnectionId());
+        }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
         return this;
@@ -2026,6 +2110,125 @@ public final class Monitoring {
         }
         return sliceIdBuilder_;
       }
+
+      private context.ContextOuterClass.ConnectionId connectionId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> connectionIdBuilder_;
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       * @return Whether the connectionId field is set.
+       */
+      public boolean hasConnectionId() {
+        return connectionIdBuilder_ != null || connectionId_ != null;
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       * @return The connectionId.
+       */
+      public context.ContextOuterClass.ConnectionId getConnectionId() {
+        if (connectionIdBuilder_ == null) {
+          return connectionId_ == null ? context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+        } else {
+          return connectionIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      public Builder setConnectionId(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          connectionId_ = value;
+          onChanged();
+        } else {
+          connectionIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      public Builder setConnectionId(
+          context.ContextOuterClass.ConnectionId.Builder builderForValue) {
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = builderForValue.build();
+          onChanged();
+        } else {
+          connectionIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      public Builder mergeConnectionId(context.ContextOuterClass.ConnectionId value) {
+        if (connectionIdBuilder_ == null) {
+          if (connectionId_ != null) {
+            connectionId_ =
+              context.ContextOuterClass.ConnectionId.newBuilder(connectionId_).mergeFrom(value).buildPartial();
+          } else {
+            connectionId_ = value;
+          }
+          onChanged();
+        } else {
+          connectionIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      public Builder clearConnectionId() {
+        if (connectionIdBuilder_ == null) {
+          connectionId_ = null;
+          onChanged();
+        } else {
+          connectionId_ = null;
+          connectionIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      public context.ContextOuterClass.ConnectionId.Builder getConnectionIdBuilder() {
+        
+        onChanged();
+        return getConnectionIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      public context.ContextOuterClass.ConnectionIdOrBuilder getConnectionIdOrBuilder() {
+        if (connectionIdBuilder_ != null) {
+          return connectionIdBuilder_.getMessageOrBuilder();
+        } else {
+          return connectionId_ == null ?
+              context.ContextOuterClass.ConnectionId.getDefaultInstance() : connectionId_;
+        }
+      }
+      /**
+       * <code>.context.ConnectionId connection_id = 9;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder> 
+          getConnectionIdFieldBuilder() {
+        if (connectionIdBuilder_ == null) {
+          connectionIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.ConnectionId, context.ContextOuterClass.ConnectionId.Builder, context.ContextOuterClass.ConnectionIdOrBuilder>(
+                  getConnectionId(),
+                  getParentForChildren(),
+                  isClean());
+          connectionId_ = null;
+        }
+        return connectionIdBuilder_;
+      }
       @java.lang.Override
       public final Builder setUnknownFields(
           final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -2869,27 +3072,27 @@ public final class Monitoring {
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     java.util.List<monitoring.Monitoring.KpiId> 
-        getKpiIdList();
+        getKpiIdsList();
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
-    monitoring.Monitoring.KpiId getKpiId(int index);
+    monitoring.Monitoring.KpiId getKpiIds(int index);
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
-    int getKpiIdCount();
+    int getKpiIdsCount();
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     java.util.List<? extends monitoring.Monitoring.KpiIdOrBuilder> 
-        getKpiIdOrBuilderList();
+        getKpiIdsOrBuilderList();
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
-    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(
+    monitoring.Monitoring.KpiIdOrBuilder getKpiIdsOrBuilder(
         int index);
 
     /**
@@ -2898,18 +3101,12 @@ public final class Monitoring {
      */
     float getMonitoringWindowS();
 
-    /**
-     * <code>float sampling_rate_s = 3;</code>
-     * @return The samplingRateS.
-     */
-    float getSamplingRateS();
-
     /**
      * <pre>
      * used when you want something like "get the last N many samples
      * </pre>
      *
-     * <code>uint32 last_n_samples = 4;</code>
+     * <code>uint32 last_n_samples = 3;</code>
      * @return The lastNSamples.
      */
     int getLastNSamples();
@@ -2919,7 +3116,7 @@ public final class Monitoring {
      * used when you want something like "get the samples since X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp start_timestamp = 5;</code>
+     * <code>.context.Timestamp start_timestamp = 4;</code>
      * @return Whether the startTimestamp field is set.
      */
     boolean hasStartTimestamp();
@@ -2928,7 +3125,7 @@ public final class Monitoring {
      * used when you want something like "get the samples since X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp start_timestamp = 5;</code>
+     * <code>.context.Timestamp start_timestamp = 4;</code>
      * @return The startTimestamp.
      */
     context.ContextOuterClass.Timestamp getStartTimestamp();
@@ -2937,7 +3134,7 @@ public final class Monitoring {
      * used when you want something like "get the samples since X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp start_timestamp = 5;</code>
+     * <code>.context.Timestamp start_timestamp = 4;</code>
      */
     context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder();
 
@@ -2946,7 +3143,7 @@ public final class Monitoring {
      * used when you want something like "get the samples until X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp end_timestamp = 6;</code>
+     * <code>.context.Timestamp end_timestamp = 5;</code>
      * @return Whether the endTimestamp field is set.
      */
     boolean hasEndTimestamp();
@@ -2955,7 +3152,7 @@ public final class Monitoring {
      * used when you want something like "get the samples until X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp end_timestamp = 6;</code>
+     * <code>.context.Timestamp end_timestamp = 5;</code>
      * @return The endTimestamp.
      */
     context.ContextOuterClass.Timestamp getEndTimestamp();
@@ -2964,7 +3161,7 @@ public final class Monitoring {
      * used when you want something like "get the samples until X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp end_timestamp = 6;</code>
+     * <code>.context.Timestamp end_timestamp = 5;</code>
      */
     context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder();
   }
@@ -2981,7 +3178,7 @@ public final class Monitoring {
       super(builder);
     }
     private KpiQuery() {
-      kpiId_ = java.util.Collections.emptyList();
+      kpiIds_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
@@ -3017,10 +3214,10 @@ public final class Monitoring {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                kpiId_ = new java.util.ArrayList<monitoring.Monitoring.KpiId>();
+                kpiIds_ = new java.util.ArrayList<monitoring.Monitoring.KpiId>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              kpiId_.add(
+              kpiIds_.add(
                   input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry));
               break;
             }
@@ -3029,17 +3226,12 @@ public final class Monitoring {
               monitoringWindowS_ = input.readFloat();
               break;
             }
-            case 29: {
-
-              samplingRateS_ = input.readFloat();
-              break;
-            }
-            case 32: {
+            case 24: {
 
               lastNSamples_ = input.readUInt32();
               break;
             }
-            case 42: {
+            case 34: {
               context.ContextOuterClass.Timestamp.Builder subBuilder = null;
               if (startTimestamp_ != null) {
                 subBuilder = startTimestamp_.toBuilder();
@@ -3052,7 +3244,7 @@ public final class Monitoring {
 
               break;
             }
-            case 50: {
+            case 42: {
               context.ContextOuterClass.Timestamp.Builder subBuilder = null;
               if (endTimestamp_ != null) {
                 subBuilder = endTimestamp_.toBuilder();
@@ -3081,7 +3273,7 @@ public final class Monitoring {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          kpiId_ = java.util.Collections.unmodifiableList(kpiId_);
+          kpiIds_ = java.util.Collections.unmodifiableList(kpiIds_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -3100,44 +3292,44 @@ public final class Monitoring {
               monitoring.Monitoring.KpiQuery.class, monitoring.Monitoring.KpiQuery.Builder.class);
     }
 
-    public static final int KPI_ID_FIELD_NUMBER = 1;
-    private java.util.List<monitoring.Monitoring.KpiId> kpiId_;
+    public static final int KPI_IDS_FIELD_NUMBER = 1;
+    private java.util.List<monitoring.Monitoring.KpiId> kpiIds_;
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<monitoring.Monitoring.KpiId> getKpiIdList() {
-      return kpiId_;
+    public java.util.List<monitoring.Monitoring.KpiId> getKpiIdsList() {
+      return kpiIds_;
     }
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     @java.lang.Override
     public java.util.List<? extends monitoring.Monitoring.KpiIdOrBuilder> 
-        getKpiIdOrBuilderList() {
-      return kpiId_;
+        getKpiIdsOrBuilderList() {
+      return kpiIds_;
     }
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     @java.lang.Override
-    public int getKpiIdCount() {
-      return kpiId_.size();
+    public int getKpiIdsCount() {
+      return kpiIds_.size();
     }
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiId getKpiId(int index) {
-      return kpiId_.get(index);
+    public monitoring.Monitoring.KpiId getKpiIds(int index) {
+      return kpiIds_.get(index);
     }
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+     * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(
+    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdsOrBuilder(
         int index) {
-      return kpiId_.get(index);
+      return kpiIds_.get(index);
     }
 
     public static final int MONITORING_WINDOW_S_FIELD_NUMBER = 2;
@@ -3151,25 +3343,14 @@ public final class Monitoring {
       return monitoringWindowS_;
     }
 
-    public static final int SAMPLING_RATE_S_FIELD_NUMBER = 3;
-    private float samplingRateS_;
-    /**
-     * <code>float sampling_rate_s = 3;</code>
-     * @return The samplingRateS.
-     */
-    @java.lang.Override
-    public float getSamplingRateS() {
-      return samplingRateS_;
-    }
-
-    public static final int LAST_N_SAMPLES_FIELD_NUMBER = 4;
+    public static final int LAST_N_SAMPLES_FIELD_NUMBER = 3;
     private int lastNSamples_;
     /**
      * <pre>
      * used when you want something like "get the last N many samples
      * </pre>
      *
-     * <code>uint32 last_n_samples = 4;</code>
+     * <code>uint32 last_n_samples = 3;</code>
      * @return The lastNSamples.
      */
     @java.lang.Override
@@ -3177,14 +3358,14 @@ public final class Monitoring {
       return lastNSamples_;
     }
 
-    public static final int START_TIMESTAMP_FIELD_NUMBER = 5;
+    public static final int START_TIMESTAMP_FIELD_NUMBER = 4;
     private context.ContextOuterClass.Timestamp startTimestamp_;
     /**
      * <pre>
      * used when you want something like "get the samples since X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp start_timestamp = 5;</code>
+     * <code>.context.Timestamp start_timestamp = 4;</code>
      * @return Whether the startTimestamp field is set.
      */
     @java.lang.Override
@@ -3196,7 +3377,7 @@ public final class Monitoring {
      * used when you want something like "get the samples since X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp start_timestamp = 5;</code>
+     * <code>.context.Timestamp start_timestamp = 4;</code>
      * @return The startTimestamp.
      */
     @java.lang.Override
@@ -3208,21 +3389,21 @@ public final class Monitoring {
      * used when you want something like "get the samples since X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp start_timestamp = 5;</code>
+     * <code>.context.Timestamp start_timestamp = 4;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder() {
       return getStartTimestamp();
     }
 
-    public static final int END_TIMESTAMP_FIELD_NUMBER = 6;
+    public static final int END_TIMESTAMP_FIELD_NUMBER = 5;
     private context.ContextOuterClass.Timestamp endTimestamp_;
     /**
      * <pre>
      * used when you want something like "get the samples until X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp end_timestamp = 6;</code>
+     * <code>.context.Timestamp end_timestamp = 5;</code>
      * @return Whether the endTimestamp field is set.
      */
     @java.lang.Override
@@ -3234,7 +3415,7 @@ public final class Monitoring {
      * used when you want something like "get the samples until X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp end_timestamp = 6;</code>
+     * <code>.context.Timestamp end_timestamp = 5;</code>
      * @return The endTimestamp.
      */
     @java.lang.Override
@@ -3246,7 +3427,7 @@ public final class Monitoring {
      * used when you want something like "get the samples until X date/time"
      * </pre>
      *
-     * <code>.context.Timestamp end_timestamp = 6;</code>
+     * <code>.context.Timestamp end_timestamp = 5;</code>
      */
     @java.lang.Override
     public context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder() {
@@ -3267,23 +3448,20 @@ public final class Monitoring {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < kpiId_.size(); i++) {
-        output.writeMessage(1, kpiId_.get(i));
+      for (int i = 0; i < kpiIds_.size(); i++) {
+        output.writeMessage(1, kpiIds_.get(i));
       }
       if (monitoringWindowS_ != 0F) {
         output.writeFloat(2, monitoringWindowS_);
       }
-      if (samplingRateS_ != 0F) {
-        output.writeFloat(3, samplingRateS_);
-      }
       if (lastNSamples_ != 0) {
-        output.writeUInt32(4, lastNSamples_);
+        output.writeUInt32(3, lastNSamples_);
       }
       if (startTimestamp_ != null) {
-        output.writeMessage(5, getStartTimestamp());
+        output.writeMessage(4, getStartTimestamp());
       }
       if (endTimestamp_ != null) {
-        output.writeMessage(6, getEndTimestamp());
+        output.writeMessage(5, getEndTimestamp());
       }
       unknownFields.writeTo(output);
     }
@@ -3294,29 +3472,25 @@ public final class Monitoring {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < kpiId_.size(); i++) {
+      for (int i = 0; i < kpiIds_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, kpiId_.get(i));
+          .computeMessageSize(1, kpiIds_.get(i));
       }
       if (monitoringWindowS_ != 0F) {
         size += com.google.protobuf.CodedOutputStream
           .computeFloatSize(2, monitoringWindowS_);
       }
-      if (samplingRateS_ != 0F) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeFloatSize(3, samplingRateS_);
-      }
       if (lastNSamples_ != 0) {
         size += com.google.protobuf.CodedOutputStream
-          .computeUInt32Size(4, lastNSamples_);
+          .computeUInt32Size(3, lastNSamples_);
       }
       if (startTimestamp_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, getStartTimestamp());
+          .computeMessageSize(4, getStartTimestamp());
       }
       if (endTimestamp_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(6, getEndTimestamp());
+          .computeMessageSize(5, getEndTimestamp());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -3333,14 +3507,11 @@ public final class Monitoring {
       }
       monitoring.Monitoring.KpiQuery other = (monitoring.Monitoring.KpiQuery) obj;
 
-      if (!getKpiIdList()
-          .equals(other.getKpiIdList())) return false;
+      if (!getKpiIdsList()
+          .equals(other.getKpiIdsList())) return false;
       if (java.lang.Float.floatToIntBits(getMonitoringWindowS())
           != java.lang.Float.floatToIntBits(
               other.getMonitoringWindowS())) return false;
-      if (java.lang.Float.floatToIntBits(getSamplingRateS())
-          != java.lang.Float.floatToIntBits(
-              other.getSamplingRateS())) return false;
       if (getLastNSamples()
           != other.getLastNSamples()) return false;
       if (hasStartTimestamp() != other.hasStartTimestamp()) return false;
@@ -3364,16 +3535,13 @@ public final class Monitoring {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getKpiIdCount() > 0) {
-        hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getKpiIdList().hashCode();
+      if (getKpiIdsCount() > 0) {
+        hash = (37 * hash) + KPI_IDS_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiIdsList().hashCode();
       }
       hash = (37 * hash) + MONITORING_WINDOW_S_FIELD_NUMBER;
       hash = (53 * hash) + java.lang.Float.floatToIntBits(
           getMonitoringWindowS());
-      hash = (37 * hash) + SAMPLING_RATE_S_FIELD_NUMBER;
-      hash = (53 * hash) + java.lang.Float.floatToIntBits(
-          getSamplingRateS());
       hash = (37 * hash) + LAST_N_SAMPLES_FIELD_NUMBER;
       hash = (53 * hash) + getLastNSamples();
       if (hasStartTimestamp()) {
@@ -3512,22 +3680,20 @@ public final class Monitoring {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getKpiIdFieldBuilder();
+          getKpiIdsFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (kpiIdBuilder_ == null) {
-          kpiId_ = java.util.Collections.emptyList();
+        if (kpiIdsBuilder_ == null) {
+          kpiIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          kpiIdBuilder_.clear();
+          kpiIdsBuilder_.clear();
         }
         monitoringWindowS_ = 0F;
 
-        samplingRateS_ = 0F;
-
         lastNSamples_ = 0;
 
         if (startTimestampBuilder_ == null) {
@@ -3569,17 +3735,16 @@ public final class Monitoring {
       public monitoring.Monitoring.KpiQuery buildPartial() {
         monitoring.Monitoring.KpiQuery result = new monitoring.Monitoring.KpiQuery(this);
         int from_bitField0_ = bitField0_;
-        if (kpiIdBuilder_ == null) {
+        if (kpiIdsBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            kpiId_ = java.util.Collections.unmodifiableList(kpiId_);
+            kpiIds_ = java.util.Collections.unmodifiableList(kpiIds_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.kpiId_ = kpiId_;
+          result.kpiIds_ = kpiIds_;
         } else {
-          result.kpiId_ = kpiIdBuilder_.build();
+          result.kpiIds_ = kpiIdsBuilder_.build();
         }
         result.monitoringWindowS_ = monitoringWindowS_;
-        result.samplingRateS_ = samplingRateS_;
         result.lastNSamples_ = lastNSamples_;
         if (startTimestampBuilder_ == null) {
           result.startTimestamp_ = startTimestamp_;
@@ -3639,38 +3804,35 @@ public final class Monitoring {
 
       public Builder mergeFrom(monitoring.Monitoring.KpiQuery other) {
         if (other == monitoring.Monitoring.KpiQuery.getDefaultInstance()) return this;
-        if (kpiIdBuilder_ == null) {
-          if (!other.kpiId_.isEmpty()) {
-            if (kpiId_.isEmpty()) {
-              kpiId_ = other.kpiId_;
+        if (kpiIdsBuilder_ == null) {
+          if (!other.kpiIds_.isEmpty()) {
+            if (kpiIds_.isEmpty()) {
+              kpiIds_ = other.kpiIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureKpiIdIsMutable();
-              kpiId_.addAll(other.kpiId_);
+              ensureKpiIdsIsMutable();
+              kpiIds_.addAll(other.kpiIds_);
             }
             onChanged();
           }
         } else {
-          if (!other.kpiId_.isEmpty()) {
-            if (kpiIdBuilder_.isEmpty()) {
-              kpiIdBuilder_.dispose();
-              kpiIdBuilder_ = null;
-              kpiId_ = other.kpiId_;
+          if (!other.kpiIds_.isEmpty()) {
+            if (kpiIdsBuilder_.isEmpty()) {
+              kpiIdsBuilder_.dispose();
+              kpiIdsBuilder_ = null;
+              kpiIds_ = other.kpiIds_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              kpiIdBuilder_ = 
+              kpiIdsBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getKpiIdFieldBuilder() : null;
+                   getKpiIdsFieldBuilder() : null;
             } else {
-              kpiIdBuilder_.addAllMessages(other.kpiId_);
+              kpiIdsBuilder_.addAllMessages(other.kpiIds_);
             }
           }
         }
         if (other.getMonitoringWindowS() != 0F) {
           setMonitoringWindowS(other.getMonitoringWindowS());
         }
-        if (other.getSamplingRateS() != 0F) {
-          setSamplingRateS(other.getSamplingRateS());
-        }
         if (other.getLastNSamples() != 0) {
           setLastNSamples(other.getLastNSamples());
         }
@@ -3710,244 +3872,244 @@ public final class Monitoring {
       }
       private int bitField0_;
 
-      private java.util.List<monitoring.Monitoring.KpiId> kpiId_ =
+      private java.util.List<monitoring.Monitoring.KpiId> kpiIds_ =
         java.util.Collections.emptyList();
-      private void ensureKpiIdIsMutable() {
+      private void ensureKpiIdsIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          kpiId_ = new java.util.ArrayList<monitoring.Monitoring.KpiId>(kpiId_);
+          kpiIds_ = new java.util.ArrayList<monitoring.Monitoring.KpiId>(kpiIds_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdBuilder_;
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdsBuilder_;
 
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public java.util.List<monitoring.Monitoring.KpiId> getKpiIdList() {
-        if (kpiIdBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(kpiId_);
+      public java.util.List<monitoring.Monitoring.KpiId> getKpiIdsList() {
+        if (kpiIdsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(kpiIds_);
         } else {
-          return kpiIdBuilder_.getMessageList();
+          return kpiIdsBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public int getKpiIdCount() {
-        if (kpiIdBuilder_ == null) {
-          return kpiId_.size();
+      public int getKpiIdsCount() {
+        if (kpiIdsBuilder_ == null) {
+          return kpiIds_.size();
         } else {
-          return kpiIdBuilder_.getCount();
+          return kpiIdsBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public monitoring.Monitoring.KpiId getKpiId(int index) {
-        if (kpiIdBuilder_ == null) {
-          return kpiId_.get(index);
+      public monitoring.Monitoring.KpiId getKpiIds(int index) {
+        if (kpiIdsBuilder_ == null) {
+          return kpiIds_.get(index);
         } else {
-          return kpiIdBuilder_.getMessage(index);
+          return kpiIdsBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder setKpiId(
+      public Builder setKpiIds(
           int index, monitoring.Monitoring.KpiId value) {
-        if (kpiIdBuilder_ == null) {
+        if (kpiIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiIdIsMutable();
-          kpiId_.set(index, value);
+          ensureKpiIdsIsMutable();
+          kpiIds_.set(index, value);
           onChanged();
         } else {
-          kpiIdBuilder_.setMessage(index, value);
+          kpiIdsBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder setKpiId(
+      public Builder setKpiIds(
           int index, monitoring.Monitoring.KpiId.Builder builderForValue) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.set(index, builderForValue.build());
+        if (kpiIdsBuilder_ == null) {
+          ensureKpiIdsIsMutable();
+          kpiIds_.set(index, builderForValue.build());
           onChanged();
         } else {
-          kpiIdBuilder_.setMessage(index, builderForValue.build());
+          kpiIdsBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder addKpiId(monitoring.Monitoring.KpiId value) {
-        if (kpiIdBuilder_ == null) {
+      public Builder addKpiIds(monitoring.Monitoring.KpiId value) {
+        if (kpiIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiIdIsMutable();
-          kpiId_.add(value);
+          ensureKpiIdsIsMutable();
+          kpiIds_.add(value);
           onChanged();
         } else {
-          kpiIdBuilder_.addMessage(value);
+          kpiIdsBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder addKpiId(
+      public Builder addKpiIds(
           int index, monitoring.Monitoring.KpiId value) {
-        if (kpiIdBuilder_ == null) {
+        if (kpiIdsBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiIdIsMutable();
-          kpiId_.add(index, value);
+          ensureKpiIdsIsMutable();
+          kpiIds_.add(index, value);
           onChanged();
         } else {
-          kpiIdBuilder_.addMessage(index, value);
+          kpiIdsBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder addKpiId(
+      public Builder addKpiIds(
           monitoring.Monitoring.KpiId.Builder builderForValue) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.add(builderForValue.build());
+        if (kpiIdsBuilder_ == null) {
+          ensureKpiIdsIsMutable();
+          kpiIds_.add(builderForValue.build());
           onChanged();
         } else {
-          kpiIdBuilder_.addMessage(builderForValue.build());
+          kpiIdsBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder addKpiId(
+      public Builder addKpiIds(
           int index, monitoring.Monitoring.KpiId.Builder builderForValue) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.add(index, builderForValue.build());
+        if (kpiIdsBuilder_ == null) {
+          ensureKpiIdsIsMutable();
+          kpiIds_.add(index, builderForValue.build());
           onChanged();
         } else {
-          kpiIdBuilder_.addMessage(index, builderForValue.build());
+          kpiIdsBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder addAllKpiId(
+      public Builder addAllKpiIds(
           java.lang.Iterable<? extends monitoring.Monitoring.KpiId> values) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
+        if (kpiIdsBuilder_ == null) {
+          ensureKpiIdsIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, kpiId_);
+              values, kpiIds_);
           onChanged();
         } else {
-          kpiIdBuilder_.addAllMessages(values);
+          kpiIdsBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder clearKpiId() {
-        if (kpiIdBuilder_ == null) {
-          kpiId_ = java.util.Collections.emptyList();
+      public Builder clearKpiIds() {
+        if (kpiIdsBuilder_ == null) {
+          kpiIds_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          kpiIdBuilder_.clear();
+          kpiIdsBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public Builder removeKpiId(int index) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.remove(index);
+      public Builder removeKpiIds(int index) {
+        if (kpiIdsBuilder_ == null) {
+          ensureKpiIdsIsMutable();
+          kpiIds_.remove(index);
           onChanged();
         } else {
-          kpiIdBuilder_.remove(index);
+          kpiIdsBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder(
+      public monitoring.Monitoring.KpiId.Builder getKpiIdsBuilder(
           int index) {
-        return getKpiIdFieldBuilder().getBuilder(index);
+        return getKpiIdsFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(
+      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdsOrBuilder(
           int index) {
-        if (kpiIdBuilder_ == null) {
-          return kpiId_.get(index);  } else {
-          return kpiIdBuilder_.getMessageOrBuilder(index);
+        if (kpiIdsBuilder_ == null) {
+          return kpiIds_.get(index);  } else {
+          return kpiIdsBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
       public java.util.List<? extends monitoring.Monitoring.KpiIdOrBuilder> 
-           getKpiIdOrBuilderList() {
-        if (kpiIdBuilder_ != null) {
-          return kpiIdBuilder_.getMessageOrBuilderList();
+           getKpiIdsOrBuilderList() {
+        if (kpiIdsBuilder_ != null) {
+          return kpiIdsBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(kpiId_);
+          return java.util.Collections.unmodifiableList(kpiIds_);
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public monitoring.Monitoring.KpiId.Builder addKpiIdBuilder() {
-        return getKpiIdFieldBuilder().addBuilder(
+      public monitoring.Monitoring.KpiId.Builder addKpiIdsBuilder() {
+        return getKpiIdsFieldBuilder().addBuilder(
             monitoring.Monitoring.KpiId.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
-      public monitoring.Monitoring.KpiId.Builder addKpiIdBuilder(
+      public monitoring.Monitoring.KpiId.Builder addKpiIdsBuilder(
           int index) {
-        return getKpiIdFieldBuilder().addBuilder(
+        return getKpiIdsFieldBuilder().addBuilder(
             index, monitoring.Monitoring.KpiId.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 1;</code>
+       * <code>repeated .monitoring.KpiId kpi_ids = 1;</code>
        */
       public java.util.List<monitoring.Monitoring.KpiId.Builder> 
-           getKpiIdBuilderList() {
-        return getKpiIdFieldBuilder().getBuilderList();
+           getKpiIdsBuilderList() {
+        return getKpiIdsFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
           monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> 
-          getKpiIdFieldBuilder() {
-        if (kpiIdBuilder_ == null) {
-          kpiIdBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+          getKpiIdsFieldBuilder() {
+        if (kpiIdsBuilder_ == null) {
+          kpiIdsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
               monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder>(
-                  kpiId_,
+                  kpiIds_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          kpiId_ = null;
+          kpiIds_ = null;
         }
-        return kpiIdBuilder_;
+        return kpiIdsBuilder_;
       }
 
       private float monitoringWindowS_ ;
@@ -3981,44 +4143,13 @@ public final class Monitoring {
         return this;
       }
 
-      private float samplingRateS_ ;
-      /**
-       * <code>float sampling_rate_s = 3;</code>
-       * @return The samplingRateS.
-       */
-      @java.lang.Override
-      public float getSamplingRateS() {
-        return samplingRateS_;
-      }
-      /**
-       * <code>float sampling_rate_s = 3;</code>
-       * @param value The samplingRateS to set.
-       * @return This builder for chaining.
-       */
-      public Builder setSamplingRateS(float value) {
-        
-        samplingRateS_ = value;
-        onChanged();
-        return this;
-      }
-      /**
-       * <code>float sampling_rate_s = 3;</code>
-       * @return This builder for chaining.
-       */
-      public Builder clearSamplingRateS() {
-        
-        samplingRateS_ = 0F;
-        onChanged();
-        return this;
-      }
-
       private int lastNSamples_ ;
       /**
        * <pre>
        * used when you want something like "get the last N many samples
        * </pre>
        *
-       * <code>uint32 last_n_samples = 4;</code>
+       * <code>uint32 last_n_samples = 3;</code>
        * @return The lastNSamples.
        */
       @java.lang.Override
@@ -4030,7 +4161,7 @@ public final class Monitoring {
        * used when you want something like "get the last N many samples
        * </pre>
        *
-       * <code>uint32 last_n_samples = 4;</code>
+       * <code>uint32 last_n_samples = 3;</code>
        * @param value The lastNSamples to set.
        * @return This builder for chaining.
        */
@@ -4045,7 +4176,7 @@ public final class Monitoring {
        * used when you want something like "get the last N many samples
        * </pre>
        *
-       * <code>uint32 last_n_samples = 4;</code>
+       * <code>uint32 last_n_samples = 3;</code>
        * @return This builder for chaining.
        */
       public Builder clearLastNSamples() {
@@ -4063,7 +4194,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        * @return Whether the startTimestamp field is set.
        */
       public boolean hasStartTimestamp() {
@@ -4074,7 +4205,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        * @return The startTimestamp.
        */
       public context.ContextOuterClass.Timestamp getStartTimestamp() {
@@ -4089,7 +4220,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       public Builder setStartTimestamp(context.ContextOuterClass.Timestamp value) {
         if (startTimestampBuilder_ == null) {
@@ -4109,7 +4240,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       public Builder setStartTimestamp(
           context.ContextOuterClass.Timestamp.Builder builderForValue) {
@@ -4127,7 +4258,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       public Builder mergeStartTimestamp(context.ContextOuterClass.Timestamp value) {
         if (startTimestampBuilder_ == null) {
@@ -4149,7 +4280,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       public Builder clearStartTimestamp() {
         if (startTimestampBuilder_ == null) {
@@ -4167,7 +4298,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       public context.ContextOuterClass.Timestamp.Builder getStartTimestampBuilder() {
         
@@ -4179,7 +4310,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       public context.ContextOuterClass.TimestampOrBuilder getStartTimestampOrBuilder() {
         if (startTimestampBuilder_ != null) {
@@ -4194,7 +4325,7 @@ public final class Monitoring {
        * used when you want something like "get the samples since X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp start_timestamp = 5;</code>
+       * <code>.context.Timestamp start_timestamp = 4;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
@@ -4218,7 +4349,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        * @return Whether the endTimestamp field is set.
        */
       public boolean hasEndTimestamp() {
@@ -4229,7 +4360,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        * @return The endTimestamp.
        */
       public context.ContextOuterClass.Timestamp getEndTimestamp() {
@@ -4244,7 +4375,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       public Builder setEndTimestamp(context.ContextOuterClass.Timestamp value) {
         if (endTimestampBuilder_ == null) {
@@ -4264,7 +4395,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       public Builder setEndTimestamp(
           context.ContextOuterClass.Timestamp.Builder builderForValue) {
@@ -4282,7 +4413,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       public Builder mergeEndTimestamp(context.ContextOuterClass.Timestamp value) {
         if (endTimestampBuilder_ == null) {
@@ -4304,7 +4435,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       public Builder clearEndTimestamp() {
         if (endTimestampBuilder_ == null) {
@@ -4322,7 +4453,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       public context.ContextOuterClass.Timestamp.Builder getEndTimestampBuilder() {
         
@@ -4334,7 +4465,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       public context.ContextOuterClass.TimestampOrBuilder getEndTimestampOrBuilder() {
         if (endTimestampBuilder_ != null) {
@@ -4349,7 +4480,7 @@ public final class Monitoring {
        * used when you want something like "get the samples until X date/time"
        * </pre>
        *
-       * <code>.context.Timestamp end_timestamp = 6;</code>
+       * <code>.context.Timestamp end_timestamp = 5;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
@@ -4417,22 +4548,2659 @@ public final class Monitoring {
 
   }
 
-  public interface KpiIdOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+  public interface RawKpiOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.RawKpi)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.context.Uuid kpi_id = 1;</code>
-     * @return Whether the kpiId field is set.
+     * <code>.context.Timestamp timestamp = 1;</code>
+     * @return Whether the timestamp field is set.
      */
-    boolean hasKpiId();
+    boolean hasTimestamp();
     /**
-     * <code>.context.Uuid kpi_id = 1;</code>
-     * @return The kpiId.
+     * <code>.context.Timestamp timestamp = 1;</code>
+     * @return The timestamp.
      */
-    context.ContextOuterClass.Uuid getKpiId();
+    context.ContextOuterClass.Timestamp getTimestamp();
     /**
-     * <code>.context.Uuid kpi_id = 1;</code>
+     * <code>.context.Timestamp timestamp = 1;</code>
+     */
+    context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder();
+
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 2;</code>
+     * @return Whether the kpiValue field is set.
+     */
+    boolean hasKpiValue();
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 2;</code>
+     * @return The kpiValue.
+     */
+    monitoring.Monitoring.KpiValue getKpiValue();
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 2;</code>
+     */
+    monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder();
+  }
+  /**
+   * <pre>
+   * cell
+   * </pre>
+   *
+   * Protobuf type {@code monitoring.RawKpi}
+   */
+  public static final class RawKpi extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.RawKpi)
+      RawKpiOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use RawKpi.newBuilder() to construct.
+    private RawKpi(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private RawKpi() {
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new RawKpi();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private RawKpi(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              context.ContextOuterClass.Timestamp.Builder subBuilder = null;
+              if (timestamp_ != null) {
+                subBuilder = timestamp_.toBuilder();
+              }
+              timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(timestamp_);
+                timestamp_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              monitoring.Monitoring.KpiValue.Builder subBuilder = null;
+              if (kpiValue_ != null) {
+                subBuilder = kpiValue_.toBuilder();
+              }
+              kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiValue_);
+                kpiValue_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_RawKpi_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.RawKpi.class, monitoring.Monitoring.RawKpi.Builder.class);
+    }
+
+    public static final int TIMESTAMP_FIELD_NUMBER = 1;
+    private context.ContextOuterClass.Timestamp timestamp_;
+    /**
+     * <code>.context.Timestamp timestamp = 1;</code>
+     * @return Whether the timestamp field is set.
+     */
+    @java.lang.Override
+    public boolean hasTimestamp() {
+      return timestamp_ != null;
+    }
+    /**
+     * <code>.context.Timestamp timestamp = 1;</code>
+     * @return The timestamp.
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.Timestamp getTimestamp() {
+      return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+    }
+    /**
+     * <code>.context.Timestamp timestamp = 1;</code>
+     */
+    @java.lang.Override
+    public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
+      return getTimestamp();
+    }
+
+    public static final int KPI_VALUE_FIELD_NUMBER = 2;
+    private monitoring.Monitoring.KpiValue kpiValue_;
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 2;</code>
+     * @return Whether the kpiValue field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiValue() {
+      return kpiValue_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 2;</code>
+     * @return The kpiValue.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiValue getKpiValue() {
+      return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+    }
+    /**
+     * <code>.monitoring.KpiValue kpi_value = 2;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
+      return getKpiValue();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (timestamp_ != null) {
+        output.writeMessage(1, getTimestamp());
+      }
+      if (kpiValue_ != null) {
+        output.writeMessage(2, getKpiValue());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (timestamp_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getTimestamp());
+      }
+      if (kpiValue_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getKpiValue());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.RawKpi)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.RawKpi other = (monitoring.Monitoring.RawKpi) obj;
+
+      if (hasTimestamp() != other.hasTimestamp()) return false;
+      if (hasTimestamp()) {
+        if (!getTimestamp()
+            .equals(other.getTimestamp())) return false;
+      }
+      if (hasKpiValue() != other.hasKpiValue()) return false;
+      if (hasKpiValue()) {
+        if (!getKpiValue()
+            .equals(other.getKpiValue())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasTimestamp()) {
+        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
+        hash = (53 * hash) + getTimestamp().hashCode();
+      }
+      if (hasKpiValue()) {
+        hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiValue().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpi parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpi parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpi parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.RawKpi prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * cell
+     * </pre>
+     *
+     * Protobuf type {@code monitoring.RawKpi}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.RawKpi)
+        monitoring.Monitoring.RawKpiOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpi_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.RawKpi.class, monitoring.Monitoring.RawKpi.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.RawKpi.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (timestampBuilder_ == null) {
+          timestamp_ = null;
+        } else {
+          timestamp_ = null;
+          timestampBuilder_ = null;
+        }
+        if (kpiValueBuilder_ == null) {
+          kpiValue_ = null;
+        } else {
+          kpiValue_ = null;
+          kpiValueBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpi_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpi getDefaultInstanceForType() {
+        return monitoring.Monitoring.RawKpi.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpi build() {
+        monitoring.Monitoring.RawKpi result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpi buildPartial() {
+        monitoring.Monitoring.RawKpi result = new monitoring.Monitoring.RawKpi(this);
+        if (timestampBuilder_ == null) {
+          result.timestamp_ = timestamp_;
+        } else {
+          result.timestamp_ = timestampBuilder_.build();
+        }
+        if (kpiValueBuilder_ == null) {
+          result.kpiValue_ = kpiValue_;
+        } else {
+          result.kpiValue_ = kpiValueBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.RawKpi) {
+          return mergeFrom((monitoring.Monitoring.RawKpi)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.RawKpi other) {
+        if (other == monitoring.Monitoring.RawKpi.getDefaultInstance()) return this;
+        if (other.hasTimestamp()) {
+          mergeTimestamp(other.getTimestamp());
+        }
+        if (other.hasKpiValue()) {
+          mergeKpiValue(other.getKpiValue());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.RawKpi parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.RawKpi) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private context.ContextOuterClass.Timestamp timestamp_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> timestampBuilder_;
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       * @return Whether the timestamp field is set.
+       */
+      public boolean hasTimestamp() {
+        return timestampBuilder_ != null || timestamp_ != null;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       * @return The timestamp.
+       */
+      public context.ContextOuterClass.Timestamp getTimestamp() {
+        if (timestampBuilder_ == null) {
+          return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+        } else {
+          return timestampBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      public Builder setTimestamp(context.ContextOuterClass.Timestamp value) {
+        if (timestampBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          timestamp_ = value;
+          onChanged();
+        } else {
+          timestampBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      public Builder setTimestamp(
+          context.ContextOuterClass.Timestamp.Builder builderForValue) {
+        if (timestampBuilder_ == null) {
+          timestamp_ = builderForValue.build();
+          onChanged();
+        } else {
+          timestampBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
+        if (timestampBuilder_ == null) {
+          if (timestamp_ != null) {
+            timestamp_ =
+              context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
+          } else {
+            timestamp_ = value;
+          }
+          onChanged();
+        } else {
+          timestampBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      public Builder clearTimestamp() {
+        if (timestampBuilder_ == null) {
+          timestamp_ = null;
+          onChanged();
+        } else {
+          timestamp_ = null;
+          timestampBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
+        
+        onChanged();
+        return getTimestampFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
+        if (timestampBuilder_ != null) {
+          return timestampBuilder_.getMessageOrBuilder();
+        } else {
+          return timestamp_ == null ?
+              context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+        }
+      }
+      /**
+       * <code>.context.Timestamp timestamp = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
+          getTimestampFieldBuilder() {
+        if (timestampBuilder_ == null) {
+          timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder>(
+                  getTimestamp(),
+                  getParentForChildren(),
+                  isClean());
+          timestamp_ = null;
+        }
+        return timestampBuilder_;
+      }
+
+      private monitoring.Monitoring.KpiValue kpiValue_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder> kpiValueBuilder_;
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       * @return Whether the kpiValue field is set.
+       */
+      public boolean hasKpiValue() {
+        return kpiValueBuilder_ != null || kpiValue_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       * @return The kpiValue.
+       */
+      public monitoring.Monitoring.KpiValue getKpiValue() {
+        if (kpiValueBuilder_ == null) {
+          return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+        } else {
+          return kpiValueBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      public Builder setKpiValue(monitoring.Monitoring.KpiValue value) {
+        if (kpiValueBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiValue_ = value;
+          onChanged();
+        } else {
+          kpiValueBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      public Builder setKpiValue(
+          monitoring.Monitoring.KpiValue.Builder builderForValue) {
+        if (kpiValueBuilder_ == null) {
+          kpiValue_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiValueBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
+        if (kpiValueBuilder_ == null) {
+          if (kpiValue_ != null) {
+            kpiValue_ =
+              monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
+          } else {
+            kpiValue_ = value;
+          }
+          onChanged();
+        } else {
+          kpiValueBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      public Builder clearKpiValue() {
+        if (kpiValueBuilder_ == null) {
+          kpiValue_ = null;
+          onChanged();
+        } else {
+          kpiValue_ = null;
+          kpiValueBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
+        
+        onChanged();
+        return getKpiValueFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
+        if (kpiValueBuilder_ != null) {
+          return kpiValueBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiValue_ == null ?
+              monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiValue kpi_value = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder> 
+          getKpiValueFieldBuilder() {
+        if (kpiValueBuilder_ == null) {
+          kpiValueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder>(
+                  getKpiValue(),
+                  getParentForChildren(),
+                  isClean());
+          kpiValue_ = null;
+        }
+        return kpiValueBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.RawKpi)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.RawKpi)
+    private static final monitoring.Monitoring.RawKpi DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.RawKpi();
+    }
+
+    public static monitoring.Monitoring.RawKpi getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<RawKpi>
+        PARSER = new com.google.protobuf.AbstractParser<RawKpi>() {
+      @java.lang.Override
+      public RawKpi parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new RawKpi(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<RawKpi> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<RawKpi> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpi getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface RawKpiListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.RawKpiList)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    boolean hasKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    monitoring.Monitoring.KpiId getKpiId();
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder();
+
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    java.util.List<monitoring.Monitoring.RawKpi> 
+        getRawKpisList();
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    monitoring.Monitoring.RawKpi getRawKpis(int index);
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    int getRawKpisCount();
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    java.util.List<? extends monitoring.Monitoring.RawKpiOrBuilder> 
+        getRawKpisOrBuilderList();
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    monitoring.Monitoring.RawKpiOrBuilder getRawKpisOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * column
+   * </pre>
+   *
+   * Protobuf type {@code monitoring.RawKpiList}
+   */
+  public static final class RawKpiList extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.RawKpiList)
+      RawKpiListOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use RawKpiList.newBuilder() to construct.
+    private RawKpiList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private RawKpiList() {
+      rawKpis_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new RawKpiList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private RawKpiList(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              monitoring.Monitoring.KpiId.Builder subBuilder = null;
+              if (kpiId_ != null) {
+                subBuilder = kpiId_.toBuilder();
+              }
+              kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiId_);
+                kpiId_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 18: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                rawKpis_ = new java.util.ArrayList<monitoring.Monitoring.RawKpi>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              rawKpis_.add(
+                  input.readMessage(monitoring.Monitoring.RawKpi.parser(), extensionRegistry));
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          rawKpis_ = java.util.Collections.unmodifiableList(rawKpis_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_RawKpiList_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.RawKpiList.class, monitoring.Monitoring.RawKpiList.Builder.class);
+    }
+
+    public static final int KPI_ID_FIELD_NUMBER = 1;
+    private monitoring.Monitoring.KpiId kpiId_;
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    @java.lang.Override
+    public boolean hasKpiId() {
+      return kpiId_ != null;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiId getKpiId() {
+      return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+    }
+    /**
+     * <code>.monitoring.KpiId kpi_id = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+      return getKpiId();
+    }
+
+    public static final int RAW_KPIS_FIELD_NUMBER = 2;
+    private java.util.List<monitoring.Monitoring.RawKpi> rawKpis_;
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    @java.lang.Override
+    public java.util.List<monitoring.Monitoring.RawKpi> getRawKpisList() {
+      return rawKpis_;
+    }
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends monitoring.Monitoring.RawKpiOrBuilder> 
+        getRawKpisOrBuilderList() {
+      return rawKpis_;
+    }
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    @java.lang.Override
+    public int getRawKpisCount() {
+      return rawKpis_.size();
+    }
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpi getRawKpis(int index) {
+      return rawKpis_.get(index);
+    }
+    /**
+     * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpiOrBuilder getRawKpisOrBuilder(
+        int index) {
+      return rawKpis_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (kpiId_ != null) {
+        output.writeMessage(1, getKpiId());
+      }
+      for (int i = 0; i < rawKpis_.size(); i++) {
+        output.writeMessage(2, rawKpis_.get(i));
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (kpiId_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, getKpiId());
+      }
+      for (int i = 0; i < rawKpis_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, rawKpis_.get(i));
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.RawKpiList)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.RawKpiList other = (monitoring.Monitoring.RawKpiList) obj;
+
+      if (hasKpiId() != other.hasKpiId()) return false;
+      if (hasKpiId()) {
+        if (!getKpiId()
+            .equals(other.getKpiId())) return false;
+      }
+      if (!getRawKpisList()
+          .equals(other.getRawKpisList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (hasKpiId()) {
+        hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiId().hashCode();
+      }
+      if (getRawKpisCount() > 0) {
+        hash = (37 * hash) + RAW_KPIS_FIELD_NUMBER;
+        hash = (53 * hash) + getRawKpisList().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiList parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpiList parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpiList parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.RawKpiList prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * column
+     * </pre>
+     *
+     * Protobuf type {@code monitoring.RawKpiList}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.RawKpiList)
+        monitoring.Monitoring.RawKpiListOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpiList_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.RawKpiList.class, monitoring.Monitoring.RawKpiList.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.RawKpiList.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getRawKpisFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+        if (rawKpisBuilder_ == null) {
+          rawKpis_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          rawKpisBuilder_.clear();
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpiList_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpiList getDefaultInstanceForType() {
+        return monitoring.Monitoring.RawKpiList.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpiList build() {
+        monitoring.Monitoring.RawKpiList result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpiList buildPartial() {
+        monitoring.Monitoring.RawKpiList result = new monitoring.Monitoring.RawKpiList(this);
+        int from_bitField0_ = bitField0_;
+        if (kpiIdBuilder_ == null) {
+          result.kpiId_ = kpiId_;
+        } else {
+          result.kpiId_ = kpiIdBuilder_.build();
+        }
+        if (rawKpisBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            rawKpis_ = java.util.Collections.unmodifiableList(rawKpis_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.rawKpis_ = rawKpis_;
+        } else {
+          result.rawKpis_ = rawKpisBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.RawKpiList) {
+          return mergeFrom((monitoring.Monitoring.RawKpiList)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.RawKpiList other) {
+        if (other == monitoring.Monitoring.RawKpiList.getDefaultInstance()) return this;
+        if (other.hasKpiId()) {
+          mergeKpiId(other.getKpiId());
+        }
+        if (rawKpisBuilder_ == null) {
+          if (!other.rawKpis_.isEmpty()) {
+            if (rawKpis_.isEmpty()) {
+              rawKpis_ = other.rawKpis_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureRawKpisIsMutable();
+              rawKpis_.addAll(other.rawKpis_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.rawKpis_.isEmpty()) {
+            if (rawKpisBuilder_.isEmpty()) {
+              rawKpisBuilder_.dispose();
+              rawKpisBuilder_ = null;
+              rawKpis_ = other.rawKpis_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              rawKpisBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getRawKpisFieldBuilder() : null;
+            } else {
+              rawKpisBuilder_.addAllMessages(other.rawKpis_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.RawKpiList parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.RawKpiList) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private monitoring.Monitoring.KpiId kpiId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdBuilder_;
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return Whether the kpiId field is set.
+       */
+      public boolean hasKpiId() {
+        return kpiIdBuilder_ != null || kpiId_ != null;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       * @return The kpiId.
+       */
+      public monitoring.Monitoring.KpiId getKpiId() {
+        if (kpiIdBuilder_ == null) {
+          return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        } else {
+          return kpiIdBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiId_ = value;
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder setKpiId(
+          monitoring.Monitoring.KpiId.Builder builderForValue) {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = builderForValue.build();
+          onChanged();
+        } else {
+          kpiIdBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
+        if (kpiIdBuilder_ == null) {
+          if (kpiId_ != null) {
+            kpiId_ =
+              monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
+          } else {
+            kpiId_ = value;
+          }
+          onChanged();
+        } else {
+          kpiIdBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public Builder clearKpiId() {
+        if (kpiIdBuilder_ == null) {
+          kpiId_ = null;
+          onChanged();
+        } else {
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
+        
+        onChanged();
+        return getKpiIdFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+        if (kpiIdBuilder_ != null) {
+          return kpiIdBuilder_.getMessageOrBuilder();
+        } else {
+          return kpiId_ == null ?
+              monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
+        }
+      }
+      /**
+       * <code>.monitoring.KpiId kpi_id = 1;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> 
+          getKpiIdFieldBuilder() {
+        if (kpiIdBuilder_ == null) {
+          kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder>(
+                  getKpiId(),
+                  getParentForChildren(),
+                  isClean());
+          kpiId_ = null;
+        }
+        return kpiIdBuilder_;
+      }
+
+      private java.util.List<monitoring.Monitoring.RawKpi> rawKpis_ =
+        java.util.Collections.emptyList();
+      private void ensureRawKpisIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          rawKpis_ = new java.util.ArrayList<monitoring.Monitoring.RawKpi>(rawKpis_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          monitoring.Monitoring.RawKpi, monitoring.Monitoring.RawKpi.Builder, monitoring.Monitoring.RawKpiOrBuilder> rawKpisBuilder_;
+
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public java.util.List<monitoring.Monitoring.RawKpi> getRawKpisList() {
+        if (rawKpisBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(rawKpis_);
+        } else {
+          return rawKpisBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public int getRawKpisCount() {
+        if (rawKpisBuilder_ == null) {
+          return rawKpis_.size();
+        } else {
+          return rawKpisBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public monitoring.Monitoring.RawKpi getRawKpis(int index) {
+        if (rawKpisBuilder_ == null) {
+          return rawKpis_.get(index);
+        } else {
+          return rawKpisBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder setRawKpis(
+          int index, monitoring.Monitoring.RawKpi value) {
+        if (rawKpisBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawKpisIsMutable();
+          rawKpis_.set(index, value);
+          onChanged();
+        } else {
+          rawKpisBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder setRawKpis(
+          int index, monitoring.Monitoring.RawKpi.Builder builderForValue) {
+        if (rawKpisBuilder_ == null) {
+          ensureRawKpisIsMutable();
+          rawKpis_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          rawKpisBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder addRawKpis(monitoring.Monitoring.RawKpi value) {
+        if (rawKpisBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawKpisIsMutable();
+          rawKpis_.add(value);
+          onChanged();
+        } else {
+          rawKpisBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder addRawKpis(
+          int index, monitoring.Monitoring.RawKpi value) {
+        if (rawKpisBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawKpisIsMutable();
+          rawKpis_.add(index, value);
+          onChanged();
+        } else {
+          rawKpisBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder addRawKpis(
+          monitoring.Monitoring.RawKpi.Builder builderForValue) {
+        if (rawKpisBuilder_ == null) {
+          ensureRawKpisIsMutable();
+          rawKpis_.add(builderForValue.build());
+          onChanged();
+        } else {
+          rawKpisBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder addRawKpis(
+          int index, monitoring.Monitoring.RawKpi.Builder builderForValue) {
+        if (rawKpisBuilder_ == null) {
+          ensureRawKpisIsMutable();
+          rawKpis_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          rawKpisBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder addAllRawKpis(
+          java.lang.Iterable<? extends monitoring.Monitoring.RawKpi> values) {
+        if (rawKpisBuilder_ == null) {
+          ensureRawKpisIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, rawKpis_);
+          onChanged();
+        } else {
+          rawKpisBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder clearRawKpis() {
+        if (rawKpisBuilder_ == null) {
+          rawKpis_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          rawKpisBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public Builder removeRawKpis(int index) {
+        if (rawKpisBuilder_ == null) {
+          ensureRawKpisIsMutable();
+          rawKpis_.remove(index);
+          onChanged();
+        } else {
+          rawKpisBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public monitoring.Monitoring.RawKpi.Builder getRawKpisBuilder(
+          int index) {
+        return getRawKpisFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public monitoring.Monitoring.RawKpiOrBuilder getRawKpisOrBuilder(
+          int index) {
+        if (rawKpisBuilder_ == null) {
+          return rawKpis_.get(index);  } else {
+          return rawKpisBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public java.util.List<? extends monitoring.Monitoring.RawKpiOrBuilder> 
+           getRawKpisOrBuilderList() {
+        if (rawKpisBuilder_ != null) {
+          return rawKpisBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(rawKpis_);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public monitoring.Monitoring.RawKpi.Builder addRawKpisBuilder() {
+        return getRawKpisFieldBuilder().addBuilder(
+            monitoring.Monitoring.RawKpi.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public monitoring.Monitoring.RawKpi.Builder addRawKpisBuilder(
+          int index) {
+        return getRawKpisFieldBuilder().addBuilder(
+            index, monitoring.Monitoring.RawKpi.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .monitoring.RawKpi raw_kpis = 2;</code>
+       */
+      public java.util.List<monitoring.Monitoring.RawKpi.Builder> 
+           getRawKpisBuilderList() {
+        return getRawKpisFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          monitoring.Monitoring.RawKpi, monitoring.Monitoring.RawKpi.Builder, monitoring.Monitoring.RawKpiOrBuilder> 
+          getRawKpisFieldBuilder() {
+        if (rawKpisBuilder_ == null) {
+          rawKpisBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              monitoring.Monitoring.RawKpi, monitoring.Monitoring.RawKpi.Builder, monitoring.Monitoring.RawKpiOrBuilder>(
+                  rawKpis_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          rawKpis_ = null;
+        }
+        return rawKpisBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.RawKpiList)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.RawKpiList)
+    private static final monitoring.Monitoring.RawKpiList DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.RawKpiList();
+    }
+
+    public static monitoring.Monitoring.RawKpiList getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<RawKpiList>
+        PARSER = new com.google.protobuf.AbstractParser<RawKpiList>() {
+      @java.lang.Override
+      public RawKpiList parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new RawKpiList(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<RawKpiList> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<RawKpiList> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpiList getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface RawKpiTableOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.RawKpiTable)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    java.util.List<monitoring.Monitoring.RawKpiList> 
+        getRawKpiListsList();
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    monitoring.Monitoring.RawKpiList getRawKpiLists(int index);
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    int getRawKpiListsCount();
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    java.util.List<? extends monitoring.Monitoring.RawKpiListOrBuilder> 
+        getRawKpiListsOrBuilderList();
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    monitoring.Monitoring.RawKpiListOrBuilder getRawKpiListsOrBuilder(
+        int index);
+  }
+  /**
+   * <pre>
+   * table
+   * </pre>
+   *
+   * Protobuf type {@code monitoring.RawKpiTable}
+   */
+  public static final class RawKpiTable extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:monitoring.RawKpiTable)
+      RawKpiTableOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use RawKpiTable.newBuilder() to construct.
+    private RawKpiTable(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private RawKpiTable() {
+      rawKpiLists_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    @SuppressWarnings({"unused"})
+    protected java.lang.Object newInstance(
+        UnusedPrivateParameter unused) {
+      return new RawKpiTable();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private RawKpiTable(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                rawKpiLists_ = new java.util.ArrayList<monitoring.Monitoring.RawKpiList>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              rawKpiLists_.add(
+                  input.readMessage(monitoring.Monitoring.RawKpiList.parser(), extensionRegistry));
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          rawKpiLists_ = java.util.Collections.unmodifiableList(rawKpiLists_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              monitoring.Monitoring.RawKpiTable.class, monitoring.Monitoring.RawKpiTable.Builder.class);
+    }
+
+    public static final int RAW_KPI_LISTS_FIELD_NUMBER = 1;
+    private java.util.List<monitoring.Monitoring.RawKpiList> rawKpiLists_;
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<monitoring.Monitoring.RawKpiList> getRawKpiListsList() {
+      return rawKpiLists_;
+    }
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    @java.lang.Override
+    public java.util.List<? extends monitoring.Monitoring.RawKpiListOrBuilder> 
+        getRawKpiListsOrBuilderList() {
+      return rawKpiLists_;
+    }
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    @java.lang.Override
+    public int getRawKpiListsCount() {
+      return rawKpiLists_.size();
+    }
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpiList getRawKpiLists(int index) {
+      return rawKpiLists_.get(index);
+    }
+    /**
+     * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+     */
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpiListOrBuilder getRawKpiListsOrBuilder(
+        int index) {
+      return rawKpiLists_.get(index);
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < rawKpiLists_.size(); i++) {
+        output.writeMessage(1, rawKpiLists_.get(i));
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < rawKpiLists_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, rawKpiLists_.get(i));
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof monitoring.Monitoring.RawKpiTable)) {
+        return super.equals(obj);
+      }
+      monitoring.Monitoring.RawKpiTable other = (monitoring.Monitoring.RawKpiTable) obj;
+
+      if (!getRawKpiListsList()
+          .equals(other.getRawKpiListsList())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getRawKpiListsCount() > 0) {
+        hash = (37 * hash) + RAW_KPI_LISTS_FIELD_NUMBER;
+        hash = (53 * hash) + getRawKpiListsList().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static monitoring.Monitoring.RawKpiTable parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(monitoring.Monitoring.RawKpiTable prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     * table
+     * </pre>
+     *
+     * Protobuf type {@code monitoring.RawKpiTable}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:monitoring.RawKpiTable)
+        monitoring.Monitoring.RawKpiTableOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                monitoring.Monitoring.RawKpiTable.class, monitoring.Monitoring.RawKpiTable.Builder.class);
+      }
+
+      // Construct using monitoring.Monitoring.RawKpiTable.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getRawKpiListsFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (rawKpiListsBuilder_ == null) {
+          rawKpiLists_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          rawKpiListsBuilder_.clear();
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return monitoring.Monitoring.internal_static_monitoring_RawKpiTable_descriptor;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpiTable getDefaultInstanceForType() {
+        return monitoring.Monitoring.RawKpiTable.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpiTable build() {
+        monitoring.Monitoring.RawKpiTable result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public monitoring.Monitoring.RawKpiTable buildPartial() {
+        monitoring.Monitoring.RawKpiTable result = new monitoring.Monitoring.RawKpiTable(this);
+        int from_bitField0_ = bitField0_;
+        if (rawKpiListsBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            rawKpiLists_ = java.util.Collections.unmodifiableList(rawKpiLists_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.rawKpiLists_ = rawKpiLists_;
+        } else {
+          result.rawKpiLists_ = rawKpiListsBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof monitoring.Monitoring.RawKpiTable) {
+          return mergeFrom((monitoring.Monitoring.RawKpiTable)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(monitoring.Monitoring.RawKpiTable other) {
+        if (other == monitoring.Monitoring.RawKpiTable.getDefaultInstance()) return this;
+        if (rawKpiListsBuilder_ == null) {
+          if (!other.rawKpiLists_.isEmpty()) {
+            if (rawKpiLists_.isEmpty()) {
+              rawKpiLists_ = other.rawKpiLists_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureRawKpiListsIsMutable();
+              rawKpiLists_.addAll(other.rawKpiLists_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.rawKpiLists_.isEmpty()) {
+            if (rawKpiListsBuilder_.isEmpty()) {
+              rawKpiListsBuilder_.dispose();
+              rawKpiListsBuilder_ = null;
+              rawKpiLists_ = other.rawKpiLists_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              rawKpiListsBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getRawKpiListsFieldBuilder() : null;
+            } else {
+              rawKpiListsBuilder_.addAllMessages(other.rawKpiLists_);
+            }
+          }
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        monitoring.Monitoring.RawKpiTable parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (monitoring.Monitoring.RawKpiTable) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<monitoring.Monitoring.RawKpiList> rawKpiLists_ =
+        java.util.Collections.emptyList();
+      private void ensureRawKpiListsIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          rawKpiLists_ = new java.util.ArrayList<monitoring.Monitoring.RawKpiList>(rawKpiLists_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          monitoring.Monitoring.RawKpiList, monitoring.Monitoring.RawKpiList.Builder, monitoring.Monitoring.RawKpiListOrBuilder> rawKpiListsBuilder_;
+
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public java.util.List<monitoring.Monitoring.RawKpiList> getRawKpiListsList() {
+        if (rawKpiListsBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(rawKpiLists_);
+        } else {
+          return rawKpiListsBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public int getRawKpiListsCount() {
+        if (rawKpiListsBuilder_ == null) {
+          return rawKpiLists_.size();
+        } else {
+          return rawKpiListsBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public monitoring.Monitoring.RawKpiList getRawKpiLists(int index) {
+        if (rawKpiListsBuilder_ == null) {
+          return rawKpiLists_.get(index);
+        } else {
+          return rawKpiListsBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder setRawKpiLists(
+          int index, monitoring.Monitoring.RawKpiList value) {
+        if (rawKpiListsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.set(index, value);
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder setRawKpiLists(
+          int index, monitoring.Monitoring.RawKpiList.Builder builderForValue) {
+        if (rawKpiListsBuilder_ == null) {
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder addRawKpiLists(monitoring.Monitoring.RawKpiList value) {
+        if (rawKpiListsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.add(value);
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder addRawKpiLists(
+          int index, monitoring.Monitoring.RawKpiList value) {
+        if (rawKpiListsBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.add(index, value);
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder addRawKpiLists(
+          monitoring.Monitoring.RawKpiList.Builder builderForValue) {
+        if (rawKpiListsBuilder_ == null) {
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.add(builderForValue.build());
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder addRawKpiLists(
+          int index, monitoring.Monitoring.RawKpiList.Builder builderForValue) {
+        if (rawKpiListsBuilder_ == null) {
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder addAllRawKpiLists(
+          java.lang.Iterable<? extends monitoring.Monitoring.RawKpiList> values) {
+        if (rawKpiListsBuilder_ == null) {
+          ensureRawKpiListsIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, rawKpiLists_);
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder clearRawKpiLists() {
+        if (rawKpiListsBuilder_ == null) {
+          rawKpiLists_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public Builder removeRawKpiLists(int index) {
+        if (rawKpiListsBuilder_ == null) {
+          ensureRawKpiListsIsMutable();
+          rawKpiLists_.remove(index);
+          onChanged();
+        } else {
+          rawKpiListsBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public monitoring.Monitoring.RawKpiList.Builder getRawKpiListsBuilder(
+          int index) {
+        return getRawKpiListsFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public monitoring.Monitoring.RawKpiListOrBuilder getRawKpiListsOrBuilder(
+          int index) {
+        if (rawKpiListsBuilder_ == null) {
+          return rawKpiLists_.get(index);  } else {
+          return rawKpiListsBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public java.util.List<? extends monitoring.Monitoring.RawKpiListOrBuilder> 
+           getRawKpiListsOrBuilderList() {
+        if (rawKpiListsBuilder_ != null) {
+          return rawKpiListsBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(rawKpiLists_);
+        }
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public monitoring.Monitoring.RawKpiList.Builder addRawKpiListsBuilder() {
+        return getRawKpiListsFieldBuilder().addBuilder(
+            monitoring.Monitoring.RawKpiList.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public monitoring.Monitoring.RawKpiList.Builder addRawKpiListsBuilder(
+          int index) {
+        return getRawKpiListsFieldBuilder().addBuilder(
+            index, monitoring.Monitoring.RawKpiList.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .monitoring.RawKpiList raw_kpi_lists = 1;</code>
+       */
+      public java.util.List<monitoring.Monitoring.RawKpiList.Builder> 
+           getRawKpiListsBuilderList() {
+        return getRawKpiListsFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          monitoring.Monitoring.RawKpiList, monitoring.Monitoring.RawKpiList.Builder, monitoring.Monitoring.RawKpiListOrBuilder> 
+          getRawKpiListsFieldBuilder() {
+        if (rawKpiListsBuilder_ == null) {
+          rawKpiListsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              monitoring.Monitoring.RawKpiList, monitoring.Monitoring.RawKpiList.Builder, monitoring.Monitoring.RawKpiListOrBuilder>(
+                  rawKpiLists_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          rawKpiLists_ = null;
+        }
+        return rawKpiListsBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:monitoring.RawKpiTable)
+    }
+
+    // @@protoc_insertion_point(class_scope:monitoring.RawKpiTable)
+    private static final monitoring.Monitoring.RawKpiTable DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new monitoring.Monitoring.RawKpiTable();
+    }
+
+    public static monitoring.Monitoring.RawKpiTable getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<RawKpiTable>
+        PARSER = new com.google.protobuf.AbstractParser<RawKpiTable>() {
+      @java.lang.Override
+      public RawKpiTable parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new RawKpiTable(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<RawKpiTable> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<RawKpiTable> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public monitoring.Monitoring.RawKpiTable getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface KpiIdOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.KpiId)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     * @return Whether the kpiId field is set.
+     */
+    boolean hasKpiId();
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
+     * @return The kpiId.
+     */
+    context.ContextOuterClass.Uuid getKpiId();
+    /**
+     * <code>.context.Uuid kpi_id = 1;</code>
      */
     context.ContextOuterClass.UuidOrBuilder getKpiIdOrBuilder();
   }
@@ -8482,27 +11250,27 @@ public final class Monitoring {
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     java.util.List<monitoring.Monitoring.Kpi> 
-        getKpiListList();
+        getKpiList();
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
-    monitoring.Monitoring.Kpi getKpiList(int index);
+    monitoring.Monitoring.Kpi getKpi(int index);
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
-    int getKpiListCount();
+    int getKpiCount();
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     java.util.List<? extends monitoring.Monitoring.KpiOrBuilder> 
-        getKpiListOrBuilderList();
+        getKpiOrBuilderList();
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
-    monitoring.Monitoring.KpiOrBuilder getKpiListOrBuilder(
+    monitoring.Monitoring.KpiOrBuilder getKpiOrBuilder(
         int index);
   }
   /**
@@ -8518,7 +11286,7 @@ public final class Monitoring {
       super(builder);
     }
     private KpiList() {
-      kpiList_ = java.util.Collections.emptyList();
+      kpi_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
@@ -8554,10 +11322,10 @@ public final class Monitoring {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                kpiList_ = new java.util.ArrayList<monitoring.Monitoring.Kpi>();
+                kpi_ = new java.util.ArrayList<monitoring.Monitoring.Kpi>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              kpiList_.add(
+              kpi_.add(
                   input.readMessage(monitoring.Monitoring.Kpi.parser(), extensionRegistry));
               break;
             }
@@ -8577,7 +11345,7 @@ public final class Monitoring {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          kpiList_ = java.util.Collections.unmodifiableList(kpiList_);
+          kpi_ = java.util.Collections.unmodifiableList(kpi_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -8596,44 +11364,44 @@ public final class Monitoring {
               monitoring.Monitoring.KpiList.class, monitoring.Monitoring.KpiList.Builder.class);
     }
 
-    public static final int KPI_LIST_FIELD_NUMBER = 1;
-    private java.util.List<monitoring.Monitoring.Kpi> kpiList_;
+    public static final int KPI_FIELD_NUMBER = 1;
+    private java.util.List<monitoring.Monitoring.Kpi> kpi_;
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<monitoring.Monitoring.Kpi> getKpiListList() {
-      return kpiList_;
+    public java.util.List<monitoring.Monitoring.Kpi> getKpiList() {
+      return kpi_;
     }
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     @java.lang.Override
     public java.util.List<? extends monitoring.Monitoring.KpiOrBuilder> 
-        getKpiListOrBuilderList() {
-      return kpiList_;
+        getKpiOrBuilderList() {
+      return kpi_;
     }
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     @java.lang.Override
-    public int getKpiListCount() {
-      return kpiList_.size();
+    public int getKpiCount() {
+      return kpi_.size();
     }
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.Kpi getKpiList(int index) {
-      return kpiList_.get(index);
+    public monitoring.Monitoring.Kpi getKpi(int index) {
+      return kpi_.get(index);
     }
     /**
-     * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+     * <code>repeated .monitoring.Kpi kpi = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiOrBuilder getKpiListOrBuilder(
+    public monitoring.Monitoring.KpiOrBuilder getKpiOrBuilder(
         int index) {
-      return kpiList_.get(index);
+      return kpi_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -8650,8 +11418,8 @@ public final class Monitoring {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < kpiList_.size(); i++) {
-        output.writeMessage(1, kpiList_.get(i));
+      for (int i = 0; i < kpi_.size(); i++) {
+        output.writeMessage(1, kpi_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -8662,9 +11430,9 @@ public final class Monitoring {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < kpiList_.size(); i++) {
+      for (int i = 0; i < kpi_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, kpiList_.get(i));
+          .computeMessageSize(1, kpi_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -8681,8 +11449,8 @@ public final class Monitoring {
       }
       monitoring.Monitoring.KpiList other = (monitoring.Monitoring.KpiList) obj;
 
-      if (!getKpiListList()
-          .equals(other.getKpiListList())) return false;
+      if (!getKpiList()
+          .equals(other.getKpiList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -8694,9 +11462,9 @@ public final class Monitoring {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getKpiListCount() > 0) {
-        hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
-        hash = (53 * hash) + getKpiListList().hashCode();
+      if (getKpiCount() > 0) {
+        hash = (37 * hash) + KPI_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
@@ -8826,17 +11594,17 @@ public final class Monitoring {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getKpiListFieldBuilder();
+          getKpiFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (kpiListBuilder_ == null) {
-          kpiList_ = java.util.Collections.emptyList();
+        if (kpiBuilder_ == null) {
+          kpi_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          kpiListBuilder_.clear();
+          kpiBuilder_.clear();
         }
         return this;
       }
@@ -8865,14 +11633,14 @@ public final class Monitoring {
       public monitoring.Monitoring.KpiList buildPartial() {
         monitoring.Monitoring.KpiList result = new monitoring.Monitoring.KpiList(this);
         int from_bitField0_ = bitField0_;
-        if (kpiListBuilder_ == null) {
+        if (kpiBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            kpiList_ = java.util.Collections.unmodifiableList(kpiList_);
+            kpi_ = java.util.Collections.unmodifiableList(kpi_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.kpiList_ = kpiList_;
+          result.kpi_ = kpi_;
         } else {
-          result.kpiList_ = kpiListBuilder_.build();
+          result.kpi_ = kpiBuilder_.build();
         }
         onBuilt();
         return result;
@@ -8922,29 +11690,29 @@ public final class Monitoring {
 
       public Builder mergeFrom(monitoring.Monitoring.KpiList other) {
         if (other == monitoring.Monitoring.KpiList.getDefaultInstance()) return this;
-        if (kpiListBuilder_ == null) {
-          if (!other.kpiList_.isEmpty()) {
-            if (kpiList_.isEmpty()) {
-              kpiList_ = other.kpiList_;
+        if (kpiBuilder_ == null) {
+          if (!other.kpi_.isEmpty()) {
+            if (kpi_.isEmpty()) {
+              kpi_ = other.kpi_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureKpiListIsMutable();
-              kpiList_.addAll(other.kpiList_);
+              ensureKpiIsMutable();
+              kpi_.addAll(other.kpi_);
             }
             onChanged();
           }
         } else {
-          if (!other.kpiList_.isEmpty()) {
-            if (kpiListBuilder_.isEmpty()) {
-              kpiListBuilder_.dispose();
-              kpiListBuilder_ = null;
-              kpiList_ = other.kpiList_;
+          if (!other.kpi_.isEmpty()) {
+            if (kpiBuilder_.isEmpty()) {
+              kpiBuilder_.dispose();
+              kpiBuilder_ = null;
+              kpi_ = other.kpi_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              kpiListBuilder_ = 
+              kpiBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getKpiListFieldBuilder() : null;
+                   getKpiFieldBuilder() : null;
             } else {
-              kpiListBuilder_.addAllMessages(other.kpiList_);
+              kpiBuilder_.addAllMessages(other.kpi_);
             }
           }
         }
@@ -8978,244 +11746,244 @@ public final class Monitoring {
       }
       private int bitField0_;
 
-      private java.util.List<monitoring.Monitoring.Kpi> kpiList_ =
+      private java.util.List<monitoring.Monitoring.Kpi> kpi_ =
         java.util.Collections.emptyList();
-      private void ensureKpiListIsMutable() {
+      private void ensureKpiIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          kpiList_ = new java.util.ArrayList<monitoring.Monitoring.Kpi>(kpiList_);
+          kpi_ = new java.util.ArrayList<monitoring.Monitoring.Kpi>(kpi_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder> kpiListBuilder_;
+          monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder> kpiBuilder_;
 
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public java.util.List<monitoring.Monitoring.Kpi> getKpiListList() {
-        if (kpiListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(kpiList_);
+      public java.util.List<monitoring.Monitoring.Kpi> getKpiList() {
+        if (kpiBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(kpi_);
         } else {
-          return kpiListBuilder_.getMessageList();
+          return kpiBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public int getKpiListCount() {
-        if (kpiListBuilder_ == null) {
-          return kpiList_.size();
+      public int getKpiCount() {
+        if (kpiBuilder_ == null) {
+          return kpi_.size();
         } else {
-          return kpiListBuilder_.getCount();
+          return kpiBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public monitoring.Monitoring.Kpi getKpiList(int index) {
-        if (kpiListBuilder_ == null) {
-          return kpiList_.get(index);
+      public monitoring.Monitoring.Kpi getKpi(int index) {
+        if (kpiBuilder_ == null) {
+          return kpi_.get(index);
         } else {
-          return kpiListBuilder_.getMessage(index);
+          return kpiBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder setKpiList(
+      public Builder setKpi(
           int index, monitoring.Monitoring.Kpi value) {
-        if (kpiListBuilder_ == null) {
+        if (kpiBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiListIsMutable();
-          kpiList_.set(index, value);
+          ensureKpiIsMutable();
+          kpi_.set(index, value);
           onChanged();
         } else {
-          kpiListBuilder_.setMessage(index, value);
+          kpiBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder setKpiList(
+      public Builder setKpi(
           int index, monitoring.Monitoring.Kpi.Builder builderForValue) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.set(index, builderForValue.build());
+        if (kpiBuilder_ == null) {
+          ensureKpiIsMutable();
+          kpi_.set(index, builderForValue.build());
           onChanged();
         } else {
-          kpiListBuilder_.setMessage(index, builderForValue.build());
+          kpiBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder addKpiList(monitoring.Monitoring.Kpi value) {
-        if (kpiListBuilder_ == null) {
+      public Builder addKpi(monitoring.Monitoring.Kpi value) {
+        if (kpiBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiListIsMutable();
-          kpiList_.add(value);
+          ensureKpiIsMutable();
+          kpi_.add(value);
           onChanged();
         } else {
-          kpiListBuilder_.addMessage(value);
+          kpiBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder addKpiList(
+      public Builder addKpi(
           int index, monitoring.Monitoring.Kpi value) {
-        if (kpiListBuilder_ == null) {
+        if (kpiBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiListIsMutable();
-          kpiList_.add(index, value);
+          ensureKpiIsMutable();
+          kpi_.add(index, value);
           onChanged();
         } else {
-          kpiListBuilder_.addMessage(index, value);
+          kpiBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder addKpiList(
+      public Builder addKpi(
           monitoring.Monitoring.Kpi.Builder builderForValue) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.add(builderForValue.build());
+        if (kpiBuilder_ == null) {
+          ensureKpiIsMutable();
+          kpi_.add(builderForValue.build());
           onChanged();
         } else {
-          kpiListBuilder_.addMessage(builderForValue.build());
+          kpiBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder addKpiList(
+      public Builder addKpi(
           int index, monitoring.Monitoring.Kpi.Builder builderForValue) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.add(index, builderForValue.build());
+        if (kpiBuilder_ == null) {
+          ensureKpiIsMutable();
+          kpi_.add(index, builderForValue.build());
           onChanged();
         } else {
-          kpiListBuilder_.addMessage(index, builderForValue.build());
+          kpiBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder addAllKpiList(
+      public Builder addAllKpi(
           java.lang.Iterable<? extends monitoring.Monitoring.Kpi> values) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
+        if (kpiBuilder_ == null) {
+          ensureKpiIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, kpiList_);
+              values, kpi_);
           onChanged();
         } else {
-          kpiListBuilder_.addAllMessages(values);
+          kpiBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder clearKpiList() {
-        if (kpiListBuilder_ == null) {
-          kpiList_ = java.util.Collections.emptyList();
+      public Builder clearKpi() {
+        if (kpiBuilder_ == null) {
+          kpi_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          kpiListBuilder_.clear();
+          kpiBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public Builder removeKpiList(int index) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.remove(index);
+      public Builder removeKpi(int index) {
+        if (kpiBuilder_ == null) {
+          ensureKpiIsMutable();
+          kpi_.remove(index);
           onChanged();
         } else {
-          kpiListBuilder_.remove(index);
+          kpiBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public monitoring.Monitoring.Kpi.Builder getKpiListBuilder(
+      public monitoring.Monitoring.Kpi.Builder getKpiBuilder(
           int index) {
-        return getKpiListFieldBuilder().getBuilder(index);
+        return getKpiFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public monitoring.Monitoring.KpiOrBuilder getKpiListOrBuilder(
+      public monitoring.Monitoring.KpiOrBuilder getKpiOrBuilder(
           int index) {
-        if (kpiListBuilder_ == null) {
-          return kpiList_.get(index);  } else {
-          return kpiListBuilder_.getMessageOrBuilder(index);
+        if (kpiBuilder_ == null) {
+          return kpi_.get(index);  } else {
+          return kpiBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
       public java.util.List<? extends monitoring.Monitoring.KpiOrBuilder> 
-           getKpiListOrBuilderList() {
-        if (kpiListBuilder_ != null) {
-          return kpiListBuilder_.getMessageOrBuilderList();
+           getKpiOrBuilderList() {
+        if (kpiBuilder_ != null) {
+          return kpiBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(kpiList_);
+          return java.util.Collections.unmodifiableList(kpi_);
         }
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public monitoring.Monitoring.Kpi.Builder addKpiListBuilder() {
-        return getKpiListFieldBuilder().addBuilder(
+      public monitoring.Monitoring.Kpi.Builder addKpiBuilder() {
+        return getKpiFieldBuilder().addBuilder(
             monitoring.Monitoring.Kpi.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
-      public monitoring.Monitoring.Kpi.Builder addKpiListBuilder(
+      public monitoring.Monitoring.Kpi.Builder addKpiBuilder(
           int index) {
-        return getKpiListFieldBuilder().addBuilder(
+        return getKpiFieldBuilder().addBuilder(
             index, monitoring.Monitoring.Kpi.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.Kpi kpi_list = 1;</code>
+       * <code>repeated .monitoring.Kpi kpi = 1;</code>
        */
       public java.util.List<monitoring.Monitoring.Kpi.Builder> 
-           getKpiListBuilderList() {
-        return getKpiListFieldBuilder().getBuilderList();
+           getKpiBuilderList() {
+        return getKpiFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
           monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder> 
-          getKpiListFieldBuilder() {
-        if (kpiListBuilder_ == null) {
-          kpiListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+          getKpiFieldBuilder() {
+        if (kpiBuilder_ == null) {
+          kpiBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
               monitoring.Monitoring.Kpi, monitoring.Monitoring.Kpi.Builder, monitoring.Monitoring.KpiOrBuilder>(
-                  kpiList_,
+                  kpi_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          kpiList_ = null;
+          kpi_ = null;
         }
-        return kpiListBuilder_;
+        return kpiBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -12198,28 +14966,19 @@ public final class Monitoring {
     monitoring.Monitoring.SubscriptionIDOrBuilder getSubsIdOrBuilder();
 
     /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-     */
-    java.util.List<monitoring.Monitoring.KpiList> 
-        getKpiListList();
-    /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-     */
-    monitoring.Monitoring.KpiList getKpiList(int index);
-    /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+     * <code>.monitoring.KpiList kpi_list = 2;</code>
+     * @return Whether the kpiList field is set.
      */
-    int getKpiListCount();
+    boolean hasKpiList();
     /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+     * <code>.monitoring.KpiList kpi_list = 2;</code>
+     * @return The kpiList.
      */
-    java.util.List<? extends monitoring.Monitoring.KpiListOrBuilder> 
-        getKpiListOrBuilderList();
+    monitoring.Monitoring.KpiList getKpiList();
     /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+     * <code>.monitoring.KpiList kpi_list = 2;</code>
      */
-    monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder(
-        int index);
+    monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder();
   }
   /**
    * Protobuf type {@code monitoring.SubsResponse}
@@ -12234,7 +14993,6 @@ public final class Monitoring {
       super(builder);
     }
     private SubsResponse() {
-      kpiList_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
@@ -12257,7 +15015,6 @@ public final class Monitoring {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -12282,12 +15039,16 @@ public final class Monitoring {
               break;
             }
             case 18: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                kpiList_ = new java.util.ArrayList<monitoring.Monitoring.KpiList>();
-                mutable_bitField0_ |= 0x00000001;
+              monitoring.Monitoring.KpiList.Builder subBuilder = null;
+              if (kpiList_ != null) {
+                subBuilder = kpiList_.toBuilder();
+              }
+              kpiList_ = input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiList_);
+                kpiList_ = subBuilder.buildPartial();
               }
-              kpiList_.add(
-                  input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry));
+
               break;
             }
             default: {
@@ -12305,9 +15066,6 @@ public final class Monitoring {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          kpiList_ = java.util.Collections.unmodifiableList(kpiList_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -12352,43 +15110,29 @@ public final class Monitoring {
     }
 
     public static final int KPI_LIST_FIELD_NUMBER = 2;
-    private java.util.List<monitoring.Monitoring.KpiList> kpiList_;
-    /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-     */
-    @java.lang.Override
-    public java.util.List<monitoring.Monitoring.KpiList> getKpiListList() {
-      return kpiList_;
-    }
-    /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends monitoring.Monitoring.KpiListOrBuilder> 
-        getKpiListOrBuilderList() {
-      return kpiList_;
-    }
+    private monitoring.Monitoring.KpiList kpiList_;
     /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+     * <code>.monitoring.KpiList kpi_list = 2;</code>
+     * @return Whether the kpiList field is set.
      */
     @java.lang.Override
-    public int getKpiListCount() {
-      return kpiList_.size();
+    public boolean hasKpiList() {
+      return kpiList_ != null;
     }
     /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+     * <code>.monitoring.KpiList kpi_list = 2;</code>
+     * @return The kpiList.
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiList getKpiList(int index) {
-      return kpiList_.get(index);
+    public monitoring.Monitoring.KpiList getKpiList() {
+      return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
     }
     /**
-     * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+     * <code>.monitoring.KpiList kpi_list = 2;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder(
-        int index) {
-      return kpiList_.get(index);
+    public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
+      return getKpiList();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -12408,8 +15152,8 @@ public final class Monitoring {
       if (subsId_ != null) {
         output.writeMessage(1, getSubsId());
       }
-      for (int i = 0; i < kpiList_.size(); i++) {
-        output.writeMessage(2, kpiList_.get(i));
+      if (kpiList_ != null) {
+        output.writeMessage(2, getKpiList());
       }
       unknownFields.writeTo(output);
     }
@@ -12424,9 +15168,9 @@ public final class Monitoring {
         size += com.google.protobuf.CodedOutputStream
           .computeMessageSize(1, getSubsId());
       }
-      for (int i = 0; i < kpiList_.size(); i++) {
+      if (kpiList_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(2, kpiList_.get(i));
+          .computeMessageSize(2, getKpiList());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -12448,8 +15192,11 @@ public final class Monitoring {
         if (!getSubsId()
             .equals(other.getSubsId())) return false;
       }
-      if (!getKpiListList()
-          .equals(other.getKpiListList())) return false;
+      if (hasKpiList() != other.hasKpiList()) return false;
+      if (hasKpiList()) {
+        if (!getKpiList()
+            .equals(other.getKpiList())) return false;
+      }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -12465,9 +15212,9 @@ public final class Monitoring {
         hash = (37 * hash) + SUBS_ID_FIELD_NUMBER;
         hash = (53 * hash) + getSubsId().hashCode();
       }
-      if (getKpiListCount() > 0) {
+      if (hasKpiList()) {
         hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
-        hash = (53 * hash) + getKpiListList().hashCode();
+        hash = (53 * hash) + getKpiList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
@@ -12597,7 +15344,6 @@ public final class Monitoring {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getKpiListFieldBuilder();
         }
       }
       @java.lang.Override
@@ -12610,10 +15356,10 @@ public final class Monitoring {
           subsIdBuilder_ = null;
         }
         if (kpiListBuilder_ == null) {
-          kpiList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+          kpiList_ = null;
         } else {
-          kpiListBuilder_.clear();
+          kpiList_ = null;
+          kpiListBuilder_ = null;
         }
         return this;
       }
@@ -12641,17 +15387,12 @@ public final class Monitoring {
       @java.lang.Override
       public monitoring.Monitoring.SubsResponse buildPartial() {
         monitoring.Monitoring.SubsResponse result = new monitoring.Monitoring.SubsResponse(this);
-        int from_bitField0_ = bitField0_;
         if (subsIdBuilder_ == null) {
           result.subsId_ = subsId_;
         } else {
           result.subsId_ = subsIdBuilder_.build();
         }
         if (kpiListBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            kpiList_ = java.util.Collections.unmodifiableList(kpiList_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
           result.kpiList_ = kpiList_;
         } else {
           result.kpiList_ = kpiListBuilder_.build();
@@ -12707,31 +15448,8 @@ public final class Monitoring {
         if (other.hasSubsId()) {
           mergeSubsId(other.getSubsId());
         }
-        if (kpiListBuilder_ == null) {
-          if (!other.kpiList_.isEmpty()) {
-            if (kpiList_.isEmpty()) {
-              kpiList_ = other.kpiList_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureKpiListIsMutable();
-              kpiList_.addAll(other.kpiList_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.kpiList_.isEmpty()) {
-            if (kpiListBuilder_.isEmpty()) {
-              kpiListBuilder_.dispose();
-              kpiListBuilder_ = null;
-              kpiList_ = other.kpiList_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              kpiListBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getKpiListFieldBuilder() : null;
-            } else {
-              kpiListBuilder_.addAllMessages(other.kpiList_);
-            }
-          }
+        if (other.hasKpiList()) {
+          mergeKpiList(other.getKpiList());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -12761,7 +15479,6 @@ public final class Monitoring {
         }
         return this;
       }
-      private int bitField0_;
 
       private monitoring.Monitoring.SubscriptionID subsId_;
       private com.google.protobuf.SingleFieldBuilderV3<
@@ -12882,239 +15599,118 @@ public final class Monitoring {
         return subsIdBuilder_;
       }
 
-      private java.util.List<monitoring.Monitoring.KpiList> kpiList_ =
-        java.util.Collections.emptyList();
-      private void ensureKpiListIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          kpiList_ = new java.util.ArrayList<monitoring.Monitoring.KpiList>(kpiList_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
+      private monitoring.Monitoring.KpiList kpiList_;
+      private com.google.protobuf.SingleFieldBuilderV3<
           monitoring.Monitoring.KpiList, monitoring.Monitoring.KpiList.Builder, monitoring.Monitoring.KpiListOrBuilder> kpiListBuilder_;
-
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public java.util.List<monitoring.Monitoring.KpiList> getKpiListList() {
-        if (kpiListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(kpiList_);
-        } else {
-          return kpiListBuilder_.getMessageList();
-        }
-      }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
+       * @return Whether the kpiList field is set.
        */
-      public int getKpiListCount() {
-        if (kpiListBuilder_ == null) {
-          return kpiList_.size();
-        } else {
-          return kpiListBuilder_.getCount();
-        }
+      public boolean hasKpiList() {
+        return kpiListBuilder_ != null || kpiList_ != null;
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
+       * @return The kpiList.
        */
-      public monitoring.Monitoring.KpiList getKpiList(int index) {
+      public monitoring.Monitoring.KpiList getKpiList() {
         if (kpiListBuilder_ == null) {
-          return kpiList_.get(index);
+          return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
         } else {
-          return kpiListBuilder_.getMessage(index);
+          return kpiListBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
-      public Builder setKpiList(
-          int index, monitoring.Monitoring.KpiList value) {
+      public Builder setKpiList(monitoring.Monitoring.KpiList value) {
         if (kpiListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiListIsMutable();
-          kpiList_.set(index, value);
+          kpiList_ = value;
           onChanged();
         } else {
-          kpiListBuilder_.setMessage(index, value);
+          kpiListBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
       public Builder setKpiList(
-          int index, monitoring.Monitoring.KpiList.Builder builderForValue) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          kpiListBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public Builder addKpiList(monitoring.Monitoring.KpiList value) {
-        if (kpiListBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiListIsMutable();
-          kpiList_.add(value);
-          onChanged();
-        } else {
-          kpiListBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public Builder addKpiList(
-          int index, monitoring.Monitoring.KpiList value) {
-        if (kpiListBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiListIsMutable();
-          kpiList_.add(index, value);
-          onChanged();
-        } else {
-          kpiListBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public Builder addKpiList(
           monitoring.Monitoring.KpiList.Builder builderForValue) {
         if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.add(builderForValue.build());
-          onChanged();
-        } else {
-          kpiListBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public Builder addKpiList(
-          int index, monitoring.Monitoring.KpiList.Builder builderForValue) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.add(index, builderForValue.build());
+          kpiList_ = builderForValue.build();
           onChanged();
         } else {
-          kpiListBuilder_.addMessage(index, builderForValue.build());
+          kpiListBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
-      public Builder addAllKpiList(
-          java.lang.Iterable<? extends monitoring.Monitoring.KpiList> values) {
+      public Builder mergeKpiList(monitoring.Monitoring.KpiList value) {
         if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, kpiList_);
+          if (kpiList_ != null) {
+            kpiList_ =
+              monitoring.Monitoring.KpiList.newBuilder(kpiList_).mergeFrom(value).buildPartial();
+          } else {
+            kpiList_ = value;
+          }
           onChanged();
         } else {
-          kpiListBuilder_.addAllMessages(values);
+          kpiListBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
       public Builder clearKpiList() {
         if (kpiListBuilder_ == null) {
-          kpiList_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          kpiListBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public Builder removeKpiList(int index) {
-        if (kpiListBuilder_ == null) {
-          ensureKpiListIsMutable();
-          kpiList_.remove(index);
+          kpiList_ = null;
           onChanged();
         } else {
-          kpiListBuilder_.remove(index);
+          kpiList_ = null;
+          kpiListBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public monitoring.Monitoring.KpiList.Builder getKpiListBuilder(
-          int index) {
-        return getKpiListFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
-      public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder(
-          int index) {
-        if (kpiListBuilder_ == null) {
-          return kpiList_.get(index);  } else {
-          return kpiListBuilder_.getMessageOrBuilder(index);
-        }
+      public monitoring.Monitoring.KpiList.Builder getKpiListBuilder() {
+        
+        onChanged();
+        return getKpiListFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
-      public java.util.List<? extends monitoring.Monitoring.KpiListOrBuilder> 
-           getKpiListOrBuilderList() {
+      public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
         if (kpiListBuilder_ != null) {
-          return kpiListBuilder_.getMessageOrBuilderList();
+          return kpiListBuilder_.getMessageOrBuilder();
         } else {
-          return java.util.Collections.unmodifiableList(kpiList_);
+          return kpiList_ == null ?
+              monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
         }
       }
       /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public monitoring.Monitoring.KpiList.Builder addKpiListBuilder() {
-        return getKpiListFieldBuilder().addBuilder(
-            monitoring.Monitoring.KpiList.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
-       */
-      public monitoring.Monitoring.KpiList.Builder addKpiListBuilder(
-          int index) {
-        return getKpiListFieldBuilder().addBuilder(
-            index, monitoring.Monitoring.KpiList.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .monitoring.KpiList kpi_list = 2;</code>
+       * <code>.monitoring.KpiList kpi_list = 2;</code>
        */
-      public java.util.List<monitoring.Monitoring.KpiList.Builder> 
-           getKpiListBuilderList() {
-        return getKpiListFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
+      private com.google.protobuf.SingleFieldBuilderV3<
           monitoring.Monitoring.KpiList, monitoring.Monitoring.KpiList.Builder, monitoring.Monitoring.KpiListOrBuilder> 
           getKpiListFieldBuilder() {
         if (kpiListBuilder_ == null) {
-          kpiListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+          kpiListBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
               monitoring.Monitoring.KpiList, monitoring.Monitoring.KpiList.Builder, monitoring.Monitoring.KpiListOrBuilder>(
-                  kpiList_,
-                  ((bitField0_ & 0x00000001) != 0),
+                  getKpiList(),
                   getParentForChildren(),
                   isClean());
           kpiList_ = null;
@@ -13174,55 +15770,55 @@ public final class Monitoring {
 
   }
 
-  public interface SubsIDListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:monitoring.SubsIDList)
+  public interface SubsListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.SubsList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
-    java.util.List<monitoring.Monitoring.SubscriptionID> 
-        getSubsListList();
+    java.util.List<monitoring.Monitoring.SubsDescriptor> 
+        getSubsDescriptorList();
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
-    monitoring.Monitoring.SubscriptionID getSubsList(int index);
+    monitoring.Monitoring.SubsDescriptor getSubsDescriptor(int index);
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
-    int getSubsListCount();
+    int getSubsDescriptorCount();
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
-    java.util.List<? extends monitoring.Monitoring.SubscriptionIDOrBuilder> 
-        getSubsListOrBuilderList();
+    java.util.List<? extends monitoring.Monitoring.SubsDescriptorOrBuilder> 
+        getSubsDescriptorOrBuilderList();
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
-    monitoring.Monitoring.SubscriptionIDOrBuilder getSubsListOrBuilder(
+    monitoring.Monitoring.SubsDescriptorOrBuilder getSubsDescriptorOrBuilder(
         int index);
   }
   /**
-   * Protobuf type {@code monitoring.SubsIDList}
+   * Protobuf type {@code monitoring.SubsList}
    */
-  public static final class SubsIDList extends
+  public static final class SubsList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:monitoring.SubsIDList)
-      SubsIDListOrBuilder {
+      // @@protoc_insertion_point(message_implements:monitoring.SubsList)
+      SubsListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use SubsIDList.newBuilder() to construct.
-    private SubsIDList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use SubsList.newBuilder() to construct.
+    private SubsList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private SubsIDList() {
-      subsList_ = java.util.Collections.emptyList();
+    private SubsList() {
+      subsDescriptor_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new SubsIDList();
+      return new SubsList();
     }
 
     @java.lang.Override
@@ -13230,7 +15826,7 @@ public final class Monitoring {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private SubsIDList(
+    private SubsList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -13251,11 +15847,11 @@ public final class Monitoring {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                subsList_ = new java.util.ArrayList<monitoring.Monitoring.SubscriptionID>();
+                subsDescriptor_ = new java.util.ArrayList<monitoring.Monitoring.SubsDescriptor>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              subsList_.add(
-                  input.readMessage(monitoring.Monitoring.SubscriptionID.parser(), extensionRegistry));
+              subsDescriptor_.add(
+                  input.readMessage(monitoring.Monitoring.SubsDescriptor.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -13274,7 +15870,7 @@ public final class Monitoring {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          subsList_ = java.util.Collections.unmodifiableList(subsList_);
+          subsDescriptor_ = java.util.Collections.unmodifiableList(subsDescriptor_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -13282,55 +15878,55 @@ public final class Monitoring {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return monitoring.Monitoring.internal_static_monitoring_SubsIDList_descriptor;
+      return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return monitoring.Monitoring.internal_static_monitoring_SubsIDList_fieldAccessorTable
+      return monitoring.Monitoring.internal_static_monitoring_SubsList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              monitoring.Monitoring.SubsIDList.class, monitoring.Monitoring.SubsIDList.Builder.class);
+              monitoring.Monitoring.SubsList.class, monitoring.Monitoring.SubsList.Builder.class);
     }
 
-    public static final int SUBS_LIST_FIELD_NUMBER = 1;
-    private java.util.List<monitoring.Monitoring.SubscriptionID> subsList_;
+    public static final int SUBS_DESCRIPTOR_FIELD_NUMBER = 1;
+    private java.util.List<monitoring.Monitoring.SubsDescriptor> subsDescriptor_;
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<monitoring.Monitoring.SubscriptionID> getSubsListList() {
-      return subsList_;
+    public java.util.List<monitoring.Monitoring.SubsDescriptor> getSubsDescriptorList() {
+      return subsDescriptor_;
     }
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends monitoring.Monitoring.SubscriptionIDOrBuilder> 
-        getSubsListOrBuilderList() {
-      return subsList_;
+    public java.util.List<? extends monitoring.Monitoring.SubsDescriptorOrBuilder> 
+        getSubsDescriptorOrBuilderList() {
+      return subsDescriptor_;
     }
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
     @java.lang.Override
-    public int getSubsListCount() {
-      return subsList_.size();
+    public int getSubsDescriptorCount() {
+      return subsDescriptor_.size();
     }
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.SubscriptionID getSubsList(int index) {
-      return subsList_.get(index);
+    public monitoring.Monitoring.SubsDescriptor getSubsDescriptor(int index) {
+      return subsDescriptor_.get(index);
     }
     /**
-     * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+     * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.SubscriptionIDOrBuilder getSubsListOrBuilder(
+    public monitoring.Monitoring.SubsDescriptorOrBuilder getSubsDescriptorOrBuilder(
         int index) {
-      return subsList_.get(index);
+      return subsDescriptor_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -13347,8 +15943,8 @@ public final class Monitoring {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < subsList_.size(); i++) {
-        output.writeMessage(1, subsList_.get(i));
+      for (int i = 0; i < subsDescriptor_.size(); i++) {
+        output.writeMessage(1, subsDescriptor_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -13359,9 +15955,9 @@ public final class Monitoring {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < subsList_.size(); i++) {
+      for (int i = 0; i < subsDescriptor_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, subsList_.get(i));
+          .computeMessageSize(1, subsDescriptor_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -13373,13 +15969,13 @@ public final class Monitoring {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof monitoring.Monitoring.SubsIDList)) {
+      if (!(obj instanceof monitoring.Monitoring.SubsList)) {
         return super.equals(obj);
       }
-      monitoring.Monitoring.SubsIDList other = (monitoring.Monitoring.SubsIDList) obj;
+      monitoring.Monitoring.SubsList other = (monitoring.Monitoring.SubsList) obj;
 
-      if (!getSubsListList()
-          .equals(other.getSubsListList())) return false;
+      if (!getSubsDescriptorList()
+          .equals(other.getSubsDescriptorList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -13391,78 +15987,78 @@ public final class Monitoring {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getSubsListCount() > 0) {
-        hash = (37 * hash) + SUBS_LIST_FIELD_NUMBER;
-        hash = (53 * hash) + getSubsListList().hashCode();
+      if (getSubsDescriptorCount() > 0) {
+        hash = (37 * hash) + SUBS_DESCRIPTOR_FIELD_NUMBER;
+        hash = (53 * hash) + getSubsDescriptorList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(byte[] data)
+    public static monitoring.Monitoring.SubsList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(java.io.InputStream input)
+    public static monitoring.Monitoring.SubsList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static monitoring.Monitoring.SubsIDList parseDelimitedFrom(java.io.InputStream input)
+    public static monitoring.Monitoring.SubsList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static monitoring.Monitoring.SubsIDList parseDelimitedFrom(
+    public static monitoring.Monitoring.SubsList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static monitoring.Monitoring.SubsIDList parseFrom(
+    public static monitoring.Monitoring.SubsList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -13475,7 +16071,7 @@ public final class Monitoring {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(monitoring.Monitoring.SubsIDList prototype) {
+    public static Builder newBuilder(monitoring.Monitoring.SubsList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -13491,26 +16087,26 @@ public final class Monitoring {
       return builder;
     }
     /**
-     * Protobuf type {@code monitoring.SubsIDList}
+     * Protobuf type {@code monitoring.SubsList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:monitoring.SubsIDList)
-        monitoring.Monitoring.SubsIDListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:monitoring.SubsList)
+        monitoring.Monitoring.SubsListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return monitoring.Monitoring.internal_static_monitoring_SubsIDList_descriptor;
+        return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return monitoring.Monitoring.internal_static_monitoring_SubsIDList_fieldAccessorTable
+        return monitoring.Monitoring.internal_static_monitoring_SubsList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                monitoring.Monitoring.SubsIDList.class, monitoring.Monitoring.SubsIDList.Builder.class);
+                monitoring.Monitoring.SubsList.class, monitoring.Monitoring.SubsList.Builder.class);
       }
 
-      // Construct using monitoring.Monitoring.SubsIDList.newBuilder()
+      // Construct using monitoring.Monitoring.SubsList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -13523,17 +16119,17 @@ public final class Monitoring {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getSubsListFieldBuilder();
+          getSubsDescriptorFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (subsListBuilder_ == null) {
-          subsList_ = java.util.Collections.emptyList();
+        if (subsDescriptorBuilder_ == null) {
+          subsDescriptor_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          subsListBuilder_.clear();
+          subsDescriptorBuilder_.clear();
         }
         return this;
       }
@@ -13541,17 +16137,17 @@ public final class Monitoring {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return monitoring.Monitoring.internal_static_monitoring_SubsIDList_descriptor;
+        return monitoring.Monitoring.internal_static_monitoring_SubsList_descriptor;
       }
 
       @java.lang.Override
-      public monitoring.Monitoring.SubsIDList getDefaultInstanceForType() {
-        return monitoring.Monitoring.SubsIDList.getDefaultInstance();
+      public monitoring.Monitoring.SubsList getDefaultInstanceForType() {
+        return monitoring.Monitoring.SubsList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public monitoring.Monitoring.SubsIDList build() {
-        monitoring.Monitoring.SubsIDList result = buildPartial();
+      public monitoring.Monitoring.SubsList build() {
+        monitoring.Monitoring.SubsList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -13559,17 +16155,17 @@ public final class Monitoring {
       }
 
       @java.lang.Override
-      public monitoring.Monitoring.SubsIDList buildPartial() {
-        monitoring.Monitoring.SubsIDList result = new monitoring.Monitoring.SubsIDList(this);
+      public monitoring.Monitoring.SubsList buildPartial() {
+        monitoring.Monitoring.SubsList result = new monitoring.Monitoring.SubsList(this);
         int from_bitField0_ = bitField0_;
-        if (subsListBuilder_ == null) {
+        if (subsDescriptorBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            subsList_ = java.util.Collections.unmodifiableList(subsList_);
+            subsDescriptor_ = java.util.Collections.unmodifiableList(subsDescriptor_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.subsList_ = subsList_;
+          result.subsDescriptor_ = subsDescriptor_;
         } else {
-          result.subsList_ = subsListBuilder_.build();
+          result.subsDescriptor_ = subsDescriptorBuilder_.build();
         }
         onBuilt();
         return result;
@@ -13609,39 +16205,39 @@ public final class Monitoring {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof monitoring.Monitoring.SubsIDList) {
-          return mergeFrom((monitoring.Monitoring.SubsIDList)other);
+        if (other instanceof monitoring.Monitoring.SubsList) {
+          return mergeFrom((monitoring.Monitoring.SubsList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(monitoring.Monitoring.SubsIDList other) {
-        if (other == monitoring.Monitoring.SubsIDList.getDefaultInstance()) return this;
-        if (subsListBuilder_ == null) {
-          if (!other.subsList_.isEmpty()) {
-            if (subsList_.isEmpty()) {
-              subsList_ = other.subsList_;
+      public Builder mergeFrom(monitoring.Monitoring.SubsList other) {
+        if (other == monitoring.Monitoring.SubsList.getDefaultInstance()) return this;
+        if (subsDescriptorBuilder_ == null) {
+          if (!other.subsDescriptor_.isEmpty()) {
+            if (subsDescriptor_.isEmpty()) {
+              subsDescriptor_ = other.subsDescriptor_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureSubsListIsMutable();
-              subsList_.addAll(other.subsList_);
+              ensureSubsDescriptorIsMutable();
+              subsDescriptor_.addAll(other.subsDescriptor_);
             }
             onChanged();
           }
         } else {
-          if (!other.subsList_.isEmpty()) {
-            if (subsListBuilder_.isEmpty()) {
-              subsListBuilder_.dispose();
-              subsListBuilder_ = null;
-              subsList_ = other.subsList_;
+          if (!other.subsDescriptor_.isEmpty()) {
+            if (subsDescriptorBuilder_.isEmpty()) {
+              subsDescriptorBuilder_.dispose();
+              subsDescriptorBuilder_ = null;
+              subsDescriptor_ = other.subsDescriptor_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              subsListBuilder_ = 
+              subsDescriptorBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getSubsListFieldBuilder() : null;
+                   getSubsDescriptorFieldBuilder() : null;
             } else {
-              subsListBuilder_.addAllMessages(other.subsList_);
+              subsDescriptorBuilder_.addAllMessages(other.subsDescriptor_);
             }
           }
         }
@@ -13660,11 +16256,11 @@ public final class Monitoring {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        monitoring.Monitoring.SubsIDList parsedMessage = null;
+        monitoring.Monitoring.SubsList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (monitoring.Monitoring.SubsIDList) e.getUnfinishedMessage();
+          parsedMessage = (monitoring.Monitoring.SubsList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -13675,244 +16271,244 @@ public final class Monitoring {
       }
       private int bitField0_;
 
-      private java.util.List<monitoring.Monitoring.SubscriptionID> subsList_ =
+      private java.util.List<monitoring.Monitoring.SubsDescriptor> subsDescriptor_ =
         java.util.Collections.emptyList();
-      private void ensureSubsListIsMutable() {
+      private void ensureSubsDescriptorIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          subsList_ = new java.util.ArrayList<monitoring.Monitoring.SubscriptionID>(subsList_);
+          subsDescriptor_ = new java.util.ArrayList<monitoring.Monitoring.SubsDescriptor>(subsDescriptor_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.SubscriptionID, monitoring.Monitoring.SubscriptionID.Builder, monitoring.Monitoring.SubscriptionIDOrBuilder> subsListBuilder_;
+          monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.SubsDescriptor.Builder, monitoring.Monitoring.SubsDescriptorOrBuilder> subsDescriptorBuilder_;
 
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public java.util.List<monitoring.Monitoring.SubscriptionID> getSubsListList() {
-        if (subsListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(subsList_);
+      public java.util.List<monitoring.Monitoring.SubsDescriptor> getSubsDescriptorList() {
+        if (subsDescriptorBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(subsDescriptor_);
         } else {
-          return subsListBuilder_.getMessageList();
+          return subsDescriptorBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public int getSubsListCount() {
-        if (subsListBuilder_ == null) {
-          return subsList_.size();
+      public int getSubsDescriptorCount() {
+        if (subsDescriptorBuilder_ == null) {
+          return subsDescriptor_.size();
         } else {
-          return subsListBuilder_.getCount();
+          return subsDescriptorBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.SubscriptionID getSubsList(int index) {
-        if (subsListBuilder_ == null) {
-          return subsList_.get(index);
+      public monitoring.Monitoring.SubsDescriptor getSubsDescriptor(int index) {
+        if (subsDescriptorBuilder_ == null) {
+          return subsDescriptor_.get(index);
         } else {
-          return subsListBuilder_.getMessage(index);
+          return subsDescriptorBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder setSubsList(
-          int index, monitoring.Monitoring.SubscriptionID value) {
-        if (subsListBuilder_ == null) {
+      public Builder setSubsDescriptor(
+          int index, monitoring.Monitoring.SubsDescriptor value) {
+        if (subsDescriptorBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSubsListIsMutable();
-          subsList_.set(index, value);
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.set(index, value);
           onChanged();
         } else {
-          subsListBuilder_.setMessage(index, value);
+          subsDescriptorBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder setSubsList(
-          int index, monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
-        if (subsListBuilder_ == null) {
-          ensureSubsListIsMutable();
-          subsList_.set(index, builderForValue.build());
+      public Builder setSubsDescriptor(
+          int index, monitoring.Monitoring.SubsDescriptor.Builder builderForValue) {
+        if (subsDescriptorBuilder_ == null) {
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.set(index, builderForValue.build());
           onChanged();
         } else {
-          subsListBuilder_.setMessage(index, builderForValue.build());
+          subsDescriptorBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder addSubsList(monitoring.Monitoring.SubscriptionID value) {
-        if (subsListBuilder_ == null) {
+      public Builder addSubsDescriptor(monitoring.Monitoring.SubsDescriptor value) {
+        if (subsDescriptorBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSubsListIsMutable();
-          subsList_.add(value);
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.add(value);
           onChanged();
         } else {
-          subsListBuilder_.addMessage(value);
+          subsDescriptorBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder addSubsList(
-          int index, monitoring.Monitoring.SubscriptionID value) {
-        if (subsListBuilder_ == null) {
+      public Builder addSubsDescriptor(
+          int index, monitoring.Monitoring.SubsDescriptor value) {
+        if (subsDescriptorBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureSubsListIsMutable();
-          subsList_.add(index, value);
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.add(index, value);
           onChanged();
         } else {
-          subsListBuilder_.addMessage(index, value);
+          subsDescriptorBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder addSubsList(
-          monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
-        if (subsListBuilder_ == null) {
-          ensureSubsListIsMutable();
-          subsList_.add(builderForValue.build());
+      public Builder addSubsDescriptor(
+          monitoring.Monitoring.SubsDescriptor.Builder builderForValue) {
+        if (subsDescriptorBuilder_ == null) {
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.add(builderForValue.build());
           onChanged();
         } else {
-          subsListBuilder_.addMessage(builderForValue.build());
+          subsDescriptorBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder addSubsList(
-          int index, monitoring.Monitoring.SubscriptionID.Builder builderForValue) {
-        if (subsListBuilder_ == null) {
-          ensureSubsListIsMutable();
-          subsList_.add(index, builderForValue.build());
+      public Builder addSubsDescriptor(
+          int index, monitoring.Monitoring.SubsDescriptor.Builder builderForValue) {
+        if (subsDescriptorBuilder_ == null) {
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.add(index, builderForValue.build());
           onChanged();
         } else {
-          subsListBuilder_.addMessage(index, builderForValue.build());
+          subsDescriptorBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder addAllSubsList(
-          java.lang.Iterable<? extends monitoring.Monitoring.SubscriptionID> values) {
-        if (subsListBuilder_ == null) {
-          ensureSubsListIsMutable();
+      public Builder addAllSubsDescriptor(
+          java.lang.Iterable<? extends monitoring.Monitoring.SubsDescriptor> values) {
+        if (subsDescriptorBuilder_ == null) {
+          ensureSubsDescriptorIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, subsList_);
+              values, subsDescriptor_);
           onChanged();
         } else {
-          subsListBuilder_.addAllMessages(values);
+          subsDescriptorBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder clearSubsList() {
-        if (subsListBuilder_ == null) {
-          subsList_ = java.util.Collections.emptyList();
+      public Builder clearSubsDescriptor() {
+        if (subsDescriptorBuilder_ == null) {
+          subsDescriptor_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          subsListBuilder_.clear();
+          subsDescriptorBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public Builder removeSubsList(int index) {
-        if (subsListBuilder_ == null) {
-          ensureSubsListIsMutable();
-          subsList_.remove(index);
+      public Builder removeSubsDescriptor(int index) {
+        if (subsDescriptorBuilder_ == null) {
+          ensureSubsDescriptorIsMutable();
+          subsDescriptor_.remove(index);
           onChanged();
         } else {
-          subsListBuilder_.remove(index);
+          subsDescriptorBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.SubscriptionID.Builder getSubsListBuilder(
+      public monitoring.Monitoring.SubsDescriptor.Builder getSubsDescriptorBuilder(
           int index) {
-        return getSubsListFieldBuilder().getBuilder(index);
+        return getSubsDescriptorFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.SubscriptionIDOrBuilder getSubsListOrBuilder(
+      public monitoring.Monitoring.SubsDescriptorOrBuilder getSubsDescriptorOrBuilder(
           int index) {
-        if (subsListBuilder_ == null) {
-          return subsList_.get(index);  } else {
-          return subsListBuilder_.getMessageOrBuilder(index);
+        if (subsDescriptorBuilder_ == null) {
+          return subsDescriptor_.get(index);  } else {
+          return subsDescriptorBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public java.util.List<? extends monitoring.Monitoring.SubscriptionIDOrBuilder> 
-           getSubsListOrBuilderList() {
-        if (subsListBuilder_ != null) {
-          return subsListBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends monitoring.Monitoring.SubsDescriptorOrBuilder> 
+           getSubsDescriptorOrBuilderList() {
+        if (subsDescriptorBuilder_ != null) {
+          return subsDescriptorBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(subsList_);
+          return java.util.Collections.unmodifiableList(subsDescriptor_);
         }
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.SubscriptionID.Builder addSubsListBuilder() {
-        return getSubsListFieldBuilder().addBuilder(
-            monitoring.Monitoring.SubscriptionID.getDefaultInstance());
+      public monitoring.Monitoring.SubsDescriptor.Builder addSubsDescriptorBuilder() {
+        return getSubsDescriptorFieldBuilder().addBuilder(
+            monitoring.Monitoring.SubsDescriptor.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.SubscriptionID.Builder addSubsListBuilder(
+      public monitoring.Monitoring.SubsDescriptor.Builder addSubsDescriptorBuilder(
           int index) {
-        return getSubsListFieldBuilder().addBuilder(
-            index, monitoring.Monitoring.SubscriptionID.getDefaultInstance());
+        return getSubsDescriptorFieldBuilder().addBuilder(
+            index, monitoring.Monitoring.SubsDescriptor.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.SubscriptionID subs_list = 1;</code>
+       * <code>repeated .monitoring.SubsDescriptor subs_descriptor = 1;</code>
        */
-      public java.util.List<monitoring.Monitoring.SubscriptionID.Builder> 
-           getSubsListBuilderList() {
-        return getSubsListFieldBuilder().getBuilderList();
+      public java.util.List<monitoring.Monitoring.SubsDescriptor.Builder> 
+           getSubsDescriptorBuilderList() {
+        return getSubsDescriptorFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.SubscriptionID, monitoring.Monitoring.SubscriptionID.Builder, monitoring.Monitoring.SubscriptionIDOrBuilder> 
-          getSubsListFieldBuilder() {
-        if (subsListBuilder_ == null) {
-          subsListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              monitoring.Monitoring.SubscriptionID, monitoring.Monitoring.SubscriptionID.Builder, monitoring.Monitoring.SubscriptionIDOrBuilder>(
-                  subsList_,
+          monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.SubsDescriptor.Builder, monitoring.Monitoring.SubsDescriptorOrBuilder> 
+          getSubsDescriptorFieldBuilder() {
+        if (subsDescriptorBuilder_ == null) {
+          subsDescriptorBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.SubsDescriptor.Builder, monitoring.Monitoring.SubsDescriptorOrBuilder>(
+                  subsDescriptor_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          subsList_ = null;
+          subsDescriptor_ = null;
         }
-        return subsListBuilder_;
+        return subsDescriptorBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -13927,41 +16523,41 @@ public final class Monitoring {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:monitoring.SubsIDList)
+      // @@protoc_insertion_point(builder_scope:monitoring.SubsList)
     }
 
-    // @@protoc_insertion_point(class_scope:monitoring.SubsIDList)
-    private static final monitoring.Monitoring.SubsIDList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:monitoring.SubsList)
+    private static final monitoring.Monitoring.SubsList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new monitoring.Monitoring.SubsIDList();
+      DEFAULT_INSTANCE = new monitoring.Monitoring.SubsList();
     }
 
-    public static monitoring.Monitoring.SubsIDList getDefaultInstance() {
+    public static monitoring.Monitoring.SubsList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<SubsIDList>
-        PARSER = new com.google.protobuf.AbstractParser<SubsIDList>() {
+    private static final com.google.protobuf.Parser<SubsList>
+        PARSER = new com.google.protobuf.AbstractParser<SubsList>() {
       @java.lang.Override
-      public SubsIDList parsePartialFrom(
+      public SubsList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new SubsIDList(input, extensionRegistry);
+        return new SubsList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<SubsIDList> parser() {
+    public static com.google.protobuf.Parser<SubsList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<SubsIDList> getParserForType() {
+    public com.google.protobuf.Parser<SubsList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public monitoring.Monitoring.SubsIDList getDefaultInstanceForType() {
+    public monitoring.Monitoring.SubsList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -14011,52 +16607,34 @@ public final class Monitoring {
         getNameBytes();
 
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-     */
-    java.util.List<monitoring.Monitoring.KpiId> 
-        getKpiIdList();
-    /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-     */
-    monitoring.Monitoring.KpiId getKpiId(int index);
-    /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+     * <code>.monitoring.KpiId kpi_id = 4;</code>
+     * @return Whether the kpiId field is set.
      */
-    int getKpiIdCount();
+    boolean hasKpiId();
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+     * <code>.monitoring.KpiId kpi_id = 4;</code>
+     * @return The kpiId.
      */
-    java.util.List<? extends monitoring.Monitoring.KpiIdOrBuilder> 
-        getKpiIdOrBuilderList();
+    monitoring.Monitoring.KpiId getKpiId();
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+     * <code>.monitoring.KpiId kpi_id = 4;</code>
      */
-    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(
-        int index);
+    monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder();
 
     /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-     */
-    java.util.List<monitoring.Monitoring.KpiValueRange> 
-        getKpiValueRangeList();
-    /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * @return Whether the kpiValueRange field is set.
      */
-    monitoring.Monitoring.KpiValueRange getKpiValueRange(int index);
+    boolean hasKpiValueRange();
     /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * @return The kpiValueRange.
      */
-    int getKpiValueRangeCount();
+    monitoring.Monitoring.KpiValueRange getKpiValueRange();
     /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
      */
-    java.util.List<? extends monitoring.Monitoring.KpiValueRangeOrBuilder> 
-        getKpiValueRangeOrBuilderList();
-    /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-     */
-    monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder(
-        int index);
+    monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder();
 
     /**
      * <code>.context.Timestamp timestamp = 6;</code>
@@ -14088,8 +16666,6 @@ public final class Monitoring {
     private AlarmDescriptor() {
       alarmDescription_ = "";
       name_ = "";
-      kpiId_ = java.util.Collections.emptyList();
-      kpiValueRange_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
@@ -14112,7 +16688,6 @@ public final class Monitoring {
       if (extensionRegistry == null) {
         throw new java.lang.NullPointerException();
       }
-      int mutable_bitField0_ = 0;
       com.google.protobuf.UnknownFieldSet.Builder unknownFields =
           com.google.protobuf.UnknownFieldSet.newBuilder();
       try {
@@ -14149,21 +16724,29 @@ public final class Monitoring {
               break;
             }
             case 34: {
-              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                kpiId_ = new java.util.ArrayList<monitoring.Monitoring.KpiId>();
-                mutable_bitField0_ |= 0x00000001;
+              monitoring.Monitoring.KpiId.Builder subBuilder = null;
+              if (kpiId_ != null) {
+                subBuilder = kpiId_.toBuilder();
               }
-              kpiId_.add(
-                  input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry));
+              kpiId_ = input.readMessage(monitoring.Monitoring.KpiId.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiId_);
+                kpiId_ = subBuilder.buildPartial();
+              }
+
               break;
             }
             case 42: {
-              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
-                kpiValueRange_ = new java.util.ArrayList<monitoring.Monitoring.KpiValueRange>();
-                mutable_bitField0_ |= 0x00000002;
+              monitoring.Monitoring.KpiValueRange.Builder subBuilder = null;
+              if (kpiValueRange_ != null) {
+                subBuilder = kpiValueRange_.toBuilder();
               }
-              kpiValueRange_.add(
-                  input.readMessage(monitoring.Monitoring.KpiValueRange.parser(), extensionRegistry));
+              kpiValueRange_ = input.readMessage(monitoring.Monitoring.KpiValueRange.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(kpiValueRange_);
+                kpiValueRange_ = subBuilder.buildPartial();
+              }
+
               break;
             }
             case 50: {
@@ -14194,12 +16777,6 @@ public final class Monitoring {
         throw new com.google.protobuf.InvalidProtocolBufferException(
             e).setUnfinishedMessage(this);
       } finally {
-        if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          kpiId_ = java.util.Collections.unmodifiableList(kpiId_);
-        }
-        if (((mutable_bitField0_ & 0x00000002) != 0)) {
-          kpiValueRange_ = java.util.Collections.unmodifiableList(kpiValueRange_);
-        }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
       }
@@ -14319,84 +16896,56 @@ public final class Monitoring {
       }
     }
 
-    public static final int KPI_ID_FIELD_NUMBER = 4;
-    private java.util.List<monitoring.Monitoring.KpiId> kpiId_;
-    /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-     */
-    @java.lang.Override
-    public java.util.List<monitoring.Monitoring.KpiId> getKpiIdList() {
-      return kpiId_;
-    }
-    /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends monitoring.Monitoring.KpiIdOrBuilder> 
-        getKpiIdOrBuilderList() {
-      return kpiId_;
-    }
+    public static final int KPI_ID_FIELD_NUMBER = 4;
+    private monitoring.Monitoring.KpiId kpiId_;
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+     * <code>.monitoring.KpiId kpi_id = 4;</code>
+     * @return Whether the kpiId field is set.
      */
     @java.lang.Override
-    public int getKpiIdCount() {
-      return kpiId_.size();
+    public boolean hasKpiId() {
+      return kpiId_ != null;
     }
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+     * <code>.monitoring.KpiId kpi_id = 4;</code>
+     * @return The kpiId.
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiId getKpiId(int index) {
-      return kpiId_.get(index);
+    public monitoring.Monitoring.KpiId getKpiId() {
+      return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
     }
     /**
-     * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+     * <code>.monitoring.KpiId kpi_id = 4;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(
-        int index) {
-      return kpiId_.get(index);
+    public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
+      return getKpiId();
     }
 
     public static final int KPI_VALUE_RANGE_FIELD_NUMBER = 5;
-    private java.util.List<monitoring.Monitoring.KpiValueRange> kpiValueRange_;
-    /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-     */
-    @java.lang.Override
-    public java.util.List<monitoring.Monitoring.KpiValueRange> getKpiValueRangeList() {
-      return kpiValueRange_;
-    }
-    /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-     */
-    @java.lang.Override
-    public java.util.List<? extends monitoring.Monitoring.KpiValueRangeOrBuilder> 
-        getKpiValueRangeOrBuilderList() {
-      return kpiValueRange_;
-    }
+    private monitoring.Monitoring.KpiValueRange kpiValueRange_;
     /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * @return Whether the kpiValueRange field is set.
      */
     @java.lang.Override
-    public int getKpiValueRangeCount() {
-      return kpiValueRange_.size();
+    public boolean hasKpiValueRange() {
+      return kpiValueRange_ != null;
     }
     /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * @return The kpiValueRange.
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiValueRange getKpiValueRange(int index) {
-      return kpiValueRange_.get(index);
+    public monitoring.Monitoring.KpiValueRange getKpiValueRange() {
+      return kpiValueRange_ == null ? monitoring.Monitoring.KpiValueRange.getDefaultInstance() : kpiValueRange_;
     }
     /**
-     * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+     * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder(
-        int index) {
-      return kpiValueRange_.get(index);
+    public monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder() {
+      return getKpiValueRange();
     }
 
     public static final int TIMESTAMP_FIELD_NUMBER = 6;
@@ -14448,11 +16997,11 @@ public final class Monitoring {
       if (!getNameBytes().isEmpty()) {
         com.google.protobuf.GeneratedMessageV3.writeString(output, 3, name_);
       }
-      for (int i = 0; i < kpiId_.size(); i++) {
-        output.writeMessage(4, kpiId_.get(i));
+      if (kpiId_ != null) {
+        output.writeMessage(4, getKpiId());
       }
-      for (int i = 0; i < kpiValueRange_.size(); i++) {
-        output.writeMessage(5, kpiValueRange_.get(i));
+      if (kpiValueRange_ != null) {
+        output.writeMessage(5, getKpiValueRange());
       }
       if (timestamp_ != null) {
         output.writeMessage(6, getTimestamp());
@@ -14476,13 +17025,13 @@ public final class Monitoring {
       if (!getNameBytes().isEmpty()) {
         size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, name_);
       }
-      for (int i = 0; i < kpiId_.size(); i++) {
+      if (kpiId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, kpiId_.get(i));
+          .computeMessageSize(4, getKpiId());
       }
-      for (int i = 0; i < kpiValueRange_.size(); i++) {
+      if (kpiValueRange_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(5, kpiValueRange_.get(i));
+          .computeMessageSize(5, getKpiValueRange());
       }
       if (timestamp_ != null) {
         size += com.google.protobuf.CodedOutputStream
@@ -14512,10 +17061,16 @@ public final class Monitoring {
           .equals(other.getAlarmDescription())) return false;
       if (!getName()
           .equals(other.getName())) return false;
-      if (!getKpiIdList()
-          .equals(other.getKpiIdList())) return false;
-      if (!getKpiValueRangeList()
-          .equals(other.getKpiValueRangeList())) return false;
+      if (hasKpiId() != other.hasKpiId()) return false;
+      if (hasKpiId()) {
+        if (!getKpiId()
+            .equals(other.getKpiId())) return false;
+      }
+      if (hasKpiValueRange() != other.hasKpiValueRange()) return false;
+      if (hasKpiValueRange()) {
+        if (!getKpiValueRange()
+            .equals(other.getKpiValueRange())) return false;
+      }
       if (hasTimestamp() != other.hasTimestamp()) return false;
       if (hasTimestamp()) {
         if (!getTimestamp()
@@ -14540,13 +17095,13 @@ public final class Monitoring {
       hash = (53 * hash) + getAlarmDescription().hashCode();
       hash = (37 * hash) + NAME_FIELD_NUMBER;
       hash = (53 * hash) + getName().hashCode();
-      if (getKpiIdCount() > 0) {
+      if (hasKpiId()) {
         hash = (37 * hash) + KPI_ID_FIELD_NUMBER;
-        hash = (53 * hash) + getKpiIdList().hashCode();
+        hash = (53 * hash) + getKpiId().hashCode();
       }
-      if (getKpiValueRangeCount() > 0) {
+      if (hasKpiValueRange()) {
         hash = (37 * hash) + KPI_VALUE_RANGE_FIELD_NUMBER;
-        hash = (53 * hash) + getKpiValueRangeList().hashCode();
+        hash = (53 * hash) + getKpiValueRange().hashCode();
       }
       if (hasTimestamp()) {
         hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
@@ -14680,8 +17235,6 @@ public final class Monitoring {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getKpiIdFieldBuilder();
-          getKpiValueRangeFieldBuilder();
         }
       }
       @java.lang.Override
@@ -14698,16 +17251,16 @@ public final class Monitoring {
         name_ = "";
 
         if (kpiIdBuilder_ == null) {
-          kpiId_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
+          kpiId_ = null;
         } else {
-          kpiIdBuilder_.clear();
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
         }
         if (kpiValueRangeBuilder_ == null) {
-          kpiValueRange_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
+          kpiValueRange_ = null;
         } else {
-          kpiValueRangeBuilder_.clear();
+          kpiValueRange_ = null;
+          kpiValueRangeBuilder_ = null;
         }
         if (timestampBuilder_ == null) {
           timestamp_ = null;
@@ -14741,7 +17294,6 @@ public final class Monitoring {
       @java.lang.Override
       public monitoring.Monitoring.AlarmDescriptor buildPartial() {
         monitoring.Monitoring.AlarmDescriptor result = new monitoring.Monitoring.AlarmDescriptor(this);
-        int from_bitField0_ = bitField0_;
         if (alarmIdBuilder_ == null) {
           result.alarmId_ = alarmId_;
         } else {
@@ -14750,19 +17302,11 @@ public final class Monitoring {
         result.alarmDescription_ = alarmDescription_;
         result.name_ = name_;
         if (kpiIdBuilder_ == null) {
-          if (((bitField0_ & 0x00000001) != 0)) {
-            kpiId_ = java.util.Collections.unmodifiableList(kpiId_);
-            bitField0_ = (bitField0_ & ~0x00000001);
-          }
           result.kpiId_ = kpiId_;
         } else {
           result.kpiId_ = kpiIdBuilder_.build();
         }
         if (kpiValueRangeBuilder_ == null) {
-          if (((bitField0_ & 0x00000002) != 0)) {
-            kpiValueRange_ = java.util.Collections.unmodifiableList(kpiValueRange_);
-            bitField0_ = (bitField0_ & ~0x00000002);
-          }
           result.kpiValueRange_ = kpiValueRange_;
         } else {
           result.kpiValueRange_ = kpiValueRangeBuilder_.build();
@@ -14831,57 +17375,11 @@ public final class Monitoring {
           name_ = other.name_;
           onChanged();
         }
-        if (kpiIdBuilder_ == null) {
-          if (!other.kpiId_.isEmpty()) {
-            if (kpiId_.isEmpty()) {
-              kpiId_ = other.kpiId_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-            } else {
-              ensureKpiIdIsMutable();
-              kpiId_.addAll(other.kpiId_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.kpiId_.isEmpty()) {
-            if (kpiIdBuilder_.isEmpty()) {
-              kpiIdBuilder_.dispose();
-              kpiIdBuilder_ = null;
-              kpiId_ = other.kpiId_;
-              bitField0_ = (bitField0_ & ~0x00000001);
-              kpiIdBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getKpiIdFieldBuilder() : null;
-            } else {
-              kpiIdBuilder_.addAllMessages(other.kpiId_);
-            }
-          }
+        if (other.hasKpiId()) {
+          mergeKpiId(other.getKpiId());
         }
-        if (kpiValueRangeBuilder_ == null) {
-          if (!other.kpiValueRange_.isEmpty()) {
-            if (kpiValueRange_.isEmpty()) {
-              kpiValueRange_ = other.kpiValueRange_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-            } else {
-              ensureKpiValueRangeIsMutable();
-              kpiValueRange_.addAll(other.kpiValueRange_);
-            }
-            onChanged();
-          }
-        } else {
-          if (!other.kpiValueRange_.isEmpty()) {
-            if (kpiValueRangeBuilder_.isEmpty()) {
-              kpiValueRangeBuilder_.dispose();
-              kpiValueRangeBuilder_ = null;
-              kpiValueRange_ = other.kpiValueRange_;
-              bitField0_ = (bitField0_ & ~0x00000002);
-              kpiValueRangeBuilder_ = 
-                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getKpiValueRangeFieldBuilder() : null;
-            } else {
-              kpiValueRangeBuilder_.addAllMessages(other.kpiValueRange_);
-            }
-          }
+        if (other.hasKpiValueRange()) {
+          mergeKpiValueRange(other.getKpiValueRange());
         }
         if (other.hasTimestamp()) {
           mergeTimestamp(other.getTimestamp());
@@ -14914,7 +17412,6 @@ public final class Monitoring {
         }
         return this;
       }
-      private int bitField0_;
 
       private monitoring.Monitoring.AlarmID alarmId_;
       private com.google.protobuf.SingleFieldBuilderV3<
@@ -15187,239 +17684,118 @@ public final class Monitoring {
         return this;
       }
 
-      private java.util.List<monitoring.Monitoring.KpiId> kpiId_ =
-        java.util.Collections.emptyList();
-      private void ensureKpiIdIsMutable() {
-        if (!((bitField0_ & 0x00000001) != 0)) {
-          kpiId_ = new java.util.ArrayList<monitoring.Monitoring.KpiId>(kpiId_);
-          bitField0_ |= 0x00000001;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
+      private monitoring.Monitoring.KpiId kpiId_;
+      private com.google.protobuf.SingleFieldBuilderV3<
           monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> kpiIdBuilder_;
-
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public java.util.List<monitoring.Monitoring.KpiId> getKpiIdList() {
-        if (kpiIdBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(kpiId_);
-        } else {
-          return kpiIdBuilder_.getMessageList();
-        }
-      }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
+       * @return Whether the kpiId field is set.
        */
-      public int getKpiIdCount() {
-        if (kpiIdBuilder_ == null) {
-          return kpiId_.size();
-        } else {
-          return kpiIdBuilder_.getCount();
-        }
+      public boolean hasKpiId() {
+        return kpiIdBuilder_ != null || kpiId_ != null;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
+       * @return The kpiId.
        */
-      public monitoring.Monitoring.KpiId getKpiId(int index) {
+      public monitoring.Monitoring.KpiId getKpiId() {
         if (kpiIdBuilder_ == null) {
-          return kpiId_.get(index);
+          return kpiId_ == null ? monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
         } else {
-          return kpiIdBuilder_.getMessage(index);
+          return kpiIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
-      public Builder setKpiId(
-          int index, monitoring.Monitoring.KpiId value) {
+      public Builder setKpiId(monitoring.Monitoring.KpiId value) {
         if (kpiIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureKpiIdIsMutable();
-          kpiId_.set(index, value);
+          kpiId_ = value;
           onChanged();
         } else {
-          kpiIdBuilder_.setMessage(index, value);
+          kpiIdBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
       public Builder setKpiId(
-          int index, monitoring.Monitoring.KpiId.Builder builderForValue) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          kpiIdBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public Builder addKpiId(monitoring.Monitoring.KpiId value) {
-        if (kpiIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiIdIsMutable();
-          kpiId_.add(value);
-          onChanged();
-        } else {
-          kpiIdBuilder_.addMessage(value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public Builder addKpiId(
-          int index, monitoring.Monitoring.KpiId value) {
-        if (kpiIdBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiIdIsMutable();
-          kpiId_.add(index, value);
-          onChanged();
-        } else {
-          kpiIdBuilder_.addMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public Builder addKpiId(
           monitoring.Monitoring.KpiId.Builder builderForValue) {
         if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.add(builderForValue.build());
-          onChanged();
-        } else {
-          kpiIdBuilder_.addMessage(builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public Builder addKpiId(
-          int index, monitoring.Monitoring.KpiId.Builder builderForValue) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.add(index, builderForValue.build());
+          kpiId_ = builderForValue.build();
           onChanged();
         } else {
-          kpiIdBuilder_.addMessage(index, builderForValue.build());
+          kpiIdBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
-      public Builder addAllKpiId(
-          java.lang.Iterable<? extends monitoring.Monitoring.KpiId> values) {
+      public Builder mergeKpiId(monitoring.Monitoring.KpiId value) {
         if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, kpiId_);
+          if (kpiId_ != null) {
+            kpiId_ =
+              monitoring.Monitoring.KpiId.newBuilder(kpiId_).mergeFrom(value).buildPartial();
+          } else {
+            kpiId_ = value;
+          }
           onChanged();
         } else {
-          kpiIdBuilder_.addAllMessages(values);
+          kpiIdBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
       public Builder clearKpiId() {
         if (kpiIdBuilder_ == null) {
-          kpiId_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000001);
-          onChanged();
-        } else {
-          kpiIdBuilder_.clear();
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public Builder removeKpiId(int index) {
-        if (kpiIdBuilder_ == null) {
-          ensureKpiIdIsMutable();
-          kpiId_.remove(index);
+          kpiId_ = null;
           onChanged();
         } else {
-          kpiIdBuilder_.remove(index);
+          kpiId_ = null;
+          kpiIdBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder(
-          int index) {
-        return getKpiIdFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
-      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder(
-          int index) {
-        if (kpiIdBuilder_ == null) {
-          return kpiId_.get(index);  } else {
-          return kpiIdBuilder_.getMessageOrBuilder(index);
-        }
+      public monitoring.Monitoring.KpiId.Builder getKpiIdBuilder() {
+        
+        onChanged();
+        return getKpiIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
-      public java.util.List<? extends monitoring.Monitoring.KpiIdOrBuilder> 
-           getKpiIdOrBuilderList() {
+      public monitoring.Monitoring.KpiIdOrBuilder getKpiIdOrBuilder() {
         if (kpiIdBuilder_ != null) {
-          return kpiIdBuilder_.getMessageOrBuilderList();
+          return kpiIdBuilder_.getMessageOrBuilder();
         } else {
-          return java.util.Collections.unmodifiableList(kpiId_);
+          return kpiId_ == null ?
+              monitoring.Monitoring.KpiId.getDefaultInstance() : kpiId_;
         }
       }
       /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public monitoring.Monitoring.KpiId.Builder addKpiIdBuilder() {
-        return getKpiIdFieldBuilder().addBuilder(
-            monitoring.Monitoring.KpiId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
-       */
-      public monitoring.Monitoring.KpiId.Builder addKpiIdBuilder(
-          int index) {
-        return getKpiIdFieldBuilder().addBuilder(
-            index, monitoring.Monitoring.KpiId.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .monitoring.KpiId kpi_id = 4;</code>
+       * <code>.monitoring.KpiId kpi_id = 4;</code>
        */
-      public java.util.List<monitoring.Monitoring.KpiId.Builder> 
-           getKpiIdBuilderList() {
-        return getKpiIdFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
+      private com.google.protobuf.SingleFieldBuilderV3<
           monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder> 
           getKpiIdFieldBuilder() {
         if (kpiIdBuilder_ == null) {
-          kpiIdBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+          kpiIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
               monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiId.Builder, monitoring.Monitoring.KpiIdOrBuilder>(
-                  kpiId_,
-                  ((bitField0_ & 0x00000001) != 0),
+                  getKpiId(),
                   getParentForChildren(),
                   isClean());
           kpiId_ = null;
@@ -15427,239 +17803,118 @@ public final class Monitoring {
         return kpiIdBuilder_;
       }
 
-      private java.util.List<monitoring.Monitoring.KpiValueRange> kpiValueRange_ =
-        java.util.Collections.emptyList();
-      private void ensureKpiValueRangeIsMutable() {
-        if (!((bitField0_ & 0x00000002) != 0)) {
-          kpiValueRange_ = new java.util.ArrayList<monitoring.Monitoring.KpiValueRange>(kpiValueRange_);
-          bitField0_ |= 0x00000002;
-         }
-      }
-
-      private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.KpiValueRange, monitoring.Monitoring.KpiValueRange.Builder, monitoring.Monitoring.KpiValueRangeOrBuilder> kpiValueRangeBuilder_;
-
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public java.util.List<monitoring.Monitoring.KpiValueRange> getKpiValueRangeList() {
-        if (kpiValueRangeBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(kpiValueRange_);
-        } else {
-          return kpiValueRangeBuilder_.getMessageList();
-        }
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public int getKpiValueRangeCount() {
-        if (kpiValueRangeBuilder_ == null) {
-          return kpiValueRange_.size();
-        } else {
-          return kpiValueRangeBuilder_.getCount();
-        }
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public monitoring.Monitoring.KpiValueRange getKpiValueRange(int index) {
-        if (kpiValueRangeBuilder_ == null) {
-          return kpiValueRange_.get(index);
-        } else {
-          return kpiValueRangeBuilder_.getMessage(index);
-        }
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public Builder setKpiValueRange(
-          int index, monitoring.Monitoring.KpiValueRange value) {
-        if (kpiValueRangeBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.set(index, value);
-          onChanged();
-        } else {
-          kpiValueRangeBuilder_.setMessage(index, value);
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public Builder setKpiValueRange(
-          int index, monitoring.Monitoring.KpiValueRange.Builder builderForValue) {
-        if (kpiValueRangeBuilder_ == null) {
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.set(index, builderForValue.build());
-          onChanged();
-        } else {
-          kpiValueRangeBuilder_.setMessage(index, builderForValue.build());
-        }
-        return this;
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public Builder addKpiValueRange(monitoring.Monitoring.KpiValueRange value) {
-        if (kpiValueRangeBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.add(value);
-          onChanged();
-        } else {
-          kpiValueRangeBuilder_.addMessage(value);
-        }
-        return this;
-      }
+      private monitoring.Monitoring.KpiValueRange kpiValueRange_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          monitoring.Monitoring.KpiValueRange, monitoring.Monitoring.KpiValueRange.Builder, monitoring.Monitoring.KpiValueRangeOrBuilder> kpiValueRangeBuilder_;
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * @return Whether the kpiValueRange field is set.
        */
-      public Builder addKpiValueRange(
-          int index, monitoring.Monitoring.KpiValueRange value) {
-        if (kpiValueRangeBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.add(index, value);
-          onChanged();
-        } else {
-          kpiValueRangeBuilder_.addMessage(index, value);
-        }
-        return this;
+      public boolean hasKpiValueRange() {
+        return kpiValueRangeBuilder_ != null || kpiValueRange_ != null;
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * @return The kpiValueRange.
        */
-      public Builder addKpiValueRange(
-          monitoring.Monitoring.KpiValueRange.Builder builderForValue) {
+      public monitoring.Monitoring.KpiValueRange getKpiValueRange() {
         if (kpiValueRangeBuilder_ == null) {
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.add(builderForValue.build());
-          onChanged();
+          return kpiValueRange_ == null ? monitoring.Monitoring.KpiValueRange.getDefaultInstance() : kpiValueRange_;
         } else {
-          kpiValueRangeBuilder_.addMessage(builderForValue.build());
+          return kpiValueRangeBuilder_.getMessage();
         }
-        return this;
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public Builder addKpiValueRange(
-          int index, monitoring.Monitoring.KpiValueRange.Builder builderForValue) {
+      public Builder setKpiValueRange(monitoring.Monitoring.KpiValueRange value) {
         if (kpiValueRangeBuilder_ == null) {
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.add(index, builderForValue.build());
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          kpiValueRange_ = value;
           onChanged();
         } else {
-          kpiValueRangeBuilder_.addMessage(index, builderForValue.build());
+          kpiValueRangeBuilder_.setMessage(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public Builder addAllKpiValueRange(
-          java.lang.Iterable<? extends monitoring.Monitoring.KpiValueRange> values) {
+      public Builder setKpiValueRange(
+          monitoring.Monitoring.KpiValueRange.Builder builderForValue) {
         if (kpiValueRangeBuilder_ == null) {
-          ensureKpiValueRangeIsMutable();
-          com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, kpiValueRange_);
+          kpiValueRange_ = builderForValue.build();
           onChanged();
         } else {
-          kpiValueRangeBuilder_.addAllMessages(values);
+          kpiValueRangeBuilder_.setMessage(builderForValue.build());
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public Builder clearKpiValueRange() {
+      public Builder mergeKpiValueRange(monitoring.Monitoring.KpiValueRange value) {
         if (kpiValueRangeBuilder_ == null) {
-          kpiValueRange_ = java.util.Collections.emptyList();
-          bitField0_ = (bitField0_ & ~0x00000002);
+          if (kpiValueRange_ != null) {
+            kpiValueRange_ =
+              monitoring.Monitoring.KpiValueRange.newBuilder(kpiValueRange_).mergeFrom(value).buildPartial();
+          } else {
+            kpiValueRange_ = value;
+          }
           onChanged();
         } else {
-          kpiValueRangeBuilder_.clear();
+          kpiValueRangeBuilder_.mergeFrom(value);
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public Builder removeKpiValueRange(int index) {
+      public Builder clearKpiValueRange() {
         if (kpiValueRangeBuilder_ == null) {
-          ensureKpiValueRangeIsMutable();
-          kpiValueRange_.remove(index);
+          kpiValueRange_ = null;
           onChanged();
         } else {
-          kpiValueRangeBuilder_.remove(index);
+          kpiValueRange_ = null;
+          kpiValueRangeBuilder_ = null;
         }
+
         return this;
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public monitoring.Monitoring.KpiValueRange.Builder getKpiValueRangeBuilder(
-          int index) {
-        return getKpiValueRangeFieldBuilder().getBuilder(index);
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder(
-          int index) {
-        if (kpiValueRangeBuilder_ == null) {
-          return kpiValueRange_.get(index);  } else {
-          return kpiValueRangeBuilder_.getMessageOrBuilder(index);
-        }
+      public monitoring.Monitoring.KpiValueRange.Builder getKpiValueRangeBuilder() {
+        
+        onChanged();
+        return getKpiValueRangeFieldBuilder().getBuilder();
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public java.util.List<? extends monitoring.Monitoring.KpiValueRangeOrBuilder> 
-           getKpiValueRangeOrBuilderList() {
+      public monitoring.Monitoring.KpiValueRangeOrBuilder getKpiValueRangeOrBuilder() {
         if (kpiValueRangeBuilder_ != null) {
-          return kpiValueRangeBuilder_.getMessageOrBuilderList();
+          return kpiValueRangeBuilder_.getMessageOrBuilder();
         } else {
-          return java.util.Collections.unmodifiableList(kpiValueRange_);
+          return kpiValueRange_ == null ?
+              monitoring.Monitoring.KpiValueRange.getDefaultInstance() : kpiValueRange_;
         }
       }
       /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public monitoring.Monitoring.KpiValueRange.Builder addKpiValueRangeBuilder() {
-        return getKpiValueRangeFieldBuilder().addBuilder(
-            monitoring.Monitoring.KpiValueRange.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
+       * <code>.monitoring.KpiValueRange kpi_value_range = 5;</code>
        */
-      public monitoring.Monitoring.KpiValueRange.Builder addKpiValueRangeBuilder(
-          int index) {
-        return getKpiValueRangeFieldBuilder().addBuilder(
-            index, monitoring.Monitoring.KpiValueRange.getDefaultInstance());
-      }
-      /**
-       * <code>repeated .monitoring.KpiValueRange kpi_value_range = 5;</code>
-       */
-      public java.util.List<monitoring.Monitoring.KpiValueRange.Builder> 
-           getKpiValueRangeBuilderList() {
-        return getKpiValueRangeFieldBuilder().getBuilderList();
-      }
-      private com.google.protobuf.RepeatedFieldBuilderV3<
+      private com.google.protobuf.SingleFieldBuilderV3<
           monitoring.Monitoring.KpiValueRange, monitoring.Monitoring.KpiValueRange.Builder, monitoring.Monitoring.KpiValueRangeOrBuilder> 
           getKpiValueRangeFieldBuilder() {
         if (kpiValueRangeBuilder_ == null) {
-          kpiValueRangeBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+          kpiValueRangeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
               monitoring.Monitoring.KpiValueRange, monitoring.Monitoring.KpiValueRange.Builder, monitoring.Monitoring.KpiValueRangeOrBuilder>(
-                  kpiValueRange_,
-                  ((bitField0_ & 0x00000002) != 0),
+                  getKpiValueRange(),
                   getParentForChildren(),
                   isClean());
           kpiValueRange_ = null;
@@ -16464,19 +18719,19 @@ public final class Monitoring {
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>.monitoring.AlarmID alarmID = 1;</code>
-     * @return Whether the alarmID field is set.
+     * <code>.monitoring.AlarmID alarm_id = 1;</code>
+     * @return Whether the alarmId field is set.
      */
-    boolean hasAlarmID();
+    boolean hasAlarmId();
     /**
-     * <code>.monitoring.AlarmID alarmID = 1;</code>
-     * @return The alarmID.
+     * <code>.monitoring.AlarmID alarm_id = 1;</code>
+     * @return The alarmId.
      */
-    monitoring.Monitoring.AlarmID getAlarmID();
+    monitoring.Monitoring.AlarmID getAlarmId();
     /**
-     * <code>.monitoring.AlarmID alarmID = 1;</code>
+     * <code>.monitoring.AlarmID alarm_id = 1;</code>
      */
-    monitoring.Monitoring.AlarmIDOrBuilder getAlarmIDOrBuilder();
+    monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder();
 
     /**
      * <code>float subscription_timeout_s = 2;</code>
@@ -16537,13 +18792,13 @@ public final class Monitoring {
               break;
             case 10: {
               monitoring.Monitoring.AlarmID.Builder subBuilder = null;
-              if (alarmID_ != null) {
-                subBuilder = alarmID_.toBuilder();
+              if (alarmId_ != null) {
+                subBuilder = alarmId_.toBuilder();
               }
-              alarmID_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
+              alarmId_ = input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(alarmID_);
-                alarmID_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(alarmId_);
+                alarmId_ = subBuilder.buildPartial();
               }
 
               break;
@@ -16590,30 +18845,30 @@ public final class Monitoring {
               monitoring.Monitoring.AlarmSubscription.class, monitoring.Monitoring.AlarmSubscription.Builder.class);
     }
 
-    public static final int ALARMID_FIELD_NUMBER = 1;
-    private monitoring.Monitoring.AlarmID alarmID_;
+    public static final int ALARM_ID_FIELD_NUMBER = 1;
+    private monitoring.Monitoring.AlarmID alarmId_;
     /**
-     * <code>.monitoring.AlarmID alarmID = 1;</code>
-     * @return Whether the alarmID field is set.
+     * <code>.monitoring.AlarmID alarm_id = 1;</code>
+     * @return Whether the alarmId field is set.
      */
     @java.lang.Override
-    public boolean hasAlarmID() {
-      return alarmID_ != null;
+    public boolean hasAlarmId() {
+      return alarmId_ != null;
     }
     /**
-     * <code>.monitoring.AlarmID alarmID = 1;</code>
-     * @return The alarmID.
+     * <code>.monitoring.AlarmID alarm_id = 1;</code>
+     * @return The alarmId.
      */
     @java.lang.Override
-    public monitoring.Monitoring.AlarmID getAlarmID() {
-      return alarmID_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmID_;
+    public monitoring.Monitoring.AlarmID getAlarmId() {
+      return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
     }
     /**
-     * <code>.monitoring.AlarmID alarmID = 1;</code>
+     * <code>.monitoring.AlarmID alarm_id = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIDOrBuilder() {
-      return getAlarmID();
+    public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
+      return getAlarmId();
     }
 
     public static final int SUBSCRIPTION_TIMEOUT_S_FIELD_NUMBER = 2;
@@ -16652,8 +18907,8 @@ public final class Monitoring {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      if (alarmID_ != null) {
-        output.writeMessage(1, getAlarmID());
+      if (alarmId_ != null) {
+        output.writeMessage(1, getAlarmId());
       }
       if (subscriptionTimeoutS_ != 0F) {
         output.writeFloat(2, subscriptionTimeoutS_);
@@ -16670,9 +18925,9 @@ public final class Monitoring {
       if (size != -1) return size;
 
       size = 0;
-      if (alarmID_ != null) {
+      if (alarmId_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, getAlarmID());
+          .computeMessageSize(1, getAlarmId());
       }
       if (subscriptionTimeoutS_ != 0F) {
         size += com.google.protobuf.CodedOutputStream
@@ -16697,10 +18952,10 @@ public final class Monitoring {
       }
       monitoring.Monitoring.AlarmSubscription other = (monitoring.Monitoring.AlarmSubscription) obj;
 
-      if (hasAlarmID() != other.hasAlarmID()) return false;
-      if (hasAlarmID()) {
-        if (!getAlarmID()
-            .equals(other.getAlarmID())) return false;
+      if (hasAlarmId() != other.hasAlarmId()) return false;
+      if (hasAlarmId()) {
+        if (!getAlarmId()
+            .equals(other.getAlarmId())) return false;
       }
       if (java.lang.Float.floatToIntBits(getSubscriptionTimeoutS())
           != java.lang.Float.floatToIntBits(
@@ -16719,9 +18974,9 @@ public final class Monitoring {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (hasAlarmID()) {
-        hash = (37 * hash) + ALARMID_FIELD_NUMBER;
-        hash = (53 * hash) + getAlarmID().hashCode();
+      if (hasAlarmId()) {
+        hash = (37 * hash) + ALARM_ID_FIELD_NUMBER;
+        hash = (53 * hash) + getAlarmId().hashCode();
       }
       hash = (37 * hash) + SUBSCRIPTION_TIMEOUT_S_FIELD_NUMBER;
       hash = (53 * hash) + java.lang.Float.floatToIntBits(
@@ -16862,11 +19117,11 @@ public final class Monitoring {
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (alarmIDBuilder_ == null) {
-          alarmID_ = null;
+        if (alarmIdBuilder_ == null) {
+          alarmId_ = null;
         } else {
-          alarmID_ = null;
-          alarmIDBuilder_ = null;
+          alarmId_ = null;
+          alarmIdBuilder_ = null;
         }
         subscriptionTimeoutS_ = 0F;
 
@@ -16898,10 +19153,10 @@ public final class Monitoring {
       @java.lang.Override
       public monitoring.Monitoring.AlarmSubscription buildPartial() {
         monitoring.Monitoring.AlarmSubscription result = new monitoring.Monitoring.AlarmSubscription(this);
-        if (alarmIDBuilder_ == null) {
-          result.alarmID_ = alarmID_;
+        if (alarmIdBuilder_ == null) {
+          result.alarmId_ = alarmId_;
         } else {
-          result.alarmID_ = alarmIDBuilder_.build();
+          result.alarmId_ = alarmIdBuilder_.build();
         }
         result.subscriptionTimeoutS_ = subscriptionTimeoutS_;
         result.subscriptionFrequencyMs_ = subscriptionFrequencyMs_;
@@ -16953,8 +19208,8 @@ public final class Monitoring {
 
       public Builder mergeFrom(monitoring.Monitoring.AlarmSubscription other) {
         if (other == monitoring.Monitoring.AlarmSubscription.getDefaultInstance()) return this;
-        if (other.hasAlarmID()) {
-          mergeAlarmID(other.getAlarmID());
+        if (other.hasAlarmId()) {
+          mergeAlarmId(other.getAlarmId());
         }
         if (other.getSubscriptionTimeoutS() != 0F) {
           setSubscriptionTimeoutS(other.getSubscriptionTimeoutS());
@@ -16991,123 +19246,123 @@ public final class Monitoring {
         return this;
       }
 
-      private monitoring.Monitoring.AlarmID alarmID_;
+      private monitoring.Monitoring.AlarmID alarmId_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder> alarmIDBuilder_;
+          monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder> alarmIdBuilder_;
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
-       * @return Whether the alarmID field is set.
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
+       * @return Whether the alarmId field is set.
        */
-      public boolean hasAlarmID() {
-        return alarmIDBuilder_ != null || alarmID_ != null;
+      public boolean hasAlarmId() {
+        return alarmIdBuilder_ != null || alarmId_ != null;
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
-       * @return The alarmID.
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
+       * @return The alarmId.
        */
-      public monitoring.Monitoring.AlarmID getAlarmID() {
-        if (alarmIDBuilder_ == null) {
-          return alarmID_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmID_;
+      public monitoring.Monitoring.AlarmID getAlarmId() {
+        if (alarmIdBuilder_ == null) {
+          return alarmId_ == null ? monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
         } else {
-          return alarmIDBuilder_.getMessage();
+          return alarmIdBuilder_.getMessage();
         }
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
-      public Builder setAlarmID(monitoring.Monitoring.AlarmID value) {
-        if (alarmIDBuilder_ == null) {
+      public Builder setAlarmId(monitoring.Monitoring.AlarmID value) {
+        if (alarmIdBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          alarmID_ = value;
+          alarmId_ = value;
           onChanged();
         } else {
-          alarmIDBuilder_.setMessage(value);
+          alarmIdBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
-      public Builder setAlarmID(
+      public Builder setAlarmId(
           monitoring.Monitoring.AlarmID.Builder builderForValue) {
-        if (alarmIDBuilder_ == null) {
-          alarmID_ = builderForValue.build();
+        if (alarmIdBuilder_ == null) {
+          alarmId_ = builderForValue.build();
           onChanged();
         } else {
-          alarmIDBuilder_.setMessage(builderForValue.build());
+          alarmIdBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
-      public Builder mergeAlarmID(monitoring.Monitoring.AlarmID value) {
-        if (alarmIDBuilder_ == null) {
-          if (alarmID_ != null) {
-            alarmID_ =
-              monitoring.Monitoring.AlarmID.newBuilder(alarmID_).mergeFrom(value).buildPartial();
+      public Builder mergeAlarmId(monitoring.Monitoring.AlarmID value) {
+        if (alarmIdBuilder_ == null) {
+          if (alarmId_ != null) {
+            alarmId_ =
+              monitoring.Monitoring.AlarmID.newBuilder(alarmId_).mergeFrom(value).buildPartial();
           } else {
-            alarmID_ = value;
+            alarmId_ = value;
           }
           onChanged();
         } else {
-          alarmIDBuilder_.mergeFrom(value);
+          alarmIdBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
-      public Builder clearAlarmID() {
-        if (alarmIDBuilder_ == null) {
-          alarmID_ = null;
+      public Builder clearAlarmId() {
+        if (alarmIdBuilder_ == null) {
+          alarmId_ = null;
           onChanged();
         } else {
-          alarmID_ = null;
-          alarmIDBuilder_ = null;
+          alarmId_ = null;
+          alarmIdBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
-      public monitoring.Monitoring.AlarmID.Builder getAlarmIDBuilder() {
+      public monitoring.Monitoring.AlarmID.Builder getAlarmIdBuilder() {
         
         onChanged();
-        return getAlarmIDFieldBuilder().getBuilder();
+        return getAlarmIdFieldBuilder().getBuilder();
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
-      public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIDOrBuilder() {
-        if (alarmIDBuilder_ != null) {
-          return alarmIDBuilder_.getMessageOrBuilder();
+      public monitoring.Monitoring.AlarmIDOrBuilder getAlarmIdOrBuilder() {
+        if (alarmIdBuilder_ != null) {
+          return alarmIdBuilder_.getMessageOrBuilder();
         } else {
-          return alarmID_ == null ?
-              monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmID_;
+          return alarmId_ == null ?
+              monitoring.Monitoring.AlarmID.getDefaultInstance() : alarmId_;
         }
       }
       /**
-       * <code>.monitoring.AlarmID alarmID = 1;</code>
+       * <code>.monitoring.AlarmID alarm_id = 1;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
           monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder> 
-          getAlarmIDFieldBuilder() {
-        if (alarmIDBuilder_ == null) {
-          alarmIDBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+          getAlarmIdFieldBuilder() {
+        if (alarmIdBuilder_ == null) {
+          alarmIdBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
               monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder>(
-                  getAlarmID(),
+                  getAlarmId(),
                   getParentForChildren(),
                   isClean());
-          alarmID_ = null;
+          alarmId_ = null;
         }
-        return alarmIDBuilder_;
+        return alarmIdBuilder_;
       }
 
       private float subscriptionTimeoutS_ ;
@@ -17256,34 +19511,19 @@ public final class Monitoring {
         getTextBytes();
 
     /**
-     * <code>.monitoring.KpiValue kpi_value = 3;</code>
-     * @return Whether the kpiValue field is set.
-     */
-    boolean hasKpiValue();
-    /**
-     * <code>.monitoring.KpiValue kpi_value = 3;</code>
-     * @return The kpiValue.
-     */
-    monitoring.Monitoring.KpiValue getKpiValue();
-    /**
-     * <code>.monitoring.KpiValue kpi_value = 3;</code>
-     */
-    monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder();
-
-    /**
-     * <code>.context.Timestamp timestamp = 4;</code>
-     * @return Whether the timestamp field is set.
+     * <code>.monitoring.KpiList kpi_list = 3;</code>
+     * @return Whether the kpiList field is set.
      */
-    boolean hasTimestamp();
+    boolean hasKpiList();
     /**
-     * <code>.context.Timestamp timestamp = 4;</code>
-     * @return The timestamp.
+     * <code>.monitoring.KpiList kpi_list = 3;</code>
+     * @return The kpiList.
      */
-    context.ContextOuterClass.Timestamp getTimestamp();
+    monitoring.Monitoring.KpiList getKpiList();
     /**
-     * <code>.context.Timestamp timestamp = 4;</code>
+     * <code>.monitoring.KpiList kpi_list = 3;</code>
      */
-    context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder();
+    monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder();
   }
   /**
    * Protobuf type {@code monitoring.AlarmResponse}
@@ -17351,27 +19591,14 @@ public final class Monitoring {
               break;
             }
             case 26: {
-              monitoring.Monitoring.KpiValue.Builder subBuilder = null;
-              if (kpiValue_ != null) {
-                subBuilder = kpiValue_.toBuilder();
-              }
-              kpiValue_ = input.readMessage(monitoring.Monitoring.KpiValue.parser(), extensionRegistry);
-              if (subBuilder != null) {
-                subBuilder.mergeFrom(kpiValue_);
-                kpiValue_ = subBuilder.buildPartial();
-              }
-
-              break;
-            }
-            case 34: {
-              context.ContextOuterClass.Timestamp.Builder subBuilder = null;
-              if (timestamp_ != null) {
-                subBuilder = timestamp_.toBuilder();
+              monitoring.Monitoring.KpiList.Builder subBuilder = null;
+              if (kpiList_ != null) {
+                subBuilder = kpiList_.toBuilder();
               }
-              timestamp_ = input.readMessage(context.ContextOuterClass.Timestamp.parser(), extensionRegistry);
+              kpiList_ = input.readMessage(monitoring.Monitoring.KpiList.parser(), extensionRegistry);
               if (subBuilder != null) {
-                subBuilder.mergeFrom(timestamp_);
-                timestamp_ = subBuilder.buildPartial();
+                subBuilder.mergeFrom(kpiList_);
+                kpiList_ = subBuilder.buildPartial();
               }
 
               break;
@@ -17472,56 +19699,30 @@ public final class Monitoring {
       }
     }
 
-    public static final int KPI_VALUE_FIELD_NUMBER = 3;
-    private monitoring.Monitoring.KpiValue kpiValue_;
-    /**
-     * <code>.monitoring.KpiValue kpi_value = 3;</code>
-     * @return Whether the kpiValue field is set.
-     */
-    @java.lang.Override
-    public boolean hasKpiValue() {
-      return kpiValue_ != null;
-    }
-    /**
-     * <code>.monitoring.KpiValue kpi_value = 3;</code>
-     * @return The kpiValue.
-     */
-    @java.lang.Override
-    public monitoring.Monitoring.KpiValue getKpiValue() {
-      return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
-    }
-    /**
-     * <code>.monitoring.KpiValue kpi_value = 3;</code>
-     */
-    @java.lang.Override
-    public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-      return getKpiValue();
-    }
-
-    public static final int TIMESTAMP_FIELD_NUMBER = 4;
-    private context.ContextOuterClass.Timestamp timestamp_;
+    public static final int KPI_LIST_FIELD_NUMBER = 3;
+    private monitoring.Monitoring.KpiList kpiList_;
     /**
-     * <code>.context.Timestamp timestamp = 4;</code>
-     * @return Whether the timestamp field is set.
+     * <code>.monitoring.KpiList kpi_list = 3;</code>
+     * @return Whether the kpiList field is set.
      */
     @java.lang.Override
-    public boolean hasTimestamp() {
-      return timestamp_ != null;
+    public boolean hasKpiList() {
+      return kpiList_ != null;
     }
     /**
-     * <code>.context.Timestamp timestamp = 4;</code>
-     * @return The timestamp.
+     * <code>.monitoring.KpiList kpi_list = 3;</code>
+     * @return The kpiList.
      */
     @java.lang.Override
-    public context.ContextOuterClass.Timestamp getTimestamp() {
-      return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+    public monitoring.Monitoring.KpiList getKpiList() {
+      return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
     }
     /**
-     * <code>.context.Timestamp timestamp = 4;</code>
+     * <code>.monitoring.KpiList kpi_list = 3;</code>
      */
     @java.lang.Override
-    public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-      return getTimestamp();
+    public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
+      return getKpiList();
     }
 
     private byte memoizedIsInitialized = -1;
@@ -17544,11 +19745,8 @@ public final class Monitoring {
       if (!getTextBytes().isEmpty()) {
         com.google.protobuf.GeneratedMessageV3.writeString(output, 2, text_);
       }
-      if (kpiValue_ != null) {
-        output.writeMessage(3, getKpiValue());
-      }
-      if (timestamp_ != null) {
-        output.writeMessage(4, getTimestamp());
+      if (kpiList_ != null) {
+        output.writeMessage(3, getKpiList());
       }
       unknownFields.writeTo(output);
     }
@@ -17566,13 +19764,9 @@ public final class Monitoring {
       if (!getTextBytes().isEmpty()) {
         size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, text_);
       }
-      if (kpiValue_ != null) {
-        size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(3, getKpiValue());
-      }
-      if (timestamp_ != null) {
+      if (kpiList_ != null) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(4, getTimestamp());
+          .computeMessageSize(3, getKpiList());
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -17596,15 +19790,10 @@ public final class Monitoring {
       }
       if (!getText()
           .equals(other.getText())) return false;
-      if (hasKpiValue() != other.hasKpiValue()) return false;
-      if (hasKpiValue()) {
-        if (!getKpiValue()
-            .equals(other.getKpiValue())) return false;
-      }
-      if (hasTimestamp() != other.hasTimestamp()) return false;
-      if (hasTimestamp()) {
-        if (!getTimestamp()
-            .equals(other.getTimestamp())) return false;
+      if (hasKpiList() != other.hasKpiList()) return false;
+      if (hasKpiList()) {
+        if (!getKpiList()
+            .equals(other.getKpiList())) return false;
       }
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
@@ -17623,13 +19812,9 @@ public final class Monitoring {
       }
       hash = (37 * hash) + TEXT_FIELD_NUMBER;
       hash = (53 * hash) + getText().hashCode();
-      if (hasKpiValue()) {
-        hash = (37 * hash) + KPI_VALUE_FIELD_NUMBER;
-        hash = (53 * hash) + getKpiValue().hashCode();
-      }
-      if (hasTimestamp()) {
-        hash = (37 * hash) + TIMESTAMP_FIELD_NUMBER;
-        hash = (53 * hash) + getTimestamp().hashCode();
+      if (hasKpiList()) {
+        hash = (37 * hash) + KPI_LIST_FIELD_NUMBER;
+        hash = (53 * hash) + getKpiList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
@@ -17766,23 +19951,17 @@ public final class Monitoring {
         super.clear();
         if (alarmIdBuilder_ == null) {
           alarmId_ = null;
-        } else {
-          alarmId_ = null;
-          alarmIdBuilder_ = null;
-        }
-        text_ = "";
-
-        if (kpiValueBuilder_ == null) {
-          kpiValue_ = null;
-        } else {
-          kpiValue_ = null;
-          kpiValueBuilder_ = null;
+        } else {
+          alarmId_ = null;
+          alarmIdBuilder_ = null;
         }
-        if (timestampBuilder_ == null) {
-          timestamp_ = null;
+        text_ = "";
+
+        if (kpiListBuilder_ == null) {
+          kpiList_ = null;
         } else {
-          timestamp_ = null;
-          timestampBuilder_ = null;
+          kpiList_ = null;
+          kpiListBuilder_ = null;
         }
         return this;
       }
@@ -17816,15 +19995,10 @@ public final class Monitoring {
           result.alarmId_ = alarmIdBuilder_.build();
         }
         result.text_ = text_;
-        if (kpiValueBuilder_ == null) {
-          result.kpiValue_ = kpiValue_;
-        } else {
-          result.kpiValue_ = kpiValueBuilder_.build();
-        }
-        if (timestampBuilder_ == null) {
-          result.timestamp_ = timestamp_;
+        if (kpiListBuilder_ == null) {
+          result.kpiList_ = kpiList_;
         } else {
-          result.timestamp_ = timestampBuilder_.build();
+          result.kpiList_ = kpiListBuilder_.build();
         }
         onBuilt();
         return result;
@@ -17881,11 +20055,8 @@ public final class Monitoring {
           text_ = other.text_;
           onChanged();
         }
-        if (other.hasKpiValue()) {
-          mergeKpiValue(other.getKpiValue());
-        }
-        if (other.hasTimestamp()) {
-          mergeTimestamp(other.getTimestamp());
+        if (other.hasKpiList()) {
+          mergeKpiList(other.getKpiList());
         }
         this.mergeUnknownFields(other.unknownFields);
         onChanged();
@@ -18111,242 +20282,123 @@ public final class Monitoring {
         return this;
       }
 
-      private monitoring.Monitoring.KpiValue kpiValue_;
-      private com.google.protobuf.SingleFieldBuilderV3<
-          monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder> kpiValueBuilder_;
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       * @return Whether the kpiValue field is set.
-       */
-      public boolean hasKpiValue() {
-        return kpiValueBuilder_ != null || kpiValue_ != null;
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       * @return The kpiValue.
-       */
-      public monitoring.Monitoring.KpiValue getKpiValue() {
-        if (kpiValueBuilder_ == null) {
-          return kpiValue_ == null ? monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
-        } else {
-          return kpiValueBuilder_.getMessage();
-        }
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      public Builder setKpiValue(monitoring.Monitoring.KpiValue value) {
-        if (kpiValueBuilder_ == null) {
-          if (value == null) {
-            throw new NullPointerException();
-          }
-          kpiValue_ = value;
-          onChanged();
-        } else {
-          kpiValueBuilder_.setMessage(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      public Builder setKpiValue(
-          monitoring.Monitoring.KpiValue.Builder builderForValue) {
-        if (kpiValueBuilder_ == null) {
-          kpiValue_ = builderForValue.build();
-          onChanged();
-        } else {
-          kpiValueBuilder_.setMessage(builderForValue.build());
-        }
-
-        return this;
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      public Builder mergeKpiValue(monitoring.Monitoring.KpiValue value) {
-        if (kpiValueBuilder_ == null) {
-          if (kpiValue_ != null) {
-            kpiValue_ =
-              monitoring.Monitoring.KpiValue.newBuilder(kpiValue_).mergeFrom(value).buildPartial();
-          } else {
-            kpiValue_ = value;
-          }
-          onChanged();
-        } else {
-          kpiValueBuilder_.mergeFrom(value);
-        }
-
-        return this;
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      public Builder clearKpiValue() {
-        if (kpiValueBuilder_ == null) {
-          kpiValue_ = null;
-          onChanged();
-        } else {
-          kpiValue_ = null;
-          kpiValueBuilder_ = null;
-        }
-
-        return this;
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      public monitoring.Monitoring.KpiValue.Builder getKpiValueBuilder() {
-        
-        onChanged();
-        return getKpiValueFieldBuilder().getBuilder();
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      public monitoring.Monitoring.KpiValueOrBuilder getKpiValueOrBuilder() {
-        if (kpiValueBuilder_ != null) {
-          return kpiValueBuilder_.getMessageOrBuilder();
-        } else {
-          return kpiValue_ == null ?
-              monitoring.Monitoring.KpiValue.getDefaultInstance() : kpiValue_;
-        }
-      }
-      /**
-       * <code>.monitoring.KpiValue kpi_value = 3;</code>
-       */
-      private com.google.protobuf.SingleFieldBuilderV3<
-          monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder> 
-          getKpiValueFieldBuilder() {
-        if (kpiValueBuilder_ == null) {
-          kpiValueBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              monitoring.Monitoring.KpiValue, monitoring.Monitoring.KpiValue.Builder, monitoring.Monitoring.KpiValueOrBuilder>(
-                  getKpiValue(),
-                  getParentForChildren(),
-                  isClean());
-          kpiValue_ = null;
-        }
-        return kpiValueBuilder_;
-      }
-
-      private context.ContextOuterClass.Timestamp timestamp_;
+      private monitoring.Monitoring.KpiList kpiList_;
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> timestampBuilder_;
+          monitoring.Monitoring.KpiList, monitoring.Monitoring.KpiList.Builder, monitoring.Monitoring.KpiListOrBuilder> kpiListBuilder_;
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
-       * @return Whether the timestamp field is set.
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
+       * @return Whether the kpiList field is set.
        */
-      public boolean hasTimestamp() {
-        return timestampBuilder_ != null || timestamp_ != null;
+      public boolean hasKpiList() {
+        return kpiListBuilder_ != null || kpiList_ != null;
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
-       * @return The timestamp.
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
+       * @return The kpiList.
        */
-      public context.ContextOuterClass.Timestamp getTimestamp() {
-        if (timestampBuilder_ == null) {
-          return timestamp_ == null ? context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+      public monitoring.Monitoring.KpiList getKpiList() {
+        if (kpiListBuilder_ == null) {
+          return kpiList_ == null ? monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
         } else {
-          return timestampBuilder_.getMessage();
+          return kpiListBuilder_.getMessage();
         }
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
-      public Builder setTimestamp(context.ContextOuterClass.Timestamp value) {
-        if (timestampBuilder_ == null) {
+      public Builder setKpiList(monitoring.Monitoring.KpiList value) {
+        if (kpiListBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          timestamp_ = value;
+          kpiList_ = value;
           onChanged();
         } else {
-          timestampBuilder_.setMessage(value);
+          kpiListBuilder_.setMessage(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
-      public Builder setTimestamp(
-          context.ContextOuterClass.Timestamp.Builder builderForValue) {
-        if (timestampBuilder_ == null) {
-          timestamp_ = builderForValue.build();
+      public Builder setKpiList(
+          monitoring.Monitoring.KpiList.Builder builderForValue) {
+        if (kpiListBuilder_ == null) {
+          kpiList_ = builderForValue.build();
           onChanged();
         } else {
-          timestampBuilder_.setMessage(builderForValue.build());
+          kpiListBuilder_.setMessage(builderForValue.build());
         }
 
         return this;
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
-      public Builder mergeTimestamp(context.ContextOuterClass.Timestamp value) {
-        if (timestampBuilder_ == null) {
-          if (timestamp_ != null) {
-            timestamp_ =
-              context.ContextOuterClass.Timestamp.newBuilder(timestamp_).mergeFrom(value).buildPartial();
+      public Builder mergeKpiList(monitoring.Monitoring.KpiList value) {
+        if (kpiListBuilder_ == null) {
+          if (kpiList_ != null) {
+            kpiList_ =
+              monitoring.Monitoring.KpiList.newBuilder(kpiList_).mergeFrom(value).buildPartial();
           } else {
-            timestamp_ = value;
+            kpiList_ = value;
           }
           onChanged();
         } else {
-          timestampBuilder_.mergeFrom(value);
+          kpiListBuilder_.mergeFrom(value);
         }
 
         return this;
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
-      public Builder clearTimestamp() {
-        if (timestampBuilder_ == null) {
-          timestamp_ = null;
+      public Builder clearKpiList() {
+        if (kpiListBuilder_ == null) {
+          kpiList_ = null;
           onChanged();
         } else {
-          timestamp_ = null;
-          timestampBuilder_ = null;
+          kpiList_ = null;
+          kpiListBuilder_ = null;
         }
 
         return this;
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
-      public context.ContextOuterClass.Timestamp.Builder getTimestampBuilder() {
+      public monitoring.Monitoring.KpiList.Builder getKpiListBuilder() {
         
         onChanged();
-        return getTimestampFieldBuilder().getBuilder();
+        return getKpiListFieldBuilder().getBuilder();
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
-      public context.ContextOuterClass.TimestampOrBuilder getTimestampOrBuilder() {
-        if (timestampBuilder_ != null) {
-          return timestampBuilder_.getMessageOrBuilder();
+      public monitoring.Monitoring.KpiListOrBuilder getKpiListOrBuilder() {
+        if (kpiListBuilder_ != null) {
+          return kpiListBuilder_.getMessageOrBuilder();
         } else {
-          return timestamp_ == null ?
-              context.ContextOuterClass.Timestamp.getDefaultInstance() : timestamp_;
+          return kpiList_ == null ?
+              monitoring.Monitoring.KpiList.getDefaultInstance() : kpiList_;
         }
       }
       /**
-       * <code>.context.Timestamp timestamp = 4;</code>
+       * <code>.monitoring.KpiList kpi_list = 3;</code>
        */
       private com.google.protobuf.SingleFieldBuilderV3<
-          context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder> 
-          getTimestampFieldBuilder() {
-        if (timestampBuilder_ == null) {
-          timestampBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
-              context.ContextOuterClass.Timestamp, context.ContextOuterClass.Timestamp.Builder, context.ContextOuterClass.TimestampOrBuilder>(
-                  getTimestamp(),
+          monitoring.Monitoring.KpiList, monitoring.Monitoring.KpiList.Builder, monitoring.Monitoring.KpiListOrBuilder> 
+          getKpiListFieldBuilder() {
+        if (kpiListBuilder_ == null) {
+          kpiListBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              monitoring.Monitoring.KpiList, monitoring.Monitoring.KpiList.Builder, monitoring.Monitoring.KpiListOrBuilder>(
+                  getKpiList(),
                   getParentForChildren(),
                   isClean());
-          timestamp_ = null;
+          kpiList_ = null;
         }
-        return timestampBuilder_;
+        return kpiListBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -18401,55 +20453,55 @@ public final class Monitoring {
 
   }
 
-  public interface AlarmIDListOrBuilder extends
-      // @@protoc_insertion_point(interface_extends:monitoring.AlarmIDList)
+  public interface AlarmListOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:monitoring.AlarmList)
       com.google.protobuf.MessageOrBuilder {
 
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
-    java.util.List<monitoring.Monitoring.AlarmID> 
-        getAlarmListList();
+    java.util.List<monitoring.Monitoring.AlarmDescriptor> 
+        getAlarmDescriptorList();
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
-    monitoring.Monitoring.AlarmID getAlarmList(int index);
+    monitoring.Monitoring.AlarmDescriptor getAlarmDescriptor(int index);
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
-    int getAlarmListCount();
+    int getAlarmDescriptorCount();
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
-    java.util.List<? extends monitoring.Monitoring.AlarmIDOrBuilder> 
-        getAlarmListOrBuilderList();
+    java.util.List<? extends monitoring.Monitoring.AlarmDescriptorOrBuilder> 
+        getAlarmDescriptorOrBuilderList();
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
-    monitoring.Monitoring.AlarmIDOrBuilder getAlarmListOrBuilder(
+    monitoring.Monitoring.AlarmDescriptorOrBuilder getAlarmDescriptorOrBuilder(
         int index);
   }
   /**
-   * Protobuf type {@code monitoring.AlarmIDList}
+   * Protobuf type {@code monitoring.AlarmList}
    */
-  public static final class AlarmIDList extends
+  public static final class AlarmList extends
       com.google.protobuf.GeneratedMessageV3 implements
-      // @@protoc_insertion_point(message_implements:monitoring.AlarmIDList)
-      AlarmIDListOrBuilder {
+      // @@protoc_insertion_point(message_implements:monitoring.AlarmList)
+      AlarmListOrBuilder {
   private static final long serialVersionUID = 0L;
-    // Use AlarmIDList.newBuilder() to construct.
-    private AlarmIDList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    // Use AlarmList.newBuilder() to construct.
+    private AlarmList(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
       super(builder);
     }
-    private AlarmIDList() {
-      alarmList_ = java.util.Collections.emptyList();
+    private AlarmList() {
+      alarmDescriptor_ = java.util.Collections.emptyList();
     }
 
     @java.lang.Override
     @SuppressWarnings({"unused"})
     protected java.lang.Object newInstance(
         UnusedPrivateParameter unused) {
-      return new AlarmIDList();
+      return new AlarmList();
     }
 
     @java.lang.Override
@@ -18457,7 +20509,7 @@ public final class Monitoring {
     getUnknownFields() {
       return this.unknownFields;
     }
-    private AlarmIDList(
+    private AlarmList(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -18478,11 +20530,11 @@ public final class Monitoring {
               break;
             case 10: {
               if (!((mutable_bitField0_ & 0x00000001) != 0)) {
-                alarmList_ = new java.util.ArrayList<monitoring.Monitoring.AlarmID>();
+                alarmDescriptor_ = new java.util.ArrayList<monitoring.Monitoring.AlarmDescriptor>();
                 mutable_bitField0_ |= 0x00000001;
               }
-              alarmList_.add(
-                  input.readMessage(monitoring.Monitoring.AlarmID.parser(), extensionRegistry));
+              alarmDescriptor_.add(
+                  input.readMessage(monitoring.Monitoring.AlarmDescriptor.parser(), extensionRegistry));
               break;
             }
             default: {
@@ -18501,7 +20553,7 @@ public final class Monitoring {
             e).setUnfinishedMessage(this);
       } finally {
         if (((mutable_bitField0_ & 0x00000001) != 0)) {
-          alarmList_ = java.util.Collections.unmodifiableList(alarmList_);
+          alarmDescriptor_ = java.util.Collections.unmodifiableList(alarmDescriptor_);
         }
         this.unknownFields = unknownFields.build();
         makeExtensionsImmutable();
@@ -18509,55 +20561,55 @@ public final class Monitoring {
     }
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return monitoring.Monitoring.internal_static_monitoring_AlarmIDList_descriptor;
+      return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return monitoring.Monitoring.internal_static_monitoring_AlarmIDList_fieldAccessorTable
+      return monitoring.Monitoring.internal_static_monitoring_AlarmList_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              monitoring.Monitoring.AlarmIDList.class, monitoring.Monitoring.AlarmIDList.Builder.class);
+              monitoring.Monitoring.AlarmList.class, monitoring.Monitoring.AlarmList.Builder.class);
     }
 
-    public static final int ALARM_LIST_FIELD_NUMBER = 1;
-    private java.util.List<monitoring.Monitoring.AlarmID> alarmList_;
+    public static final int ALARM_DESCRIPTOR_FIELD_NUMBER = 1;
+    private java.util.List<monitoring.Monitoring.AlarmDescriptor> alarmDescriptor_;
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<monitoring.Monitoring.AlarmID> getAlarmListList() {
-      return alarmList_;
+    public java.util.List<monitoring.Monitoring.AlarmDescriptor> getAlarmDescriptorList() {
+      return alarmDescriptor_;
     }
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
     @java.lang.Override
-    public java.util.List<? extends monitoring.Monitoring.AlarmIDOrBuilder> 
-        getAlarmListOrBuilderList() {
-      return alarmList_;
+    public java.util.List<? extends monitoring.Monitoring.AlarmDescriptorOrBuilder> 
+        getAlarmDescriptorOrBuilderList() {
+      return alarmDescriptor_;
     }
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
     @java.lang.Override
-    public int getAlarmListCount() {
-      return alarmList_.size();
+    public int getAlarmDescriptorCount() {
+      return alarmDescriptor_.size();
     }
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.AlarmID getAlarmList(int index) {
-      return alarmList_.get(index);
+    public monitoring.Monitoring.AlarmDescriptor getAlarmDescriptor(int index) {
+      return alarmDescriptor_.get(index);
     }
     /**
-     * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+     * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
      */
     @java.lang.Override
-    public monitoring.Monitoring.AlarmIDOrBuilder getAlarmListOrBuilder(
+    public monitoring.Monitoring.AlarmDescriptorOrBuilder getAlarmDescriptorOrBuilder(
         int index) {
-      return alarmList_.get(index);
+      return alarmDescriptor_.get(index);
     }
 
     private byte memoizedIsInitialized = -1;
@@ -18574,8 +20626,8 @@ public final class Monitoring {
     @java.lang.Override
     public void writeTo(com.google.protobuf.CodedOutputStream output)
                         throws java.io.IOException {
-      for (int i = 0; i < alarmList_.size(); i++) {
-        output.writeMessage(1, alarmList_.get(i));
+      for (int i = 0; i < alarmDescriptor_.size(); i++) {
+        output.writeMessage(1, alarmDescriptor_.get(i));
       }
       unknownFields.writeTo(output);
     }
@@ -18586,9 +20638,9 @@ public final class Monitoring {
       if (size != -1) return size;
 
       size = 0;
-      for (int i = 0; i < alarmList_.size(); i++) {
+      for (int i = 0; i < alarmDescriptor_.size(); i++) {
         size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, alarmList_.get(i));
+          .computeMessageSize(1, alarmDescriptor_.get(i));
       }
       size += unknownFields.getSerializedSize();
       memoizedSize = size;
@@ -18600,13 +20652,13 @@ public final class Monitoring {
       if (obj == this) {
        return true;
       }
-      if (!(obj instanceof monitoring.Monitoring.AlarmIDList)) {
+      if (!(obj instanceof monitoring.Monitoring.AlarmList)) {
         return super.equals(obj);
       }
-      monitoring.Monitoring.AlarmIDList other = (monitoring.Monitoring.AlarmIDList) obj;
+      monitoring.Monitoring.AlarmList other = (monitoring.Monitoring.AlarmList) obj;
 
-      if (!getAlarmListList()
-          .equals(other.getAlarmListList())) return false;
+      if (!getAlarmDescriptorList()
+          .equals(other.getAlarmDescriptorList())) return false;
       if (!unknownFields.equals(other.unknownFields)) return false;
       return true;
     }
@@ -18618,78 +20670,78 @@ public final class Monitoring {
       }
       int hash = 41;
       hash = (19 * hash) + getDescriptor().hashCode();
-      if (getAlarmListCount() > 0) {
-        hash = (37 * hash) + ALARM_LIST_FIELD_NUMBER;
-        hash = (53 * hash) + getAlarmListList().hashCode();
+      if (getAlarmDescriptorCount() > 0) {
+        hash = (37 * hash) + ALARM_DESCRIPTOR_FIELD_NUMBER;
+        hash = (53 * hash) + getAlarmDescriptorList().hashCode();
       }
       hash = (29 * hash) + unknownFields.hashCode();
       memoizedHashCode = hash;
       return hash;
     }
 
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         java.nio.ByteBuffer data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         java.nio.ByteBuffer data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         com.google.protobuf.ByteString data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         com.google.protobuf.ByteString data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(byte[] data)
+    public static monitoring.Monitoring.AlarmList parseFrom(byte[] data)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         byte[] data,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
       return PARSER.parseFrom(data, extensionRegistry);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(java.io.InputStream input)
+    public static monitoring.Monitoring.AlarmList parseFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input, extensionRegistry);
     }
-    public static monitoring.Monitoring.AlarmIDList parseDelimitedFrom(java.io.InputStream input)
+    public static monitoring.Monitoring.AlarmList parseDelimitedFrom(java.io.InputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input);
     }
-    public static monitoring.Monitoring.AlarmIDList parseDelimitedFrom(
+    public static monitoring.Monitoring.AlarmList parseDelimitedFrom(
         java.io.InputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         com.google.protobuf.CodedInputStream input)
         throws java.io.IOException {
       return com.google.protobuf.GeneratedMessageV3
           .parseWithIOException(PARSER, input);
     }
-    public static monitoring.Monitoring.AlarmIDList parseFrom(
+    public static monitoring.Monitoring.AlarmList parseFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws java.io.IOException {
@@ -18702,7 +20754,7 @@ public final class Monitoring {
     public static Builder newBuilder() {
       return DEFAULT_INSTANCE.toBuilder();
     }
-    public static Builder newBuilder(monitoring.Monitoring.AlarmIDList prototype) {
+    public static Builder newBuilder(monitoring.Monitoring.AlarmList prototype) {
       return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
     }
     @java.lang.Override
@@ -18718,26 +20770,26 @@ public final class Monitoring {
       return builder;
     }
     /**
-     * Protobuf type {@code monitoring.AlarmIDList}
+     * Protobuf type {@code monitoring.AlarmList}
      */
     public static final class Builder extends
         com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-        // @@protoc_insertion_point(builder_implements:monitoring.AlarmIDList)
-        monitoring.Monitoring.AlarmIDListOrBuilder {
+        // @@protoc_insertion_point(builder_implements:monitoring.AlarmList)
+        monitoring.Monitoring.AlarmListOrBuilder {
       public static final com.google.protobuf.Descriptors.Descriptor
           getDescriptor() {
-        return monitoring.Monitoring.internal_static_monitoring_AlarmIDList_descriptor;
+        return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
       }
 
       @java.lang.Override
       protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
           internalGetFieldAccessorTable() {
-        return monitoring.Monitoring.internal_static_monitoring_AlarmIDList_fieldAccessorTable
+        return monitoring.Monitoring.internal_static_monitoring_AlarmList_fieldAccessorTable
             .ensureFieldAccessorsInitialized(
-                monitoring.Monitoring.AlarmIDList.class, monitoring.Monitoring.AlarmIDList.Builder.class);
+                monitoring.Monitoring.AlarmList.class, monitoring.Monitoring.AlarmList.Builder.class);
       }
 
-      // Construct using monitoring.Monitoring.AlarmIDList.newBuilder()
+      // Construct using monitoring.Monitoring.AlarmList.newBuilder()
       private Builder() {
         maybeForceBuilderInitialization();
       }
@@ -18750,17 +20802,17 @@ public final class Monitoring {
       private void maybeForceBuilderInitialization() {
         if (com.google.protobuf.GeneratedMessageV3
                 .alwaysUseFieldBuilders) {
-          getAlarmListFieldBuilder();
+          getAlarmDescriptorFieldBuilder();
         }
       }
       @java.lang.Override
       public Builder clear() {
         super.clear();
-        if (alarmListBuilder_ == null) {
-          alarmList_ = java.util.Collections.emptyList();
+        if (alarmDescriptorBuilder_ == null) {
+          alarmDescriptor_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
         } else {
-          alarmListBuilder_.clear();
+          alarmDescriptorBuilder_.clear();
         }
         return this;
       }
@@ -18768,17 +20820,17 @@ public final class Monitoring {
       @java.lang.Override
       public com.google.protobuf.Descriptors.Descriptor
           getDescriptorForType() {
-        return monitoring.Monitoring.internal_static_monitoring_AlarmIDList_descriptor;
+        return monitoring.Monitoring.internal_static_monitoring_AlarmList_descriptor;
       }
 
       @java.lang.Override
-      public monitoring.Monitoring.AlarmIDList getDefaultInstanceForType() {
-        return monitoring.Monitoring.AlarmIDList.getDefaultInstance();
+      public monitoring.Monitoring.AlarmList getDefaultInstanceForType() {
+        return monitoring.Monitoring.AlarmList.getDefaultInstance();
       }
 
       @java.lang.Override
-      public monitoring.Monitoring.AlarmIDList build() {
-        monitoring.Monitoring.AlarmIDList result = buildPartial();
+      public monitoring.Monitoring.AlarmList build() {
+        monitoring.Monitoring.AlarmList result = buildPartial();
         if (!result.isInitialized()) {
           throw newUninitializedMessageException(result);
         }
@@ -18786,17 +20838,17 @@ public final class Monitoring {
       }
 
       @java.lang.Override
-      public monitoring.Monitoring.AlarmIDList buildPartial() {
-        monitoring.Monitoring.AlarmIDList result = new monitoring.Monitoring.AlarmIDList(this);
+      public monitoring.Monitoring.AlarmList buildPartial() {
+        monitoring.Monitoring.AlarmList result = new monitoring.Monitoring.AlarmList(this);
         int from_bitField0_ = bitField0_;
-        if (alarmListBuilder_ == null) {
+        if (alarmDescriptorBuilder_ == null) {
           if (((bitField0_ & 0x00000001) != 0)) {
-            alarmList_ = java.util.Collections.unmodifiableList(alarmList_);
+            alarmDescriptor_ = java.util.Collections.unmodifiableList(alarmDescriptor_);
             bitField0_ = (bitField0_ & ~0x00000001);
           }
-          result.alarmList_ = alarmList_;
+          result.alarmDescriptor_ = alarmDescriptor_;
         } else {
-          result.alarmList_ = alarmListBuilder_.build();
+          result.alarmDescriptor_ = alarmDescriptorBuilder_.build();
         }
         onBuilt();
         return result;
@@ -18836,39 +20888,39 @@ public final class Monitoring {
       }
       @java.lang.Override
       public Builder mergeFrom(com.google.protobuf.Message other) {
-        if (other instanceof monitoring.Monitoring.AlarmIDList) {
-          return mergeFrom((monitoring.Monitoring.AlarmIDList)other);
+        if (other instanceof monitoring.Monitoring.AlarmList) {
+          return mergeFrom((monitoring.Monitoring.AlarmList)other);
         } else {
           super.mergeFrom(other);
           return this;
         }
       }
 
-      public Builder mergeFrom(monitoring.Monitoring.AlarmIDList other) {
-        if (other == monitoring.Monitoring.AlarmIDList.getDefaultInstance()) return this;
-        if (alarmListBuilder_ == null) {
-          if (!other.alarmList_.isEmpty()) {
-            if (alarmList_.isEmpty()) {
-              alarmList_ = other.alarmList_;
+      public Builder mergeFrom(monitoring.Monitoring.AlarmList other) {
+        if (other == monitoring.Monitoring.AlarmList.getDefaultInstance()) return this;
+        if (alarmDescriptorBuilder_ == null) {
+          if (!other.alarmDescriptor_.isEmpty()) {
+            if (alarmDescriptor_.isEmpty()) {
+              alarmDescriptor_ = other.alarmDescriptor_;
               bitField0_ = (bitField0_ & ~0x00000001);
             } else {
-              ensureAlarmListIsMutable();
-              alarmList_.addAll(other.alarmList_);
+              ensureAlarmDescriptorIsMutable();
+              alarmDescriptor_.addAll(other.alarmDescriptor_);
             }
             onChanged();
           }
         } else {
-          if (!other.alarmList_.isEmpty()) {
-            if (alarmListBuilder_.isEmpty()) {
-              alarmListBuilder_.dispose();
-              alarmListBuilder_ = null;
-              alarmList_ = other.alarmList_;
+          if (!other.alarmDescriptor_.isEmpty()) {
+            if (alarmDescriptorBuilder_.isEmpty()) {
+              alarmDescriptorBuilder_.dispose();
+              alarmDescriptorBuilder_ = null;
+              alarmDescriptor_ = other.alarmDescriptor_;
               bitField0_ = (bitField0_ & ~0x00000001);
-              alarmListBuilder_ = 
+              alarmDescriptorBuilder_ = 
                 com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
-                   getAlarmListFieldBuilder() : null;
+                   getAlarmDescriptorFieldBuilder() : null;
             } else {
-              alarmListBuilder_.addAllMessages(other.alarmList_);
+              alarmDescriptorBuilder_.addAllMessages(other.alarmDescriptor_);
             }
           }
         }
@@ -18887,11 +20939,11 @@ public final class Monitoring {
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws java.io.IOException {
-        monitoring.Monitoring.AlarmIDList parsedMessage = null;
+        monitoring.Monitoring.AlarmList parsedMessage = null;
         try {
           parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
         } catch (com.google.protobuf.InvalidProtocolBufferException e) {
-          parsedMessage = (monitoring.Monitoring.AlarmIDList) e.getUnfinishedMessage();
+          parsedMessage = (monitoring.Monitoring.AlarmList) e.getUnfinishedMessage();
           throw e.unwrapIOException();
         } finally {
           if (parsedMessage != null) {
@@ -18902,244 +20954,244 @@ public final class Monitoring {
       }
       private int bitField0_;
 
-      private java.util.List<monitoring.Monitoring.AlarmID> alarmList_ =
+      private java.util.List<monitoring.Monitoring.AlarmDescriptor> alarmDescriptor_ =
         java.util.Collections.emptyList();
-      private void ensureAlarmListIsMutable() {
+      private void ensureAlarmDescriptorIsMutable() {
         if (!((bitField0_ & 0x00000001) != 0)) {
-          alarmList_ = new java.util.ArrayList<monitoring.Monitoring.AlarmID>(alarmList_);
+          alarmDescriptor_ = new java.util.ArrayList<monitoring.Monitoring.AlarmDescriptor>(alarmDescriptor_);
           bitField0_ |= 0x00000001;
          }
       }
 
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder> alarmListBuilder_;
+          monitoring.Monitoring.AlarmDescriptor, monitoring.Monitoring.AlarmDescriptor.Builder, monitoring.Monitoring.AlarmDescriptorOrBuilder> alarmDescriptorBuilder_;
 
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public java.util.List<monitoring.Monitoring.AlarmID> getAlarmListList() {
-        if (alarmListBuilder_ == null) {
-          return java.util.Collections.unmodifiableList(alarmList_);
+      public java.util.List<monitoring.Monitoring.AlarmDescriptor> getAlarmDescriptorList() {
+        if (alarmDescriptorBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(alarmDescriptor_);
         } else {
-          return alarmListBuilder_.getMessageList();
+          return alarmDescriptorBuilder_.getMessageList();
         }
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public int getAlarmListCount() {
-        if (alarmListBuilder_ == null) {
-          return alarmList_.size();
+      public int getAlarmDescriptorCount() {
+        if (alarmDescriptorBuilder_ == null) {
+          return alarmDescriptor_.size();
         } else {
-          return alarmListBuilder_.getCount();
+          return alarmDescriptorBuilder_.getCount();
         }
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.AlarmID getAlarmList(int index) {
-        if (alarmListBuilder_ == null) {
-          return alarmList_.get(index);
+      public monitoring.Monitoring.AlarmDescriptor getAlarmDescriptor(int index) {
+        if (alarmDescriptorBuilder_ == null) {
+          return alarmDescriptor_.get(index);
         } else {
-          return alarmListBuilder_.getMessage(index);
+          return alarmDescriptorBuilder_.getMessage(index);
         }
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder setAlarmList(
-          int index, monitoring.Monitoring.AlarmID value) {
-        if (alarmListBuilder_ == null) {
+      public Builder setAlarmDescriptor(
+          int index, monitoring.Monitoring.AlarmDescriptor value) {
+        if (alarmDescriptorBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureAlarmListIsMutable();
-          alarmList_.set(index, value);
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.set(index, value);
           onChanged();
         } else {
-          alarmListBuilder_.setMessage(index, value);
+          alarmDescriptorBuilder_.setMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder setAlarmList(
-          int index, monitoring.Monitoring.AlarmID.Builder builderForValue) {
-        if (alarmListBuilder_ == null) {
-          ensureAlarmListIsMutable();
-          alarmList_.set(index, builderForValue.build());
+      public Builder setAlarmDescriptor(
+          int index, monitoring.Monitoring.AlarmDescriptor.Builder builderForValue) {
+        if (alarmDescriptorBuilder_ == null) {
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.set(index, builderForValue.build());
           onChanged();
         } else {
-          alarmListBuilder_.setMessage(index, builderForValue.build());
+          alarmDescriptorBuilder_.setMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder addAlarmList(monitoring.Monitoring.AlarmID value) {
-        if (alarmListBuilder_ == null) {
+      public Builder addAlarmDescriptor(monitoring.Monitoring.AlarmDescriptor value) {
+        if (alarmDescriptorBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureAlarmListIsMutable();
-          alarmList_.add(value);
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.add(value);
           onChanged();
         } else {
-          alarmListBuilder_.addMessage(value);
+          alarmDescriptorBuilder_.addMessage(value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder addAlarmList(
-          int index, monitoring.Monitoring.AlarmID value) {
-        if (alarmListBuilder_ == null) {
+      public Builder addAlarmDescriptor(
+          int index, monitoring.Monitoring.AlarmDescriptor value) {
+        if (alarmDescriptorBuilder_ == null) {
           if (value == null) {
             throw new NullPointerException();
           }
-          ensureAlarmListIsMutable();
-          alarmList_.add(index, value);
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.add(index, value);
           onChanged();
         } else {
-          alarmListBuilder_.addMessage(index, value);
+          alarmDescriptorBuilder_.addMessage(index, value);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder addAlarmList(
-          monitoring.Monitoring.AlarmID.Builder builderForValue) {
-        if (alarmListBuilder_ == null) {
-          ensureAlarmListIsMutable();
-          alarmList_.add(builderForValue.build());
+      public Builder addAlarmDescriptor(
+          monitoring.Monitoring.AlarmDescriptor.Builder builderForValue) {
+        if (alarmDescriptorBuilder_ == null) {
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.add(builderForValue.build());
           onChanged();
         } else {
-          alarmListBuilder_.addMessage(builderForValue.build());
+          alarmDescriptorBuilder_.addMessage(builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder addAlarmList(
-          int index, monitoring.Monitoring.AlarmID.Builder builderForValue) {
-        if (alarmListBuilder_ == null) {
-          ensureAlarmListIsMutable();
-          alarmList_.add(index, builderForValue.build());
+      public Builder addAlarmDescriptor(
+          int index, monitoring.Monitoring.AlarmDescriptor.Builder builderForValue) {
+        if (alarmDescriptorBuilder_ == null) {
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.add(index, builderForValue.build());
           onChanged();
         } else {
-          alarmListBuilder_.addMessage(index, builderForValue.build());
+          alarmDescriptorBuilder_.addMessage(index, builderForValue.build());
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder addAllAlarmList(
-          java.lang.Iterable<? extends monitoring.Monitoring.AlarmID> values) {
-        if (alarmListBuilder_ == null) {
-          ensureAlarmListIsMutable();
+      public Builder addAllAlarmDescriptor(
+          java.lang.Iterable<? extends monitoring.Monitoring.AlarmDescriptor> values) {
+        if (alarmDescriptorBuilder_ == null) {
+          ensureAlarmDescriptorIsMutable();
           com.google.protobuf.AbstractMessageLite.Builder.addAll(
-              values, alarmList_);
+              values, alarmDescriptor_);
           onChanged();
         } else {
-          alarmListBuilder_.addAllMessages(values);
+          alarmDescriptorBuilder_.addAllMessages(values);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder clearAlarmList() {
-        if (alarmListBuilder_ == null) {
-          alarmList_ = java.util.Collections.emptyList();
+      public Builder clearAlarmDescriptor() {
+        if (alarmDescriptorBuilder_ == null) {
+          alarmDescriptor_ = java.util.Collections.emptyList();
           bitField0_ = (bitField0_ & ~0x00000001);
           onChanged();
         } else {
-          alarmListBuilder_.clear();
+          alarmDescriptorBuilder_.clear();
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public Builder removeAlarmList(int index) {
-        if (alarmListBuilder_ == null) {
-          ensureAlarmListIsMutable();
-          alarmList_.remove(index);
+      public Builder removeAlarmDescriptor(int index) {
+        if (alarmDescriptorBuilder_ == null) {
+          ensureAlarmDescriptorIsMutable();
+          alarmDescriptor_.remove(index);
           onChanged();
         } else {
-          alarmListBuilder_.remove(index);
+          alarmDescriptorBuilder_.remove(index);
         }
         return this;
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.AlarmID.Builder getAlarmListBuilder(
+      public monitoring.Monitoring.AlarmDescriptor.Builder getAlarmDescriptorBuilder(
           int index) {
-        return getAlarmListFieldBuilder().getBuilder(index);
+        return getAlarmDescriptorFieldBuilder().getBuilder(index);
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.AlarmIDOrBuilder getAlarmListOrBuilder(
+      public monitoring.Monitoring.AlarmDescriptorOrBuilder getAlarmDescriptorOrBuilder(
           int index) {
-        if (alarmListBuilder_ == null) {
-          return alarmList_.get(index);  } else {
-          return alarmListBuilder_.getMessageOrBuilder(index);
+        if (alarmDescriptorBuilder_ == null) {
+          return alarmDescriptor_.get(index);  } else {
+          return alarmDescriptorBuilder_.getMessageOrBuilder(index);
         }
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public java.util.List<? extends monitoring.Monitoring.AlarmIDOrBuilder> 
-           getAlarmListOrBuilderList() {
-        if (alarmListBuilder_ != null) {
-          return alarmListBuilder_.getMessageOrBuilderList();
+      public java.util.List<? extends monitoring.Monitoring.AlarmDescriptorOrBuilder> 
+           getAlarmDescriptorOrBuilderList() {
+        if (alarmDescriptorBuilder_ != null) {
+          return alarmDescriptorBuilder_.getMessageOrBuilderList();
         } else {
-          return java.util.Collections.unmodifiableList(alarmList_);
+          return java.util.Collections.unmodifiableList(alarmDescriptor_);
         }
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.AlarmID.Builder addAlarmListBuilder() {
-        return getAlarmListFieldBuilder().addBuilder(
-            monitoring.Monitoring.AlarmID.getDefaultInstance());
+      public monitoring.Monitoring.AlarmDescriptor.Builder addAlarmDescriptorBuilder() {
+        return getAlarmDescriptorFieldBuilder().addBuilder(
+            monitoring.Monitoring.AlarmDescriptor.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public monitoring.Monitoring.AlarmID.Builder addAlarmListBuilder(
+      public monitoring.Monitoring.AlarmDescriptor.Builder addAlarmDescriptorBuilder(
           int index) {
-        return getAlarmListFieldBuilder().addBuilder(
-            index, monitoring.Monitoring.AlarmID.getDefaultInstance());
+        return getAlarmDescriptorFieldBuilder().addBuilder(
+            index, monitoring.Monitoring.AlarmDescriptor.getDefaultInstance());
       }
       /**
-       * <code>repeated .monitoring.AlarmID alarm_list = 1;</code>
+       * <code>repeated .monitoring.AlarmDescriptor alarm_descriptor = 1;</code>
        */
-      public java.util.List<monitoring.Monitoring.AlarmID.Builder> 
-           getAlarmListBuilderList() {
-        return getAlarmListFieldBuilder().getBuilderList();
+      public java.util.List<monitoring.Monitoring.AlarmDescriptor.Builder> 
+           getAlarmDescriptorBuilderList() {
+        return getAlarmDescriptorFieldBuilder().getBuilderList();
       }
       private com.google.protobuf.RepeatedFieldBuilderV3<
-          monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder> 
-          getAlarmListFieldBuilder() {
-        if (alarmListBuilder_ == null) {
-          alarmListBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
-              monitoring.Monitoring.AlarmID, monitoring.Monitoring.AlarmID.Builder, monitoring.Monitoring.AlarmIDOrBuilder>(
-                  alarmList_,
+          monitoring.Monitoring.AlarmDescriptor, monitoring.Monitoring.AlarmDescriptor.Builder, monitoring.Monitoring.AlarmDescriptorOrBuilder> 
+          getAlarmDescriptorFieldBuilder() {
+        if (alarmDescriptorBuilder_ == null) {
+          alarmDescriptorBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              monitoring.Monitoring.AlarmDescriptor, monitoring.Monitoring.AlarmDescriptor.Builder, monitoring.Monitoring.AlarmDescriptorOrBuilder>(
+                  alarmDescriptor_,
                   ((bitField0_ & 0x00000001) != 0),
                   getParentForChildren(),
                   isClean());
-          alarmList_ = null;
+          alarmDescriptor_ = null;
         }
-        return alarmListBuilder_;
+        return alarmDescriptorBuilder_;
       }
       @java.lang.Override
       public final Builder setUnknownFields(
@@ -19154,41 +21206,41 @@ public final class Monitoring {
       }
 
 
-      // @@protoc_insertion_point(builder_scope:monitoring.AlarmIDList)
+      // @@protoc_insertion_point(builder_scope:monitoring.AlarmList)
     }
 
-    // @@protoc_insertion_point(class_scope:monitoring.AlarmIDList)
-    private static final monitoring.Monitoring.AlarmIDList DEFAULT_INSTANCE;
+    // @@protoc_insertion_point(class_scope:monitoring.AlarmList)
+    private static final monitoring.Monitoring.AlarmList DEFAULT_INSTANCE;
     static {
-      DEFAULT_INSTANCE = new monitoring.Monitoring.AlarmIDList();
+      DEFAULT_INSTANCE = new monitoring.Monitoring.AlarmList();
     }
 
-    public static monitoring.Monitoring.AlarmIDList getDefaultInstance() {
+    public static monitoring.Monitoring.AlarmList getDefaultInstance() {
       return DEFAULT_INSTANCE;
     }
 
-    private static final com.google.protobuf.Parser<AlarmIDList>
-        PARSER = new com.google.protobuf.AbstractParser<AlarmIDList>() {
+    private static final com.google.protobuf.Parser<AlarmList>
+        PARSER = new com.google.protobuf.AbstractParser<AlarmList>() {
       @java.lang.Override
-      public AlarmIDList parsePartialFrom(
+      public AlarmList parsePartialFrom(
           com.google.protobuf.CodedInputStream input,
           com.google.protobuf.ExtensionRegistryLite extensionRegistry)
           throws com.google.protobuf.InvalidProtocolBufferException {
-        return new AlarmIDList(input, extensionRegistry);
+        return new AlarmList(input, extensionRegistry);
       }
     };
 
-    public static com.google.protobuf.Parser<AlarmIDList> parser() {
+    public static com.google.protobuf.Parser<AlarmList> parser() {
       return PARSER;
     }
 
     @java.lang.Override
-    public com.google.protobuf.Parser<AlarmIDList> getParserForType() {
+    public com.google.protobuf.Parser<AlarmList> getParserForType() {
       return PARSER;
     }
 
     @java.lang.Override
-    public monitoring.Monitoring.AlarmIDList getDefaultInstanceForType() {
+    public monitoring.Monitoring.AlarmList getDefaultInstanceForType() {
       return DEFAULT_INSTANCE;
     }
 
@@ -19209,6 +21261,21 @@ public final class Monitoring {
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_monitoring_KpiQuery_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_RawKpi_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_RawKpi_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_RawKpiList_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_RawKpiList_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_monitoring_RawKpiTable_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_monitoring_RawKpiTable_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_monitoring_KpiId_descriptor;
   private static final 
@@ -19255,10 +21322,10 @@ public final class Monitoring {
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_monitoring_SubsResponse_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_monitoring_SubsIDList_descriptor;
+    internal_static_monitoring_SubsList_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_monitoring_SubsIDList_fieldAccessorTable;
+      internal_static_monitoring_SubsList_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
     internal_static_monitoring_AlarmDescriptor_descriptor;
   private static final 
@@ -19280,10 +21347,10 @@ public final class Monitoring {
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_monitoring_AlarmResponse_fieldAccessorTable;
   private static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_monitoring_AlarmIDList_descriptor;
+    internal_static_monitoring_AlarmList_descriptor;
   private static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_monitoring_AlarmIDList_fieldAccessorTable;
+      internal_static_monitoring_AlarmList_fieldAccessorTable;
 
   public static com.google.protobuf.Descriptors.FileDescriptor
       getDescriptor() {
@@ -19294,7 +21361,7 @@ public final class Monitoring {
   static {
     java.lang.String[] descriptorData = {
       "\n\020monitoring.proto\022\nmonitoring\032\rcontext." +
-      "proto\032\026kpi_sample_types.proto\"\311\002\n\rKpiDes" +
+      "proto\032\026kpi_sample_types.proto\"\367\002\n\rKpiDes" +
       "criptor\022!\n\006kpi_id\030\001 \001(\0132\021.monitoring.Kpi" +
       "Id\022\027\n\017kpi_description\030\002 \001(\t\022&\n\013kpi_id_li" +
       "st\030\003 \003(\0132\021.monitoring.KpiId\0228\n\017kpi_sampl" +
@@ -19303,86 +21370,92 @@ public final class Monitoring {
       "eId\022(\n\013endpoint_id\030\006 \001(\0132\023.context.EndPo" +
       "intId\022&\n\nservice_id\030\007 \001(\0132\022.context.Serv" +
       "iceId\022\"\n\010slice_id\030\010 \001(\0132\020.context.SliceI" +
-      "d\"l\n\021MonitorKpiRequest\022!\n\006kpi_id\030\001 \001(\0132\021" +
-      ".monitoring.KpiId\022\033\n\023monitoring_window_s" +
-      "\030\002 \001(\002\022\027\n\017sampling_rate_s\030\003 \001(\002\"\323\001\n\010KpiQ" +
-      "uery\022!\n\006kpi_id\030\001 \003(\0132\021.monitoring.KpiId\022" +
-      "\033\n\023monitoring_window_s\030\002 \001(\002\022\027\n\017sampling" +
-      "_rate_s\030\003 \001(\002\022\026\n\016last_n_samples\030\004 \001(\r\022+\n" +
-      "\017start_timestamp\030\005 \001(\0132\022.context.Timesta" +
-      "mp\022)\n\rend_timestamp\030\006 \001(\0132\022.context.Time" +
-      "stamp\"&\n\005KpiId\022\035\n\006kpi_id\030\001 \001(\0132\r.context" +
-      ".Uuid\"x\n\003Kpi\022!\n\006kpi_id\030\001 \001(\0132\021.monitorin" +
-      "g.KpiId\022%\n\ttimestamp\030\002 \001(\0132\022.context.Tim" +
-      "estamp\022\'\n\tkpi_value\030\003 \001(\0132\024.monitoring.K" +
-      "piValue\"\250\001\n\rKpiValueRange\022)\n\013kpiMinValue" +
-      "\030\001 \001(\0132\024.monitoring.KpiValue\022)\n\013kpiMaxVa" +
-      "lue\030\002 \001(\0132\024.monitoring.KpiValue\022\017\n\007inRan" +
-      "ge\030\003 \001(\010\022\027\n\017includeMinValue\030\004 \001(\010\022\027\n\017inc" +
-      "ludeMaxValue\030\005 \001(\010\"\241\001\n\010KpiValue\022\022\n\010int32" +
-      "Val\030\001 \001(\005H\000\022\023\n\tuint32Val\030\002 \001(\rH\000\022\022\n\010int6" +
-      "4Val\030\003 \001(\003H\000\022\023\n\tuint64Val\030\004 \001(\004H\000\022\022\n\010flo" +
-      "atVal\030\005 \001(\002H\000\022\023\n\tstringVal\030\006 \001(\tH\000\022\021\n\007bo" +
-      "olVal\030\007 \001(\010H\000B\007\n\005value\",\n\007KpiList\022!\n\010kpi" +
-      "_list\030\001 \003(\0132\017.monitoring.Kpi\"K\n\021KpiDescr" +
-      "iptorList\0226\n\023kpi_descriptor_list\030\001 \003(\0132\031" +
-      ".monitoring.KpiDescriptor\"\362\001\n\016SubsDescri" +
-      "ptor\022+\n\007subs_id\030\001 \001(\0132\032.monitoring.Subsc" +
-      "riptionID\022!\n\006kpi_id\030\002 \001(\0132\021.monitoring.K" +
-      "piId\022\033\n\023sampling_duration_s\030\003 \001(\002\022\033\n\023sam" +
-      "pling_interval_s\030\004 \001(\002\022+\n\017start_timestam" +
-      "p\030\005 \001(\0132\022.context.Timestamp\022)\n\rend_times" +
-      "tamp\030\006 \001(\0132\022.context.Timestamp\"0\n\016Subscr" +
-      "iptionID\022\036\n\007subs_id\030\001 \001(\0132\r.context.Uuid" +
-      "\"b\n\014SubsResponse\022+\n\007subs_id\030\001 \001(\0132\032.moni" +
-      "toring.SubscriptionID\022%\n\010kpi_list\030\002 \003(\0132" +
-      "\023.monitoring.KpiList\";\n\nSubsIDList\022-\n\tsu" +
-      "bs_list\030\001 \003(\0132\032.monitoring.SubscriptionI" +
-      "D\"\337\001\n\017AlarmDescriptor\022%\n\010alarm_id\030\001 \001(\0132" +
-      "\023.monitoring.AlarmID\022\031\n\021alarm_descriptio" +
-      "n\030\002 \001(\t\022\014\n\004name\030\003 \001(\t\022!\n\006kpi_id\030\004 \003(\0132\021." +
-      "monitoring.KpiId\0222\n\017kpi_value_range\030\005 \003(" +
-      "\0132\031.monitoring.KpiValueRange\022%\n\ttimestam" +
-      "p\030\006 \001(\0132\022.context.Timestamp\"*\n\007AlarmID\022\037" +
-      "\n\010alarm_id\030\001 \001(\0132\r.context.Uuid\"|\n\021Alarm" +
-      "Subscription\022$\n\007alarmID\030\001 \001(\0132\023.monitori" +
-      "ng.AlarmID\022\036\n\026subscription_timeout_s\030\002 \001" +
-      "(\002\022!\n\031subscription_frequency_ms\030\003 \001(\002\"\224\001" +
-      "\n\rAlarmResponse\022%\n\010alarm_id\030\001 \001(\0132\023.moni" +
-      "toring.AlarmID\022\014\n\004text\030\002 \001(\t\022\'\n\tkpi_valu" +
-      "e\030\003 \001(\0132\024.monitoring.KpiValue\022%\n\ttimesta" +
-      "mp\030\004 \001(\0132\022.context.Timestamp\"6\n\013AlarmIDL" +
-      "ist\022\'\n\nalarm_list\030\001 \003(\0132\023.monitoring.Ala" +
-      "rmID2\233\t\n\021MonitoringService\0228\n\006SetKpi\022\031.m" +
-      "onitoring.KpiDescriptor\032\021.monitoring.Kpi" +
-      "Id\"\000\0220\n\tDeleteKpi\022\021.monitoring.KpiId\032\016.c" +
-      "ontext.Empty\"\000\022B\n\020GetKpiDescriptor\022\021.mon" +
-      "itoring.KpiId\032\031.monitoring.KpiDescriptor" +
-      "\"\000\022G\n\024GetKpiDescriptorList\022\016.context.Emp" +
-      "ty\032\035.monitoring.KpiDescriptorList\"\000\022/\n\nI" +
-      "ncludeKpi\022\017.monitoring.Kpi\032\016.context.Emp" +
-      "ty\"\000\022=\n\nMonitorKpi\022\035.monitoring.MonitorK" +
-      "piRequest\032\016.context.Empty\"\000\022;\n\014QueryKpiD" +
-      "ata\022\024.monitoring.KpiQuery\032\023.monitoring.K" +
-      "piList\"\000\022I\n\022SetKpiSubscription\022\032.monitor" +
-      "ing.SubsDescriptor\032\023.monitoring.KpiList\"" +
+      "d\022,\n\rconnection_id\030\t \001(\0132\025.context.Conne" +
+      "ctionId\"l\n\021MonitorKpiRequest\022!\n\006kpi_id\030\001" +
+      " \001(\0132\021.monitoring.KpiId\022\033\n\023monitoring_wi" +
+      "ndow_s\030\002 \001(\002\022\027\n\017sampling_rate_s\030\003 \001(\002\"\273\001" +
+      "\n\010KpiQuery\022\"\n\007kpi_ids\030\001 \003(\0132\021.monitoring" +
+      ".KpiId\022\033\n\023monitoring_window_s\030\002 \001(\002\022\026\n\016l" +
+      "ast_n_samples\030\003 \001(\r\022+\n\017start_timestamp\030\004" +
+      " \001(\0132\022.context.Timestamp\022)\n\rend_timestam" +
+      "p\030\005 \001(\0132\022.context.Timestamp\"X\n\006RawKpi\022%\n" +
+      "\ttimestamp\030\001 \001(\0132\022.context.Timestamp\022\'\n\t" +
+      "kpi_value\030\002 \001(\0132\024.monitoring.KpiValue\"U\n" +
+      "\nRawKpiList\022!\n\006kpi_id\030\001 \001(\0132\021.monitoring" +
+      ".KpiId\022$\n\010raw_kpis\030\002 \003(\0132\022.monitoring.Ra" +
+      "wKpi\"<\n\013RawKpiTable\022-\n\rraw_kpi_lists\030\001 \003" +
+      "(\0132\026.monitoring.RawKpiList\"&\n\005KpiId\022\035\n\006k" +
+      "pi_id\030\001 \001(\0132\r.context.Uuid\"x\n\003Kpi\022!\n\006kpi" +
+      "_id\030\001 \001(\0132\021.monitoring.KpiId\022%\n\ttimestam" +
+      "p\030\002 \001(\0132\022.context.Timestamp\022\'\n\tkpi_value" +
+      "\030\003 \001(\0132\024.monitoring.KpiValue\"\250\001\n\rKpiValu" +
+      "eRange\022)\n\013kpiMinValue\030\001 \001(\0132\024.monitoring" +
+      ".KpiValue\022)\n\013kpiMaxValue\030\002 \001(\0132\024.monitor" +
+      "ing.KpiValue\022\017\n\007inRange\030\003 \001(\010\022\027\n\017include" +
+      "MinValue\030\004 \001(\010\022\027\n\017includeMaxValue\030\005 \001(\010\"" +
+      "\241\001\n\010KpiValue\022\022\n\010int32Val\030\001 \001(\005H\000\022\023\n\tuint" +
+      "32Val\030\002 \001(\rH\000\022\022\n\010int64Val\030\003 \001(\003H\000\022\023\n\tuin" +
+      "t64Val\030\004 \001(\004H\000\022\022\n\010floatVal\030\005 \001(\002H\000\022\023\n\tst" +
+      "ringVal\030\006 \001(\tH\000\022\021\n\007boolVal\030\007 \001(\010H\000B\007\n\005va" +
+      "lue\"\'\n\007KpiList\022\034\n\003kpi\030\001 \003(\0132\017.monitoring" +
+      ".Kpi\"K\n\021KpiDescriptorList\0226\n\023kpi_descrip" +
+      "tor_list\030\001 \003(\0132\031.monitoring.KpiDescripto" +
+      "r\"\362\001\n\016SubsDescriptor\022+\n\007subs_id\030\001 \001(\0132\032." +
+      "monitoring.SubscriptionID\022!\n\006kpi_id\030\002 \001(" +
+      "\0132\021.monitoring.KpiId\022\033\n\023sampling_duratio" +
+      "n_s\030\003 \001(\002\022\033\n\023sampling_interval_s\030\004 \001(\002\022+" +
+      "\n\017start_timestamp\030\005 \001(\0132\022.context.Timest" +
+      "amp\022)\n\rend_timestamp\030\006 \001(\0132\022.context.Tim" +
+      "estamp\"0\n\016SubscriptionID\022\036\n\007subs_id\030\001 \001(" +
+      "\0132\r.context.Uuid\"b\n\014SubsResponse\022+\n\007subs" +
+      "_id\030\001 \001(\0132\032.monitoring.SubscriptionID\022%\n" +
+      "\010kpi_list\030\002 \001(\0132\023.monitoring.KpiList\"?\n\010" +
+      "SubsList\0223\n\017subs_descriptor\030\001 \003(\0132\032.moni" +
+      "toring.SubsDescriptor\"\337\001\n\017AlarmDescripto" +
+      "r\022%\n\010alarm_id\030\001 \001(\0132\023.monitoring.AlarmID" +
+      "\022\031\n\021alarm_description\030\002 \001(\t\022\014\n\004name\030\003 \001(" +
+      "\t\022!\n\006kpi_id\030\004 \001(\0132\021.monitoring.KpiId\0222\n\017" +
+      "kpi_value_range\030\005 \001(\0132\031.monitoring.KpiVa" +
+      "lueRange\022%\n\ttimestamp\030\006 \001(\0132\022.context.Ti" +
+      "mestamp\"*\n\007AlarmID\022\037\n\010alarm_id\030\001 \001(\0132\r.c" +
+      "ontext.Uuid\"}\n\021AlarmSubscription\022%\n\010alar" +
+      "m_id\030\001 \001(\0132\023.monitoring.AlarmID\022\036\n\026subsc" +
+      "ription_timeout_s\030\002 \001(\002\022!\n\031subscription_" +
+      "frequency_ms\030\003 \001(\002\"k\n\rAlarmResponse\022%\n\010a" +
+      "larm_id\030\001 \001(\0132\023.monitoring.AlarmID\022\014\n\004te" +
+      "xt\030\002 \001(\t\022%\n\010kpi_list\030\003 \001(\0132\023.monitoring." +
+      "KpiList\"B\n\tAlarmList\0225\n\020alarm_descriptor" +
+      "\030\001 \003(\0132\033.monitoring.AlarmDescriptor2\234\t\n\021" +
+      "MonitoringService\0228\n\006SetKpi\022\031.monitoring" +
+      ".KpiDescriptor\032\021.monitoring.KpiId\"\000\0220\n\tD" +
+      "eleteKpi\022\021.monitoring.KpiId\032\016.context.Em" +
+      "pty\"\000\022B\n\020GetKpiDescriptor\022\021.monitoring.K" +
+      "piId\032\031.monitoring.KpiDescriptor\"\000\022G\n\024Get" +
+      "KpiDescriptorList\022\016.context.Empty\032\035.moni" +
+      "toring.KpiDescriptorList\"\000\022/\n\nIncludeKpi" +
+      "\022\017.monitoring.Kpi\032\016.context.Empty\"\000\022=\n\nM" +
+      "onitorKpi\022\035.monitoring.MonitorKpiRequest" +
+      "\032\016.context.Empty\"\000\022?\n\014QueryKpiData\022\024.mon" +
+      "itoring.KpiQuery\032\027.monitoring.RawKpiTabl" +
+      "e\"\000\022N\n\022SetKpiSubscription\022\032.monitoring.S" +
+      "ubsDescriptor\032\030.monitoring.SubsResponse\"" +
       "\0000\001\022M\n\021GetSubsDescriptor\022\032.monitoring.Su" +
       "bscriptionID\032\032.monitoring.SubsDescriptor" +
-      "\"\000\022<\n\020GetSubscriptions\022\016.context.Empty\032\026" +
-      ".monitoring.SubsIDList\"\000\022B\n\022DeleteSubscr" +
-      "iption\022\032.monitoring.SubscriptionID\032\016.con" +
-      "text.Empty\"\000\022A\n\013SetKpiAlarm\022\033.monitoring" +
-      ".AlarmDescriptor\032\023.monitoring.AlarmID\"\000\022" +
-      "6\n\tGetAlarms\022\016.context.Empty\032\027.monitorin" +
-      "g.AlarmIDList\"\000\022H\n\022GetAlarmDescriptor\022\023." +
-      "monitoring.AlarmID\032\033.monitoring.AlarmDes" +
-      "criptor\"\000\022V\n\026GetAlarmResponseStream\022\035.mo" +
-      "nitoring.AlarmSubscription\032\031.monitoring." +
-      "AlarmResponse\"\0000\001\0224\n\013DeleteAlarm\022\023.monit" +
-      "oring.AlarmID\032\016.context.Empty\"\000\0226\n\014GetSt" +
-      "reamKpi\022\021.monitoring.KpiId\032\017.monitoring." +
-      "Kpi\"\0000\001\0229\n\rGetInstantKpi\022\021.monitoring.Kp" +
-      "iId\032\023.monitoring.KpiList\"\000b\006proto3"
+      "\"\000\022:\n\020GetSubscriptions\022\016.context.Empty\032\024" +
+      ".monitoring.SubsList\"\000\022B\n\022DeleteSubscrip" +
+      "tion\022\032.monitoring.SubscriptionID\032\016.conte" +
+      "xt.Empty\"\000\022A\n\013SetKpiAlarm\022\033.monitoring.A" +
+      "larmDescriptor\032\023.monitoring.AlarmID\"\000\0224\n" +
+      "\tGetAlarms\022\016.context.Empty\032\025.monitoring." +
+      "AlarmList\"\000\022H\n\022GetAlarmDescriptor\022\023.moni" +
+      "toring.AlarmID\032\033.monitoring.AlarmDescrip" +
+      "tor\"\000\022V\n\026GetAlarmResponseStream\022\035.monito" +
+      "ring.AlarmSubscription\032\031.monitoring.Alar" +
+      "mResponse\"\0000\001\0224\n\013DeleteAlarm\022\023.monitorin" +
+      "g.AlarmID\032\016.context.Empty\"\000\0226\n\014GetStream" +
+      "Kpi\022\021.monitoring.KpiId\032\017.monitoring.Kpi\"" +
+      "\0000\001\0225\n\rGetInstantKpi\022\021.monitoring.KpiId\032" +
+      "\017.monitoring.Kpi\"\000b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -19395,7 +21468,7 @@ public final class Monitoring {
     internal_static_monitoring_KpiDescriptor_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiDescriptor_descriptor,
-        new java.lang.String[] { "KpiId", "KpiDescription", "KpiIdList", "KpiSampleType", "DeviceId", "EndpointId", "ServiceId", "SliceId", });
+        new java.lang.String[] { "KpiId", "KpiDescription", "KpiIdList", "KpiSampleType", "DeviceId", "EndpointId", "ServiceId", "SliceId", "ConnectionId", });
     internal_static_monitoring_MonitorKpiRequest_descriptor =
       getDescriptor().getMessageTypes().get(1);
     internal_static_monitoring_MonitorKpiRequest_fieldAccessorTable = new
@@ -19407,97 +21480,115 @@ public final class Monitoring {
     internal_static_monitoring_KpiQuery_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiQuery_descriptor,
-        new java.lang.String[] { "KpiId", "MonitoringWindowS", "SamplingRateS", "LastNSamples", "StartTimestamp", "EndTimestamp", });
-    internal_static_monitoring_KpiId_descriptor =
+        new java.lang.String[] { "KpiIds", "MonitoringWindowS", "LastNSamples", "StartTimestamp", "EndTimestamp", });
+    internal_static_monitoring_RawKpi_descriptor =
       getDescriptor().getMessageTypes().get(3);
+    internal_static_monitoring_RawKpi_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_RawKpi_descriptor,
+        new java.lang.String[] { "Timestamp", "KpiValue", });
+    internal_static_monitoring_RawKpiList_descriptor =
+      getDescriptor().getMessageTypes().get(4);
+    internal_static_monitoring_RawKpiList_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_RawKpiList_descriptor,
+        new java.lang.String[] { "KpiId", "RawKpis", });
+    internal_static_monitoring_RawKpiTable_descriptor =
+      getDescriptor().getMessageTypes().get(5);
+    internal_static_monitoring_RawKpiTable_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_monitoring_RawKpiTable_descriptor,
+        new java.lang.String[] { "RawKpiLists", });
+    internal_static_monitoring_KpiId_descriptor =
+      getDescriptor().getMessageTypes().get(6);
     internal_static_monitoring_KpiId_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiId_descriptor,
         new java.lang.String[] { "KpiId", });
     internal_static_monitoring_Kpi_descriptor =
-      getDescriptor().getMessageTypes().get(4);
+      getDescriptor().getMessageTypes().get(7);
     internal_static_monitoring_Kpi_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_Kpi_descriptor,
         new java.lang.String[] { "KpiId", "Timestamp", "KpiValue", });
     internal_static_monitoring_KpiValueRange_descriptor =
-      getDescriptor().getMessageTypes().get(5);
+      getDescriptor().getMessageTypes().get(8);
     internal_static_monitoring_KpiValueRange_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiValueRange_descriptor,
         new java.lang.String[] { "KpiMinValue", "KpiMaxValue", "InRange", "IncludeMinValue", "IncludeMaxValue", });
     internal_static_monitoring_KpiValue_descriptor =
-      getDescriptor().getMessageTypes().get(6);
+      getDescriptor().getMessageTypes().get(9);
     internal_static_monitoring_KpiValue_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiValue_descriptor,
         new java.lang.String[] { "Int32Val", "Uint32Val", "Int64Val", "Uint64Val", "FloatVal", "StringVal", "BoolVal", "Value", });
     internal_static_monitoring_KpiList_descriptor =
-      getDescriptor().getMessageTypes().get(7);
+      getDescriptor().getMessageTypes().get(10);
     internal_static_monitoring_KpiList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiList_descriptor,
-        new java.lang.String[] { "KpiList", });
+        new java.lang.String[] { "Kpi", });
     internal_static_monitoring_KpiDescriptorList_descriptor =
-      getDescriptor().getMessageTypes().get(8);
+      getDescriptor().getMessageTypes().get(11);
     internal_static_monitoring_KpiDescriptorList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_KpiDescriptorList_descriptor,
         new java.lang.String[] { "KpiDescriptorList", });
     internal_static_monitoring_SubsDescriptor_descriptor =
-      getDescriptor().getMessageTypes().get(9);
+      getDescriptor().getMessageTypes().get(12);
     internal_static_monitoring_SubsDescriptor_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_SubsDescriptor_descriptor,
         new java.lang.String[] { "SubsId", "KpiId", "SamplingDurationS", "SamplingIntervalS", "StartTimestamp", "EndTimestamp", });
     internal_static_monitoring_SubscriptionID_descriptor =
-      getDescriptor().getMessageTypes().get(10);
+      getDescriptor().getMessageTypes().get(13);
     internal_static_monitoring_SubscriptionID_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_SubscriptionID_descriptor,
         new java.lang.String[] { "SubsId", });
     internal_static_monitoring_SubsResponse_descriptor =
-      getDescriptor().getMessageTypes().get(11);
+      getDescriptor().getMessageTypes().get(14);
     internal_static_monitoring_SubsResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_SubsResponse_descriptor,
         new java.lang.String[] { "SubsId", "KpiList", });
-    internal_static_monitoring_SubsIDList_descriptor =
-      getDescriptor().getMessageTypes().get(12);
-    internal_static_monitoring_SubsIDList_fieldAccessorTable = new
+    internal_static_monitoring_SubsList_descriptor =
+      getDescriptor().getMessageTypes().get(15);
+    internal_static_monitoring_SubsList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_monitoring_SubsIDList_descriptor,
-        new java.lang.String[] { "SubsList", });
+        internal_static_monitoring_SubsList_descriptor,
+        new java.lang.String[] { "SubsDescriptor", });
     internal_static_monitoring_AlarmDescriptor_descriptor =
-      getDescriptor().getMessageTypes().get(13);
+      getDescriptor().getMessageTypes().get(16);
     internal_static_monitoring_AlarmDescriptor_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_AlarmDescriptor_descriptor,
         new java.lang.String[] { "AlarmId", "AlarmDescription", "Name", "KpiId", "KpiValueRange", "Timestamp", });
     internal_static_monitoring_AlarmID_descriptor =
-      getDescriptor().getMessageTypes().get(14);
+      getDescriptor().getMessageTypes().get(17);
     internal_static_monitoring_AlarmID_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_AlarmID_descriptor,
         new java.lang.String[] { "AlarmId", });
     internal_static_monitoring_AlarmSubscription_descriptor =
-      getDescriptor().getMessageTypes().get(15);
+      getDescriptor().getMessageTypes().get(18);
     internal_static_monitoring_AlarmSubscription_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_AlarmSubscription_descriptor,
-        new java.lang.String[] { "AlarmID", "SubscriptionTimeoutS", "SubscriptionFrequencyMs", });
+        new java.lang.String[] { "AlarmId", "SubscriptionTimeoutS", "SubscriptionFrequencyMs", });
     internal_static_monitoring_AlarmResponse_descriptor =
-      getDescriptor().getMessageTypes().get(16);
+      getDescriptor().getMessageTypes().get(19);
     internal_static_monitoring_AlarmResponse_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_monitoring_AlarmResponse_descriptor,
-        new java.lang.String[] { "AlarmId", "Text", "KpiValue", "Timestamp", });
-    internal_static_monitoring_AlarmIDList_descriptor =
-      getDescriptor().getMessageTypes().get(17);
-    internal_static_monitoring_AlarmIDList_fieldAccessorTable = new
+        new java.lang.String[] { "AlarmId", "Text", "KpiList", });
+    internal_static_monitoring_AlarmList_descriptor =
+      getDescriptor().getMessageTypes().get(20);
+    internal_static_monitoring_AlarmList_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_monitoring_AlarmIDList_descriptor,
-        new java.lang.String[] { "AlarmList", });
+        internal_static_monitoring_AlarmList_descriptor,
+        new java.lang.String[] { "AlarmDescriptor", });
     context.ContextOuterClass.getDescriptor();
     kpi_sample_types.KpiSampleTypes.getDescriptor();
   }
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java
index 6372600680d57d0b351e7dd67b88c84f9d8e8cff..0ce30559b2c0a1bb6236431482d6b99b82cf0842 100644
--- a/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringService.java
@@ -20,26 +20,26 @@ public interface MonitoringService extends MutinyService {
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> monitorKpi(monitoring.Monitoring.MonitorKpiRequest request);
     
-    io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> queryKpiData(monitoring.Monitoring.KpiQuery request);
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.RawKpiTable> queryKpiData(monitoring.Monitoring.KpiQuery request);
     
     io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsDescriptor> getSubsDescriptor(monitoring.Monitoring.SubscriptionID request);
     
-    io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsIDList> getSubscriptions(context.ContextOuterClass.Empty request);
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsList> getSubscriptions(context.ContextOuterClass.Empty request);
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteSubscription(monitoring.Monitoring.SubscriptionID request);
     
     io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmID> setKpiAlarm(monitoring.Monitoring.AlarmDescriptor request);
     
-    io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmIDList> getAlarms(context.ContextOuterClass.Empty request);
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmList> getAlarms(context.ContextOuterClass.Empty request);
     
     io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmDescriptor> getAlarmDescriptor(monitoring.Monitoring.AlarmID request);
     
     io.smallrye.mutiny.Uni<context.ContextOuterClass.Empty> deleteAlarm(monitoring.Monitoring.AlarmID request);
     
-    io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> getInstantKpi(monitoring.Monitoring.KpiId request);
+    io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request);
     
     
-    io.smallrye.mutiny.Multi<monitoring.Monitoring.KpiList> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request);
+    io.smallrye.mutiny.Multi<monitoring.Monitoring.SubsResponse> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request);
     
     io.smallrye.mutiny.Multi<monitoring.Monitoring.AlarmResponse> getAlarmResponseStream(monitoring.Monitoring.AlarmSubscription request);
     
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java
index 21f7f48acd6b6870584133dc3d665f681e78cf5e..cbc984e7132bdbf22c9b99a510106c5c6f4cbda7 100644
--- a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceBean.java
@@ -64,7 +64,7 @@ public class MonitoringServiceBean extends MutinyMonitoringServiceGrpc.Monitorin
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> queryKpiData(monitoring.Monitoring.KpiQuery request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.RawKpiTable> queryKpiData(monitoring.Monitoring.KpiQuery request) {
        try {
          return delegate.queryKpiData(request);
        } catch (UnsupportedOperationException e) {
@@ -80,7 +80,7 @@ public class MonitoringServiceBean extends MutinyMonitoringServiceGrpc.Monitorin
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsIDList> getSubscriptions(context.ContextOuterClass.Empty request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsList> getSubscriptions(context.ContextOuterClass.Empty request) {
        try {
          return delegate.getSubscriptions(request);
        } catch (UnsupportedOperationException e) {
@@ -104,7 +104,7 @@ public class MonitoringServiceBean extends MutinyMonitoringServiceGrpc.Monitorin
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmIDList> getAlarms(context.ContextOuterClass.Empty request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmList> getAlarms(context.ContextOuterClass.Empty request) {
        try {
          return delegate.getAlarms(request);
        } catch (UnsupportedOperationException e) {
@@ -128,7 +128,7 @@ public class MonitoringServiceBean extends MutinyMonitoringServiceGrpc.Monitorin
        }
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> getInstantKpi(monitoring.Monitoring.KpiId request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
        try {
          return delegate.getInstantKpi(request);
        } catch (UnsupportedOperationException e) {
@@ -137,7 +137,7 @@ public class MonitoringServiceBean extends MutinyMonitoringServiceGrpc.Monitorin
     }
 
     @Override
-    public io.smallrye.mutiny.Multi<monitoring.Monitoring.KpiList> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
+    public io.smallrye.mutiny.Multi<monitoring.Monitoring.SubsResponse> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
        try {
          return delegate.setKpiSubscription(request);
        } catch (UnsupportedOperationException e) {
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java
index 6b6dc38645931ad94287b4151019c3b42a1c098d..0e8ff5d1b8929694b49548984cd7d53f9c8f68a4 100644
--- a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceClient.java
@@ -45,7 +45,7 @@ public class MonitoringServiceClient implements MonitoringService, MutinyClient<
        return stub.monitorKpi(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> queryKpiData(monitoring.Monitoring.KpiQuery request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.RawKpiTable> queryKpiData(monitoring.Monitoring.KpiQuery request) {
        return stub.queryKpiData(request);
     }
     @Override
@@ -53,7 +53,7 @@ public class MonitoringServiceClient implements MonitoringService, MutinyClient<
        return stub.getSubsDescriptor(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsIDList> getSubscriptions(context.ContextOuterClass.Empty request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsList> getSubscriptions(context.ContextOuterClass.Empty request) {
        return stub.getSubscriptions(request);
     }
     @Override
@@ -65,7 +65,7 @@ public class MonitoringServiceClient implements MonitoringService, MutinyClient<
        return stub.setKpiAlarm(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmIDList> getAlarms(context.ContextOuterClass.Empty request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmList> getAlarms(context.ContextOuterClass.Empty request) {
        return stub.getAlarms(request);
     }
     @Override
@@ -77,12 +77,12 @@ public class MonitoringServiceClient implements MonitoringService, MutinyClient<
        return stub.deleteAlarm(request);
     }
     @Override
-    public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> getInstantKpi(monitoring.Monitoring.KpiId request) {
+    public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
        return stub.getInstantKpi(request);
     }
 
     @Override
-    public io.smallrye.mutiny.Multi<monitoring.Monitoring.KpiList> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
+    public io.smallrye.mutiny.Multi<monitoring.Monitoring.SubsResponse> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
        return stub.setKpiSubscription(request);
     }
 
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
index fe92a7814166b65b12db5d50bb4baaf525c59146..c5f55b3b44c03ea8f5377ce11e3c3e547da5ef06 100644
--- a/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
+++ b/src/automation/target/generated-sources/grpc/monitoring/MonitoringServiceGrpc.java
@@ -201,28 +201,28 @@ public final class MonitoringServiceGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.KpiQuery,
-      monitoring.Monitoring.KpiList> getQueryKpiDataMethod;
+      monitoring.Monitoring.RawKpiTable> getQueryKpiDataMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "QueryKpiData",
       requestType = monitoring.Monitoring.KpiQuery.class,
-      responseType = monitoring.Monitoring.KpiList.class,
+      responseType = monitoring.Monitoring.RawKpiTable.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<monitoring.Monitoring.KpiQuery,
-      monitoring.Monitoring.KpiList> getQueryKpiDataMethod() {
-    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiQuery, monitoring.Monitoring.KpiList> getQueryKpiDataMethod;
+      monitoring.Monitoring.RawKpiTable> getQueryKpiDataMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiQuery, monitoring.Monitoring.RawKpiTable> getQueryKpiDataMethod;
     if ((getQueryKpiDataMethod = MonitoringServiceGrpc.getQueryKpiDataMethod) == null) {
       synchronized (MonitoringServiceGrpc.class) {
         if ((getQueryKpiDataMethod = MonitoringServiceGrpc.getQueryKpiDataMethod) == null) {
           MonitoringServiceGrpc.getQueryKpiDataMethod = getQueryKpiDataMethod =
-              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiQuery, monitoring.Monitoring.KpiList>newBuilder()
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiQuery, monitoring.Monitoring.RawKpiTable>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "QueryKpiData"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   monitoring.Monitoring.KpiQuery.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  monitoring.Monitoring.KpiList.getDefaultInstance()))
+                  monitoring.Monitoring.RawKpiTable.getDefaultInstance()))
               .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("QueryKpiData"))
               .build();
         }
@@ -232,28 +232,28 @@ public final class MonitoringServiceGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.SubsDescriptor,
-      monitoring.Monitoring.KpiList> getSetKpiSubscriptionMethod;
+      monitoring.Monitoring.SubsResponse> getSetKpiSubscriptionMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "SetKpiSubscription",
       requestType = monitoring.Monitoring.SubsDescriptor.class,
-      responseType = monitoring.Monitoring.KpiList.class,
+      responseType = monitoring.Monitoring.SubsResponse.class,
       methodType = io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
   public static io.grpc.MethodDescriptor<monitoring.Monitoring.SubsDescriptor,
-      monitoring.Monitoring.KpiList> getSetKpiSubscriptionMethod() {
-    io.grpc.MethodDescriptor<monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.KpiList> getSetKpiSubscriptionMethod;
+      monitoring.Monitoring.SubsResponse> getSetKpiSubscriptionMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.SubsResponse> getSetKpiSubscriptionMethod;
     if ((getSetKpiSubscriptionMethod = MonitoringServiceGrpc.getSetKpiSubscriptionMethod) == null) {
       synchronized (MonitoringServiceGrpc.class) {
         if ((getSetKpiSubscriptionMethod = MonitoringServiceGrpc.getSetKpiSubscriptionMethod) == null) {
           MonitoringServiceGrpc.getSetKpiSubscriptionMethod = getSetKpiSubscriptionMethod =
-              io.grpc.MethodDescriptor.<monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.KpiList>newBuilder()
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.SubsDescriptor, monitoring.Monitoring.SubsResponse>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.SERVER_STREAMING)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "SetKpiSubscription"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   monitoring.Monitoring.SubsDescriptor.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  monitoring.Monitoring.KpiList.getDefaultInstance()))
+                  monitoring.Monitoring.SubsResponse.getDefaultInstance()))
               .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("SetKpiSubscription"))
               .build();
         }
@@ -294,28 +294,28 @@ public final class MonitoringServiceGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.Empty,
-      monitoring.Monitoring.SubsIDList> getGetSubscriptionsMethod;
+      monitoring.Monitoring.SubsList> getGetSubscriptionsMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "GetSubscriptions",
       requestType = context.ContextOuterClass.Empty.class,
-      responseType = monitoring.Monitoring.SubsIDList.class,
+      responseType = monitoring.Monitoring.SubsList.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<context.ContextOuterClass.Empty,
-      monitoring.Monitoring.SubsIDList> getGetSubscriptionsMethod() {
-    io.grpc.MethodDescriptor<context.ContextOuterClass.Empty, monitoring.Monitoring.SubsIDList> getGetSubscriptionsMethod;
+      monitoring.Monitoring.SubsList> getGetSubscriptionsMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.Empty, monitoring.Monitoring.SubsList> getGetSubscriptionsMethod;
     if ((getGetSubscriptionsMethod = MonitoringServiceGrpc.getGetSubscriptionsMethod) == null) {
       synchronized (MonitoringServiceGrpc.class) {
         if ((getGetSubscriptionsMethod = MonitoringServiceGrpc.getGetSubscriptionsMethod) == null) {
           MonitoringServiceGrpc.getGetSubscriptionsMethod = getGetSubscriptionsMethod =
-              io.grpc.MethodDescriptor.<context.ContextOuterClass.Empty, monitoring.Monitoring.SubsIDList>newBuilder()
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.Empty, monitoring.Monitoring.SubsList>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetSubscriptions"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   context.ContextOuterClass.Empty.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  monitoring.Monitoring.SubsIDList.getDefaultInstance()))
+                  monitoring.Monitoring.SubsList.getDefaultInstance()))
               .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("GetSubscriptions"))
               .build();
         }
@@ -387,28 +387,28 @@ public final class MonitoringServiceGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<context.ContextOuterClass.Empty,
-      monitoring.Monitoring.AlarmIDList> getGetAlarmsMethod;
+      monitoring.Monitoring.AlarmList> getGetAlarmsMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "GetAlarms",
       requestType = context.ContextOuterClass.Empty.class,
-      responseType = monitoring.Monitoring.AlarmIDList.class,
+      responseType = monitoring.Monitoring.AlarmList.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<context.ContextOuterClass.Empty,
-      monitoring.Monitoring.AlarmIDList> getGetAlarmsMethod() {
-    io.grpc.MethodDescriptor<context.ContextOuterClass.Empty, monitoring.Monitoring.AlarmIDList> getGetAlarmsMethod;
+      monitoring.Monitoring.AlarmList> getGetAlarmsMethod() {
+    io.grpc.MethodDescriptor<context.ContextOuterClass.Empty, monitoring.Monitoring.AlarmList> getGetAlarmsMethod;
     if ((getGetAlarmsMethod = MonitoringServiceGrpc.getGetAlarmsMethod) == null) {
       synchronized (MonitoringServiceGrpc.class) {
         if ((getGetAlarmsMethod = MonitoringServiceGrpc.getGetAlarmsMethod) == null) {
           MonitoringServiceGrpc.getGetAlarmsMethod = getGetAlarmsMethod =
-              io.grpc.MethodDescriptor.<context.ContextOuterClass.Empty, monitoring.Monitoring.AlarmIDList>newBuilder()
+              io.grpc.MethodDescriptor.<context.ContextOuterClass.Empty, monitoring.Monitoring.AlarmList>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetAlarms"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   context.ContextOuterClass.Empty.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  monitoring.Monitoring.AlarmIDList.getDefaultInstance()))
+                  monitoring.Monitoring.AlarmList.getDefaultInstance()))
               .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("GetAlarms"))
               .build();
         }
@@ -542,28 +542,28 @@ public final class MonitoringServiceGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
-      monitoring.Monitoring.KpiList> getGetInstantKpiMethod;
+      monitoring.Monitoring.Kpi> getGetInstantKpiMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "GetInstantKpi",
       requestType = monitoring.Monitoring.KpiId.class,
-      responseType = monitoring.Monitoring.KpiList.class,
+      responseType = monitoring.Monitoring.Kpi.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId,
-      monitoring.Monitoring.KpiList> getGetInstantKpiMethod() {
-    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiList> getGetInstantKpiMethod;
+      monitoring.Monitoring.Kpi> getGetInstantKpiMethod() {
+    io.grpc.MethodDescriptor<monitoring.Monitoring.KpiId, monitoring.Monitoring.Kpi> getGetInstantKpiMethod;
     if ((getGetInstantKpiMethod = MonitoringServiceGrpc.getGetInstantKpiMethod) == null) {
       synchronized (MonitoringServiceGrpc.class) {
         if ((getGetInstantKpiMethod = MonitoringServiceGrpc.getGetInstantKpiMethod) == null) {
           MonitoringServiceGrpc.getGetInstantKpiMethod = getGetInstantKpiMethod =
-              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiId, monitoring.Monitoring.KpiList>newBuilder()
+              io.grpc.MethodDescriptor.<monitoring.Monitoring.KpiId, monitoring.Monitoring.Kpi>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetInstantKpi"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   monitoring.Monitoring.KpiId.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  monitoring.Monitoring.KpiList.getDefaultInstance()))
+                  monitoring.Monitoring.Kpi.getDefaultInstance()))
               .setSchemaDescriptor(new MonitoringServiceMethodDescriptorSupplier("GetInstantKpi"))
               .build();
         }
@@ -665,14 +665,14 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void queryKpiData(monitoring.Monitoring.KpiQuery request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.RawKpiTable> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getQueryKpiDataMethod(), responseObserver);
     }
 
     /**
      */
     public void setKpiSubscription(monitoring.Monitoring.SubsDescriptor request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsResponse> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getSetKpiSubscriptionMethod(), responseObserver);
     }
 
@@ -686,7 +686,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void getSubscriptions(context.ContextOuterClass.Empty request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsIDList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsList> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetSubscriptionsMethod(), responseObserver);
     }
 
@@ -707,7 +707,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void getAlarms(context.ContextOuterClass.Empty request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmIDList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmList> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetAlarmsMethod(), responseObserver);
     }
 
@@ -742,7 +742,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void getInstantKpi(monitoring.Monitoring.KpiId request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetInstantKpiMethod(), responseObserver);
     }
 
@@ -795,14 +795,14 @@ public final class MonitoringServiceGrpc {
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
                 monitoring.Monitoring.KpiQuery,
-                monitoring.Monitoring.KpiList>(
+                monitoring.Monitoring.RawKpiTable>(
                   this, METHODID_QUERY_KPI_DATA)))
           .addMethod(
             getSetKpiSubscriptionMethod(),
             io.grpc.stub.ServerCalls.asyncServerStreamingCall(
               new MethodHandlers<
                 monitoring.Monitoring.SubsDescriptor,
-                monitoring.Monitoring.KpiList>(
+                monitoring.Monitoring.SubsResponse>(
                   this, METHODID_SET_KPI_SUBSCRIPTION)))
           .addMethod(
             getGetSubsDescriptorMethod(),
@@ -816,7 +816,7 @@ public final class MonitoringServiceGrpc {
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
                 context.ContextOuterClass.Empty,
-                monitoring.Monitoring.SubsIDList>(
+                monitoring.Monitoring.SubsList>(
                   this, METHODID_GET_SUBSCRIPTIONS)))
           .addMethod(
             getDeleteSubscriptionMethod(),
@@ -837,7 +837,7 @@ public final class MonitoringServiceGrpc {
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
                 context.ContextOuterClass.Empty,
-                monitoring.Monitoring.AlarmIDList>(
+                monitoring.Monitoring.AlarmList>(
                   this, METHODID_GET_ALARMS)))
           .addMethod(
             getGetAlarmDescriptorMethod(),
@@ -872,7 +872,7 @@ public final class MonitoringServiceGrpc {
             io.grpc.stub.ServerCalls.asyncUnaryCall(
               new MethodHandlers<
                 monitoring.Monitoring.KpiId,
-                monitoring.Monitoring.KpiList>(
+                monitoring.Monitoring.Kpi>(
                   this, METHODID_GET_INSTANT_KPI)))
           .build();
     }
@@ -943,7 +943,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void queryKpiData(monitoring.Monitoring.KpiQuery request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.RawKpiTable> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getQueryKpiDataMethod(), getCallOptions()), request, responseObserver);
     }
@@ -951,7 +951,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void setKpiSubscription(monitoring.Monitoring.SubsDescriptor request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsResponse> responseObserver) {
       io.grpc.stub.ClientCalls.asyncServerStreamingCall(
           getChannel().newCall(getSetKpiSubscriptionMethod(), getCallOptions()), request, responseObserver);
     }
@@ -967,7 +967,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void getSubscriptions(context.ContextOuterClass.Empty request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsIDList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsList> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getGetSubscriptionsMethod(), getCallOptions()), request, responseObserver);
     }
@@ -991,7 +991,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void getAlarms(context.ContextOuterClass.Empty request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmIDList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmList> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getGetAlarmsMethod(), getCallOptions()), request, responseObserver);
     }
@@ -1031,7 +1031,7 @@ public final class MonitoringServiceGrpc {
     /**
      */
     public void getInstantKpi(monitoring.Monitoring.KpiId request,
-        io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList> responseObserver) {
+        io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getGetInstantKpiMethod(), getCallOptions()), request, responseObserver);
     }
@@ -1095,14 +1095,14 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public monitoring.Monitoring.KpiList queryKpiData(monitoring.Monitoring.KpiQuery request) {
+    public monitoring.Monitoring.RawKpiTable queryKpiData(monitoring.Monitoring.KpiQuery request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getQueryKpiDataMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public java.util.Iterator<monitoring.Monitoring.KpiList> setKpiSubscription(
+    public java.util.Iterator<monitoring.Monitoring.SubsResponse> setKpiSubscription(
         monitoring.Monitoring.SubsDescriptor request) {
       return io.grpc.stub.ClientCalls.blockingServerStreamingCall(
           getChannel(), getSetKpiSubscriptionMethod(), getCallOptions(), request);
@@ -1117,7 +1117,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public monitoring.Monitoring.SubsIDList getSubscriptions(context.ContextOuterClass.Empty request) {
+    public monitoring.Monitoring.SubsList getSubscriptions(context.ContextOuterClass.Empty request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getGetSubscriptionsMethod(), getCallOptions(), request);
     }
@@ -1138,7 +1138,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public monitoring.Monitoring.AlarmIDList getAlarms(context.ContextOuterClass.Empty request) {
+    public monitoring.Monitoring.AlarmList getAlarms(context.ContextOuterClass.Empty request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getGetAlarmsMethod(), getCallOptions(), request);
     }
@@ -1175,7 +1175,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public monitoring.Monitoring.KpiList getInstantKpi(monitoring.Monitoring.KpiId request) {
+    public monitoring.Monitoring.Kpi getInstantKpi(monitoring.Monitoring.KpiId request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getGetInstantKpiMethod(), getCallOptions(), request);
     }
@@ -1245,7 +1245,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.KpiList> queryKpiData(
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.RawKpiTable> queryKpiData(
         monitoring.Monitoring.KpiQuery request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getQueryKpiDataMethod(), getCallOptions()), request);
@@ -1261,7 +1261,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.SubsIDList> getSubscriptions(
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.SubsList> getSubscriptions(
         context.ContextOuterClass.Empty request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getGetSubscriptionsMethod(), getCallOptions()), request);
@@ -1285,7 +1285,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.AlarmIDList> getAlarms(
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.AlarmList> getAlarms(
         context.ContextOuterClass.Empty request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getGetAlarmsMethod(), getCallOptions()), request);
@@ -1309,7 +1309,7 @@ public final class MonitoringServiceGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.KpiList> getInstantKpi(
+    public com.google.common.util.concurrent.ListenableFuture<monitoring.Monitoring.Kpi> getInstantKpi(
         monitoring.Monitoring.KpiId request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getGetInstantKpiMethod(), getCallOptions()), request);
@@ -1378,11 +1378,11 @@ public final class MonitoringServiceGrpc {
           break;
         case METHODID_QUERY_KPI_DATA:
           serviceImpl.queryKpiData((monitoring.Monitoring.KpiQuery) request,
-              (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList>) responseObserver);
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.RawKpiTable>) responseObserver);
           break;
         case METHODID_SET_KPI_SUBSCRIPTION:
           serviceImpl.setKpiSubscription((monitoring.Monitoring.SubsDescriptor) request,
-              (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList>) responseObserver);
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsResponse>) responseObserver);
           break;
         case METHODID_GET_SUBS_DESCRIPTOR:
           serviceImpl.getSubsDescriptor((monitoring.Monitoring.SubscriptionID) request,
@@ -1390,7 +1390,7 @@ public final class MonitoringServiceGrpc {
           break;
         case METHODID_GET_SUBSCRIPTIONS:
           serviceImpl.getSubscriptions((context.ContextOuterClass.Empty) request,
-              (io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsIDList>) responseObserver);
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsList>) responseObserver);
           break;
         case METHODID_DELETE_SUBSCRIPTION:
           serviceImpl.deleteSubscription((monitoring.Monitoring.SubscriptionID) request,
@@ -1402,7 +1402,7 @@ public final class MonitoringServiceGrpc {
           break;
         case METHODID_GET_ALARMS:
           serviceImpl.getAlarms((context.ContextOuterClass.Empty) request,
-              (io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmIDList>) responseObserver);
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmList>) responseObserver);
           break;
         case METHODID_GET_ALARM_DESCRIPTOR:
           serviceImpl.getAlarmDescriptor((monitoring.Monitoring.AlarmID) request,
@@ -1422,7 +1422,7 @@ public final class MonitoringServiceGrpc {
           break;
         case METHODID_GET_INSTANT_KPI:
           serviceImpl.getInstantKpi((monitoring.Monitoring.KpiId) request,
-              (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList>) responseObserver);
+              (io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi>) responseObserver);
           break;
         default:
           throw new AssertionError();
diff --git a/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java b/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java
index d663b38c923a2b5401642db4e697e16be4720f05..f045ecc7ed434ba90bdfda065f18e0d839850a76 100644
--- a/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java
+++ b/src/automation/target/generated-sources/grpc/monitoring/MutinyMonitoringServiceGrpc.java
@@ -66,7 +66,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> queryKpiData(monitoring.Monitoring.KpiQuery request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.RawKpiTable> queryKpiData(monitoring.Monitoring.KpiQuery request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::queryKpiData);
         }
 
@@ -76,7 +76,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsIDList> getSubscriptions(context.ContextOuterClass.Empty request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsList> getSubscriptions(context.ContextOuterClass.Empty request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getSubscriptions);
         }
 
@@ -91,7 +91,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmIDList> getAlarms(context.ContextOuterClass.Empty request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmList> getAlarms(context.ContextOuterClass.Empty request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getAlarms);
         }
 
@@ -106,12 +106,12 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> getInstantKpi(monitoring.Monitoring.KpiId request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToOne(request, delegateStub::getInstantKpi);
         }
 
         
-        public io.smallrye.mutiny.Multi<monitoring.Monitoring.KpiList> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
+        public io.smallrye.mutiny.Multi<monitoring.Monitoring.SubsResponse> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
             return io.quarkus.grpc.runtime.ClientCalls.oneToMany(request, delegateStub::setKpiSubscription);
         }
 
@@ -173,7 +173,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> queryKpiData(monitoring.Monitoring.KpiQuery request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.RawKpiTable> queryKpiData(monitoring.Monitoring.KpiQuery request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
@@ -183,7 +183,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsIDList> getSubscriptions(context.ContextOuterClass.Empty request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.SubsList> getSubscriptions(context.ContextOuterClass.Empty request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
@@ -198,7 +198,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmIDList> getAlarms(context.ContextOuterClass.Empty request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.AlarmList> getAlarms(context.ContextOuterClass.Empty request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
@@ -213,12 +213,12 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
         }
 
         
-        public io.smallrye.mutiny.Uni<monitoring.Monitoring.KpiList> getInstantKpi(monitoring.Monitoring.KpiId request) {
+        public io.smallrye.mutiny.Uni<monitoring.Monitoring.Kpi> getInstantKpi(monitoring.Monitoring.KpiId request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
         
-        public io.smallrye.mutiny.Multi<monitoring.Monitoring.KpiList> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
+        public io.smallrye.mutiny.Multi<monitoring.Monitoring.SubsResponse> setKpiSubscription(monitoring.Monitoring.SubsDescriptor request) {
             throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
         }
 
@@ -281,14 +281,14 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                             asyncUnaryCall(
                                     new MethodHandlers<
                                             monitoring.Monitoring.KpiQuery,
-                                            monitoring.Monitoring.KpiList>(
+                                            monitoring.Monitoring.RawKpiTable>(
                                             this, METHODID_QUERY_KPI_DATA, compression)))
                     .addMethod(
                             monitoring.MonitoringServiceGrpc.getSetKpiSubscriptionMethod(),
                             asyncServerStreamingCall(
                                     new MethodHandlers<
                                             monitoring.Monitoring.SubsDescriptor,
-                                            monitoring.Monitoring.KpiList>(
+                                            monitoring.Monitoring.SubsResponse>(
                                             this, METHODID_SET_KPI_SUBSCRIPTION, compression)))
                     .addMethod(
                             monitoring.MonitoringServiceGrpc.getGetSubsDescriptorMethod(),
@@ -302,7 +302,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                             asyncUnaryCall(
                                     new MethodHandlers<
                                             context.ContextOuterClass.Empty,
-                                            monitoring.Monitoring.SubsIDList>(
+                                            monitoring.Monitoring.SubsList>(
                                             this, METHODID_GET_SUBSCRIPTIONS, compression)))
                     .addMethod(
                             monitoring.MonitoringServiceGrpc.getDeleteSubscriptionMethod(),
@@ -323,7 +323,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                             asyncUnaryCall(
                                     new MethodHandlers<
                                             context.ContextOuterClass.Empty,
-                                            monitoring.Monitoring.AlarmIDList>(
+                                            monitoring.Monitoring.AlarmList>(
                                             this, METHODID_GET_ALARMS, compression)))
                     .addMethod(
                             monitoring.MonitoringServiceGrpc.getGetAlarmDescriptorMethod(),
@@ -358,7 +358,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                             asyncUnaryCall(
                                     new MethodHandlers<
                                             monitoring.Monitoring.KpiId,
-                                            monitoring.Monitoring.KpiList>(
+                                            monitoring.Monitoring.Kpi>(
                                             this, METHODID_GET_INSTANT_KPI, compression)))
                     .build();
         }
@@ -440,13 +440,13 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                     break;
                 case METHODID_QUERY_KPI_DATA:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.KpiQuery) request,
-                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList>) responseObserver,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.RawKpiTable>) responseObserver,
                             compression,
                             serviceImpl::queryKpiData);
                     break;
                 case METHODID_SET_KPI_SUBSCRIPTION:
                     io.quarkus.grpc.runtime.ServerCalls.oneToMany((monitoring.Monitoring.SubsDescriptor) request,
-                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList>) responseObserver,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsResponse>) responseObserver,
                             compression,
                             serviceImpl::setKpiSubscription);
                     break;
@@ -458,7 +458,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                     break;
                 case METHODID_GET_SUBSCRIPTIONS:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.Empty) request,
-                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsIDList>) responseObserver,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.SubsList>) responseObserver,
                             compression,
                             serviceImpl::getSubscriptions);
                     break;
@@ -476,7 +476,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                     break;
                 case METHODID_GET_ALARMS:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((context.ContextOuterClass.Empty) request,
-                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmIDList>) responseObserver,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.AlarmList>) responseObserver,
                             compression,
                             serviceImpl::getAlarms);
                     break;
@@ -506,7 +506,7 @@ public final class MutinyMonitoringServiceGrpc implements io.quarkus.grpc.runtim
                     break;
                 case METHODID_GET_INSTANT_KPI:
                     io.quarkus.grpc.runtime.ServerCalls.oneToOne((monitoring.Monitoring.KpiId) request,
-                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.KpiList>) responseObserver,
+                            (io.grpc.stub.StreamObserver<monitoring.Monitoring.Kpi>) responseObserver,
                             compression,
                             serviceImpl::getInstantKpi);
                     break;
diff --git a/src/common/tools/descriptor/Tools.py b/src/common/tools/descriptor/Tools.py
index 909cec9d97b5baa2f7b0198091c3921a71c9b1f7..cc7fa37577ec7b490756078a90aff959658274b4 100644
--- a/src/common/tools/descriptor/Tools.py
+++ b/src/common/tools/descriptor/Tools.py
@@ -74,7 +74,7 @@ def format_service_custom_config_rules(service : Dict) -> Dict:
 def format_slice_custom_config_rules(slice_ : Dict) -> Dict:
     config_rules = slice_.get('service_config', {}).get('config_rules', [])
     config_rules = format_custom_config_rules(config_rules)
-    slice_['service_config']['config_rules'] = config_rules
+    slice_['slice_config']['config_rules'] = config_rules
     return slice_
 
 def split_devices_by_rules(devices : List[Dict]) -> Tuple[List[Dict], List[Dict]]:
diff --git a/src/common/tools/object_factory/Service.py b/src/common/tools/object_factory/Service.py
index 829c2f66751c8f578161620f569e87edebb9ce41..0b5ad820c565c50607180e0933795774fd5c2035 100644
--- a/src/common/tools/object_factory/Service.py
+++ b/src/common/tools/object_factory/Service.py
@@ -71,3 +71,13 @@ def json_service_tapi_planned(
         service_uuid, ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE, context_id=json_context_id(context_uuid),
         status=ServiceStatusEnum.SERVICESTATUS_PLANNED, endpoint_ids=endpoint_ids, constraints=constraints,
         config_rules=config_rules)
+
+def json_service_p4_planned(
+        service_uuid : str, endpoint_ids : List[Dict] = [], constraints : List[Dict] = [],
+        config_rules : List[Dict] = [], context_uuid : str = DEFAULT_CONTEXT_UUID
+    ):
+
+    return json_service(
+        service_uuid, ServiceTypeEnum.SERVICETYPE_L2NM, context_id=json_context_id(context_uuid),
+        status=ServiceStatusEnum.SERVICESTATUS_PLANNED, endpoint_ids=endpoint_ids, constraints=constraints,
+        config_rules=config_rules)
\ No newline at end of file
diff --git a/src/device/service/drivers/xr/README_XR.md b/src/device/service/drivers/xr/README_XR.md
index f7c2316ce5fa810969d373e1fad7bc5ca83b9e49..3bfdf5b019b3c36e7ded09d58ac625a48add36a9 100644
--- a/src/device/service/drivers/xr/README_XR.md
+++ b/src/device/service/drivers/xr/README_XR.md
@@ -110,7 +110,7 @@ Upload descriptors_emulatex_xr.json via WEB UI to setup fake topology.
 Setup service by following commands in src directory. Kubernetes endpoins change on every build, so setup script is mandatory.
 
 ```bash
-    source tests/ofc22/setup_test_env.sh 
+    source  device/service/drivers/xr/setup_test_env.sh
     python -m pytest --verbose tests/ofc22/tests/test_functional_create_service_xr.py 
 ```
 
diff --git a/src/device/service/drivers/xr/cm/cm_connection.py b/src/device/service/drivers/xr/cm/cm_connection.py
index 7e0fc61b72e7028fae00886cea4dcb2f922bfbf4..b4aee586668e842b372c3aa7b87240c5041c8118 100644
--- a/src/device/service/drivers/xr/cm/cm_connection.py
+++ b/src/device/service/drivers/xr/cm/cm_connection.py
@@ -61,7 +61,14 @@ class HttpResult:
 
     def __str__(self):
         status_code = self.status_code if self.status_code is not None else "<not executed>"
-        return f"{self.method} {self.url} {self.params},  status {status_code}"
+        if self.text:
+            if len(self.text) > 1024:
+                body_text = self.text[:1024] + "..."
+            else:
+                body_text = self.text
+        else:
+            body_text = "NONE"
+        return f"{self.method} {self.url} {self.params},  status {status_code}, body {body_text}"
 
     def process_http_response(self, response: requests.Response, permit_empty_body:bool = False):
         LOGGER.info(f"process_http_response(): {self.method}: {self.url} qparams={self.params} ==> {response.status_code}") # FIXME: params
diff --git a/src/device/service/drivers/xr/cm/connection.py b/src/device/service/drivers/xr/cm/connection.py
index e88995842eb0b6266d4d8eb42e2cc3197d89bea1..088c743d50d6c04fd0688b5c6318e35eae4d7dc0 100644
--- a/src/device/service/drivers/xr/cm/connection.py
+++ b/src/device/service/drivers/xr/cm/connection.py
@@ -79,6 +79,9 @@ class Connection:
                 state = from_json["state"]
                 self.name = state["name"] if "name" in state else None #Name is optional
                 self.serviceMode = state["serviceMode"]
+                # Implicit transport capacity is a string, where value "none" has special meaning.
+                # So "none" is correct value, not "None" for missing attribute
+                self.implicitTransportCapacity = config["implicitTransportCapacity"] if "implicitTransportCapacity" in config else "none"
                 self.mc = config["mc"] if "mc" in config else None
                 self.vlan_filter = state["outerVID"] if "outerVID" in state else None
                 self.href = from_json["href"]
@@ -100,12 +103,15 @@ class Connection:
             # VLANs to interface names. Correspondingly cm-cli user has to know
             # to use VLANs on low level test APIs when using VTI mode.
             self.serviceMode = self.__guess_service_mode_from_emulated_enpoints()
-            if self.serviceMode == "portMode":
+            if self.serviceMode == "XR-L1":
                 self.vlan_filter = None
                 self.mc = None
+                self.implicitTransportCapacity ="portMode"
             else:
                 self.vlan_filter = str(self.__guess_vlan_id()) + " " # Needs to be in string format, can contain ranges, regexp is buggy, trailin space is needed for single VLAN
                 self.mc = "matchOuterVID"
+                # String "none" has a special meaning for implicitTransportCapacity
+                self.implicitTransportCapacity ="none"
 
             self.cm_data = None
         else:
@@ -120,8 +126,8 @@ class Connection:
     def __guess_service_mode_from_emulated_enpoints(self):
         for ep in self.endpoints:
             if ep.vlan is not None:
-                return "vtiP2pSymmetric"
-        return "portMode"
+                return "XR-VTI-P2P"
+        return "XR-L1"
 
     def __guess_vlan_id(self) -> int:
         vlans = []
@@ -140,6 +146,7 @@ class Connection:
         cfg = {}
         set_optional_parameter(cfg, "name", self.name)
         cfg["serviceMode"] = self.serviceMode
+        cfg["implicitTransportCapacity"] = self.implicitTransportCapacity
         if self.endpoints:
             cfg["endpoints"] = [ep.create_config() for ep in self.endpoints]
         set_optional_parameter(cfg, "outerVID", self.vlan_filter)
diff --git a/src/device/service/drivers/xr/cm/tests/resources/connections-expanded.json b/src/device/service/drivers/xr/cm/tests/resources/connections-expanded.json
index f9f064ea20c3764ad0a5e4d0d3dfb60b468c2556..f4ee31189cb0dc698d4d79420bef4a8df6874b0e 100644
--- a/src/device/service/drivers/xr/cm/tests/resources/connections-expanded.json
+++ b/src/device/service/drivers/xr/cm/tests/resources/connections-expanded.json
@@ -2,7 +2,8 @@
     {
         "config": {
             "name": "FooBar123",
-            "serviceMode": "portMode"
+            "serviceMode": "XR-L1",
+            "implicitTransportCapacity": "portMode"
         },
         "endpoints": [
             {
@@ -141,12 +142,14 @@
             "createdBy": "host",
             "lifecycleState": "configured",
             "name": "FooBar123",
-            "serviceMode": "portMode"
+            "serviceMode": "XR-L1",
+            "implicitTransportCapacity": "portMode"
         }
     },
     {
         "config": {
-            "serviceMode": "portMode"
+            "serviceMode": "XR-L1",
+            "implicitTransportCapacity": "portMode"
         },
         "endpoints": [
             {
@@ -284,7 +287,8 @@
         "state": {
             "createdBy": "host",
             "lifecycleState": "configured",
-            "serviceMode": "portMode"
+            "serviceMode": "XR-L1",
+            "implicitTransportCapacity": "portMode"
         }
     }
 ]
\ No newline at end of file
diff --git a/src/device/service/drivers/xr/cm/tests/resources/single-connection-2022-12.json b/src/device/service/drivers/xr/cm/tests/resources/single-connection-2022-12.json
new file mode 100644
index 0000000000000000000000000000000000000000..d4c0262cdbcf68194ed831670ec3314d4b11a906
--- /dev/null
+++ b/src/device/service/drivers/xr/cm/tests/resources/single-connection-2022-12.json
@@ -0,0 +1,160 @@
+[
+    {
+        "config": {
+            "implicitTransportCapacity": "portMode",
+            "name": "test2",
+            "serviceMode": "XR-L1"
+        },
+        "endpoints": [
+            {
+                "acs": [],
+                "config": {
+                    "selector": {
+                        "moduleIfSelectorByModuleName": {
+                            "moduleClientIfAid": "XR-T2",
+                            "moduleName": "XR HUB 1"
+                        }
+                    }
+                },
+                "href": "/network-connections/38675444-3f08-4dbe-a9c4-523ef309a518/endpoints/4801ecf5-fe37-4b8e-864f-2a0409210cb0",
+                "id": "4801ecf5-fe37-4b8e-864f-2a0409210cb0",
+                "parentId": "38675444-3f08-4dbe-a9c4-523ef309a518",
+                "rt": [
+                    "cm.network-connection.endpoint"
+                ],
+                "state": {
+                    "capacity": 100,
+                    "hostPort": {
+                        "chassisId": "192.168.100.1",
+                        "chassisIdSubtype": "networkAddress",
+                        "name": "",
+                        "portDescr": "et-1/0/0:1",
+                        "portId": "et-1/0/0:1",
+                        "portIdSubtype": "interfaceName",
+                        "portSourceMAC": "58:00:BB:00:00:12",
+                        "sysName": "SanJose"
+                    },
+                    "moduleIf": {
+                        "clientIfAid": "XR-T2",
+                        "clientIfColId": 2,
+                        "clientIfPortSpeed": 100,
+                        "currentRole": "hub",
+                        "macAddress": "00:0B:F8:00:00:01",
+                        "moduleId": "68c23c59-3bcf-4d35-7042-a4a2d8a73e3f",
+                        "moduleName": "XR HUB 1",
+                        "serialNumber": "000000009"
+                    }
+                }
+            },
+            {
+                "acs": [],
+                "config": {
+                    "selector": {
+                        "moduleIfSelectorByModuleName": {
+                            "moduleClientIfAid": "XR-T1",
+                            "moduleName": "XR LEAF 2"
+                        }
+                    }
+                },
+                "href": "/network-connections/38675444-3f08-4dbe-a9c4-523ef309a518/endpoints/123fc228-59ed-423e-8537-c189f3434a38",
+                "id": "123fc228-59ed-423e-8537-c189f3434a38",
+                "parentId": "38675444-3f08-4dbe-a9c4-523ef309a518",
+                "rt": [
+                    "cm.network-connection.endpoint"
+                ],
+                "state": {
+                    "capacity": 100,
+                    "hostPort": {
+                        "chassisId": "192.168.101.2",
+                        "chassisIdSubtype": "networkAddress",
+                        "name": "",
+                        "portDescr": "et-0/0/0:0",
+                        "portId": "et-0/0/0:0",
+                        "portIdSubtype": "interfaceName",
+                        "portSourceMAC": "58:00:BB:00:12:01",
+                        "sysName": "Cupertino"
+                    },
+                    "moduleIf": {
+                        "clientIfAid": "XR-T1",
+                        "clientIfColId": 1,
+                        "clientIfPortSpeed": 100,
+                        "currentRole": "leaf",
+                        "macAddress": "00:0B:F8:00:01:02",
+                        "moduleId": "095a7a6b-1f69-4d2e-5581-cdffbb85e40f",
+                        "moduleName": "XR LEAF 2",
+                        "serialNumber": "00000000C"
+                    }
+                }
+            }
+        ],
+        "href": "/network-connections/38675444-3f08-4dbe-a9c4-523ef309a518",
+        "id": "38675444-3f08-4dbe-a9c4-523ef309a518",
+        "lcs": [
+            {
+                "config": {
+                    "clientAid": "XR-T2",
+                    "direction": "txRx",
+                    "dscgAid": "XRCARRIERDSCG-3",
+                    "moduleId": "68c23c59-3bcf-4d35-7042-a4a2d8a73e3f"
+                },
+                "href": "/lcs/0d5929d8-6498-4c54-b38b-43c6cb85a18b",
+                "id": "0d5929d8-6498-4c54-b38b-43c6cb85a18b",
+                "parentIds": [
+                    "38675444-3f08-4dbe-a9c4-523ef309a518"
+                ],
+                "rt": [
+                    "cm.network-connection.local-connection"
+                ],
+                "state": {
+                    "clientAid": "XR-T2",
+                    "colId": 2,
+                    "direction": "txRx",
+                    "dscgAid": "XRCARRIERDSCG-3",
+                    "lcAid": "XRLC-3",
+                    "lineAid": "",
+                    "macAddress": "00:0B:F8:00:00:01",
+                    "moduleId": "68c23c59-3bcf-4d35-7042-a4a2d8a73e3f",
+                    "remoteClientId": "",
+                    "remoteModuleId": ""
+                }
+            },
+            {
+                "config": {
+                    "clientAid": "XR-T1",
+                    "direction": "txRx",
+                    "dscgAid": "XRCARRIERDSCG-3",
+                    "moduleId": "095a7a6b-1f69-4d2e-5581-cdffbb85e40f"
+                },
+                "href": "/lcs/1d6cc8bf-de89-4950-a01d-4b4522c65f8c",
+                "id": "1d6cc8bf-de89-4950-a01d-4b4522c65f8c",
+                "parentIds": [
+                    "38675444-3f08-4dbe-a9c4-523ef309a518"
+                ],
+                "rt": [
+                    "cm.network-connection.local-connection"
+                ],
+                "state": {
+                    "clientAid": "XR-T1",
+                    "colId": 1,
+                    "direction": "txRx",
+                    "dscgAid": "XRCARRIERDSCG-3",
+                    "lcAid": "XRLC-3",
+                    "lineAid": "",
+                    "macAddress": "00:0B:F8:00:01:02",
+                    "moduleId": "095a7a6b-1f69-4d2e-5581-cdffbb85e40f",
+                    "remoteClientId": "",
+                    "remoteModuleId": ""
+                }
+            }
+        ],
+        "rt": [
+            "cm.network-connection"
+        ],
+        "state": {
+            "createdBy": "cm",
+            "lifecycleState": "configured",
+            "name": "test2",
+            "serviceMode": "XR-L1"
+        }
+    }
+]
\ No newline at end of file
diff --git a/src/device/service/drivers/xr/cm/tests/test_connection.py b/src/device/service/drivers/xr/cm/tests/test_connection.py
index 0792033a34d029628a853b9383af8c8a2c6272ad..cf1f9f8744dd58a31c15fc28a7f8e893aa17fb97 100644
--- a/src/device/service/drivers/xr/cm/tests/test_connection.py
+++ b/src/device/service/drivers/xr/cm/tests/test_connection.py
@@ -29,21 +29,21 @@ def test_connection_json():
         connection = Connection(j[0])
 
         assert connection.name == "FooBar123"
-        assert "name: FooBar123, id: /network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03, service-mode: portMode, end-points: [(XR LEAF 1|XR-T1, 0), (XR HUB 1|XR-T1, 0)]" == str(connection)
+        assert "name: FooBar123, id: /network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03, service-mode: XR-L1, end-points: [(XR LEAF 1|XR-T1, 0), (XR HUB 1|XR-T1, 0)]" == str(connection)
 
         config = connection.create_config()
-        expected_config = {'name': 'FooBar123', 'serviceMode': 'portMode', 'endpoints': [{'selector': {'ifSelectorByModuleName': {'moduleName': 'XR LEAF 1', 'moduleClientIfAid': 'XR-T1'}}}, {'selector': {'ifSelectorByModuleName': {'moduleName': 'XR HUB 1', 'moduleClientIfAid': 'XR-T1'}}}]}
+        expected_config = {'name': 'FooBar123', 'serviceMode': 'XR-L1', 'implicitTransportCapacity': 'portMode', 'endpoints': [{'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR LEAF 1', 'moduleClientIfAid': 'XR-T1'}}}, {'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR HUB 1', 'moduleClientIfAid': 'XR-T1'}}}]}
         assert config == expected_config
 
         # Remove mandatory key from leaf endpoint. It will not be parsed, but hub endpoint will
         del j[0]["endpoints"][0]["state"]["moduleIf"]["clientIfAid"]
         connection = Connection(j[0])
-        assert "name: FooBar123, id: /network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03, service-mode: portMode, end-points: [(XR HUB 1|XR-T1, 0)]" == str(connection)
+        assert "name: FooBar123, id: /network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03, service-mode: XR-L1, end-points: [(XR HUB 1|XR-T1, 0)]" == str(connection)
 
         # Remove Name, it is optional (although TF will always configure it)
         del j[0]["state"]["name"]
         connection = Connection(j[0])
-        assert "name: <NO NAME>, id: /network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03, service-mode: portMode, end-points: [(XR HUB 1|XR-T1, 0)]" == str(connection)
+        assert "name: <NO NAME>, id: /network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03, service-mode: XR-L1, end-points: [(XR HUB 1|XR-T1, 0)]" == str(connection)
 
         # Remove mandatory key, will raise an exception
         del j[0]["state"]
@@ -66,14 +66,14 @@ def test_connection_ep_change_compute():
         new_connection = Connection(from_tf_service=TFService("FooBar123", "XR LEAF 1|XR-T1", "XR HUB 1|changed here", 0))
         ep_deletes, ep_creates, ep_updates = new_connection.get_endpoint_updates(existing_connection)
         assert ep_deletes ==  ['/network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03/endpoints/1d58ba8f-4d51-4213-83e1-97a0e0bdd388']
-        assert ep_creates == [{'selector': {'ifSelectorByModuleName': {'moduleClientIfAid': 'changed here', 'moduleName': 'XR HUB 1'}}}]
+        assert ep_creates == [{'selector': {'moduleIfSelectorByModuleName': {'moduleClientIfAid': 'changed here', 'moduleName': 'XR HUB 1'}}}]
         assert not ep_updates
 
         # Change one of the endpoints and capacity
         new_connection = Connection(from_tf_service=TFService("FooBar123", "XR LEAF 1|XR-T1", "XR HUB 1|changed here", 125))
         ep_deletes, ep_creates, ep_updates = new_connection.get_endpoint_updates(existing_connection)
         assert ep_deletes ==  ['/network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03/endpoints/1d58ba8f-4d51-4213-83e1-97a0e0bdd388']
-        assert ep_creates == [{'selector': {'ifSelectorByModuleName': {'moduleClientIfAid': 'changed here', 'moduleName': 'XR HUB 1'}}, "capacity": 125}]
+        assert ep_creates == [{'selector': {'moduleIfSelectorByModuleName': {'moduleClientIfAid': 'changed here', 'moduleName': 'XR HUB 1'}}, "capacity": 125}]
         assert ep_updates == [('/network-connections/4505d5d3-b2f3-40b8-8ec2-4a5b28523c03/endpoints/230516d0-7e38-44b1-b174-1ba7d4454ee6', {'capacity': 125})]
 
         # No change at all
@@ -93,13 +93,13 @@ def test_connection_ep_change_compute():
 def test_connection_from_service():
     # Port mode
     connection = Connection(from_tf_service=TFService("FooBar123", "XR LEAF 1|XR-T1", "XR HUB 1|XR-T1", 0))
-    assert connection.create_config() == {'name': 'TF:FooBar123', 'serviceMode': 'portMode', 'endpoints': [{'selector': {'ifSelectorByModuleName': {'moduleName': 'XR LEAF 1', 'moduleClientIfAid': 'XR-T1'}}}, {'selector': {'ifSelectorByModuleName': {'moduleName': 'XR HUB 1', 'moduleClientIfAid': 'XR-T1'}}}]}
+    assert connection.create_config() == {'name': 'TF:FooBar123', 'serviceMode': 'XR-L1', 'implicitTransportCapacity': 'portMode', 'endpoints': [{'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR LEAF 1', 'moduleClientIfAid': 'XR-T1'}}}, {'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR HUB 1', 'moduleClientIfAid': 'XR-T1'}}}]}
 
     # VTI mode
     connection = Connection(from_tf_service=TFService("FooBar123", "XR LEAF 1|XR-T1.A", "XR HUB 1|XR-T1.100", 0))
     # In endpoint selectors VLANs are note present (CM does not know about them, encoding them to aids is purely internal to Teraflow)
     # However VLAN adds outerVID and some other fields
-    assert connection.create_config() == {'name': 'TF:FooBar123', 'serviceMode': 'vtiP2pSymmetric', 'endpoints': [{'selector': {'ifSelectorByModuleName': {'moduleName': 'XR LEAF 1', 'moduleClientIfAid': 'XR-T1'}}}, {'selector': {'ifSelectorByModuleName': {'moduleName': 'XR HUB 1', 'moduleClientIfAid': 'XR-T1'}}}], 'outerVID': '100 ', 'mc': 'matchOuterVID'}
+    assert connection.create_config() == {'name': 'TF:FooBar123', 'serviceMode': 'XR-VTI-P2P', 'implicitTransportCapacity': 'none', 'endpoints': [{'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR LEAF 1', 'moduleClientIfAid': 'XR-T1'}}}, {'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR HUB 1', 'moduleClientIfAid': 'XR-T1'}}}], 'outerVID': '100 ', 'mc': 'matchOuterVID'}
 
     # Invalid configuration, differring VLANs on different sides
     with pytest.raises(InconsistentVlanConfiguration) as _e_info:
diff --git a/src/device/service/drivers/xr/cm/tests/test_transport_capacitity.py b/src/device/service/drivers/xr/cm/tests/test_transport_capacitity.py
index cfdadae6a5e150e9890076dba0e657aea6fa3b1e..7ed085337ac25b1c6983f868de1374fff18633a7 100644
--- a/src/device/service/drivers/xr/cm/tests/test_transport_capacitity.py
+++ b/src/device/service/drivers/xr/cm/tests/test_transport_capacitity.py
@@ -34,7 +34,7 @@ def test_transport_capacity_json():
         assert str(tc) == "name: Transport capacity service example, id: /transport-capacities/6ce3aa86-2685-44b0-9f86-49e6a6c991a8, capacity-mode: dedicatedDownlinkSymmetric, end-points: [(XR Device|XR T1, 100), (XR Device 2|XR T1, 100)]"
 
         config = tc.create_config()
-        assert config == {'config': {'name': 'Transport capacity service example'}, 'endpoints': [{'capacity': 100, 'selector': {'ifSelectorByModuleName': {'moduleName': 'XR Device', 'moduleClientIfAid': 'XR T1'}}}, {'capacity': 100, 'selector': {'ifSelectorByModuleName': {'moduleName': 'XR Device 2', 'moduleClientIfAid': 'XR T1'}}}]}
+        assert config == {'config': {'name': 'Transport capacity service example'}, 'endpoints': [{'capacity': 100, 'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR Device', 'moduleClientIfAid': 'XR T1'}}}, {'capacity': 100, 'selector': {'moduleIfSelectorByModuleName': {'moduleName': 'XR Device 2', 'moduleClientIfAid': 'XR T1'}}}]}
 
 def test_transport_capacity_comparison():
     # Same content must compare same
diff --git a/src/device/service/drivers/xr/cm/utils.py b/src/device/service/drivers/xr/cm/utils.py
index cdf9e58c348f572c1547bb392a8cddba7669d0b0..ad59dc6616f50023f923dac67025b0b5aa74cf16 100644
--- a/src/device/service/drivers/xr/cm/utils.py
+++ b/src/device/service/drivers/xr/cm/utils.py
@@ -43,7 +43,7 @@ def ifname_to_module_aid_vlan(ifname: str) -> Tuple[str, str, Optional[str]]:
 # state it has clientIfAid...
 def make_selector(mod, aid, _vlan) -> Dict[str, Any]:
     selector = {
-        "ifSelectorByModuleName": {
+        "moduleIfSelectorByModuleName": {
             "moduleName": mod,
             "moduleClientIfAid": aid,
         }
diff --git a/src/device/service/drivers/xr/setup_test_env.sh b/src/device/service/drivers/xr/setup_test_env.sh
new file mode 100755
index 0000000000000000000000000000000000000000..1f8b0a5a7a8dc986715c6f54a62151f6afa4ad80
--- /dev/null
+++ b/src/device/service/drivers/xr/setup_test_env.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+export CONTEXTSERVICE_SERVICE_HOST=$(kubectl get service/contextservice --namespace tfs  --template '{{.spec.clusterIP}}')
+export CONTEXTSERVICE_SERVICE_PORT_GRPC=$(kubectl get service/contextservice --namespace tfs  -o jsonpath='{.spec.ports[?(@.name=="grpc")].port}')
+export COMPUTESERVICE_SERVICE_HOST=$(kubectl get service/computeservice --namespace tfs  --template '{{.spec.clusterIP}}')
+export COMPUTESERVICE_SERVICE_PORT_HTTP=$(kubectl get service/computeservice --namespace tfs  -o jsonpath='{.spec.ports[?(@.name=="http")].port}')
+echo "CONTEXTSERVICE_SERVICE_HOST=$CONTEXTSERVICE_SERVICE_HOST"
+echo "CONTEXTSERVICE_SERVICE_PORT_GRPC=$CONTEXTSERVICE_SERVICE_PORT_GRPC"
+echo "COMPUTESERVICE_SERVICE_HOST=$COMPUTESERVICE_SERVICE_HOST"
+echo "COMPUTESERVICE_SERVICE_PORT_HTTP=$COMPUTESERVICE_SERVICE_PORT_HTTP"
diff --git a/src/policy/target/kubernetes/kubernetes.yml b/src/policy/target/kubernetes/kubernetes.yml
index e85477c29ced250510738c6463659c5609834df6..1a2b4e26c2147273256587e5580265464be69758 100644
--- a/src/policy/target/kubernetes/kubernetes.yml
+++ b/src/policy/target/kubernetes/kubernetes.yml
@@ -11,15 +11,12 @@ metadata:
   name: policyservice
 spec:
   ports:
-    - name: grpc-server
-      port: 6060
-      targetPort: 6060
-    - name: grpc
-      port: 6060
-      targetPort: 6060
     - name: http
       port: 8080
       targetPort: 8080
+    - name: grpc
+      port: 6060
+      targetPort: 6060
   selector:
     app.kubernetes.io/name: policyservice
   type: ClusterIP
@@ -80,9 +77,6 @@ spec:
             - containerPort: 6060
               name: grpc
               protocol: TCP
-            - containerPort: 6060
-              name: grpc-server
-              protocol: TCP
           readinessProbe:
             failureThreshold: 3
             httpGet:
diff --git a/src/service/service/service_handler_api/FilterFields.py b/src/service/service/service_handler_api/FilterFields.py
index 0f21812089e2af8271884ef7539f979ff0426a5a..afc15795c7b6ae8bf59b719db2f3d920614aa51c 100644
--- a/src/service/service/service_handler_api/FilterFields.py
+++ b/src/service/service/service_handler_api/FilterFields.py
@@ -23,7 +23,7 @@ SERVICE_TYPE_VALUES = {
     ServiceTypeEnum.SERVICETYPE_UNKNOWN,
     ServiceTypeEnum.SERVICETYPE_L3NM,
     ServiceTypeEnum.SERVICETYPE_L2NM,
-    ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE,
+    ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE
 }
 
 DEVICE_DRIVER_VALUES = {
diff --git a/src/service/service/service_handlers/__init__.py b/src/service/service/service_handlers/__init__.py
index 34689ca1136c68611a098115b5acf5b74a788372..78978cc6c39c31340bd10139cb00f2cc18a7ef13 100644
--- a/src/service/service/service_handlers/__init__.py
+++ b/src/service/service/service_handlers/__init__.py
@@ -15,8 +15,10 @@
 from common.proto.context_pb2 import DeviceDriverEnum, ServiceTypeEnum
 from ..service_handler_api.FilterFields import FilterFieldEnum
 from .l2nm_emulated.L2NMEmulatedServiceHandler import L2NMEmulatedServiceHandler
+from .l2nm_openconfig.L2NMOpenConfigServiceHandler import L2NMOpenConfigServiceHandler
 from .l3nm_emulated.L3NMEmulatedServiceHandler import L3NMEmulatedServiceHandler
 from .l3nm_openconfig.L3NMOpenConfigServiceHandler import L3NMOpenConfigServiceHandler
+from .p4.p4_service_handler import P4ServiceHandler
 from .tapi_tapi.TapiServiceHandler import TapiServiceHandler
 from .microwave.MicrowaveServiceHandler import MicrowaveServiceHandler
 
@@ -27,6 +29,12 @@ SERVICE_HANDLERS = [
             FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_UNDEFINED,
         }
     ]),
+    (L2NMOpenConfigServiceHandler, [
+        {
+            FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_L2NM,
+            FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG,
+        }
+    ]),
     (L3NMEmulatedServiceHandler, [
         {
             FilterFieldEnum.SERVICE_TYPE  : ServiceTypeEnum.SERVICETYPE_L3NM,
@@ -51,4 +59,10 @@ SERVICE_HANDLERS = [
             FilterFieldEnum.DEVICE_DRIVER : DeviceDriverEnum.DEVICEDRIVER_IETF_NETWORK_TOPOLOGY,
         }
     ]),
-]
\ No newline at end of file
+    (P4ServiceHandler, [
+        {
+            FilterFieldEnum.SERVICE_TYPE: ServiceTypeEnum.SERVICETYPE_L2NM,
+            FilterFieldEnum.DEVICE_DRIVER: DeviceDriverEnum.DEVICEDRIVER_P4,
+        }
+    ]),
+]
diff --git a/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py b/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
new file mode 100644
index 0000000000000000000000000000000000000000..f12c9ab984205b9057dd1507114e5bc17d8deaa6
--- /dev/null
+++ b/src/service/service/service_handlers/l2nm_openconfig/ConfigRules.py
@@ -0,0 +1,134 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+from service.service.service_handler_api.AnyTreeTools import TreeNode
+
+def setup_config_rules(
+    service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str,
+    service_settings : TreeNode, endpoint_settings : TreeNode
+) -> List[Dict]:
+
+    json_settings          : Dict = {} if service_settings  is None else service_settings.value
+    json_endpoint_settings : Dict = {} if endpoint_settings is None else endpoint_settings.value
+
+    mtu                 = json_settings.get('mtu',                 1450 )    # 1512
+    #address_families    = json_settings.get('address_families',    []   )    # ['IPV4']
+    #bgp_as              = json_settings.get('bgp_as',              0    )    # 65000
+    #bgp_route_target    = json_settings.get('bgp_route_target',    '0:0')    # 65000:333
+
+    router_id           = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
+    #route_distinguisher = json_endpoint_settings.get('route_distinguisher', '0:0'    )  # '60001:801'
+    sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
+    vlan_id             = json_endpoint_settings.get('vlan_id',             1        )  # 400
+    #address_ip          = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
+    #address_prefix      = json_endpoint_settings.get('address_prefix',      24       )  # 30
+    remote_router       = json_endpoint_settings.get('remote_router',       '0.0.0.0')  # '5.5.5.5'
+    circuit_id          = json_endpoint_settings.get('circuit_id',          '000'    )  # '111'
+
+    if_cirid_name         = '{:s}.{:s}'.format(endpoint_uuid, str(circuit_id))
+    network_instance_name = 'ELAN-AC:{:s}'.format(str(circuit_id))
+    connection_point_id   = 'VC-1'
+
+    json_config_rules = [
+        json_config_rule_set(
+            '/network_instance[default]',
+            {'name': 'default', 'type': 'DEFAULT_INSTANCE', 'router_id': router_id}),
+
+        json_config_rule_set(
+            '/network_instance[default]/protocols[OSPF]',
+            {'name': 'default', 'identifier': 'OSPF', 'protocol_name': 'OSPF'}),
+
+        json_config_rule_set(
+            '/network_instance[default]/protocols[STATIC]',
+            {'name': 'default', 'identifier': 'STATIC', 'protocol_name': 'STATIC'}),
+
+        json_config_rule_set(
+            '/network_instance[{:s}]'.format(network_instance_name),
+            {'name': network_instance_name, 'type': 'L2VSI'}),
+
+        json_config_rule_set(
+            '/interface[{:s}]/subinterface[{:d}]'.format(if_cirid_name, sub_interface_index),
+            {'name': if_cirid_name, 'type': 'l2vlan', 'index': sub_interface_index, 'vlan_id': vlan_id}),
+
+        json_config_rule_set(
+            '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_cirid_name),
+            {'name': network_instance_name, 'id': if_cirid_name, 'interface': if_cirid_name,
+            'subinterface': sub_interface_index}),
+
+        json_config_rule_set(
+            '/network_instance[{:s}]/connection_point[{:s}]'.format(network_instance_name, connection_point_id),
+            {'name': network_instance_name, 'connection_point': connection_point_id, 'VC_ID': circuit_id,
+             'remote_system': remote_router}),
+    ]
+    return json_config_rules
+
+def teardown_config_rules(
+    service_uuid : str, connection_uuid : str, device_uuid : str, endpoint_uuid : str,
+    service_settings : TreeNode, endpoint_settings : TreeNode
+) -> List[Dict]:
+
+    #json_settings          : Dict = {} if service_settings  is None else service_settings.value
+    json_endpoint_settings : Dict = {} if endpoint_settings is None else endpoint_settings.value
+
+    #mtu                 = json_settings.get('mtu',                 1450 )    # 1512
+    #address_families    = json_settings.get('address_families',    []   )    # ['IPV4']
+    #bgp_as              = json_settings.get('bgp_as',              0    )    # 65000
+    #bgp_route_target    = json_settings.get('bgp_route_target',    '0:0')    # 65000:333
+
+    router_id           = json_endpoint_settings.get('router_id',           '0.0.0.0')  # '10.95.0.10'
+    #route_distinguisher = json_endpoint_settings.get('route_distinguisher', '0:0'    )  # '60001:801'
+    sub_interface_index = json_endpoint_settings.get('sub_interface_index', 0        )  # 1
+    #vlan_id             = json_endpoint_settings.get('vlan_id',             1        )  # 400
+    #address_ip          = json_endpoint_settings.get('address_ip',          '0.0.0.0')  # '2.2.2.1'
+    #address_prefix      = json_endpoint_settings.get('address_prefix',      24       )  # 30
+    #remote_router       = json_endpoint_settings.get('remote_router',       '0.0.0.0')  # '5.5.5.5'
+    circuit_id          = json_endpoint_settings.get('circuit_id',          '000'    )  # '111'
+
+    if_cirid_name         = '{:s}.{:s}'.format(endpoint_uuid, str(circuit_id))
+    network_instance_name = 'ELAN-AC:{:s}'.format(str(circuit_id))
+    connection_point_id   = 'VC-1'
+
+    json_config_rules = [
+        json_config_rule_delete(
+            '/network_instance[{:s}]/connection_point[{:s}]'.format(network_instance_name, connection_point_id),
+            {'name': network_instance_name, 'connection_point': connection_point_id}),
+
+        json_config_rule_delete(
+            '/network_instance[{:s}]/interface[{:s}]'.format(network_instance_name, if_cirid_name),
+            {'name': network_instance_name, 'id': if_cirid_name, 'interface': if_cirid_name,
+            'subinterface': sub_interface_index}),
+
+        json_config_rule_delete(
+            '/interface[{:s}]/subinterface[{:d}]'.format(if_cirid_name, sub_interface_index),
+            {'name': if_cirid_name, 'index': sub_interface_index}),
+
+        json_config_rule_delete(
+            '/network_instance[{:s}]'.format(network_instance_name),
+            {'name': network_instance_name}),
+
+        json_config_rule_delete(
+            '/network_instance[default]/protocols[STATIC]',
+            {'name': 'default', 'identifier': 'STATIC', 'protocol_name': 'STATIC'}),
+
+        json_config_rule_delete(
+            '/network_instance[default]/protocols[OSPF]',
+            {'name': 'default', 'identifier': 'OSPF', 'protocol_name': 'OSPF'}),
+
+        json_config_rule_delete(
+            '/network_instance[default]',
+            {'name': 'default', 'type': 'DEFAULT_INSTANCE', 'router_id': router_id}),
+    ]
+    return json_config_rules
diff --git a/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py b/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
new file mode 100644
index 0000000000000000000000000000000000000000..23df44413c17e66a631988eb6256316badf0d554
--- /dev/null
+++ b/src/service/service/service_handlers/l2nm_openconfig/L2NMOpenConfigServiceHandler.py
@@ -0,0 +1,187 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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 anytree, json, logging
+from typing import Any, List, Optional, Tuple, Union
+from common.method_wrappers.Decorator import MetricTypeEnum, MetricsPool, metered_subclass_method, INF
+from common.proto.context_pb2 import ConfigActionEnum, ConfigRule, DeviceId, Service
+from common.tools.object_factory.Device import json_device_id
+from common.type_checkers.Checkers import chk_length, chk_type
+from service.service.service_handler_api._ServiceHandler import _ServiceHandler
+from service.service.service_handler_api.AnyTreeTools import TreeNode, delete_subnode, get_subnode, set_subnode_value
+from service.service.task_scheduler.TaskExecutor import TaskExecutor
+from .ConfigRules import setup_config_rules, teardown_config_rules
+
+LOGGER = logging.getLogger(__name__)
+
+HISTOGRAM_BUCKETS = (
+    # .005, .01, .025, .05, .075, .1, .25, .5, .75, 1.0, INF
+    0.0010, 0.0025, 0.0050, 0.0075,
+    0.0100, 0.0250, 0.0500, 0.0750,
+    0.1000, 0.2500, 0.5000, 0.7500,
+    1.0000, 2.5000, 5.0000, 7.5000,
+    10.0000, 25.000, 50.0000, 75.000,
+    100.0, INF
+)
+METRICS_POOL = MetricsPool('Service', 'Handler', labels={'handler': 'l2nm_openconfig'})
+METRICS_POOL.get_or_create('SetEndpoint',      MetricTypeEnum.HISTOGRAM_DURATION, buckets=HISTOGRAM_BUCKETS)
+METRICS_POOL.get_or_create('DeleteEndpoint',   MetricTypeEnum.HISTOGRAM_DURATION, buckets=HISTOGRAM_BUCKETS)
+METRICS_POOL.get_or_create('SetConstraint',    MetricTypeEnum.HISTOGRAM_DURATION, buckets=HISTOGRAM_BUCKETS)
+METRICS_POOL.get_or_create('DeleteConstraint', MetricTypeEnum.HISTOGRAM_DURATION, buckets=HISTOGRAM_BUCKETS)
+METRICS_POOL.get_or_create('SetConfig',        MetricTypeEnum.HISTOGRAM_DURATION, buckets=HISTOGRAM_BUCKETS)
+METRICS_POOL.get_or_create('DeleteConfig',     MetricTypeEnum.HISTOGRAM_DURATION, buckets=HISTOGRAM_BUCKETS)
+
+class L2NMOpenConfigServiceHandler(_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 # pylint: disable=unused-private-member
+        self.__resolver = anytree.Resolver(pathattr='name')
+        self.__config = TreeNode('.')
+        for config_rule in service.service_config.config_rules:
+            action = config_rule.action
+            if config_rule.WhichOneof('config_rule') != 'custom': continue
+            resource_key = config_rule.custom.resource_key
+            resource_value = config_rule.custom.resource_value
+            if action == ConfigActionEnum.CONFIGACTION_SET:
+                try:
+                    resource_value = json.loads(resource_value)
+                except: # pylint: disable=bare-except
+                    pass
+                set_subnode_value(self.__resolver, self.__config, resource_key, resource_value)
+            elif action == ConfigActionEnum.CONFIGACTION_DELETE:
+                delete_subnode(self.__resolver, self.__config, resource_key)
+
+    @metered_subclass_method(METRICS_POOL)
+    def SetEndpoint(
+        self, endpoints : List[Tuple[str, str, Optional[str]]], connection_uuid : Optional[str] = None
+    ) -> List[Union[bool, Exception]]:
+        chk_type('endpoints', endpoints, list)
+        if len(endpoints) == 0: return []
+
+        service_uuid = self.__service.service_id.service_uuid.uuid
+        settings : TreeNode = get_subnode(self.__resolver, self.__config, '/settings', None)
+
+        results = []
+        for endpoint in endpoints:
+            try:
+                chk_type('endpoint', endpoint, (tuple, list))
+                chk_length('endpoint', endpoint, min_length=2, max_length=3)
+                device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid by now
+
+                endpoint_settings_uri = '/device[{:s}]/endpoint[{:s}]/settings'.format(device_uuid, endpoint_uuid)
+                endpoint_settings : TreeNode = get_subnode(self.__resolver, self.__config, endpoint_settings_uri, None)
+
+                json_config_rules = setup_config_rules(
+                    service_uuid, connection_uuid, device_uuid, endpoint_uuid, settings, endpoint_settings)
+
+                device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+                del device.device_config.config_rules[:]
+                for json_config_rule in json_config_rules:
+                    device.device_config.config_rules.append(ConfigRule(**json_config_rule))
+                self.__task_executor.configure_device(device)
+                results.append(True)
+            except Exception as e: # pylint: disable=broad-except
+                LOGGER.exception('Unable to SetEndpoint({:s})'.format(str(endpoint)))
+                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
+        settings : TreeNode = get_subnode(self.__resolver, self.__config, '/settings', None)
+
+        results = []
+        for endpoint in endpoints:
+            try:
+                chk_type('endpoint', endpoint, (tuple, list))
+                chk_length('endpoint', endpoint, min_length=2, max_length=3)
+                device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid by now
+
+                endpoint_settings_uri = '/device[{:s}]/endpoint[{:s}]/settings'.format(device_uuid, endpoint_uuid)
+                endpoint_settings : TreeNode = get_subnode(self.__resolver, self.__config, endpoint_settings_uri, None)
+
+                json_config_rules = teardown_config_rules(
+                    service_uuid, connection_uuid, device_uuid, endpoint_uuid, settings, endpoint_settings)
+
+                device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+                del device.device_config.config_rules[:]
+                for json_config_rule in json_config_rules:
+                    device.device_config.config_rules.append(ConfigRule(**json_config_rule))
+                self.__task_executor.configure_device(device)
+                results.append(True)
+            except Exception as e: # pylint: disable=broad-except
+                LOGGER.exception('Unable to DeleteEndpoint({:s})'.format(str(endpoint)))
+                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_key, resource_value = resource
+                resource_value = json.loads(resource_value)
+                set_subnode_value(self.__resolver, self.__config, resource_key, 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:
+                resource_key, _ = resource
+                delete_subnode(self.__resolver, self.__config, resource_key)
+            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/l2nm_openconfig/__init__.py b/src/service/service/service_handlers/l2nm_openconfig/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/service/service/service_handlers/l2nm_openconfig/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/p4/__init__.py b/src/service/service/service_handlers/p4/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..9953c820575d42fa88351cc8de022d880ba96e6a
--- /dev/null
+++ b/src/service/service/service_handlers/p4/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/p4/p4_service_handler.py b/src/service/service/service_handlers/p4/p4_service_handler.py
new file mode 100644
index 0000000000000000000000000000000000000000..48b9715b7bb89bc53d6888299836e9b2bf89f1d4
--- /dev/null
+++ b/src/service/service/service_handlers/p4/p4_service_handler.py
@@ -0,0 +1,305 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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.
+
+"""
+P4 service handler for the TeraFlowSDN controller.
+"""
+
+import anytree, json, logging
+from typing import Any, Dict, List, Optional, Tuple, Union
+from common.proto.context_pb2 import ConfigActionEnum, ConfigRule, DeviceId, Service
+from common.tools.object_factory.ConfigRule import json_config_rule, json_config_rule_delete, json_config_rule_set
+from common.tools.object_factory.Device import json_device_id
+from common.type_checkers.Checkers import chk_type, chk_length
+from service.service.service_handler_api._ServiceHandler import _ServiceHandler
+from service.service.service_handler_api.AnyTreeTools import TreeNode, delete_subnode, get_subnode, set_subnode_value
+from service.service.task_scheduler.TaskExecutor import TaskExecutor
+
+LOGGER = logging.getLogger(__name__)
+
+def create_rule_set(endpoint_a, endpoint_b):
+    return json_config_rule_set(
+        'table',
+        {
+            'table-name': 'IngressPipeImpl.l2_exact_table',
+            'match-fields': [
+                {
+                    'match-field': 'standard_metadata.ingress_port',
+                    'match-value': endpoint_a
+                }
+            ],
+            'action-name': 'IngressPipeImpl.set_egress_port',
+            'action-params': [
+                {
+                    'action-param': 'port',
+                    'action-value': endpoint_b
+                }
+            ]
+        }
+)
+
+def create_rule_del(endpoint_a, endpoint_b):
+    return json_config_rule_delete(
+        'table',
+        {
+            'table-name': 'IngressPipeImpl.l2_exact_table',
+            'match-fields': [
+                {
+                    'match-field': 'standard_metadata.ingress_port',
+                    'match-value': endpoint_a
+                }
+            ],
+            'action-name': 'IngressPipeImpl.set_egress_port',
+            'action-params': [
+                {
+                    'action-param': 'port',
+                    'action-value': endpoint_b
+                }
+            ]
+        }
+)
+
+class P4ServiceHandler(_ServiceHandler):
+    def __init__(self,
+                 service: Service,
+                 task_executor : TaskExecutor,
+                 **settings) -> None:
+        """ Initialize Driver.
+            Parameters:
+                service
+                    The service instance (gRPC message) to be managed.
+                task_executor
+                    An instance of Task Executor providing access to the
+                    service handlers factory, the context and device clients,
+                    and an internal cache of already-loaded gRPC entities.
+                **settings
+                    Extra settings required by the service handler.
+        """
+        self.__service = service
+        self.__task_executor = task_executor # pylint: disable=unused-private-member
+
+    def SetEndpoint(
+        self, endpoints : List[Tuple[str, str, Optional[str]]],
+        connection_uuid : Optional[str] = None
+    ) -> List[Union[bool, Exception]]:
+        """ Create/Update service endpoints form a list.
+            Parameters:
+                endpoints: List[Tuple[str, str, Optional[str]]]
+                    List of tuples, each containing a device_uuid,
+                    endpoint_uuid and, optionally, the topology_uuid
+                    of the endpoint to be added.
+                connection_uuid : Optional[str]
+                    If specified, is the UUID of the connection this endpoint is associated to.
+            Returns:
+                results: List[Union[bool, Exception]]
+                    List of results for endpoint changes requested.
+                    Return values must be in the same order as the requested
+                    endpoints. If an endpoint is properly added, True must be
+                    returned; otherwise, the Exception that is raised during
+                    the processing must be returned.
+        """
+        chk_type('endpoints', endpoints, list)
+        if len(endpoints) == 0: return []
+
+        service_uuid = self.__service.service_id.service_uuid.uuid
+
+        history = {}
+        
+        results = []
+        index = {}
+        i = 0
+        for endpoint in endpoints:        
+            device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid by now
+            if device_uuid in history:       
+                try:
+                    matched_endpoint_uuid = history.pop(device_uuid)
+                    device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+
+                    del device.device_config.config_rules[:]
+
+                    # One way
+                    rule = create_rule_set(matched_endpoint_uuid, endpoint_uuid) 
+                    device.device_config.config_rules.append(ConfigRule(**rule))
+                    # The other way
+                    rule = create_rule_set(endpoint_uuid, matched_endpoint_uuid) 
+                    device.device_config.config_rules.append(ConfigRule(**rule))
+
+                    self.__task_executor.configure_device(device)
+            
+                    results.append(True)
+                    results[index[device_uuid]] = True
+                except Exception as e:
+                    LOGGER.exception('Unable to SetEndpoint({:s})'.format(str(endpoint)))
+                    results.append(e)
+            else:
+                history[device_uuid] = endpoint_uuid
+                index[device_uuid] = i
+                results.append(False)
+            i = i+1
+
+        return results
+
+    def DeleteEndpoint(
+        self, endpoints : List[Tuple[str, str, Optional[str]]],
+        connection_uuid : Optional[str] = None
+    ) -> List[Union[bool, Exception]]:
+        """ Delete service endpoints form a list.
+            Parameters:
+                endpoints: List[Tuple[str, str, Optional[str]]]
+                    List of tuples, each containing a device_uuid,
+                    endpoint_uuid, and the topology_uuid of the endpoint
+                    to be removed.
+                connection_uuid : Optional[str]
+                    If specified, is the UUID of the connection this endpoint is associated to.
+            Returns:
+                results: List[Union[bool, Exception]]
+                    List of results for endpoint deletions requested.
+                    Return values must be in the same order as the requested
+                    endpoints. If an endpoint is properly deleted, True must be
+                    returned; otherwise, the Exception that is raised during
+                    the processing must be returned.
+        """
+        chk_type('endpoints', endpoints, list)
+        if len(endpoints) == 0: return []
+
+        service_uuid = self.__service.service_id.service_uuid.uuid
+
+        history = {}
+        
+        results = []
+        index = {}
+        i = 0
+        for endpoint in endpoints:        
+            device_uuid, endpoint_uuid = endpoint[0:2] # ignore topology_uuid by now
+            if device_uuid in history:       
+                try:
+                    matched_endpoint_uuid = history.pop(device_uuid)
+                    device = self.__task_executor.get_device(DeviceId(**json_device_id(device_uuid)))
+
+                    del device.device_config.config_rules[:]
+
+                    # One way
+                    rule = create_rule_del(matched_endpoint_uuid, endpoint_uuid) 
+                    device.device_config.config_rules.append(ConfigRule(**rule))
+                    # The other way
+                    rule = create_rule_del(endpoint_uuid, matched_endpoint_uuid) 
+                    device.device_config.config_rules.append(ConfigRule(**rule))
+
+                    self.__task_executor.configure_device(device)
+            
+                    results.append(True)
+                    results[index[device_uuid]] = True
+                except Exception as e:
+                    LOGGER.exception('Unable to SetEndpoint({:s})'.format(str(endpoint)))
+                    results.append(e)
+            else:
+                history[device_uuid] = endpoint_uuid
+                index[device_uuid] = i
+                results.append(False)
+            i = i+1
+
+        return results
+
+    def SetConstraint(self, constraints: List[Tuple[str, Any]]) \
+            -> List[Union[bool, Exception]]:
+        """ Create/Update service constraints.
+            Parameters:
+                constraints: List[Tuple[str, Any]]
+                    List of tuples, each containing a constraint_type and the
+                    new constraint_value to be set.
+            Returns:
+                results: List[Union[bool, Exception]]
+                    List of results for constraint changes requested.
+                    Return values must be in the same order as the requested
+                    constraints. If a constraint is properly set, True must be
+                    returned; otherwise, the Exception that is raised during
+                    the processing must be returned.
+        """
+        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))]
+
+    def DeleteConstraint(self, constraints: List[Tuple[str, Any]]) \
+            -> List[Union[bool, Exception]]:
+        """ Delete service constraints.
+            Parameters:
+                constraints: List[Tuple[str, Any]]
+                    List of tuples, each containing a constraint_type pointing
+                    to the constraint to be deleted, and a constraint_value
+                    containing possible additionally required values to locate
+                    the constraint to be removed.
+            Returns:
+                results: List[Union[bool, Exception]]
+                    List of results for constraint deletions requested.
+                    Return values must be in the same order as the requested
+                    constraints. If a constraint is properly deleted, True must
+                    be returned; otherwise, the Exception that is raised during
+                    the processing must be returned.
+        """
+        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))]
+
+    def SetConfig(self, resources: List[Tuple[str, Any]]) \
+            -> List[Union[bool, Exception]]:
+        """ Create/Update configuration for a list of service resources.
+            Parameters:
+                resources: List[Tuple[str, Any]]
+                    List of tuples, each containing a resource_key pointing to
+                    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 requested
+                    resource keys. If a resource is properly set, True must be
+                    returned; otherwise, the Exception that is raised during
+                    the processing must be returned.
+        """
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+
+        msg = '[SetConfig] Method not implemented. Resources({:s}) are being ignored.'
+        LOGGER.warning(msg.format(str(resources)))
+        return [True for _ in range(len(resources))]
+
+    def DeleteConfig(self, resources: List[Tuple[str, Any]]) \
+            -> List[Union[bool, Exception]]:
+        """ Delete configuration for a list of service resources.
+            Parameters:
+                resources: List[Tuple[str, Any]]
+                    List of tuples, each containing a resource_key pointing to
+                    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 requested
+                    resource keys. If a resource is properly deleted, True must
+                    be returned; otherwise, the Exception that is raised during
+                    the processing must be returned.
+        """
+        chk_type('resources', resources, list)
+        if len(resources) == 0: return []
+
+        msg = '[SetConfig] Method not implemented. Resources({:s}) are being ignored.'
+        LOGGER.warning(msg.format(str(resources)))
+        return [True for _ in range(len(resources))]
\ No newline at end of file
diff --git a/src/tests/benchmark/automation/.gitignore b/src/tests/benchmark/automation/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0a3f4400d5c88b1af32c7667d69d2fdc12d5424e
--- /dev/null
+++ b/src/tests/benchmark/automation/.gitignore
@@ -0,0 +1,2 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
+descriptors_real.json
diff --git a/src/tests/benchmark/automation/README.md b/src/tests/benchmark/automation/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8b5b2a01efc357b5d8eca6a6890b051b4ffac260
--- /dev/null
+++ b/src/tests/benchmark/automation/README.md
@@ -0,0 +1,17 @@
+
+# Grafana k6 load testing tool
+
+# K6 Installation Instructions on Ubuntu
+
+sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
+echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
+sudo apt-get update
+sudo apt-get install k6
+
+Or install k6 via snap:
+
+sudo apt install snapd
+sudo snap install k6
+
+# Running K6 
+k6 run script.js
\ No newline at end of file
diff --git a/src/tests/benchmark/automation/ZtpAdd.js b/src/tests/benchmark/automation/ZtpAdd.js
new file mode 100644
index 0000000000000000000000000000000000000000..0f649b8ccfbd910faadcc41549eddf34b83c6795
--- /dev/null
+++ b/src/tests/benchmark/automation/ZtpAdd.js
@@ -0,0 +1,55 @@
+import grpc from 'k6/net/grpc';
+import exec from "k6/execution";
+import { check, sleep } from 'k6';
+
+const client = new grpc.Client();
+client.load(['../../../../proto'], 'automation.proto');
+
+export const data = [];
+for (let i = 1; i < 801; i++) {
+  data.push({
+    "devRoleType": "DEV_CONF",
+    "devRoleId": {
+        "devId": {"device_uuid": {"uuid": "EMU-" + i}},
+        "devRoleId": {"uuid": "EMU-" + i}
+    }
+  });
+};
+
+export const options = {
+  scenarios :{
+
+    "ZtpAdd-scenario": {
+      executor: "shared-iterations",
+      vus: 800,
+      iterations: data.length,
+      maxDuration: "1h"
+    }
+  }
+};
+
+export default () => {
+  client.connect('10.1.255.239:5050', {
+    plaintext: true,
+    timeout: 10000
+  });
+
+  var item = data[exec.scenario.iterationInInstance];
+  const response = client.invoke('automation.AutomationService/ZtpAdd', item);
+
+  check(response, {
+    'status is OK': (r) => r && r.status === grpc.StatusOK,
+  });
+
+  console.log(JSON.stringify(response.message));
+
+  client.close();
+  sleep(1);
+};
+
+export function handleSummary(data) {
+
+  return {
+    'summary_add_800.json': JSON.stringify(data.metrics.grpc_req_duration.values), //the default data object
+  };
+}
diff --git a/src/tests/benchmark/automation/ZtpDelete.js b/src/tests/benchmark/automation/ZtpDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..58af9f25d924dda254e142dcf3962b62359ff42c
--- /dev/null
+++ b/src/tests/benchmark/automation/ZtpDelete.js
@@ -0,0 +1,55 @@
+import grpc from 'k6/net/grpc';
+import exec from "k6/execution";
+import { check, sleep } from 'k6';
+
+const client = new grpc.Client();
+client.load(['../../../../proto'], 'automation.proto');
+
+export const data = [];
+for (let i = 1; i < 801; i++) {
+  data.push({
+    "devRoleType": "DEV_CONF",
+    "devRoleId": {
+        "devId": {"device_uuid": {"uuid": "EMU-" + i}},
+        "devRoleId": {"uuid": "EMU-" + i}
+    }
+  });
+};
+
+export const options = {
+  scenarios :{
+
+    "ZtpAdd-scenario": {
+      executor: "shared-iterations",
+      vus: 800,
+      iterations: data.length,
+      maxDuration: "1h"
+    }
+  }
+};
+
+export default () => {
+  client.connect('10.1.255.232:5050', {
+    plaintext: true,
+    timeout: 10000
+  });
+
+  var item = data[exec.scenario.iterationInInstance];
+  const response = client.invoke('automation.AutomationService/ZtpDelete', item);
+
+  check(response, {
+    'status is OK': (r) => r && r.status === grpc.StatusOK,
+  });
+
+  console.log(JSON.stringify(response.message));
+
+  client.close();
+  sleep(1);
+};
+
+export function handleSummary(data) {
+
+  return {
+    'summary_delete_800.json': JSON.stringify(data.metrics.grpc_req_duration.values), //the default data object
+  };
+}
diff --git a/src/tests/benchmark/automation/ZtpUpdate.js b/src/tests/benchmark/automation/ZtpUpdate.js
new file mode 100755
index 0000000000000000000000000000000000000000..39135ec58643339562ff87c96a03be3968c198d4
--- /dev/null
+++ b/src/tests/benchmark/automation/ZtpUpdate.js
@@ -0,0 +1,60 @@
+import grpc from 'k6/net/grpc';
+import exec from "k6/execution";
+import { check, sleep } from 'k6';
+
+const client = new grpc.Client();
+client.load(['../../../../proto'], 'automation.proto');
+
+export const data = [];
+for (let i = 1; i < 801; i++) {
+  data.push({
+                "devRole": {
+                    "devRoleType": "DEV_CONF",
+                    "devRoleId": {
+                    "devId": {"device_uuid": {"uuid": "EMU-"+i}},
+                    "devRoleId": {"uuid": "1"}
+                 }
+                },
+                "devConfig": {
+                    "config_rules": []
+                }
+            });
+};
+
+export const options = {
+  scenarios :{
+
+    "ZtpAdd-scenario": {
+      executor: "shared-iterations",
+      vus: 800,
+      iterations: data.length,
+      maxDuration: "1h"
+    }
+  }
+};
+
+export default () => {
+  client.connect('10.1.255.250:5050', {
+    plaintext: true,
+    timeout: 10000
+  });
+
+  var item = data[exec.scenario.iterationInInstance];
+  const response = client.invoke('automation.AutomationService/ZtpUpdate', item);
+
+  check(response, {
+    'status is OK': (r) => r && r.status === grpc.StatusOK,
+  });
+
+  console.log(JSON.stringify(response.message));
+
+  client.close();
+  sleep(1);
+};
+
+export function handleSummary(data) {
+
+  return {
+    'summaryUpdate801.json': JSON.stringify(data.metrics.grpc_req_duration.values), //the default data object
+  };
+}
diff --git a/src/tests/benchmark/automation/__init__.py b/src/tests/benchmark/automation/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/tests/benchmark/automation/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/benchmark/automation/run_test_01_bootstrap.sh b/src/tests/benchmark/automation/run_test_01_bootstrap.sh
new file mode 100755
index 0000000000000000000000000000000000000000..dee1739270944bc19e370bb249b083f740e60737
--- /dev/null
+++ b/src/tests/benchmark/automation/run_test_01_bootstrap.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+pytest --verbose --log-level=INFO -o log_cli=true -o log_cli_level=INFO src/tests/benchmark/automation/tests/test_functional_bootstrap.py
diff --git a/src/tests/benchmark/automation/run_test_02_cleanup.sh b/src/tests/benchmark/automation/run_test_02_cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8f68302d6abfeac6750fff7183524c644355008e
--- /dev/null
+++ b/src/tests/benchmark/automation/run_test_02_cleanup.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+pytest --verbose --log-level=INFO -o log_cli=true -o log_cli_level=INFO src/tests/benchmark/automation/tests/test_functional_cleanup.py
diff --git a/src/tests/benchmark/automation/tests/.gitignore b/src/tests/benchmark/automation/tests/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..76cb708d1b532c9b69166e55f36bcb912fd5e370
--- /dev/null
+++ b/src/tests/benchmark/automation/tests/.gitignore
@@ -0,0 +1,2 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
+Credentials.py
diff --git a/src/tests/benchmark/automation/tests/Fixtures.py b/src/tests/benchmark/automation/tests/Fixtures.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b35a12e299ba776e909fbdd2739e971431083a6
--- /dev/null
+++ b/src/tests/benchmark/automation/tests/Fixtures.py
@@ -0,0 +1,28 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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, logging
+from common.Settings import get_setting
+from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME
+from tests.tools.mock_osm.MockOSM import MockOSM
+from .Objects import WIM_MAPPING
+
+LOGGER = logging.getLogger(__name__)
+
+@pytest.fixture(scope='session')
+def osm_wim():
+    wim_url = 'http://{:s}:{:s}'.format(
+        get_setting('COMPUTESERVICE_SERVICE_HOST'), str(get_setting('COMPUTESERVICE_SERVICE_PORT_HTTP')))
+    LOGGER.info('WIM_MAPPING = {:s}'.format(str(WIM_MAPPING)))
+    return MockOSM(wim_url, WIM_MAPPING, WIM_USERNAME, WIM_PASSWORD)
diff --git a/src/tests/benchmark/automation/tests/Objects.py b/src/tests/benchmark/automation/tests/Objects.py
new file mode 100644
index 0000000000000000000000000000000000000000..8ea6f500807e3dbcc2e34dbd559614ff91c955d8
--- /dev/null
+++ b/src/tests/benchmark/automation/tests/Objects.py
@@ -0,0 +1,54 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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.Constants import DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID
+from common.tools.object_factory.Context import json_context, json_context_id
+from common.tools.object_factory.Device import (
+    json_device_connect_rules, json_device_emulated_connect_rules, json_device_emulated_packet_router_disabled,
+    json_device_emulated_tapi_disabled, json_device_id, json_device_packetrouter_disabled, json_device_tapi_disabled)
+from common.tools.object_factory.EndPoint import json_endpoint, json_endpoint_id
+from common.tools.object_factory.Link import json_link, json_link_id
+from common.tools.object_factory.Topology import json_topology, json_topology_id
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+
+# ----- Context --------------------------------------------------------------------------------------------------------
+CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_UUID)
+CONTEXT    = json_context(DEFAULT_CONTEXT_UUID)
+
+# ----- Topology -------------------------------------------------------------------------------------------------------
+TOPOLOGY_ID = json_topology_id(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
+TOPOLOGY    = json_topology(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
+
+# ----- Monitoring Samples ---------------------------------------------------------------------------------------------
+PACKET_PORT_SAMPLE_TYPES = [
+    KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED,
+    KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED,
+    KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED,
+    KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED,
+]
+
+# ----- Devices --------------------------------------------------------------------------------------------------------
+DEVICE_ENDPOINT_DEFS = [('13/0/0', 'optical', []), ('13/1/2', 'copper', PACKET_PORT_SAMPLE_TYPES)]
+DEVICE_CONNECT_RULES = json_device_emulated_connect_rules(DEVICE_ENDPOINT_DEFS)
+
+# ----- Object Collections ---------------------------------------------------------------------------------------------
+CONTEXTS = [CONTEXT]
+TOPOLOGIES = [TOPOLOGY]
+
+DEVICES = []
+for x in range(1, 1000):
+  DEVICE_UUID = 'EMU-' + str(x)
+  DEVICE = json_device_emulated_packet_router_disabled(DEVICE_UUID)
+  DEVICES.append((DEVICE, DEVICE_CONNECT_RULES))
diff --git a/src/tests/benchmark/automation/tests/__init__.py b/src/tests/benchmark/automation/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/tests/benchmark/automation/tests/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/benchmark/automation/tests/test_functional_bootstrap.py b/src/tests/benchmark/automation/tests/test_functional_bootstrap.py
new file mode 100644
index 0000000000000000000000000000000000000000..3d588801511ae3bc6b5be87566c61b04bf54e467
--- /dev/null
+++ b/src/tests/benchmark/automation/tests/test_functional_bootstrap.py
@@ -0,0 +1,110 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import copy, logging, pytest
+from common.Settings import get_setting
+from common.proto.monitoring_pb2 import KpiDescriptorList
+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 monitoring.client.MonitoringClient import MonitoringClient
+from context.client.EventsCollector import EventsCollector
+from common.proto.context_pb2 import Context, ContextId, Device, Empty, Topology
+from device.client.DeviceClient import DeviceClient
+from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, TOPOLOGIES
+from tests.Fixtures import context_client, device_client, monitoring_client
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+
+def test_scenario_empty(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure database is empty -------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == 0
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
+
+
+def test_prepare_scenario(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+
+    # ----- Create Contexts and Topologies -----------------------------------------------------------------------------
+    for context in CONTEXTS:
+        context_uuid = context['context_id']['context_uuid']['uuid']
+        LOGGER.info('Adding Context {:s}'.format(context_uuid))
+        response = context_client.SetContext(Context(**context))
+        assert response.context_uuid.uuid == context_uuid
+
+    for topology in TOPOLOGIES:
+        context_uuid = topology['topology_id']['context_id']['context_uuid']['uuid']
+        topology_uuid = topology['topology_id']['topology_uuid']['uuid']
+        LOGGER.info('Adding Topology {:s}/{:s}'.format(context_uuid, topology_uuid))
+        response = context_client.SetTopology(Topology(**topology))
+        assert response.context_id.context_uuid.uuid == context_uuid
+        assert response.topology_uuid.uuid == topology_uuid
+        context_id = json_context_id(context_uuid)
+
+
+def test_scenario_ready(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure scenario is ready -------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == len(CONTEXTS)
+
+    response = context_client.ListTopologies(ContextId(**CONTEXT_ID))
+    assert len(response.topologies) == len(TOPOLOGIES)
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
+
+
+def test_devices_bootstraping(
+    context_client : ContextClient, device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    # ----- Create Devices and Validate Collected Events ---------------------------------------------------------------
+    for device, connect_rules in DEVICES:
+        device_uuid = device['device_id']['device_uuid']['uuid']
+        LOGGER.info('Adding Device {:s}'.format(device_uuid))
+
+        device_with_connect_rules = copy.deepcopy(device)
+        device_with_connect_rules['device_config']['config_rules'].extend(connect_rules)
+        response = device_client.AddDevice(Device(**device_with_connect_rules))
+        assert response.device_uuid.uuid == device_uuid
+
+
+def test_devices_bootstrapped(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure bevices are created -----------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == len(CONTEXTS)
+
+    response = context_client.ListTopologies(ContextId(**CONTEXT_ID))
+    assert len(response.topologies) == len(TOPOLOGIES)
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == len(DEVICES)
+
+
+def test_links_created(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure links are created -------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == len(CONTEXTS)
+
+    response = context_client.ListTopologies(ContextId(**CONTEXT_ID))
+    assert len(response.topologies) == len(TOPOLOGIES)
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == len(DEVICES)
\ No newline at end of file
diff --git a/src/tests/benchmark/automation/tests/test_functional_cleanup.py b/src/tests/benchmark/automation/tests/test_functional_cleanup.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b6e51c3e296261e52669980f656c6fdf12ceb65
--- /dev/null
+++ b/src/tests/benchmark/automation/tests/test_functional_cleanup.py
@@ -0,0 +1,68 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging, pytest
+from 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 ContextId, DeviceId, Empty, LinkId, TopologyId
+from device.client.DeviceClient import DeviceClient
+from tests.Fixtures import context_client, device_client
+from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, TOPOLOGIES
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+def test_scenario_cleanup(
+    context_client : ContextClient, device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    # ----- Delete Devices and Validate Collected Events ---------------------------------------------------------------
+    for device, _ in DEVICES:
+        device_id = device['device_id']
+        device_uuid = device_id['device_uuid']['uuid']
+        LOGGER.info('Deleting Device {:s}'.format(device_uuid))
+        device_client.DeleteDevice(DeviceId(**device_id))
+        #expected_events.append(('DeviceEvent', EVENT_REMOVE, json_device_id(device_uuid)))
+
+    # ----- Delete Topologies and Validate Collected Events ------------------------------------------------------------
+    for topology in TOPOLOGIES:
+        topology_id = topology['topology_id']
+        context_uuid = topology_id['context_id']['context_uuid']['uuid']
+        topology_uuid = topology_id['topology_uuid']['uuid']
+        LOGGER.info('Deleting Topology {:s}/{:s}'.format(context_uuid, topology_uuid))
+        context_client.RemoveTopology(TopologyId(**topology_id))
+        context_id = json_context_id(context_uuid)
+        #expected_events.append(('TopologyEvent', EVENT_REMOVE, json_topology_id(topology_uuid, context_id=context_id)))
+
+    # ----- Delete Contexts and Validate Collected Events --------------------------------------------------------------
+    for context in CONTEXTS:
+        context_id = context['context_id']
+        context_uuid = context_id['context_uuid']['uuid']
+        LOGGER.info('Deleting Context {:s}'.format(context_uuid))
+        context_client.RemoveContext(ContextId(**context_id))
+        #expected_events.append(('ContextEvent', EVENT_REMOVE, json_context_id(context_uuid)))
+
+
+def test_scenario_empty_again(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure database is empty again -------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == 0
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
diff --git a/src/tests/benchmark/policy/.gitignore b/src/tests/benchmark/policy/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..0a3f4400d5c88b1af32c7667d69d2fdc12d5424e
--- /dev/null
+++ b/src/tests/benchmark/policy/.gitignore
@@ -0,0 +1,2 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
+descriptors_real.json
diff --git a/src/tests/benchmark/policy/PolicyAddService.js b/src/tests/benchmark/policy/PolicyAddService.js
new file mode 100644
index 0000000000000000000000000000000000000000..708209ba01862a169dd7007a05e2ba29a198282a
--- /dev/null
+++ b/src/tests/benchmark/policy/PolicyAddService.js
@@ -0,0 +1,72 @@
+import grpc from 'k6/net/grpc';
+import exec from "k6/execution";
+import { check, sleep } from 'k6';
+
+const client = new grpc.Client();
+client.load(['../proto'], 'policy.proto');
+
+export const data = [];
+for (let i = 1; i < 2; i++) {
+  data.push(
+    {
+        "serviceId": {
+            "context_id": {
+                "context_uuid": {"uuid": "admin"}
+            },
+            "service_uuid": {
+                "uuid": "6942d780-cfa9-4dea-a946-a8a0b3f7eab2"
+            }
+        },
+        "policyRuleBasic": {
+            "policyRuleId": {"uuid": {"uuid": i.toString()}},
+            "policyRuleState": {"policyRuleState": "POLICY_UNDEFINED"},
+            "priority": 0,
+            "conditionList": [{"kpiId": {"kpi_id": {"uuid": "1"}}, 
+                            "numericalOperator": "POLICYRULE_CONDITION_NUMERICAL_EQUAL",
+                            "kpiValue": {"boolVal": false}
+    
+            }],
+            "actionList": [{}],
+            "booleanOperator": "POLICYRULE_CONDITION_BOOLEAN_UNDEFINED"
+        }
+    }
+  );
+};
+
+export const options = {
+  scenarios :{
+
+    "AddPolicy-scenario": {
+      executor: "shared-iterations",
+      vus: 1,
+      iterations: data.length,
+      maxDuration: "1h"
+    }
+  }
+};
+
+export default () => {
+  client.connect('10.1.255.198:6060', {
+    plaintext: true,
+//    timeout: 10000
+  });
+
+  var item = data[exec.scenario.iterationInInstance];  
+  const response = client.invoke('policy.PolicyService/PolicyAddService', item);
+
+  check(response, {
+    'status is OK': (r) => r && r.status === grpc.StatusOK,
+  });
+
+  console.log(JSON.stringify(response.message));
+
+  client.close();
+  sleep(1);
+};
+
+export function handleSummary(data) {
+
+  return {
+    'summary_add_1.json': JSON.stringify(data.metrics.grpc_req_duration.values), //the default data object
+  };
+}
diff --git a/src/tests/benchmark/policy/PolicyDelete.js b/src/tests/benchmark/policy/PolicyDelete.js
new file mode 100644
index 0000000000000000000000000000000000000000..85946837eb1123bd698f907e13415b7281a779d2
--- /dev/null
+++ b/src/tests/benchmark/policy/PolicyDelete.js
@@ -0,0 +1,53 @@
+import grpc from 'k6/net/grpc';
+import exec from "k6/execution";
+import { check, sleep } from 'k6';
+
+const client = new grpc.Client();
+client.load(['../proto'], 'policy.proto');
+
+export const data = [];
+for (let i = 1; i < 2; i++) {
+  data.push(
+    {
+     "uuid": {"uuid": i.toString()}
+    }
+  );
+};
+
+export const options = {
+  scenarios :{
+
+    "AddPolicy-scenario": {
+      executor: "shared-iterations",
+      vus: 1,
+      iterations: data.length,
+      maxDuration: "1h"
+    }
+  }
+};
+
+export default () => {
+  client.connect('10.1.255.198:6060', {
+    plaintext: true,
+//    timeout: 10000
+  });
+
+  var item = data[exec.scenario.iterationInInstance];  
+  const response = client.invoke('policy.PolicyService/PolicyDelete', item);
+
+  check(response, {
+    'status is OK': (r) => r && r.status === grpc.StatusOK,
+  });
+
+  console.log(JSON.stringify(response.message));
+
+  client.close();
+  sleep(1);
+};
+
+export function handleSummary(data) {
+
+  return {
+    'summary_delete_1.json': JSON.stringify(data.metrics.grpc_req_duration.values), //the default data object
+  };
+}
diff --git a/src/tests/benchmark/policy/PolicyUpdateService.js b/src/tests/benchmark/policy/PolicyUpdateService.js
new file mode 100644
index 0000000000000000000000000000000000000000..a3774f9dac0dec420b88e6e236e8dcd2e698e3cd
--- /dev/null
+++ b/src/tests/benchmark/policy/PolicyUpdateService.js
@@ -0,0 +1,72 @@
+import grpc from 'k6/net/grpc';
+import exec from "k6/execution";
+import { check, sleep } from 'k6';
+
+const client = new grpc.Client();
+client.load(['../proto'], 'policy.proto');
+
+export const data = [];
+for (let i = 1; i < 2; i++) {
+  data.push(
+    {
+        "serviceId": {
+            "context_id": {
+                "context_uuid": {"uuid": "admin"}
+            },
+            "service_uuid": {
+                "uuid": "6942d780-cfa9-4dea-a946-a8a0b3f7eab2"
+            }
+        },
+        "policyRuleBasic": {
+            "policyRuleId": {"uuid": {"uuid": i.toString()}},
+            "policyRuleState": {"policyRuleState": "POLICY_UNDEFINED"},
+            "priority": 0,
+            "conditionList": [{"kpiId": {"kpi_id": {"uuid": "1"}}, 
+                            "numericalOperator": "POLICYRULE_CONDITION_NUMERICAL_EQUAL",
+                            "kpiValue": {"boolVal": false}
+    
+            }],
+            "actionList": [{}],
+            "booleanOperator": "POLICYRULE_CONDITION_BOOLEAN_UNDEFINED"
+        }
+    }
+  );
+};
+
+export const options = {
+  scenarios :{
+
+    "AddPolicy-scenario": {
+      executor: "shared-iterations",
+      vus: 1,
+      iterations: data.length,
+      maxDuration: "1h"
+    }
+  }
+};
+
+export default () => {
+  client.connect('10.1.255.198:6060', {
+    plaintext: true,
+//    timeout: 10000
+  });
+
+  var item = data[exec.scenario.iterationInInstance];  
+  const response = client.invoke('policy.PolicyService/PolicyUpdateService', item);
+
+  check(response, {
+    'status is OK': (r) => r && r.status === grpc.StatusOK,
+  });
+
+  console.log(JSON.stringify(response.message));
+
+  client.close();
+  sleep(1);
+};
+
+export function handleSummary(data) {
+
+  return {
+    'summary_add_1.json': JSON.stringify(data.metrics.grpc_req_duration.values), //the default data object
+  };
+}
diff --git a/src/tests/benchmark/policy/README.md b/src/tests/benchmark/policy/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8b5b2a01efc357b5d8eca6a6890b051b4ffac260
--- /dev/null
+++ b/src/tests/benchmark/policy/README.md
@@ -0,0 +1,17 @@
+
+# Grafana k6 load testing tool
+
+# K6 Installation Instructions on Ubuntu
+
+sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
+echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
+sudo apt-get update
+sudo apt-get install k6
+
+Or install k6 via snap:
+
+sudo apt install snapd
+sudo snap install k6
+
+# Running K6 
+k6 run script.js
\ No newline at end of file
diff --git a/src/tests/benchmark/policy/__init__.py b/src/tests/benchmark/policy/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/tests/benchmark/policy/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/benchmark/policy/deploy_specs.sh b/src/tests/benchmark/policy/deploy_specs.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ffd91da35186fe21f418950493ef797a9af1b522
--- /dev/null
+++ b/src/tests/benchmark/policy/deploy_specs.sh
@@ -0,0 +1,26 @@
+# Set the URL of your local Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/"
+
+# Set the list of components, separated by spaces, you want to build images for, and deploy.
+# Supported components are:
+#   context device automation policy service compute monitoring webui
+#   interdomain slice pathcomp dlt
+#   dbscanserving opticalattackmitigator opticalattackdetector
+#   l3_attackmitigator l3_centralizedattackdetector l3_distributedattackdetector
+export TFS_COMPONENTS="context device automation monitoring pathcomp service slice compute webui"
+
+# Set the tag you want to use for your images.
+export TFS_IMAGE_TAG="dev"
+
+# Set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE="tfs"
+
+# Set additional manifest files to be applied after the deployment
+export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
+
+# Set the new Grafana admin password
+export TFS_GRAFANA_PASSWORD="admin123+"
+
+# If not already set, disable skip-build flag.
+# If TFS_SKIP_BUILD is "YES", the containers are not rebuilt-retagged-repushed and existing ones are used.
+export TFS_SKIP_BUILD=${TFS_SKIP_BUILD:-""}
diff --git a/src/tests/benchmark/policy/descriptors_emulated.json b/src/tests/benchmark/policy/descriptors_emulated.json
new file mode 100644
index 0000000000000000000000000000000000000000..a71d454f41f324cabb48a023d6d840a59245800c
--- /dev/null
+++ b/src/tests/benchmark/policy/descriptors_emulated.json
@@ -0,0 +1,121 @@
+{
+    "contexts": [
+        {
+            "context_id": {"context_uuid": {"uuid": "admin"}},
+            "topology_ids": [],
+            "service_ids": []
+        }
+    ],
+    "topologies": [
+        {
+            "topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}},
+            "device_ids": [
+                {"device_uuid": {"uuid": "R1-EMU"}},
+                {"device_uuid": {"uuid": "R2-EMU"}},
+                {"device_uuid": {"uuid": "R3-EMU"}},
+                {"device_uuid": {"uuid": "R4-EMU"}},
+                {"device_uuid": {"uuid": "O1-OLS"}}                
+            ],
+            "link_ids": [
+                {"link_uuid": {"uuid": "R1-EMU/13/0/0==O1-OLS/aade6001-f00b-5e2f-a357-6a0a9d3de870"}},
+                {"link_uuid": {"uuid": "R2-EMU/13/0/0==O1-OLS/eb287d83-f05e-53ec-ab5a-adf6bd2b5418"}},
+                {"link_uuid": {"uuid": "R3-EMU/13/0/0==O1-OLS/0ef74f99-1acc-57bd-ab9d-4b958b06c513"}},
+                {"link_uuid": {"uuid": "R4-EMU/13/0/0==O1-OLS/50296d99-58cc-5ce7-82f5-fc8ee4eec2ec"}}
+            ]
+        }
+    ],
+    "devices": [
+        {
+            "device_id": {"device_uuid": {"uuid": "R1-EMU"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "13/0/0", "type": "optical", "sample_types": []},
+                    {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R2-EMU"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "13/0/0", "type": "optical", "sample_types": []},
+                    {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R3-EMU"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "13/0/0", "type": "optical", "sample_types": []},
+                    {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "R4-EMU"}}, "device_type": "emu-packet-router",
+            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "13/0/0", "type": "optical", "sample_types": []},
+                    {"uuid": "13/1/2", "type": "copper",  "sample_types": [101, 102, 201, 202]}
+                ]}}}
+            ]}
+        },
+        {
+            "device_id": {"device_uuid": {"uuid": "O1-OLS"}}, "device_type": "emu-open-line-system",
+            "device_operational_status": 1, "device_drivers": [0], "device_endpoints": [],
+            "device_config": {"config_rules": [
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "127.0.0.1"}},
+                {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "0"}},
+                {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"endpoints": [
+                    {"uuid": "aade6001-f00b-5e2f-a357-6a0a9d3de870", "type": "optical", "sample_types": []},
+                    {"uuid": "eb287d83-f05e-53ec-ab5a-adf6bd2b5418", "type": "optical", "sample_types": []},
+                    {"uuid": "0ef74f99-1acc-57bd-ab9d-4b958b06c513", "type": "optical", "sample_types": []},
+                    {"uuid": "50296d99-58cc-5ce7-82f5-fc8ee4eec2ec", "type": "optical", "sample_types": []}
+                ]}}}
+            ]}
+        }
+    ],
+    "links": [
+        {
+            "link_id": {"link_uuid": {"uuid": "R1-EMU/13/0/0==O1-OLS/aade6001-f00b-5e2f-a357-6a0a9d3de870"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R1-EMU"}}, "endpoint_uuid": {"uuid": "13/0/0"}},
+                {"device_id": {"device_uuid": {"uuid": "O1-OLS"}}, "endpoint_uuid": {"uuid": "aade6001-f00b-5e2f-a357-6a0a9d3de870"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R2-EMU/13/0/0==O1-OLS/eb287d83-f05e-53ec-ab5a-adf6bd2b5418"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R2-EMU"}}, "endpoint_uuid": {"uuid": "13/0/0"}},
+                {"device_id": {"device_uuid": {"uuid": "O1-OLS"}}, "endpoint_uuid": {"uuid": "eb287d83-f05e-53ec-ab5a-adf6bd2b5418"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R3-EMU/13/0/0==O1-OLS/0ef74f99-1acc-57bd-ab9d-4b958b06c513"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R3-EMU"}}, "endpoint_uuid": {"uuid": "13/0/0"}},
+                {"device_id": {"device_uuid": {"uuid": "O1-OLS"}}, "endpoint_uuid": {"uuid": "0ef74f99-1acc-57bd-ab9d-4b958b06c513"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "R4-EMU/13/0/0==O1-OLS/50296d99-58cc-5ce7-82f5-fc8ee4eec2ec"}},
+            "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "R4-EMU"}}, "endpoint_uuid": {"uuid": "13/0/0"}},
+                {"device_id": {"device_uuid": {"uuid": "O1-OLS"}}, "endpoint_uuid": {"uuid": "50296d99-58cc-5ce7-82f5-fc8ee4eec2ec"}}
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/src/tests/benchmark/policy/run_test_01_bootstrap.sh b/src/tests/benchmark/policy/run_test_01_bootstrap.sh
new file mode 100755
index 0000000000000000000000000000000000000000..10b18257b937a5aae82a66cd5e3df83abd44e1d8
--- /dev/null
+++ b/src/tests/benchmark/policy/run_test_01_bootstrap.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+pytest --verbose --log-level=INFO -o log_cli=true -o log_cli_level=INFO src/tests/benchmark/policy/tests/test_functional_bootstrap.py
diff --git a/src/tests/benchmark/policy/run_test_02_create_service.sh b/src/tests/benchmark/policy/run_test_02_create_service.sh
new file mode 100755
index 0000000000000000000000000000000000000000..69ef34ff954d550fbe2c22719f0afb2eb3360525
--- /dev/null
+++ b/src/tests/benchmark/policy/run_test_02_create_service.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+pytest --verbose --log-level=INFO -o log_cli=true -o log_cli_level=INFO src/tests/benchmark/policy/tests/test_functional_create_service.py
diff --git a/src/tests/benchmark/policy/run_test_03_delete_service.sh b/src/tests/benchmark/policy/run_test_03_delete_service.sh
new file mode 100755
index 0000000000000000000000000000000000000000..01eb521310053b06538c91cbfaae80aa3b2fdd45
--- /dev/null
+++ b/src/tests/benchmark/policy/run_test_03_delete_service.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+pytest --verbose --log-level=INFO -o log_cli=true -o log_cli_level=INFO src/tests/benchmark/policy/tests/test_functional_delete_service.py
diff --git a/src/tests/benchmark/policy/run_test_04_cleanup.sh b/src/tests/benchmark/policy/run_test_04_cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a2be265de04552cbebe83decba538656232bf904
--- /dev/null
+++ b/src/tests/benchmark/policy/run_test_04_cleanup.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+pytest --verbose --log-level=INFO -o log_cli=true -o log_cli_level=INFO src/tests/benchmark/policy/tests/test_functional_cleanup.py
diff --git a/src/tests/benchmark/policy/tests/.gitignore b/src/tests/benchmark/policy/tests/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..76cb708d1b532c9b69166e55f36bcb912fd5e370
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/.gitignore
@@ -0,0 +1,2 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
+Credentials.py
diff --git a/src/tests/benchmark/policy/tests/Fixtures.py b/src/tests/benchmark/policy/tests/Fixtures.py
new file mode 100644
index 0000000000000000000000000000000000000000..3b35a12e299ba776e909fbdd2739e971431083a6
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/Fixtures.py
@@ -0,0 +1,28 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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, logging
+from common.Settings import get_setting
+from tests.tools.mock_osm.Constants import WIM_PASSWORD, WIM_USERNAME
+from tests.tools.mock_osm.MockOSM import MockOSM
+from .Objects import WIM_MAPPING
+
+LOGGER = logging.getLogger(__name__)
+
+@pytest.fixture(scope='session')
+def osm_wim():
+    wim_url = 'http://{:s}:{:s}'.format(
+        get_setting('COMPUTESERVICE_SERVICE_HOST'), str(get_setting('COMPUTESERVICE_SERVICE_PORT_HTTP')))
+    LOGGER.info('WIM_MAPPING = {:s}'.format(str(WIM_MAPPING)))
+    return MockOSM(wim_url, WIM_MAPPING, WIM_USERNAME, WIM_PASSWORD)
diff --git a/src/tests/benchmark/policy/tests/Objects.py b/src/tests/benchmark/policy/tests/Objects.py
new file mode 100644
index 0000000000000000000000000000000000000000..7bfbe9fce558d6a86d965ecb6421369d7f544d4d
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/Objects.py
@@ -0,0 +1,38 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from common.tools.object_factory.Device import json_device_id
+from common.tools.object_factory.EndPoint import json_endpoint_id
+from tests.tools.mock_osm.Tools import connection_point, wim_mapping
+
+# ----- WIM Service Settings -------------------------------------------------------------------------------------------
+
+WIM_DC1_SITE_ID     = '1'
+WIM_DC1_DEVICE_ID   = json_device_id('R1-EMU')
+WIM_DC1_ENDPOINT_ID = json_endpoint_id(WIM_DC1_DEVICE_ID, '13/1/2')
+
+WIM_DC2_SITE_ID     = '2'
+WIM_DC2_DEVICE_ID   = json_device_id('R3-EMU')
+WIM_DC2_ENDPOINT_ID = json_endpoint_id(WIM_DC2_DEVICE_ID, '13/1/2')
+
+WIM_SEP_DC1, WIM_MAP_DC1 = wim_mapping(WIM_DC1_SITE_ID, WIM_DC1_ENDPOINT_ID)
+WIM_SEP_DC2, WIM_MAP_DC2 = wim_mapping(WIM_DC2_SITE_ID, WIM_DC2_ENDPOINT_ID)
+WIM_MAPPING  = [WIM_MAP_DC1, WIM_MAP_DC2]
+
+WIM_SRV_VLAN_ID = 300
+WIM_SERVICE_TYPE = 'ELINE'
+WIM_SERVICE_CONNECTION_POINTS = [
+    connection_point(WIM_SEP_DC1, 'dot1q', WIM_SRV_VLAN_ID),
+    connection_point(WIM_SEP_DC2, 'dot1q', WIM_SRV_VLAN_ID),
+]
diff --git a/src/tests/benchmark/policy/tests/__init__.py b/src/tests/benchmark/policy/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/benchmark/policy/tests/test_functional_bootstrap.py b/src/tests/benchmark/policy/tests/test_functional_bootstrap.py
new file mode 100644
index 0000000000000000000000000000000000000000..71deb9d596b1494e148b140902ca927e5d664dd3
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/test_functional_bootstrap.py
@@ -0,0 +1,95 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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 ContextId, Empty
+from common.proto.monitoring_pb2 import KpiDescriptorList
+from common.tests.LoadScenario import load_scenario_from_descriptor
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from common.tools.object_factory.Context import json_context_id
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from monitoring.client.MonitoringClient import MonitoringClient
+from tests.Fixtures import context_client, device_client, monitoring_client # pylint: disable=unused-import
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DESCRIPTOR_FILE = 'ofc22/descriptors_emulated.json'
+
+def test_scenario_bootstrap(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient,   # pylint: disable=redefined-outer-name
+) -> None:
+    # ----- List entities - Ensure database is empty -------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == 0
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == 0
+
+
+    # ----- Load Scenario ----------------------------------------------------------------------------------------------
+    descriptor_loader = load_scenario_from_descriptor(
+        DESCRIPTOR_FILE, context_client, device_client, None, None)
+
+
+    # ----- List entities - Ensure scenario is ready -------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == descriptor_loader.num_contexts
+
+    for context_uuid, num_topologies in descriptor_loader.num_topologies.items():
+        response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid)))
+        assert len(response.topologies) == num_topologies
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == descriptor_loader.num_devices
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == descriptor_loader.num_links
+
+    for context_uuid, _ in descriptor_loader.num_services.items():
+        response = context_client.ListServices(ContextId(**json_context_id(context_uuid)))
+        assert len(response.services) == 0
+
+def test_scenario_kpis_created(
+    context_client : ContextClient,         # pylint: disable=redefined-outer-name
+    monitoring_client: MonitoringClient,    # pylint: disable=redefined-outer-name
+) -> None:
+    """
+    This test validates that KPIs related to the service/device/endpoint were created
+    during the service creation process.
+    """
+    response = context_client.ListDevices(Empty())
+    kpis_expected = set()
+    for device in response.devices:
+        device_uuid = device.device_id.device_uuid.uuid
+        for endpoint in device.device_endpoints:
+            endpoint_uuid = endpoint.endpoint_id.endpoint_uuid.uuid
+            for kpi_sample_type in endpoint.kpi_sample_types:
+                kpis_expected.add((device_uuid, endpoint_uuid, kpi_sample_type))
+    num_kpis_expected = len(kpis_expected)
+    LOGGER.info('Num KPIs expected: {:d}'.format(num_kpis_expected))
+
+    num_kpis_created, num_retry = 0, 0
+    while (num_kpis_created != num_kpis_expected) and (num_retry < 5):
+        response: KpiDescriptorList = monitoring_client.GetKpiDescriptorList(Empty())
+        num_kpis_created = len(response.kpi_descriptor_list)
+        LOGGER.info('Num KPIs created: {:d}'.format(num_kpis_created))
+        time.sleep(0.5)
+        num_retry += 1
+    assert num_kpis_created == num_kpis_expected
diff --git a/src/tests/benchmark/policy/tests/test_functional_cleanup.py b/src/tests/benchmark/policy/tests/test_functional_cleanup.py
new file mode 100644
index 0000000000000000000000000000000000000000..be807eaa0242f2363b5b6c189ce4de264528a54c
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/test_functional_cleanup.py
@@ -0,0 +1,80 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+from common.tools.object_factory.Context import json_context_id
+from common.proto.context_pb2 import ContextId, DeviceId, Empty, LinkId, TopologyId
+from context.client.ContextClient import ContextClient
+from device.client.DeviceClient import DeviceClient
+from tests.Fixtures import context_client, device_client    # pylint: disable=unused-import
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DESCRIPTOR_FILE = 'ofc22/descriptors_emulated.json'
+
+
+def test_services_removed(
+    context_client : ContextClient, # pylint: disable=redefined-outer-name
+    device_client : DeviceClient,   # pylint: disable=redefined-outer-name
+) -> None:
+    # ----- List entities - Ensure service is removed ------------------------------------------------------------------
+    with open(DESCRIPTOR_FILE, 'r', encoding='UTF-8') as f:
+        descriptors = f.read()
+
+    descriptor_loader = DescriptorLoader(descriptors)
+
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == descriptor_loader.num_contexts
+
+    for context_uuid, num_topologies in descriptor_loader.num_topologies.items():
+        response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid)))
+        assert len(response.topologies) == num_topologies
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == descriptor_loader.num_devices
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == descriptor_loader.num_links
+
+    for context_uuid, _ in descriptor_loader.num_services.items():
+        response = context_client.ListServices(ContextId(**json_context_id(context_uuid)))
+        assert len(response.services) == 0
+
+
+    # ----- Delete Links, Devices, Topologies, Contexts ----------------------------------------------------------------
+    for link in descriptor_loader.links:
+        context_client.RemoveLink(LinkId(**link['link_id']))
+
+    for device in descriptor_loader.devices:
+        device_client .DeleteDevice(DeviceId(**device['device_id']))
+
+    for context_uuid, topology_list in descriptor_loader.topologies.items():
+        for topology in topology_list:
+            context_client.RemoveTopology(TopologyId(**topology['topology_id']))
+
+    for context in descriptor_loader.contexts:
+        context_client.RemoveContext(ContextId(**context['context_id']))
+
+
+    # ----- List entities - Ensure database is empty again -------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == 0
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == 0
diff --git a/src/tests/benchmark/policy/tests/test_functional_create_service.py b/src/tests/benchmark/policy/tests/test_functional_create_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..e606d060d52631ba72e191d7c025bd7b43048b39
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/test_functional_create_service.py
@@ -0,0 +1,124 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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, random
+from common.DeviceTypes import DeviceTypeEnum
+from common.proto.context_pb2 import ContextId, Empty
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.tools.descriptor.Loader import DescriptorLoader
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from common.tools.object_factory.Context import json_context_id
+from context.client.ContextClient import ContextClient
+from monitoring.client.MonitoringClient import MonitoringClient
+from tests.Fixtures import context_client, device_client, monitoring_client # pylint: disable=unused-import
+from tests.tools.mock_osm.MockOSM import MockOSM
+from .Fixtures import osm_wim # pylint: disable=unused-import
+from .Objects import WIM_SERVICE_CONNECTION_POINTS, WIM_SERVICE_TYPE
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DEVTYPE_EMU_PR  = DeviceTypeEnum.EMULATED_PACKET_ROUTER.value
+DEVTYPE_EMU_OLS = DeviceTypeEnum.EMULATED_OPEN_LINE_SYSTEM.value
+
+DESCRIPTOR_FILE = 'ofc22/descriptors_emulated.json'
+
+def test_service_creation(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure scenario is ready -------------------------------------------------------------------
+    with open(DESCRIPTOR_FILE, 'r', encoding='UTF-8') as f:
+        descriptors = f.read()
+
+    descriptor_loader = DescriptorLoader(descriptors)
+
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == descriptor_loader.num_contexts
+
+    for context_uuid, num_topologies in descriptor_loader.num_topologies.items():
+        response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid)))
+        assert len(response.topologies) == num_topologies
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == descriptor_loader.num_devices
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == descriptor_loader.num_links
+
+    for context_uuid, num_services in descriptor_loader.num_services.items():
+        response = context_client.ListServices(ContextId(**json_context_id(context_uuid)))
+        assert len(response.services) == 0
+
+
+    # ----- Create Service ---------------------------------------------------------------------------------------------
+    service_uuid = osm_wim.create_connectivity_service(WIM_SERVICE_TYPE, WIM_SERVICE_CONNECTION_POINTS)
+    osm_wim.get_connectivity_service_status(service_uuid)
+
+
+    # ----- List entities - Ensure service is created ------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == descriptor_loader.num_contexts
+
+    for context_uuid, num_topologies in descriptor_loader.num_topologies.items():
+        response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid)))
+        assert len(response.topologies) == num_topologies
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == descriptor_loader.num_devices
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == descriptor_loader.num_links
+
+    for context_uuid, num_services in descriptor_loader.num_services.items():
+        response = context_client.ListServices(ContextId(**json_context_id(context_uuid)))
+        LOGGER.info('Services[{:d}] = {:s}'.format(len(response.services), grpc_message_to_json_string(response)))
+        assert len(response.services) == 2*num_services # OLS & L3NM => (L3NM + TAPI)
+
+        for service in response.services:
+            service_id = service.service_id
+            response = context_client.ListConnections(service_id)
+            LOGGER.info('  ServiceId[{:s}] => Connections[{:d}] = {:s}'.format(
+                grpc_message_to_json_string(service_id), len(response.connections),
+                grpc_message_to_json_string(response)))
+            assert len(response.connections) == 1 # one connection per service
+
+
+def test_scenario_kpi_values_created(
+    monitoring_client: MonitoringClient,    # pylint: disable=redefined-outer-name
+) -> None:
+    """
+    This test validates that KPI values have been inserted into the monitoring database.
+    We short k KPI descriptors to test.
+    """
+    response = monitoring_client.GetKpiDescriptorList(Empty())
+    kpi_descriptors = random.choices(response.kpi_descriptor_list, k=2)
+
+    for kpi_descriptor in kpi_descriptors:
+        MSG = 'KPI(kpi_uuid={:s}, device_uuid={:s}, endpoint_uuid={:s}, service_uuid={:s}, kpi_sample_type={:s})...'
+        LOGGER.info(MSG.format(
+            str(kpi_descriptor.kpi_id.kpi_id.uuid), str(kpi_descriptor.device_id.device_uuid.uuid),
+            str(kpi_descriptor.endpoint_id.endpoint_uuid.uuid), str(kpi_descriptor.service_id.service_uuid.uuid),
+            str(KpiSampleType.Name(kpi_descriptor.kpi_sample_type))))
+        response = monitoring_client.GetInstantKpi(kpi_descriptor.kpi_id)
+        kpi_uuid = response.kpi_id.kpi_id.uuid
+        assert kpi_uuid == kpi_descriptor.kpi_id.kpi_id.uuid
+        kpi_value_type = response.kpi_value.WhichOneof('value')
+        if kpi_value_type is None:
+            MSG = '  KPI({:s}): No instant value found'
+            LOGGER.warning(MSG.format(str(kpi_uuid)))
+        else:
+            kpi_timestamp = response.timestamp.timestamp
+            assert kpi_timestamp > 0
+            assert kpi_value_type == 'floatVal'
+            kpi_value = getattr(response.kpi_value, kpi_value_type)
+            MSG = '  KPI({:s}): timestamp={:s} value_type={:s} value={:s}'
+            LOGGER.info(MSG.format(str(kpi_uuid), str(kpi_timestamp), str(kpi_value_type), str(kpi_value)))
diff --git a/src/tests/benchmark/policy/tests/test_functional_delete_service.py b/src/tests/benchmark/policy/tests/test_functional_delete_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..0f8d088012bed164e4603a813bfe9154eda8f568
--- /dev/null
+++ b/src/tests/benchmark/policy/tests/test_functional_delete_service.py
@@ -0,0 +1,99 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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.Constants import DEFAULT_CONTEXT_UUID
+from common.DeviceTypes import DeviceTypeEnum
+from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum
+from common.tools.descriptor.Loader import DescriptorLoader
+from common.tools.object_factory.Context import json_context_id
+from common.tools.grpc.Tools import grpc_message_to_json_string
+from context.client.ContextClient import ContextClient
+from tests.Fixtures import context_client   # pylint: disable=unused-import
+from tests.tools.mock_osm.MockOSM import MockOSM
+from .Fixtures import osm_wim # pylint: disable=unused-import
+
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+DEVTYPE_EMU_PR  = DeviceTypeEnum.EMULATED_PACKET_ROUTER.value
+DEVTYPE_EMU_OLS = DeviceTypeEnum.EMULATED_OPEN_LINE_SYSTEM.value
+
+DESCRIPTOR_FILE = 'ofc22/descriptors_emulated.json'
+
+
+def test_service_removal(context_client : ContextClient, osm_wim : MockOSM): # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure service is created ------------------------------------------------------------------
+    with open(DESCRIPTOR_FILE, 'r', encoding='UTF-8') as f:
+        descriptors = f.read()
+
+    descriptor_loader = DescriptorLoader(descriptors)
+
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == descriptor_loader.num_contexts
+
+    for context_uuid, num_topologies in descriptor_loader.num_topologies.items():
+        response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid)))
+        assert len(response.topologies) == num_topologies
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == descriptor_loader.num_devices
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == descriptor_loader.num_links
+
+    l3nm_service_uuids = set()
+    response = context_client.ListServices(ContextId(**json_context_id(DEFAULT_CONTEXT_UUID)))
+    assert len(response.services) == 2 # OLS & L3NM => (L3NM + TAPI)
+    for service in response.services:
+        service_id = service.service_id
+
+        if service.service_type == ServiceTypeEnum.SERVICETYPE_L3NM:
+            service_uuid = service_id.service_uuid.uuid
+            l3nm_service_uuids.add(service_uuid)
+            osm_wim.conn_info[service_uuid] = {}
+
+        response = context_client.ListConnections(service_id)
+        LOGGER.info('  ServiceId[{:s}] => Connections[{:d}] = {:s}'.format(
+            grpc_message_to_json_string(service_id), len(response.connections),
+            grpc_message_to_json_string(response)))
+        assert len(response.connections) == 1 # one connection per service
+
+    # Identify service to delete
+    assert len(l3nm_service_uuids) == 1  # assume a single L3NM service has been created
+    l3nm_service_uuid = set(l3nm_service_uuids).pop()
+
+
+    # ----- Delete Service ---------------------------------------------------------------------------------------------
+    osm_wim.delete_connectivity_service(l3nm_service_uuid)
+
+
+    # ----- List entities - Ensure service is removed ------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == descriptor_loader.num_contexts
+
+    for context_uuid, num_topologies in descriptor_loader.num_topologies.items():
+        response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid)))
+        assert len(response.topologies) == num_topologies
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == descriptor_loader.num_devices
+
+    response = context_client.ListLinks(Empty())
+    assert len(response.links) == descriptor_loader.num_links
+
+    for context_uuid, num_services in descriptor_loader.num_services.items():
+        response = context_client.ListServices(ContextId(**json_context_id(context_uuid)))
+        assert len(response.services) == 0
diff --git a/src/tests/ofc22/descriptors_emulated_xr.json b/src/tests/ofc22/descriptors_emulated_xr.json
index 30bd97dddeb94f836d3fe66e51fce729c34ceced..4cb0dbfca891faebf4c812c2fbb77f4ecd91330a 100644
--- a/src/tests/ofc22/descriptors_emulated_xr.json
+++ b/src/tests/ofc22/descriptors_emulated_xr.json
@@ -9,8 +9,19 @@
     "topologies": [
         {
             "topology_id": {"topology_uuid": {"uuid": "admin"}, "context_id": {"context_uuid": {"uuid": "admin"}}},
-            "device_ids": [],
-            "link_ids": []
+            "device_ids": [
+                {"device_uuid": {"uuid": "R1-EMU"}},
+                {"device_uuid": {"uuid": "R2-EMU"}},
+                {"device_uuid": {"uuid": "R3-EMU"}},
+                {"device_uuid": {"uuid": "R4-EMU"}},
+                {"device_uuid": {"uuid": "X1-XR-CONSTELLATION"}}                
+            ],
+            "link_ids": [
+                {"link_uuid": {"uuid": "R1-EMU/13/0/0==XR HUB 1|XR-T4"}},
+                {"link_uuid": {"uuid": "R2-EMU/13/0/0==XR HUB 1|XR-T3"}},
+                {"link_uuid": {"uuid": "R3-EMU/13/0/0==XR1-XR LEAF 1|XR-T1"}},
+                {"link_uuid": {"uuid": "R4-EMU/13/0/0==XR LEAF 2|XR-T1"}}
+            ]
         }
     ],
     "devices": [
diff --git a/src/tests/ofc22/tests/test_functional_create_service_xr.py b/src/tests/ofc22/tests/test_functional_create_service_xr.py
index bb78abc1efe7701308448ad4b83ef2a6e32079c4..6008eaa10702f0491742f6195a5fdf15735e5f14 100644
--- a/src/tests/ofc22/tests/test_functional_create_service_xr.py
+++ b/src/tests/ofc22/tests/test_functional_create_service_xr.py
@@ -20,7 +20,7 @@ from common.tools.object_factory.Connection import json_connection_id
 from common.tools.object_factory.Device import json_device_id
 from common.tools.object_factory.Service import json_service_id
 from common.tools.grpc.Tools import grpc_message_to_json_string
-from compute.tests.mock_osm.MockOSM import MockOSM
+from tests.tools.mock_osm.MockOSM import MockOSM
 from context.client.ContextClient import ContextClient
 from context.client.EventsCollector import EventsCollector
 from common.proto.context_pb2 import ContextId, Empty
diff --git a/src/tests/ofc22/tests/test_functional_delete_service_xr.py b/src/tests/ofc22/tests/test_functional_delete_service_xr.py
index f28828be056e755058a0f6b15bd8ea3e9acbbdeb..546a8781bee125dd48723c67cddd2aec26dc3ed9 100644
--- a/src/tests/ofc22/tests/test_functional_delete_service_xr.py
+++ b/src/tests/ofc22/tests/test_functional_delete_service_xr.py
@@ -20,7 +20,7 @@ from common.tools.object_factory.Connection import json_connection_id
 from common.tools.object_factory.Device import json_device_id
 from common.tools.object_factory.Service import json_service_id
 from common.tools.grpc.Tools import grpc_message_to_json_string
-from compute.tests.mock_osm.MockOSM import MockOSM
+from tests.tools.mock_osm.MockOSM import MockOSM
 from context.client.ContextClient import ContextClient
 from context.client.EventsCollector import EventsCollector
 from common.proto.context_pb2 import ContextId, Empty, ServiceTypeEnum
diff --git a/src/tests/p4/__init__.py b/src/tests/p4/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/tests/p4/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/deploy_specs.sh b/src/tests/p4/deploy_specs.sh
new file mode 100644
index 0000000000000000000000000000000000000000..b486474e2afad7305409bf410c7b8885b0afe2a8
--- /dev/null
+++ b/src/tests/p4/deploy_specs.sh
@@ -0,0 +1,17 @@
+# Set the URL of your local Docker registry where the images will be uploaded to.
+export TFS_REGISTRY_IMAGE="http://localhost:32000/tfs/"
+
+# Set the list of components, separated by spaces, you want to build images for, and deploy.
+export TFS_COMPONENTS="context device automation service compute monitoring webui"
+
+# Set the tag you want to use for your images.
+export TFS_IMAGE_TAG="dev"
+
+# Set the name of the Kubernetes namespace to deploy to.
+export TFS_K8S_NAMESPACE="tfs"
+
+# Set additional manifest files to be applied after the deployment
+export TFS_EXTRA_MANIFESTS="manifests/nginx_ingress_http.yaml"
+
+# Set the neew Grafana admin password
+export TFS_GRAFANA_PASSWORD="admin123+"
diff --git a/src/tests/p4/mininet/1switch1path.py b/src/tests/p4/mininet/1switch1path.py
new file mode 100755
index 0000000000000000000000000000000000000000..466fb6a06e5b9ba8598614511c95ac4271d609e8
--- /dev/null
+++ b/src/tests/p4/mininet/1switch1path.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+
+#  Copyright 2019-present Open Networking Foundation
+#
+#  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 argparse
+
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.net import Mininet
+from mininet.node import Host
+from mininet.topo import Topo
+from stratum import StratumBmv2Switch
+
+CPU_PORT = 255
+
+class IPv4Host(Host):
+    """Host that can be configured with an IPv4 gateway (default route).
+    """
+
+    def config(self, mac=None, ip=None, defaultRoute=None, lo='up', gw=None,
+               **_params):
+        super(IPv4Host, self).config(mac, ip, defaultRoute, lo, **_params)
+        self.cmd('ip -4 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -6 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -4 link set up %s' % self.defaultIntf())
+        self.cmd('ip -4 addr add %s dev %s' % (ip, self.defaultIntf()))
+        if gw:
+            self.cmd('ip -4 route add default via %s' % gw)
+        # Disable offload
+        for attr in ["rx", "tx", "sg"]:
+            cmd = "/sbin/ethtool --offload %s %s off" % (
+                self.defaultIntf(), attr)
+            self.cmd(cmd)
+
+        def updateIP():
+            return ip.split('/')[0]
+
+        self.defaultIntf().updateIP = updateIP
+
+class TutorialTopo(Topo):
+    """Basic Server-Client topology with IPv4 hosts"""
+
+    def __init__(self, *args, **kwargs):
+        Topo.__init__(self, *args, **kwargs)
+
+        # Spines
+        # gRPC port 50001
+        switch1 = self.addSwitch('switch1', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+
+        # IPv4 hosts attached to switch 1
+        client = self.addHost('client', cls=IPv4Host, mac="aa:bb:cc:dd:ee:11",
+                           ip='10.0.0.1/24', gw='10.0.0.100')
+#        client.sendCmd('arp -s 10.0.0.2 aa:bb:cc:dd:ee:22')
+#        client.setARP('10.0.0.2', 'aa:bb:cc:dd:ee:22')
+        server = self.addHost('server', cls=IPv4Host, mac="aa:bb:cc:dd:ee:22",
+                           ip='10.0.0.2/24', gw='10.0.0.100')
+#        server.sendCmd('arp -s 10.0.0.1 aa:bb:cc:dd:ee:11')
+#        server.setARP('10.0.0.1', 'aa:bb:cc:dd:ee:11')
+        self.addLink(client, switch1)  # port 1
+        self.addLink(server, switch1)  # port 2
+
+
+def main():
+    net = Mininet(topo=TutorialTopo(), controller=None)
+    net.start()
+    client = net.hosts[0]
+    server = net.hosts[1]
+    client.setARP('10.0.0.2', 'aa:bb:cc:dd:ee:22')
+    server.setARP('10.0.0.1', 'aa:bb:cc:dd:ee:11')
+    CLI(net)
+    net.stop()
+    print '#' * 80
+    print 'ATTENTION: Mininet was stopped! Perhaps accidentally?'
+    print 'No worries, it will restart automatically in a few seconds...'
+    print 'To access again the Mininet CLI, use `make mn-cli`'
+    print 'To detach from the CLI (without stopping), press Ctrl-D'
+    print 'To permanently quit Mininet, use `make stop`'
+    print '#' * 80
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description='Mininet topology script for 2x2 fabric with stratum_bmv2 and IPv4 hosts')
+    args = parser.parse_args()
+    setLogLevel('info')
+
+    main()
diff --git a/src/tests/p4/mininet/2switch1path.py b/src/tests/p4/mininet/2switch1path.py
new file mode 100755
index 0000000000000000000000000000000000000000..91db70052a95dea9b53d24dabb25b0feaa9935cf
--- /dev/null
+++ b/src/tests/p4/mininet/2switch1path.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+
+#  Copyright 2019-present Open Networking Foundation
+#
+#  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 argparse
+
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.net import Mininet
+from mininet.node import Host
+from mininet.topo import Topo
+from stratum import StratumBmv2Switch
+
+CPU_PORT = 255
+
+class IPv4Host(Host):
+    """Host that can be configured with an IPv4 gateway (default route).
+    """
+
+    def config(self, mac=None, ip=None, defaultRoute=None, lo='up', gw=None,
+               **_params):
+        super(IPv4Host, self).config(mac, ip, defaultRoute, lo, **_params)
+        self.cmd('ip -4 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -6 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -4 link set up %s' % self.defaultIntf())
+        self.cmd('ip -4 addr add %s dev %s' % (ip, self.defaultIntf()))
+        if gw:
+            self.cmd('ip -4 route add default via %s' % gw)
+        # Disable offload
+        for attr in ["rx", "tx", "sg"]:
+            cmd = "/sbin/ethtool --offload %s %s off" % (
+                self.defaultIntf(), attr)
+            self.cmd(cmd)
+
+        def updateIP():
+            return ip.split('/')[0]
+
+        self.defaultIntf().updateIP = updateIP
+
+class TutorialTopo(Topo):
+    """Basic Server-Client topology with IPv4 hosts"""
+
+    def __init__(self, *args, **kwargs):
+        Topo.__init__(self, *args, **kwargs)
+
+        # Spines
+        # gRPC port 50001
+        switch1 = self.addSwitch('switch1', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50002
+        switch2 = self.addSwitch('switch2', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+
+        # IPv4 hosts attached to switch 1
+        client = self.addHost('client', cls=IPv4Host, mac="aa:bb:cc:dd:ee:11",
+                           ip='10.0.0.1/24', gw='10.0.0.100')
+        server = self.addHost('server', cls=IPv4Host, mac="aa:bb:cc:dd:ee:22",
+                           ip='10.0.0.2/24', gw='10.0.0.100')
+        self.addLink(client, switch1)  # switch1: port 1
+        self.addLink(switch1, switch2)  # switch1: port 2 == switch2: port 1
+        self.addLink(switch2, server)  # switch2: port 2
+
+def main():
+    net = Mininet(topo=TutorialTopo(), controller=None)
+    net.start()
+    
+    client = net.hosts[0]
+    client.setARP('10.0.0.2', 'aa:bb:cc:dd:ee:22')
+    server = net.hosts[1]
+    server.setARP('10.0.0.1', 'aa:bb:cc:dd:ee:11')
+    
+    CLI(net)
+    net.stop()
+    print '#' * 80
+    print 'ATTENTION: Mininet was stopped! Perhaps accidentally?'
+    print 'No worries, it will restart automatically in a few seconds...'
+    print 'To access again the Mininet CLI, use `make mn-cli`'
+    print 'To detach from the CLI (without stopping), press Ctrl-D'
+    print 'To permanently quit Mininet, use `make stop`'
+    print '#' * 80
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description='Mininet topology script for 2x2 fabric with stratum_bmv2 and IPv4 hosts')
+    args = parser.parse_args()
+    setLogLevel('info')
+
+    main()
diff --git a/src/tests/p4/mininet/4switch2path.py b/src/tests/p4/mininet/4switch2path.py
new file mode 100755
index 0000000000000000000000000000000000000000..d8ad04b0193a2b9b610a4d5f828891e575d8efe8
--- /dev/null
+++ b/src/tests/p4/mininet/4switch2path.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+
+#  Copyright 2019-present Open Networking Foundation
+#
+#  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 argparse
+
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.net import Mininet
+from mininet.node import Host
+from mininet.topo import Topo
+from stratum import StratumBmv2Switch
+
+CPU_PORT = 255
+
+class IPv4Host(Host):
+    """Host that can be configured with an IPv4 gateway (default route).
+    """
+
+    def config(self, mac=None, ip=None, defaultRoute=None, lo='up', gw=None,
+               **_params):
+        super(IPv4Host, self).config(mac, ip, defaultRoute, lo, **_params)
+        self.cmd('ip -4 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -6 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -4 link set up %s' % self.defaultIntf())
+        self.cmd('ip -4 addr add %s dev %s' % (ip, self.defaultIntf()))
+        if gw:
+            self.cmd('ip -4 route add default via %s' % gw)
+        # Disable offload
+        for attr in ["rx", "tx", "sg"]:
+            cmd = "/sbin/ethtool --offload %s %s off" % (
+                self.defaultIntf(), attr)
+            self.cmd(cmd)
+
+        def updateIP():
+            return ip.split('/')[0]
+
+        self.defaultIntf().updateIP = updateIP
+
+class TutorialTopo(Topo):
+    """Basic Server-Client topology with IPv4 hosts"""
+
+    def __init__(self, *args, **kwargs):
+        Topo.__init__(self, *args, **kwargs)
+
+        # Switches
+        # gRPC port 50001
+        switch1 = self.addSwitch('switch1', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50002
+        switch2 = self.addSwitch('switch2', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50003
+        switch3 = self.addSwitch('switch3', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50004
+        switch4 = self.addSwitch('switch4', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+
+        # Hosts
+        client = self.addHost('client', cls=IPv4Host, mac="aa:bb:cc:dd:ee:11",
+                           ip='10.0.0.1/24', gw='10.0.0.100')
+        server = self.addHost('server', cls=IPv4Host, mac="aa:bb:cc:dd:ee:22",
+                           ip='10.0.0.2/24', gw='10.0.0.100')
+        
+        # Switch links
+        self.addLink(switch1, switch2)  # Switch1:port 1, Switch2:port 1
+        self.addLink(switch1, switch3)  # Switch1:port 2, Switch3:port 1
+        self.addLink(switch2, switch4)  # Switch2:port 2, Switch4:port 1
+        self.addLink(switch3, switch4)  # Switch3:port 2, Switch4:port 2
+        
+        # Host links
+        self.addLink(client, switch1)  # Switch 1: port 3
+        self.addLink(server, switch4)  # Switch 4: port 3
+
+def main():
+    net = Mininet(topo=TutorialTopo(), controller=None)
+    net.start()
+    
+    client = net.hosts[0]
+    client.setARP('10.0.0.2', 'aa:bb:cc:dd:ee:22')
+    server = net.hosts[1]
+    server.setARP('10.0.0.1', 'aa:bb:cc:dd:ee:11')
+    
+    CLI(net)
+    net.stop()
+    print '#' * 80
+    print 'ATTENTION: Mininet was stopped! Perhaps accidentally?'
+    print 'No worries, it will restart automatically in a few seconds...'
+    print 'To access again the Mininet CLI, use `make mn-cli`'
+    print 'To detach from the CLI (without stopping), press Ctrl-D'
+    print 'To permanently quit Mininet, use `make stop`'
+    print '#' * 80
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description='Mininet topology script for 2x2 fabric with stratum_bmv2 and IPv4 hosts')
+    args = parser.parse_args()
+    setLogLevel('info')
+
+    main()
diff --git a/src/tests/p4/mininet/6switch2path.py b/src/tests/p4/mininet/6switch2path.py
new file mode 100755
index 0000000000000000000000000000000000000000..8efb4b017f8c71e55884db8dd5f805820bb65fd6
--- /dev/null
+++ b/src/tests/p4/mininet/6switch2path.py
@@ -0,0 +1,118 @@
+#!/usr/bin/python
+
+#  Copyright 2019-present Open Networking Foundation
+#
+#  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 argparse
+
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.net import Mininet
+from mininet.node import Host
+from mininet.topo import Topo
+from stratum import StratumBmv2Switch
+
+CPU_PORT = 255
+
+class IPv4Host(Host):
+    """Host that can be configured with an IPv4 gateway (default route).
+    """
+
+    def config(self, mac=None, ip=None, defaultRoute=None, lo='up', gw=None,
+               **_params):
+        super(IPv4Host, self).config(mac, ip, defaultRoute, lo, **_params)
+        self.cmd('ip -4 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -6 addr flush dev %s' % self.defaultIntf())
+        self.cmd('ip -4 link set up %s' % self.defaultIntf())
+        self.cmd('ip -4 addr add %s dev %s' % (ip, self.defaultIntf()))
+        if gw:
+            self.cmd('ip -4 route add default via %s' % gw)
+        # Disable offload
+        for attr in ["rx", "tx", "sg"]:
+            cmd = "/sbin/ethtool --offload %s %s off" % (
+                self.defaultIntf(), attr)
+            self.cmd(cmd)
+
+        def updateIP():
+            return ip.split('/')[0]
+
+        self.defaultIntf().updateIP = updateIP
+
+class TutorialTopo(Topo):
+    """Basic Server-Client topology with IPv4 hosts"""
+
+    def __init__(self, *args, **kwargs):
+        Topo.__init__(self, *args, **kwargs)
+
+        # Switches
+        # gRPC port 50001
+        switch1 = self.addSwitch('switch1', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50002
+        switch2 = self.addSwitch('switch2', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50003
+        switch3 = self.addSwitch('switch3', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50004
+        switch4 = self.addSwitch('switch4', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50005
+        switch5 = self.addSwitch('switch5', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+        # gRPC port 50006
+        switch6 = self.addSwitch('switch6', cls=StratumBmv2Switch, cpuport=CPU_PORT)
+
+        # Hosts
+        client = self.addHost('client', cls=IPv4Host, mac="aa:bb:cc:dd:ee:11",
+                           ip='10.0.0.1/24', gw='10.0.0.100')
+        server = self.addHost('server', cls=IPv4Host, mac="aa:bb:cc:dd:ee:22",
+                           ip='10.0.0.2/24', gw='10.0.0.100')
+        
+        # Switch links
+        self.addLink(switch1, switch2)  # Switch1:port 1, Switch2:port 1
+        self.addLink(switch1, switch3)  # Switch1:port 2, Switch3:port 1
+
+        self.addLink(switch2, switch4)  # Switch2:port 2, Switch4:port 1
+        self.addLink(switch3, switch5)  # Switch3:port 2, Switch5:port 1
+
+        self.addLink(switch4, switch6)  # Switch4:port 2, Switch6:port 1
+        self.addLink(switch5, switch6)  # Switch5:port 2, Switch6:port 2
+        
+        # Host links
+        self.addLink(client, switch1)  # Switch1: port 3
+        self.addLink(server, switch6)  # Switch6: port 3
+
+def main():
+    net = Mininet(topo=TutorialTopo(), controller=None)
+    net.start()
+    
+    client = net.hosts[0]
+    client.setARP('10.0.0.2', 'aa:bb:cc:dd:ee:22')
+    server = net.hosts[1]
+    server.setARP('10.0.0.1', 'aa:bb:cc:dd:ee:11')
+    
+    CLI(net)
+    net.stop()
+    print '#' * 80
+    print 'ATTENTION: Mininet was stopped! Perhaps accidentally?'
+    print 'No worries, it will restart automatically in a few seconds...'
+    print 'To access again the Mininet CLI, use `make mn-cli`'
+    print 'To detach from the CLI (without stopping), press Ctrl-D'
+    print 'To permanently quit Mininet, use `make stop`'
+    print '#' * 80
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description='Mininet topology script for 2x2 fabric with stratum_bmv2 and IPv4 hosts')
+    args = parser.parse_args()
+    setLogLevel('info')
+
+    main()
diff --git a/src/tests/p4/p4/bmv2.json b/src/tests/p4/p4/bmv2.json
new file mode 100644
index 0000000000000000000000000000000000000000..f001eb52e90e875c4152f4d7820664402ac856c3
--- /dev/null
+++ b/src/tests/p4/p4/bmv2.json
@@ -0,0 +1,381 @@
+{
+  "header_types" : [
+    {
+      "name" : "scalars_0",
+      "id" : 0,
+      "fields" : [
+        ["local_metadata_t.is_multicast", 1, false],
+        ["_padding_0", 7, false]
+      ]
+    },
+    {
+      "name" : "standard_metadata",
+      "id" : 1,
+      "fields" : [
+        ["ingress_port", 9, false],
+        ["egress_spec", 9, false],
+        ["egress_port", 9, false],
+        ["clone_spec", 32, false],
+        ["instance_type", 32, false],
+        ["drop", 1, false],
+        ["recirculate_port", 16, 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],
+        ["lf_field_list", 32, false],
+        ["mcast_grp", 16, false],
+        ["resubmit_flag", 32, false],
+        ["egress_rid", 16, false],
+        ["recirculate_flag", 32, false],
+        ["checksum_error", 1, false],
+        ["parser_error", 32, false],
+        ["priority", 3, false],
+        ["_padding", 2, false]
+      ]
+    },
+    {
+      "name" : "ethernet_t",
+      "id" : 2,
+      "fields" : [
+        ["dst_addr", 48, false],
+        ["src_addr", 48, false],
+        ["ether_type", 16, false]
+      ]
+    }
+  ],
+  "headers" : [
+    {
+      "name" : "scalars",
+      "id" : 0,
+      "header_type" : "scalars_0",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "standard_metadata",
+      "id" : 1,
+      "header_type" : "standard_metadata",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "ethernet",
+      "id" : 2,
+      "header_type" : "ethernet_t",
+      "metadata" : false,
+      "pi_omit" : true
+    }
+  ],
+  "header_stacks" : [],
+  "header_union_types" : [],
+  "header_unions" : [],
+  "header_union_stacks" : [],
+  "field_lists" : [],
+  "errors" : [
+    ["NoError", 1],
+    ["PacketTooShort", 2],
+    ["NoMatch", 3],
+    ["StackOutOfBounds", 4],
+    ["HeaderTooShort", 5],
+    ["ParserTimeout", 6],
+    ["ParserInvalidArgument", 7]
+  ],
+  "enums" : [],
+  "parsers" : [
+    {
+      "name" : "parser",
+      "id" : 0,
+      "init_state" : "start",
+      "parse_states" : [
+        {
+          "name" : "start",
+          "id" : 0,
+          "parser_ops" : [
+            {
+              "parameters" : [
+                {
+                  "type" : "regular",
+                  "value" : "ethernet"
+                }
+              ],
+              "op" : "extract"
+            }
+          ],
+          "transitions" : [
+            {
+              "value" : "default",
+              "mask" : null,
+              "next_state" : null
+            }
+          ],
+          "transition_key" : []
+        }
+      ]
+    }
+  ],
+  "parse_vsets" : [],
+  "deparsers" : [
+    {
+      "name" : "deparser",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "p4src/main.p4",
+        "line" : 130,
+        "column" : 8,
+        "source_fragment" : "DeparserImpl"
+      },
+      "order" : ["ethernet"]
+    }
+  ],
+  "meter_arrays" : [],
+  "counter_arrays" : [],
+  "register_arrays" : [],
+  "calculations" : [],
+  "learn_lists" : [],
+  "actions" : [
+    {
+      "name" : "IngressPipeImpl.drop",
+      "id" : 0,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "mark_to_drop",
+          "parameters" : [
+            {
+              "type" : "header",
+              "value" : "standard_metadata"
+            }
+          ],
+          "source_info" : {
+            "filename" : "p4src/main.p4",
+            "line" : 77,
+            "column" : 8,
+            "source_fragment" : "mark_to_drop(standard_metadata)"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "IngressPipeImpl.set_egress_port",
+      "id" : 1,
+      "runtime_data" : [
+        {
+          "name" : "port",
+          "bitwidth" : 9
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "p4src/main.p4",
+            "line" : 81,
+            "column" : 8,
+            "source_fragment" : "standard_metadata.egress_spec = port"
+          }
+        }
+      ]
+    },
+    {
+      "name" : "IngressPipeImpl.set_multicast_group",
+      "id" : 2,
+      "runtime_data" : [
+        {
+          "name" : "gid",
+          "bitwidth" : 16
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "mcast_grp"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "p4src/main.p4",
+            "line" : 89,
+            "column" : 8,
+            "source_fragment" : "standard_metadata.mcast_grp = gid"
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "local_metadata_t.is_multicast"]
+            },
+            {
+              "type" : "expression",
+              "value" : {
+                "type" : "expression",
+                "value" : {
+                  "op" : "b2d",
+                  "left" : null,
+                  "right" : {
+                    "type" : "bool",
+                    "value" : true
+                  }
+                }
+              }
+            }
+          ],
+          "source_info" : {
+            "filename" : "p4src/main.p4",
+            "line" : 90,
+            "column" : 8,
+            "source_fragment" : "local_metadata.is_multicast = true"
+          }
+        }
+      ]
+    }
+  ],
+  "pipelines" : [
+    {
+      "name" : "ingress",
+      "id" : 0,
+      "source_info" : {
+        "filename" : "p4src/main.p4",
+        "line" : 71,
+        "column" : 8,
+        "source_fragment" : "IngressPipeImpl"
+      },
+      "init_table" : "IngressPipeImpl.l2_exact_table",
+      "tables" : [
+        {
+          "name" : "IngressPipeImpl.l2_exact_table",
+          "id" : 0,
+          "source_info" : {
+            "filename" : "p4src/main.p4",
+            "line" : 95,
+            "column" : 10,
+            "source_fragment" : "l2_exact_table"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "name" : "standard_metadata.ingress_port",
+              "target" : ["standard_metadata", "ingress_port"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [1, 2, 0],
+          "actions" : ["IngressPipeImpl.set_egress_port", "IngressPipeImpl.set_multicast_group", "IngressPipeImpl.drop"],
+          "base_default_next" : null,
+          "next_tables" : {
+            "IngressPipeImpl.set_egress_port" : null,
+            "IngressPipeImpl.set_multicast_group" : null,
+            "IngressPipeImpl.drop" : null
+          },
+          "default_entry" : {
+            "action_id" : 0,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        }
+      ],
+      "action_profiles" : [],
+      "conditionals" : []
+    },
+    {
+      "name" : "egress",
+      "id" : 1,
+      "source_info" : {
+        "filename" : "p4src/main.p4",
+        "line" : 116,
+        "column" : 8,
+        "source_fragment" : "EgressPipeImpl"
+      },
+      "init_table" : null,
+      "tables" : [],
+      "action_profiles" : [],
+      "conditionals" : []
+    }
+  ],
+  "checksums" : [],
+  "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.lf_field_list",
+      ["standard_metadata", "lf_field_list"]
+    ],
+    [
+      "intrinsic_metadata.mcast_grp",
+      ["standard_metadata", "mcast_grp"]
+    ],
+    [
+      "intrinsic_metadata.resubmit_flag",
+      ["standard_metadata", "resubmit_flag"]
+    ],
+    [
+      "intrinsic_metadata.egress_rid",
+      ["standard_metadata", "egress_rid"]
+    ],
+    [
+      "intrinsic_metadata.recirculate_flag",
+      ["standard_metadata", "recirculate_flag"]
+    ],
+    [
+      "intrinsic_metadata.priority",
+      ["standard_metadata", "priority"]
+    ]
+  ],
+  "program" : "p4src/main.p4",
+  "__meta__" : {
+    "version" : [2, 18],
+    "compiler" : "https://github.com/p4lang/p4c"
+  }
+}
\ No newline at end of file
diff --git a/src/tests/p4/p4/main.p4 b/src/tests/p4/p4/main.p4
new file mode 100644
index 0000000000000000000000000000000000000000..843eb0d580e362e74b25c768b1b01e750138637a
--- /dev/null
+++ b/src/tests/p4/p4/main.p4
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.
+ */
+
+
+#include <core.p4>
+#include <v1model.p4>
+
+typedef bit<9>   port_num_t;
+typedef bit<48>  mac_addr_t;
+typedef bit<16>  mcast_group_id_t;
+
+//------------------------------------------------------------------------------
+// HEADER DEFINITIONS
+//------------------------------------------------------------------------------
+
+header ethernet_t {
+    mac_addr_t  dst_addr;
+    mac_addr_t  src_addr;
+    bit<16>     ether_type;
+}
+
+struct parsed_headers_t {
+    ethernet_t  ethernet;
+}
+
+struct local_metadata_t {
+    bool        is_multicast;
+}
+
+
+//------------------------------------------------------------------------------
+// INGRESS PIPELINE
+//------------------------------------------------------------------------------
+
+parser ParserImpl (packet_in packet,
+                   out parsed_headers_t hdr,
+                   inout local_metadata_t local_metadata,
+                   inout standard_metadata_t standard_metadata)
+{
+    state start {
+      transition parse_ethernet;
+    }
+
+    state parse_ethernet {
+        packet.extract(hdr.ethernet);
+        transition accept;
+    }
+}
+
+
+control VerifyChecksumImpl(inout parsed_headers_t hdr,
+                           inout local_metadata_t meta)
+{
+    apply { /* EMPTY */ }
+}
+
+
+control IngressPipeImpl (inout parsed_headers_t    hdr,
+                         inout local_metadata_t    local_metadata,
+                         inout standard_metadata_t standard_metadata) {
+
+    // Drop action shared by many tables.
+    action drop() {
+        mark_to_drop(standard_metadata);
+    }
+
+    action set_egress_port(port_num_t port) {
+        standard_metadata.egress_spec = port;
+    }
+
+    action set_multicast_group(mcast_group_id_t gid) {
+        // gid will be used by the Packet Replication Engine (PRE) in the
+        // Traffic Manager--located right after the ingress pipeline, to
+        // replicate a packet to multiple egress ports, specified by the control
+        // plane by means of P4Runtime MulticastGroupEntry messages.
+        standard_metadata.mcast_grp = gid;
+        local_metadata.is_multicast = true;
+    }
+
+    // --- l2_exact_table ------------------
+
+    table l2_exact_table {
+        key = {
+            standard_metadata.ingress_port: exact;
+        }
+        actions = {
+            set_egress_port;
+            set_multicast_group;
+            @defaultonly drop;
+        }
+        const default_action = drop;
+    }
+
+    apply {
+        l2_exact_table.apply();
+    }
+}
+
+//------------------------------------------------------------------------------
+// EGRESS PIPELINE
+//------------------------------------------------------------------------------
+
+control EgressPipeImpl (inout parsed_headers_t hdr,
+                        inout local_metadata_t local_metadata,
+                        inout standard_metadata_t standard_metadata) {
+    apply { /* EMPTY */ }
+}
+
+
+control ComputeChecksumImpl(inout parsed_headers_t hdr,
+                            inout local_metadata_t local_metadata)
+{
+    apply { /* EMPTY */ }
+}
+
+
+control DeparserImpl(packet_out packet, in parsed_headers_t hdr) {
+    apply {
+        packet.emit(hdr.ethernet);
+    }
+}
+
+
+V1Switch(
+    ParserImpl(),
+    VerifyChecksumImpl(),
+    IngressPipeImpl(),
+    EgressPipeImpl(),
+    ComputeChecksumImpl(),
+    DeparserImpl()
+) main;
diff --git a/src/tests/p4/p4/p4info.txt b/src/tests/p4/p4/p4info.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0b58e740864b72e6ca87582431cd7bd57894d0dd
--- /dev/null
+++ b/src/tests/p4/p4/p4info.txt
@@ -0,0 +1,62 @@
+pkg_info {
+  arch: "v1model"
+}
+tables {
+  preamble {
+    id: 33605373
+    name: "IngressPipeImpl.l2_exact_table"
+    alias: "l2_exact_table"
+  }
+  match_fields {
+    id: 1
+    name: "standard_metadata.ingress_port"
+    bitwidth: 9
+    match_type: EXACT
+  }
+  action_refs {
+    id: 16812802
+  }
+  action_refs {
+    id: 16841371
+  }
+  action_refs {
+    id: 16796182
+    annotations: "@defaultonly"
+    scope: DEFAULT_ONLY
+  }
+  const_default_action_id: 16796182
+  size: 1024
+}
+actions {
+  preamble {
+    id: 16796182
+    name: "IngressPipeImpl.drop"
+    alias: "drop"
+  }
+}
+actions {
+  preamble {
+    id: 16812802
+    name: "IngressPipeImpl.set_egress_port"
+    alias: "set_egress_port"
+  }
+  params {
+    id: 1
+    name: "port"
+    bitwidth: 9
+  }
+}
+actions {
+  preamble {
+    id: 16841371
+    name: "IngressPipeImpl.set_multicast_group"
+    alias: "set_multicast_group"
+  }
+  params {
+    id: 1
+    name: "gid"
+    bitwidth: 16
+  }
+}
+type_info {
+}
diff --git a/src/tests/p4/run_test_01_bootstrap.sh b/src/tests/p4/run_test_01_bootstrap.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a58fd50a762b99f7c8043931f89e087e8fbda6c3
--- /dev/null
+++ b/src/tests/p4/run_test_01_bootstrap.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+python -m pytest --verbose src/tests/p4/tests/test_functional_bootstrap.py
+
diff --git a/src/tests/p4/run_test_02_create_service.sh b/src/tests/p4/run_test_02_create_service.sh
new file mode 100755
index 0000000000000000000000000000000000000000..203c0d5a6dcac35c5355a3d66da0794aa30ad6cc
--- /dev/null
+++ b/src/tests/p4/run_test_02_create_service.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+python -m pytest --verbose src/tests/p4/tests/test_functional_create_service.py
diff --git a/src/tests/p4/run_test_03_delete_service.sh b/src/tests/p4/run_test_03_delete_service.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8ac52c6f647b866ada0887f8027d2a92dd230700
--- /dev/null
+++ b/src/tests/p4/run_test_03_delete_service.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+python -m pytest --verbose src/tests/p4/tests/test_functional_delete_service.py
diff --git a/src/tests/p4/run_test_04_cleanup.sh b/src/tests/p4/run_test_04_cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..64cd60f95dbe092c9be125b53a89a6536b6860e0
--- /dev/null
+++ b/src/tests/p4/run_test_04_cleanup.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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
+python -m pytest --verbose src/tests/p4/tests/test_functional_cleanup.py
diff --git a/src/tests/p4/setup.sh b/src/tests/p4/setup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3ff7e0393d0cd87491bf4ef1db9021351502f5a8
--- /dev/null
+++ b/src/tests/p4/setup.sh
@@ -0,0 +1,8 @@
+#! /bin/bash
+
+export POD_NAME=$(kubectl get pods -n=tfs | grep device | awk '{print $1}')
+
+kubectl exec ${POD_NAME} -n=tfs -- mkdir /root/p4
+
+kubectl cp src/tests/p4/p4/p4info.txt tfs/${POD_NAME}:/root/p4
+kubectl cp src/tests/p4/p4/bmv2.json tfs/${POD_NAME}:/root/p4
diff --git a/src/tests/p4/tests/.gitignore b/src/tests/p4/tests/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..76cb708d1b532c9b69166e55f36bcb912fd5e370
--- /dev/null
+++ b/src/tests/p4/tests/.gitignore
@@ -0,0 +1,2 @@
+# Add here your files containing confidential testbed details such as IP addresses, ports, usernames, passwords, etc.
+Credentials.py
diff --git a/src/tests/p4/tests/BuildDescriptors.py b/src/tests/p4/tests/BuildDescriptors.py
new file mode 100644
index 0000000000000000000000000000000000000000..5c5419190487eb5089e4a30f523dca43fa3870f2
--- /dev/null
+++ b/src/tests/p4/tests/BuildDescriptors.py
@@ -0,0 +1,35 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import copy, json, sys
+from .Objects import CONTEXTS, DEVICES, LINKS, TOPOLOGIES
+
+def main():
+    with open('tests/ofc22/descriptors_emulated.json', 'w', encoding='UTF-8') as f:
+        devices = []
+        for device,connect_rules in DEVICES:
+            device = copy.deepcopy(device)
+            device['device_config']['config_rules'].extend(connect_rules)
+            devices.append(device)
+
+        f.write(json.dumps({
+            'contexts': CONTEXTS,
+            'topologies': TOPOLOGIES,
+            'devices': devices,
+            'links': LINKS
+        }))
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/src/tests/p4/tests/LoadDescriptors.py b/src/tests/p4/tests/LoadDescriptors.py
new file mode 100644
index 0000000000000000000000000000000000000000..33bc699af933601e4c6d4b8dbc7b0c51206241ef
--- /dev/null
+++ b/src/tests/p4/tests/LoadDescriptors.py
@@ -0,0 +1,40 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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, sys
+from common.Settings import get_setting
+from context.client.ContextClient import ContextClient
+from common.proto.context_pb2 import Context, Device, Link, Topology
+from device.client.DeviceClient import DeviceClient
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+def main():
+    context_client = ContextClient(
+        get_setting('CONTEXTSERVICE_SERVICE_HOST'), get_setting('CONTEXTSERVICE_SERVICE_PORT_GRPC'))
+    device_client  = DeviceClient(
+        get_setting('DEVICESERVICE_SERVICE_HOST'), get_setting('DEVICESERVICE_SERVICE_PORT_GRPC'))
+
+    with open('tests/ofc22/descriptors.json', 'r', encoding='UTF-8') as f:
+        descriptors = json.loads(f.read())
+
+    for context  in descriptors['contexts'  ]: context_client.SetContext (Context (**context ))
+    for topology in descriptors['topologies']: context_client.SetTopology(Topology(**topology))
+    for device   in descriptors['devices'   ]: device_client .AddDevice  (Device  (**device  ))
+    for link     in descriptors['links'     ]: context_client.SetLink    (Link    (**link    ))
+    return 0
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/src/tests/p4/tests/Objects.py b/src/tests/p4/tests/Objects.py
new file mode 100644
index 0000000000000000000000000000000000000000..0473207a87ba9ea5c74b45d983db185f8c541cbf
--- /dev/null
+++ b/src/tests/p4/tests/Objects.py
@@ -0,0 +1,345 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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 typing import Dict, List, Tuple
+from common.Constants import DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID
+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
+from common.tools.object_factory.Link import get_link_uuid, json_link, json_link_id
+from common.tools.object_factory.Topology import json_topology, json_topology_id
+from common.proto.kpi_sample_types_pb2 import KpiSampleType
+
+# ----- Context --------------------------------------------------------------------------------------------------------
+CONTEXT_ID = json_context_id(DEFAULT_CONTEXT_UUID)
+CONTEXT    = json_context(DEFAULT_CONTEXT_UUID)
+
+# ----- Topology -------------------------------------------------------------------------------------------------------
+TOPOLOGY_ID = json_topology_id(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
+TOPOLOGY    = json_topology(DEFAULT_TOPOLOGY_UUID, context_id=CONTEXT_ID)
+
+# ----- Monitoring Samples ---------------------------------------------------------------------------------------------
+PACKET_PORT_SAMPLE_TYPES = [
+    KpiSampleType.KPISAMPLETYPE_PACKETS_TRANSMITTED,
+    KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED,
+    KpiSampleType.KPISAMPLETYPE_BYTES_TRANSMITTED,
+    KpiSampleType.KPISAMPLETYPE_BYTES_RECEIVED,
+]
+
+# ----- Device Credentials and Settings --------------------------------------------------------------------------------
+
+
+# ----- Devices --------------------------------------------------------------------------------------------------------
+
+CUR_PATH = os.path.dirname(os.path.abspath(__file__))
+
+DEVICE_SW1_UUID             = 'SW1'
+DEVICE_SW1_TIMEOUT          = 60
+DEVICE_SW1_ID               = json_device_id(DEVICE_SW1_UUID)
+DEVICE_SW1                  = json_device_p4_disabled(DEVICE_SW1_UUID)
+
+DEVICE_SW1_DPID             = 1
+DEVICE_SW1_NAME             = DEVICE_SW1_UUID
+DEVICE_SW1_IP_ADDR          = '10.0.2.10'
+DEVICE_SW1_PORT             = '50001'
+DEVICE_SW1_VENDOR           = 'Open Networking Foundation'
+DEVICE_SW1_HW_VER           = 'BMv2 simple_switch'
+DEVICE_SW1_SW_VER           = 'Stratum'
+
+DEVICE_SW1_BIN_PATH         = '/root/p4/bmv2.json'
+DEVICE_SW1_INFO_PATH        = '/root/p4/p4info.txt'
+
+DEVICE_SW1_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', []), ('3', 'port', [])]
+DEVICE_SW1_ENDPOINTS        = json_endpoints(DEVICE_SW1_ID, DEVICE_SW1_ENDPOINT_DEFS)
+DEVICE_SW1_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW1_ID, DEVICE_SW1_ENDPOINT_DEFS)
+ENDPOINT_ID_SW1_1           = DEVICE_SW1_ENDPOINTS[0]['endpoint_id']
+ENDPOINT_ID_SW1_2           = DEVICE_SW1_ENDPOINTS[1]['endpoint_id']
+ENDPOINT_ID_SW1_3           = DEVICE_SW1_ENDPOINTS[2]['endpoint_id']
+
+DEVICE_SW1_CONNECT_RULES    = json_device_connect_rules(
+    DEVICE_SW1_IP_ADDR,
+    DEVICE_SW1_PORT,
+    {
+        'id':       DEVICE_SW1_DPID,
+        'name':     DEVICE_SW1_NAME,
+        'vendor':   DEVICE_SW1_VENDOR,
+        'hw_ver':   DEVICE_SW1_HW_VER,
+        'sw_ver':   DEVICE_SW1_SW_VER,
+        'timeout':  DEVICE_SW1_TIMEOUT,
+        'p4bin':    DEVICE_SW1_BIN_PATH,
+        'p4info':   DEVICE_SW1_INFO_PATH
+    }
+)
+
+DEVICE_SW2_UUID             = 'SW2'
+DEVICE_SW2_TIMEOUT          = 60
+DEVICE_SW2_ID               = json_device_id(DEVICE_SW2_UUID)
+DEVICE_SW2                  = json_device_p4_disabled(DEVICE_SW2_UUID)
+
+DEVICE_SW2_DPID             = 1
+DEVICE_SW2_NAME             = DEVICE_SW2_UUID
+DEVICE_SW2_IP_ADDR          = '10.0.2.10'
+DEVICE_SW2_PORT             = '50002'
+DEVICE_SW2_VENDOR           = 'Open Networking Foundation'
+DEVICE_SW2_HW_VER           = 'BMv2 simple_switch'
+DEVICE_SW2_SW_VER           = 'Stratum'
+
+DEVICE_SW2_BIN_PATH         = '/root/p4/bmv2.json'
+DEVICE_SW2_INFO_PATH        = '/root/p4/p4info.txt'
+
+DEVICE_SW2_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW2_ENDPOINTS        = json_endpoints(DEVICE_SW2_ID, DEVICE_SW2_ENDPOINT_DEFS)
+DEVICE_SW2_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW2_ID, DEVICE_SW2_ENDPOINT_DEFS)
+ENDPOINT_ID_SW2_1           = DEVICE_SW2_ENDPOINTS[0]['endpoint_id']
+ENDPOINT_ID_SW2_2           = DEVICE_SW2_ENDPOINTS[1]['endpoint_id']
+
+DEVICE_SW2_CONNECT_RULES    = json_device_connect_rules(
+    DEVICE_SW2_IP_ADDR,
+    DEVICE_SW2_PORT,
+    {
+        'id':       DEVICE_SW2_DPID,
+        'name':     DEVICE_SW2_NAME,
+        'vendor':   DEVICE_SW2_VENDOR,
+        'hw_ver':   DEVICE_SW2_HW_VER,
+        'sw_ver':   DEVICE_SW2_SW_VER,
+        'timeout':  DEVICE_SW2_TIMEOUT,
+        'p4bin':    DEVICE_SW2_BIN_PATH,
+        'p4info':   DEVICE_SW2_INFO_PATH
+    }
+)
+
+DEVICE_SW3_UUID             = 'SW3'
+DEVICE_SW3_TIMEOUT          = 60
+DEVICE_SW3_ID               = json_device_id(DEVICE_SW3_UUID)
+DEVICE_SW3                  = json_device_p4_disabled(DEVICE_SW3_UUID)
+
+DEVICE_SW3_DPID             = 1
+DEVICE_SW3_NAME             = DEVICE_SW3_UUID
+DEVICE_SW3_IP_ADDR          = '10.0.2.10'
+DEVICE_SW3_PORT             = '50003'
+DEVICE_SW3_VENDOR           = 'Open Networking Foundation'
+DEVICE_SW3_HW_VER           = 'BMv2 simple_switch'
+DEVICE_SW3_SW_VER           = 'Stratum'
+
+DEVICE_SW3_BIN_PATH         = '/root/p4/bmv2.json'
+DEVICE_SW3_INFO_PATH        = '/root/p4/p4info.txt'
+
+DEVICE_SW3_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW3_ENDPOINTS        = json_endpoints(DEVICE_SW3_ID, DEVICE_SW3_ENDPOINT_DEFS)
+DEVICE_SW3_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW3_ID, DEVICE_SW3_ENDPOINT_DEFS)
+ENDPOINT_ID_SW3_1           = DEVICE_SW3_ENDPOINTS[0]['endpoint_id']
+ENDPOINT_ID_SW3_2           = DEVICE_SW3_ENDPOINTS[1]['endpoint_id']
+
+DEVICE_SW3_CONNECT_RULES    = json_device_connect_rules(
+    DEVICE_SW3_IP_ADDR,
+    DEVICE_SW3_PORT,
+    {
+        'id':       DEVICE_SW3_DPID,
+        'name':     DEVICE_SW3_NAME,
+        'vendor':   DEVICE_SW3_VENDOR,
+        'hw_ver':   DEVICE_SW3_HW_VER,
+        'sw_ver':   DEVICE_SW3_SW_VER,
+        'timeout':  DEVICE_SW3_TIMEOUT,
+        'p4bin':    DEVICE_SW3_BIN_PATH,
+        'p4info':   DEVICE_SW3_INFO_PATH
+    }
+)
+
+DEVICE_SW4_UUID             = 'SW4'
+DEVICE_SW4_TIMEOUT          = 60
+DEVICE_SW4_ID               = json_device_id(DEVICE_SW4_UUID)
+DEVICE_SW4                  = json_device_p4_disabled(DEVICE_SW4_UUID)
+
+DEVICE_SW4_DPID             = 1
+DEVICE_SW4_NAME             = DEVICE_SW4_UUID
+DEVICE_SW4_IP_ADDR          = '10.0.2.10'
+DEVICE_SW4_PORT             = '50004'
+DEVICE_SW4_VENDOR           = 'Open Networking Foundation'
+DEVICE_SW4_HW_VER           = 'BMv2 simple_switch'
+DEVICE_SW4_SW_VER           = 'Stratum'
+
+DEVICE_SW4_BIN_PATH         = '/root/p4/bmv2.json'
+DEVICE_SW4_INFO_PATH        = '/root/p4/p4info.txt'
+
+DEVICE_SW4_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW4_ENDPOINTS        = json_endpoints(DEVICE_SW4_ID, DEVICE_SW4_ENDPOINT_DEFS)
+DEVICE_SW4_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW4_ID, DEVICE_SW4_ENDPOINT_DEFS)
+ENDPOINT_ID_SW4_1           = DEVICE_SW4_ENDPOINTS[0]['endpoint_id']
+ENDPOINT_ID_SW4_2           = DEVICE_SW4_ENDPOINTS[1]['endpoint_id']
+
+DEVICE_SW4_CONNECT_RULES    = json_device_connect_rules(
+    DEVICE_SW4_IP_ADDR,
+    DEVICE_SW4_PORT,
+    {
+        'id':       DEVICE_SW4_DPID,
+        'name':     DEVICE_SW4_NAME,
+        'vendor':   DEVICE_SW4_VENDOR,
+        'hw_ver':   DEVICE_SW4_HW_VER,
+        'sw_ver':   DEVICE_SW4_SW_VER,
+        'timeout':  DEVICE_SW4_TIMEOUT,
+        'p4bin':    DEVICE_SW4_BIN_PATH,
+        'p4info':   DEVICE_SW4_INFO_PATH
+    }
+)
+
+DEVICE_SW5_UUID             = 'SW5'
+DEVICE_SW5_TIMEOUT          = 60
+DEVICE_SW5_ID               = json_device_id(DEVICE_SW5_UUID)
+DEVICE_SW5                  = json_device_p4_disabled(DEVICE_SW5_UUID)
+
+DEVICE_SW5_DPID             = 1
+DEVICE_SW5_NAME             = DEVICE_SW5_UUID
+DEVICE_SW5_IP_ADDR          = '10.0.2.10'
+DEVICE_SW5_PORT             = '50005'
+DEVICE_SW5_VENDOR           = 'Open Networking Foundation'
+DEVICE_SW5_HW_VER           = 'BMv2 simple_switch'
+DEVICE_SW5_SW_VER           = 'Stratum'
+
+DEVICE_SW5_BIN_PATH         = '/root/p4/bmv2.json'
+DEVICE_SW5_INFO_PATH        = '/root/p4/p4info.txt'
+
+DEVICE_SW5_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', [])]
+DEVICE_SW5_ENDPOINTS        = json_endpoints(DEVICE_SW5_ID, DEVICE_SW5_ENDPOINT_DEFS)
+DEVICE_SW5_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW5_ID, DEVICE_SW5_ENDPOINT_DEFS)
+ENDPOINT_ID_SW5_1           = DEVICE_SW5_ENDPOINTS[0]['endpoint_id']
+ENDPOINT_ID_SW5_2           = DEVICE_SW5_ENDPOINTS[1]['endpoint_id']
+
+DEVICE_SW5_CONNECT_RULES    = json_device_connect_rules(
+    DEVICE_SW5_IP_ADDR,
+    DEVICE_SW5_PORT,
+    {
+        'id':       DEVICE_SW5_DPID,
+        'name':     DEVICE_SW5_NAME,
+        'vendor':   DEVICE_SW5_VENDOR,
+        'hw_ver':   DEVICE_SW5_HW_VER,
+        'sw_ver':   DEVICE_SW5_SW_VER,
+        'timeout':  DEVICE_SW5_TIMEOUT,
+        'p4bin':    DEVICE_SW5_BIN_PATH,
+        'p4info':   DEVICE_SW5_INFO_PATH
+    }
+)
+
+DEVICE_SW6_UUID             = 'SW6'
+DEVICE_SW6_TIMEOUT          = 60
+DEVICE_SW6_ID               = json_device_id(DEVICE_SW6_UUID)
+DEVICE_SW6                  = json_device_p4_disabled(DEVICE_SW6_UUID)
+
+DEVICE_SW6_DPID             = 1
+DEVICE_SW6_NAME             = DEVICE_SW6_UUID
+DEVICE_SW6_IP_ADDR          = '10.0.2.10'
+DEVICE_SW6_PORT             = '50006'
+DEVICE_SW6_VENDOR           = 'Open Networking Foundation'
+DEVICE_SW6_HW_VER           = 'BMv2 simple_switch'
+DEVICE_SW6_SW_VER           = 'Stratum'
+
+DEVICE_SW6_BIN_PATH         = '/root/p4/bmv2.json'
+DEVICE_SW6_INFO_PATH        = '/root/p4/p4info.txt'
+
+DEVICE_SW6_ENDPOINT_DEFS    = [('1', 'port', []), ('2', 'port', []), ('3', 'port', [])]
+DEVICE_SW6_ENDPOINTS        = json_endpoints(DEVICE_SW6_ID, DEVICE_SW6_ENDPOINT_DEFS)
+DEVICE_SW6_ENDPOINT_IDS     = json_endpoint_ids(DEVICE_SW6_ID, DEVICE_SW6_ENDPOINT_DEFS)
+ENDPOINT_ID_SW6_1           = DEVICE_SW6_ENDPOINTS[0]['endpoint_id']
+ENDPOINT_ID_SW6_2           = DEVICE_SW6_ENDPOINTS[1]['endpoint_id']
+ENDPOINT_ID_SW6_3           = DEVICE_SW6_ENDPOINTS[2]['endpoint_id']
+
+DEVICE_SW6_CONNECT_RULES    = json_device_connect_rules(
+    DEVICE_SW6_IP_ADDR,
+    DEVICE_SW6_PORT,
+    {
+        'id':       DEVICE_SW6_DPID,
+        'name':     DEVICE_SW6_NAME,
+        'vendor':   DEVICE_SW6_VENDOR,
+        'hw_ver':   DEVICE_SW6_HW_VER,
+        'sw_ver':   DEVICE_SW6_SW_VER,
+        'timeout':  DEVICE_SW6_TIMEOUT,
+        'p4bin':    DEVICE_SW6_BIN_PATH,
+        'p4info':   DEVICE_SW6_INFO_PATH
+    }
+)
+
+# ----- Links ----------------------------------------------------------------------------------------------------------
+LINK_SW1_SW2_UUID           = get_link_uuid(ENDPOINT_ID_SW1_1, ENDPOINT_ID_SW2_1)
+LINK_SW1_SW2_ID             = json_link_id(LINK_SW1_SW2_UUID)
+LINK_SW1_SW2                = json_link(LINK_SW1_SW2_UUID, [ENDPOINT_ID_SW1_1, ENDPOINT_ID_SW2_1])
+
+LINK_SW1_SW3_UUID           = get_link_uuid(ENDPOINT_ID_SW1_2, ENDPOINT_ID_SW3_1)
+LINK_SW1_SW3_ID             = json_link_id(LINK_SW1_SW3_UUID)
+LINK_SW1_SW3                = json_link(LINK_SW1_SW3_UUID, [ENDPOINT_ID_SW1_2, ENDPOINT_ID_SW3_1])
+
+LINK_SW2_SW4_UUID           = get_link_uuid(ENDPOINT_ID_SW2_2, ENDPOINT_ID_SW4_1)
+LINK_SW2_SW4_ID             = json_link_id(LINK_SW2_SW4_UUID)
+LINK_SW2_SW4                = json_link(LINK_SW2_SW4_UUID, [ENDPOINT_ID_SW2_2, ENDPOINT_ID_SW4_1])
+
+LINK_SW3_SW5_UUID           = get_link_uuid(ENDPOINT_ID_SW3_2, ENDPOINT_ID_SW5_1)
+LINK_SW3_SW5_ID             = json_link_id(LINK_SW3_SW5_UUID)
+LINK_SW3_SW5                = json_link(LINK_SW3_SW5_UUID, [ENDPOINT_ID_SW3_2, ENDPOINT_ID_SW5_1])
+
+LINK_SW4_SW6_UUID           = get_link_uuid(ENDPOINT_ID_SW4_2, ENDPOINT_ID_SW6_1)
+LINK_SW4_SW6_ID             = json_link_id(LINK_SW4_SW6_UUID)
+LINK_SW4_SW6                = json_link(LINK_SW4_SW6_UUID, [ENDPOINT_ID_SW4_2, ENDPOINT_ID_SW6_1])
+
+LINK_SW5_SW6_UUID           = get_link_uuid(ENDPOINT_ID_SW5_2, ENDPOINT_ID_SW6_2)
+LINK_SW5_SW6_ID             = json_link_id(LINK_SW5_SW6_UUID)
+LINK_SW5_SW6                = json_link(LINK_SW5_SW6_UUID, [ENDPOINT_ID_SW5_2, ENDPOINT_ID_SW6_2])
+
+# ----- Service ----------------------------------------------------------------------------------------------------------
+
+#SERVICE_SW1_UUID        = get_service_uuid(ENDPOINT_ID_SW1_1, ENDPOINT_ID_SW1_2)
+#SERVICE_SW1             = json_service_p4_planned(SERVICE_SW1_UUID)
+
+#SERVICE_SW2_UUID        = get_service_uuid(ENDPOINT_ID_SW2_1, ENDPOINT_ID_SW2_2)
+#SERVICE_SW2             = json_service_p4_planned(SERVICE_SW2_UUID)
+
+SERVICE_SW1_SW6_UUID            = get_service_uuid(ENDPOINT_ID_SW1_3, ENDPOINT_ID_SW6_3)
+SERVICE_SW1_SW6                 = json_service_p4_planned(SERVICE_SW1_SW6_UUID)
+SERVICE_SW1_SW6_ENDPOINT_IDS    = [DEVICE_SW1_ENDPOINT_IDS[2], DEVICE_SW6_ENDPOINT_IDS[2]]
+
+# ----- Object Collections ---------------------------------------------------------------------------------------------
+
+CONTEXTS = [CONTEXT]
+TOPOLOGIES = [TOPOLOGY]
+
+DEVICES = [
+    (DEVICE_SW1, DEVICE_SW1_CONNECT_RULES, DEVICE_SW1_ENDPOINTS),
+    (DEVICE_SW2, DEVICE_SW2_CONNECT_RULES, DEVICE_SW2_ENDPOINTS),
+    (DEVICE_SW3, DEVICE_SW3_CONNECT_RULES, DEVICE_SW3_ENDPOINTS),
+    (DEVICE_SW4, DEVICE_SW4_CONNECT_RULES, DEVICE_SW4_ENDPOINTS),
+    (DEVICE_SW5, DEVICE_SW5_CONNECT_RULES, DEVICE_SW5_ENDPOINTS),
+    (DEVICE_SW6, DEVICE_SW6_CONNECT_RULES, DEVICE_SW6_ENDPOINTS),
+]
+
+LINKS = [
+    LINK_SW1_SW2,
+    LINK_SW1_SW3,
+
+    LINK_SW2_SW4,
+    LINK_SW3_SW5,
+
+    LINK_SW4_SW6,
+    LINK_SW5_SW6
+    ] 
+
+#SERVICES = [(SERVICE_SW1, DEVICE_SW1_ENDPOINT_IDS), (SERVICE_SW2, DEVICE_SW2_ENDPOINT_IDS)]
+
+#SERVICE_SW1_SW2_ENDPOINT_IDS = DEVICE_SW1_ENDPOINT_IDS + DEVICE_SW2_ENDPOINT_IDS
+
+SERVICES = [(SERVICE_SW1_SW6, SERVICE_SW1_SW6_ENDPOINT_IDS)]
\ No newline at end of file
diff --git a/src/tests/p4/tests/__init__.py b/src/tests/p4/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..70a33251242c51f49140e596b8208a19dd5245f7
--- /dev/null
+++ b/src/tests/p4/tests/__init__.py
@@ -0,0 +1,14 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# 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/tests/test_functional_bootstrap.py b/src/tests/p4/tests/test_functional_bootstrap.py
new file mode 100644
index 0000000000000000000000000000000000000000..793d80c7bf97e9f01a7ba968c8ea1c654d1f4a93
--- /dev/null
+++ b/src/tests/p4/tests/test_functional_bootstrap.py
@@ -0,0 +1,107 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import copy, 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 device.client.DeviceClient import DeviceClient
+from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES
+
+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'))
+    yield _client
+    _client.close()
+
+
+@pytest.fixture(scope='session')
+def device_client():
+    _client = DeviceClient(get_setting('DEVICESERVICE_SERVICE_HOST'), get_setting('DEVICESERVICE_SERVICE_PORT_GRPC'))
+    yield _client
+    _client.close()
+
+def test_prepare_scenario(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+
+    # ----- Create Contexts and Topologies -----------------------------------------------------------------------------
+    for context in CONTEXTS:
+        context_uuid = context['context_id']['context_uuid']['uuid']
+        LOGGER.info('Adding Context {:s}'.format(context_uuid))
+        response = context_client.SetContext(Context(**context))
+        assert response.context_uuid.uuid == context_uuid
+
+    for topology in TOPOLOGIES:
+        context_uuid = topology['topology_id']['context_id']['context_uuid']['uuid']
+        topology_uuid = topology['topology_id']['topology_uuid']['uuid']
+        LOGGER.info('Adding Topology {:s}/{:s}'.format(context_uuid, topology_uuid))
+        response = context_client.SetTopology(Topology(**topology))
+        assert response.context_id.context_uuid.uuid == context_uuid
+        assert response.topology_uuid.uuid == topology_uuid
+        context_id = json_context_id(context_uuid)
+
+
+def test_scenario_ready(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure scenario is ready -------------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == len(CONTEXTS)
+
+    response = context_client.ListTopologies(ContextId(**CONTEXT_ID))
+    assert len(response.topologies) == len(TOPOLOGIES)
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
+
+def test_devices_bootstraping(
+    context_client : ContextClient, device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    # ----- Create Devices ---------------------------------------------------------------
+    for device, connect_rules, endpoints, in DEVICES:
+        device_uuid = device['device_id']['device_uuid']['uuid']
+        LOGGER.info('Adding Device {:s}'.format(device_uuid))
+
+        device_p4_with_connect_rules = copy.deepcopy(device)
+        device_p4_with_connect_rules['device_config']['config_rules'].extend(connect_rules)
+        response = device_client.AddDevice(Device(**device_p4_with_connect_rules))
+        assert response.device_uuid.uuid == device_uuid
+        
+        device_p4_with_endpoints = copy.deepcopy(device)
+        device_p4_with_endpoints['device_endpoints'].extend(endpoints)
+        device_client.ConfigureDevice(Device(**device_p4_with_endpoints))
+
+    for link in LINKS:
+        link_uuid = link['link_id']['link_uuid']['uuid']
+        LOGGER.info('Adding Link {:s}'.format(link_uuid))
+        response = context_client.SetLink(Link(**link))
+        assert response.link_uuid.uuid == link_uuid
+        context_client.SetLink(Link(**link))
+
+def test_devices_bootstrapped(context_client : ContextClient):  # pylint: disable=redefined-outer-name
+    # ----- List entities - Ensure bevices are created -----------------------------------------------------------------
+    response = context_client.ListContexts(Empty())
+    assert len(response.contexts) == len(CONTEXTS)
+
+    response = context_client.ListTopologies(ContextId(**CONTEXT_ID))
+    assert len(response.topologies) == len(TOPOLOGIES)
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == len(DEVICES)
diff --git a/src/tests/p4/tests/test_functional_cleanup.py b/src/tests/p4/tests/test_functional_cleanup.py
new file mode 100644
index 0000000000000000000000000000000000000000..3dab4f84fdabbc7370de9af0f8e9a69754d310f6
--- /dev/null
+++ b/src/tests/p4/tests/test_functional_cleanup.py
@@ -0,0 +1,83 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import copy, 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 device.client.DeviceClient import DeviceClient
+from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES
+
+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'))
+    yield _client
+    _client.close()
+
+
+@pytest.fixture(scope='session')
+def device_client():
+    _client = DeviceClient(get_setting('DEVICESERVICE_SERVICE_HOST'), get_setting('DEVICESERVICE_SERVICE_PORT_GRPC'))
+    yield _client
+    _client.close()
+
+def test_scenario_cleanup(
+    context_client : ContextClient, device_client : DeviceClient):  # pylint: disable=redefined-outer-name
+
+    for link in LINKS:
+        link_uuid = link['link_id']['link_uuid']['uuid']
+        LOGGER.info('Removing Link {:s}'.format(link_uuid))
+        link_id = link['link_id']
+        context_client.RemoveLink(LinkId(**link_id))
+
+    # ----- Delete Devices and Validate Collected Events ---------------------------------------------------------------
+    for device, _, _ in DEVICES:
+
+        device_id = device['device_id']
+        device_uuid = device_id['device_uuid']['uuid']
+        LOGGER.info('Deleting Device {:s}'.format(device_uuid))
+        device_client.DeleteDevice(DeviceId(**device_id))
+        #expected_events.append(('DeviceEvent', EVENT_REMOVE, json_device_id(device_uuid)))
+
+    response = context_client.ListDevices(Empty())
+    assert len(response.devices) == 0
+    
+
+    # ----- Delete Topologies and Validate Collected Events ------------------------------------------------------------
+    for topology in TOPOLOGIES:
+        topology_id = topology['topology_id']
+        context_uuid = topology_id['context_id']['context_uuid']['uuid']
+        topology_uuid = topology_id['topology_uuid']['uuid']
+        LOGGER.info('Deleting Topology {:s}/{:s}'.format(context_uuid, topology_uuid))
+        context_client.RemoveTopology(TopologyId(**topology_id))
+        context_id = json_context_id(context_uuid)
+        #expected_events.append(('TopologyEvent', EVENT_REMOVE, json_topology_id(topology_uuid, context_id=context_id)))
+
+    # ----- Delete Contexts and Validate Collected Events --------------------------------------------------------------
+    for context in CONTEXTS:
+        context_id = context['context_id']
+        context_uuid = context_id['context_uuid']['uuid']
+        LOGGER.info('Deleting Context {:s}'.format(context_uuid))
+        context_client.RemoveContext(ContextId(**context_id))
+        #expected_events.append(('ContextEvent', EVENT_REMOVE, json_context_id(context_uuid)))
diff --git a/src/tests/p4/tests/test_functional_create_service.py b/src/tests/p4/tests/test_functional_create_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..96d16a29990b857f83ec946cbdee9ac3b88de717
--- /dev/null
+++ b/src/tests/p4/tests/test_functional_create_service.py
@@ -0,0 +1,93 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import copy, 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 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
+
+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'))
+    yield _client
+    _client.close()
+
+
+@pytest.fixture(scope='session')
+def device_client():
+    _client = DeviceClient(get_setting('DEVICESERVICE_SERVICE_HOST'), get_setting('DEVICESERVICE_SERVICE_PORT_GRPC'))
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def service_client():
+    _client = ServiceClient(get_setting('SERVICESERVICE_SERVICE_HOST'), get_setting('SERVICESERVICE_SERVICE_PORT_GRPC'))
+    yield _client
+    _client.close()
+
+def test_rules_entry(
+    context_client : ContextClient, device_client : DeviceClient, service_client : ServiceClient):  # pylint: disable=redefined-outer-name
+
+
+
+    for device, _, __ in DEVICES:
+        # Enable device
+        device_p4_with_operational_status = copy.deepcopy(device)
+        device_p4_with_operational_status['device_operational_status'] = \
+            DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
+        device_client.ConfigureDevice(Device(**device_p4_with_operational_status))
+
+    # ----- Create Services ---------------------------------------------------------------
+    for service, endpoints in SERVICES:
+        # Insert Service (table entries)
+        service_uuid = service['service_id']['service_uuid']['uuid']
+        print('Creating Service {:s}'.format(service_uuid))
+        service_p4 = copy.deepcopy(service)
+        service_client.CreateService(Service(**service_p4))
+        service_p4['service_endpoint_ids'].extend(endpoints)
+        service_client.UpdateService(Service(**service_p4))
+
+        
+        
+"""
+con_cl = ContextClient(get_setting('CONTEXTSERVICE_SERVICE_HOST'), get_setting('CONTEXTSERVICE_SERVICE_PORT_GRPC'))
+dev_cl = DeviceClient(get_setting('DEVICESERVICE_SERVICE_HOST'), get_setting('DEVICESERVICE_SERVICE_PORT_GRPC'))
+srv_cl = ServiceClient(get_setting('SERVICESERVICE_SERVICE_HOST'), get_setting('SERVICESERVICE_SERVICE_PORT_GRPC'))
+
+for service, endpoints in SERVICES:
+    service_uuid = service['service_id']['service_uuid']['uuid']
+    print('Creating Service {:s}'.format(service_uuid))
+    service_p4 = copy.deepcopy(service)
+    srv_cl.CreateService(Service(**service_p4))
+    #service_data = con_cl.GetService(ServiceId(**json_service_id('svc1')))
+    #print('service_data = {:s}'.format(grpc_message_to_json_string(service_data)))
+    service_p4 = copy.deepcopy(service)
+    service_p4['service_endpoint_ids'].extend(endpoints)
+    srv_cl.UpdateService(Service(**service_p4))
+"""
\ No newline at end of file
diff --git a/src/tests/p4/tests/test_functional_delete_service.py b/src/tests/p4/tests/test_functional_delete_service.py
new file mode 100644
index 0000000000000000000000000000000000000000..8630686c84259abd242c7b9c2ee65c45b61eb8d4
--- /dev/null
+++ b/src/tests/p4/tests/test_functional_delete_service.py
@@ -0,0 +1,69 @@
+# Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import copy, 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 device.client.DeviceClient import DeviceClient
+from service.client.ServiceClient import ServiceClient
+from .Objects import CONTEXT_ID, CONTEXTS, DEVICES, LINKS, TOPOLOGIES, 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'))
+    yield _client
+    _client.close()
+
+
+@pytest.fixture(scope='session')
+def device_client():
+    _client = DeviceClient(get_setting('DEVICESERVICE_SERVICE_HOST'), get_setting('DEVICESERVICE_SERVICE_PORT_GRPC'))
+    yield _client
+    _client.close()
+
+@pytest.fixture(scope='session')
+def service_client():
+    _client = ServiceClient(get_setting('SERVICESERVICE_SERVICE_HOST'), get_setting('SERVICESERVICE_SERVICE_PORT_GRPC'))
+    yield _client
+    _client.close()
+
+def test_rules_delete(
+    context_client : ContextClient, device_client : DeviceClient, service_client : ServiceClient):  # pylint: disable=redefined-outer-name
+
+    # ----- Create Services ---------------------------------------------------------------
+    for service, endpoints in SERVICES:
+        # Delete Service (table entries)
+        service_uuid = service['service_id']['service_uuid']['uuid']
+        print('Deleting Service {:s}'.format(service_uuid))
+        service_p4 = copy.deepcopy(service)
+        response = service_client.DeleteService(ServiceId(**json_service_id(service_uuid, CONTEXT_ID)))
+
+    # ----- Disable Devices ---------------------------------------------------------------
+    for device, _, _ in DEVICES:
+        device_p4_with_operational_status = copy.deepcopy(device)
+        device_p4_with_operational_status['device_operational_status'] = \
+            DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_DISABLED
+        device_client.ConfigureDevice(Device(**device_p4_with_operational_status))